Full Code of uhlerlab/causaldag for AI

master c664971bbffa cached
95 files
684.9 KB
214.8k tokens
210 symbols
1 requests
Download .txt
Showing preview only (719K chars total). Download the full file or copy to clipboard to get everything.
Repository: uhlerlab/causaldag
Branch: master
Commit: c664971bbffa
Files: 95
Total size: 684.9 KB

Directory structure:
gitextract_8r8o36c7/

├── .coverage
├── .gitignore
├── .travis.yml
├── LICENSE.txt
├── README.md
├── causaldag/
│   ├── __init__.py
│   ├── datasets/
│   │   ├── __init__.py
│   │   ├── data/
│   │   │   ├── apoptosis_1.csv
│   │   │   └── apoptosis_2.csv
│   │   └── networks.py
│   └── loaders.py
├── dev_setup.sh
├── docs/
│   ├── .gitignore
│   ├── 404.html
│   ├── Gemfile
│   ├── _config.yml
│   ├── _layouts/
│   │   └── default.html
│   ├── dci.markdown
│   ├── dci_tutorial.markdown
│   ├── gspo.markdown
│   ├── gspo_tutorial.markdown
│   ├── index.markdown
│   ├── utigsp.markdown
│   └── utigsp_tutorial.markdown
├── profiling/
│   ├── __init__.py
│   ├── compare_all_dags.py
│   ├── profile_cpdag.py
│   ├── profile_gsp.py
│   ├── profile_hsic.py
│   ├── profile_igsp.py
│   ├── profile_init.py
│   ├── profile_pc.py
│   ├── profile_perm2dag.py
│   ├── time_create_graph.py
│   └── time_dec.py
├── release.sh
├── requirements/
│   └── default.txt
├── requirements.txt
├── setup.py
├── sphinx_docs/
│   ├── Makefile
│   ├── _build/
│   │   ├── doctrees/
│   │   │   ├── environment.pickle
│   │   │   └── index.doctree
│   │   └── html/
│   │       ├── .buildinfo
│   │       ├── _sources/
│   │       │   └── index.rst.txt
│   │       ├── _static/
│   │       │   ├── basic.css
│   │       │   ├── css/
│   │       │   │   ├── badge_only.css
│   │       │   │   └── theme.css
│   │       │   ├── doctools.js
│   │       │   ├── documentation_options.js
│   │       │   ├── jquery.js
│   │       │   ├── js/
│   │       │   │   ├── badge_only.js
│   │       │   │   └── theme.js
│   │       │   ├── language_data.js
│   │       │   ├── pygments.css
│   │       │   ├── searchtools.js
│   │       │   └── underscore.js
│   │       ├── genindex.html
│   │       ├── index.html
│   │       ├── objects.inv
│   │       ├── search.html
│   │       └── searchindex.js
│   ├── conf.py
│   ├── index.rst
│   └── requirements.txt
└── tests/
    ├── R_scripts/
    │   ├── config.R
    │   ├── evaluate_bge_score.R
    │   ├── fadcor.R
    │   ├── test_dag2cpdag.R
    │   ├── test_dag2icpdag.R
    │   └── test_msep.R
    ├── __init__.py
    ├── create_test_data/
    │   └── create_bge_data.py
    ├── data/
    │   ├── bge_data/
    │   │   ├── dag_amat
    │   │   ├── dag_amat.npy
    │   │   ├── r_bge.npy
    │   │   └── samples.npy
    │   ├── cpdag1.txt
    │   ├── dag1.txt
    │   ├── icpdag1.txt
    │   ├── interventions.txt
    │   └── random_mag.txt
    ├── test_ci_tests.py
    ├── test_classes/
    │   ├── __init__.py
    │   ├── test_ancestral_graph.py
    │   ├── test_dag.py
    │   ├── test_dag_basics.py
    │   └── test_pdag.py
    ├── test_gaussdag.py
    ├── test_id_formula.py
    ├── test_interventions.py
    ├── test_scores/
    │   ├── test_bge_score.py
    │   └── test_max_likelihood.py
    └── test_structure_learning/
        ├── __init__.py
        ├── test_gsp.py
        └── test_pcalg.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Compiled python modules.
*.pyc

# Setuptools distribution folder.
/dist/
build/

# Python egg metadata, regenerated from source files by setuptools.
/*.egg-info

.DS_Store
.idea/

.mypy_cache/

docs/_build/
docs/classes/generated/

venv/

================================================
FILE: .travis.yml
================================================
language:
  python
after_success:
  bash <(curl -s https://codecov.io/bash)

================================================
FILE: LICENSE.txt
================================================
License
=======

CausalDAG is distributed with the 3-clause BSD license.

::
Copyright 2018, CausalDAG Developers
Chandler Squires <csquires@mit.edu>

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

================================================
FILE: README.md
================================================
[![PyPI version](https://badge.fury.io/py/causaldag.svg)](https://badge.fury.io/py/causaldag)

**This package is nearing a V1 release, with potential (minor) breaking changes. After the release, future breaking changes will occur less frequently and with more notice. Please raise issues as needed.**

`causaldag` is common wrapper for the following packages:
* https://github.com/uhlerlab/graphical_models
* https://github.com/uhlerlab/conditional_independence
* https://github.com/uhlerlab/graphical_model_learning

Installing and importing `causaldag` should be sufficient for most use cases.

CausalDAG is a Python package for the creation, manipulation, and learning
of Causal DAGs. CausalDAG requires Python 3.5+

### Install
Install the latest version of CausalDAG:
```
$ pip3 install causaldag
```

### Cite
You may use the following bibtex for citing `causaldag`:
```
@manual{squires2018causaldag,
  title={{\texttt{causaldag}: creation, manipulation, and learning of causal models}},
  author={{Chandler Squires}},
  year={2018},
  url={https://github.com/uhlerlab/causaldag},
}
```

Or the following text:

> Chandler Squires. _causaldag: creation, manipulation, and learning of causal models_, 2018. URL https://github.com/uhlerlab/causaldag

### Documentation
Documentation for each subpackage is available at:
* graphical_models: https://graphical-models.readthedocs.io/en/latest/
* graphical_model_learning: https://graphical-model-learning.readthedocs.io/en/latest/
* conditional_independence: https://conditional-independence.readthedocs.io/en/latest/

Examples for specific algorithms can be found at https://uhlerlab.github.io/causaldag/

### Simple Example
Find the CPDAG (complete partially directed acyclic graph,
AKA the *essential graph*) corresponding to a DAG:
```
>>> from causaldag import rand, partial_correlation_suffstat, partial_correlation_test, MemoizedCI_Tester, gsp
>>> import numpy as np
>>> np.random.seed(12312)
>>> nnodes = 5
>>> nodes = set(range(nnodes))
>>> dag = rand.directed_erdos(nnodes, .5)
>>> gdag = rand.rand_weights(dag)
>>> samples = gdag.sample(100)
>>> suffstat = partial_correlation_suffstat(samples)
>>> ci_tester = MemoizedCI_Tester(partial_correlation_test, suffstat, alpha=1e-3)
>>> est_dag = gsp(nodes, ci_tester)
>>> dag.shd_skeleton(est_dag)
```

### License

Released under the 3-Clause BSD license (see LICENSE.txt):
```
Copyright (C) 2018
Chandler Squires <csquires@mit.edu>
```


================================================
FILE: causaldag/__init__.py
================================================
"""
CausalDAG
=========

CausalDAG is a Python package for the creation, manipulation, and learning of Causal DAGs.

Simple Example
--------------

>>> from causaldag import rand, partial_correlation_suffstat, partial_correlation_test, MemoizedCI_Tester, gsp
>>> import numpy as np
>>> np.random.seed(12312)
>>> nnodes = 5
>>> nodes = set(range(nnodes))
>>> dag = rand.directed_erdos(nnodes, .5)
>>> gdag = rand.rand_weights(dag)
>>> samples = gdag.sample(100)
>>> suffstat = partial_correlation_suffstat(samples)
>>> ci_tester = MemoizedCI_Tester(partial_correlation_test, suffstat, alpha=1e-3)
>>> est_dag = gsp(nodes, ci_tester)
>>> dag.shd_skeleton(est_dag)
3

License
-------
Released under the 3-Clause BSD license::
   Copyright (C) 2018
   Chandler Squires <chandlersquires18@gmail.com>
"""

# from .loaders import *
# from . import utils
from conditional_independence import *
from graphical_models import *
import graphical_models.rand as rand
from graphical_model_learning import *


================================================
FILE: causaldag/datasets/__init__.py
================================================
from graphical_models.rand import *
import numpy as np
import random
from .networks import *


def create_synthetic_difference(
        nnodes=10,
        nsamples=1000,
        num_altered=1,
        num_removed=1,
        num_added=1,
        exp_nbrs=2,
        seed=8181818,
        return_graphs=False,
        rand_weight_fn=unif_away_zero,
        rand_change_fn=unif_away_original
):
    """
    Create two synthetic datasets from two related causal graphs.

    nnodes:
        Number of nodes in each graph.
    nsamples:
        Number of samples from each graph.
    num_altered:
        Number of altered
    """
    random.seed(seed)
    np.random.seed(seed)
    d1 = directed_erdos(nnodes, exp_nbrs=min(exp_nbrs, nnodes-1))
    g1 = rand_weights(d1, rand_weight_fn=rand_weight_fn)
    g2 = alter_weights(
        g1,
        num_altered=num_altered,
        num_removed=num_removed,
        num_added=num_added,
        rand_weight_fn=rand_weight_fn,
        rand_change_fn=rand_change_fn
    )
    X1 = g1.sample(nsamples)
    X2 = g2.sample(nsamples)
    difference = set(zip(*np.where(g1.to_amat() != g2.to_amat())))
    difference_ug = set(zip(*np.where(~np.isclose(g1.precision, g2.precision))))
    difference_ug = {frozenset({i, j}) for i, j in difference_ug if i != j}

    if return_graphs:
        return X1, X2, difference, difference_ug, g1, g2
    return X1, X2, difference




================================================
FILE: causaldag/datasets/data/apoptosis_1.csv
================================================
,TP53,TNFSF10,IL1R1,PRKAR2B,FAS,ENDOG,CSF2RB,AIFM1,BIRC3,PIK3R1
X129,2.21285183322192,2.34644502829575,2.30345571389366,2.1072512423191,2.1838612399077,2.05533325833587,2.05017234749783,2.10623560321545,2.28107438776296,1.98403548227921
X351,2.10751137187481,2.30625833836034,2.43116562530977,2.27185162109817,2.23560091701251,2.18679931149706,2.01268857045654,2.28218950993434,2.09842765925207,2.08771720373092
X440,1.92161160166819,2.24510427424604,2.44088858103719,2.08522975759044,2.25856841757725,2.02654564802633,2.11358327284345,2.35083034682204,2.05165916066738,2.0854534339863
X445,1.87221747526867,2.42335123033048,2.47665351954141,2.13737312876652,2.30825896608985,2.0849587936158,2.22571484773585,2.17710916779544,2.1458037894416,2.16515238584315
X474,2.12462759980708,2.53843240870452,2.37907935854073,2.09579459859261,2.24808983568497,2.02417985732247,1.84259832704161,2.20220990767842,2.12241601794822,2.18620070377557
X479,1.99538307328832,2.30669463723797,2.34737966636376,1.96464077339016,2.24248046095949,2.11144395780533,2.04291629249735,2.32501563683985,2.04928125858494,2.18617149423078
X485,2.00736400679252,2.25858513743396,2.45025913029232,2.09757979447681,2.31640318194297,2.06843494066971,2.09946105721877,2.33060776453442,2.17604406786291,2.15047532908033
X487,1.94522848820591,2.12887078730749,2.39476127604777,1.94917766205846,2.23410601806246,2.13945303439456,1.89231797366303,2.2035567092288,1.8792299074996,2.17776762362138
X490,2.13928821391313,2.15013762853831,2.48514328845353,2.12438383609416,2.38774484010798,1.98641437880798,2.26421321947445,2.20424984227297,2.32815341959593,2.14108211782809
X498,2.05538063577078,2.23254774766272,2.40211182517909,2.22026704870433,2.31377129350897,2.02778239090131,2.18769486912006,2.35486629923595,2.23815536593818,2.20426639212527
X500,2.14090345992459,2.20108157399676,2.35767726250958,2.12347517336787,2.24151787324559,2.20373555705186,1.954633419032,2.28341450591836,2.02052850114712,2.09074491715119
X507,2.09155784195841,2.30381533593478,2.49126803983995,1.90117574914371,2.27833645683155,2.14794445982592,2.08560003914533,2.26263251209089,2.18661628562983,2.18332283883321
X511,2.10304819898049,2.30131829093904,2.46151945560147,2.18379930474929,2.36670571432365,2.07948154087986,2.33784315752333,2.25303238816437,2.39421669694514,2.15421732651131
X516,2.15110733771903,2.26776898530844,2.44897458974893,2.03237744949071,2.27612817493169,2.07012073763308,2.11312531964454,2.230762507354,2.05639806851122,2.06956795788154
X532,2.09027143609859,2.30895873809612,2.32537540956123,2.09857237474534,2.13431435942275,1.97915286469857,2.0258759306932,2.25970055622848,2.01541355686308,2.1184891629305
X533,2.18688351460174,2.23254023979689,2.37742536837687,2.11662893904694,2.34690528169203,2.04526926370592,1.96633583151203,2.23911267003847,2.06588126530689,2.22034305189216
X536,1.7918527982061,2.19611952254357,2.42223128079292,2.03358606709338,2.16872793302739,2.12494894252065,1.93733347430445,2.24968629995667,1.87888778382466,2.04286832082397
X550,2.10690713527045,2.2705855245045,2.43918552130698,2.07539084868915,2.28431521044426,2.0221156138102,2.18803918717464,2.39322346780095,2.19630081746809,2.1639894702037
X563,2.04131512956072,2.37720450576829,2.39154972779967,1.9083076687139,2.21451752206428,2.07504689936932,1.95202995620571,2.33542394687306,1.99233015968987,2.06812272487676
X570,2.28077803817455,2.13737784732793,2.42021789514372,2.17158991004051,2.19073355616585,2.17074940470708,1.96316190660026,2.44177034737751,1.92019079526083,2.1174896926507
X580,1.93576024114511,2.1585299479988,2.50376847519171,2.25379602882401,2.29822660858509,2.06539079058217,1.9893144066626,2.31359426901336,2.02341998137695,2.16204749987961
X2219,2.14532876228826,2.31658661262986,2.39103818021985,2.28905395870969,2.29154436787707,2.1562856778347,2.17480058392674,2.29564506662438,2.19102763813185,2.1696500939201
X20025,2.06459817191262,2.20739270625185,2.4168214020003,2.2427384809495,2.2182802319019,2.0099025389475,2.00808650748199,2.40387644080661,2.05895435512643,2.16162963866677
X20046,2.13592820216624,2.22189876157251,2.4016536557661,2.17192956111499,2.33012827300022,2.06882791589521,2.04593000014721,2.27781277722746,2.0256358834212,2.10061455310004
X22012,2.09788663029014,2.094341237856,2.215030659485,2.10620031098053,2.10393901328022,2.11855046973924,1.89149620101559,2.38496568107886,1.88395115521753,2.17540037469953
X22013,1.77112299437761,2.09743493526007,2.26173288968418,2.06940383200925,2.19341733899327,2.2450280114614,1.9224090049558,2.3915863222472,1.86732911071773,2.00752117497153
X22020,2.08516015917328,2.1923047168681,2.37665770737983,2.30815654359897,2.24632368848561,2.05746557940117,1.84172196182492,2.33837106802822,2.05413655412618,2.15281165239503
X22047,2.06301231805396,2.27201660118751,2.41874102786182,2.17103459424598,2.23342685069124,2.09067199342258,1.94406416055219,2.23649870786619,2.12653741420459,2.21352325160201
X22058,2.06882665255673,2.2824731978795,2.37682948441367,2.00745938530086,2.20829089690344,2.19574570656793,1.86460402455913,2.40747469779076,1.90168355593713,2.16041535420222
X23074,2.13240157129221,2.02113953300804,2.3165333620256,1.97169763243913,2.07782774020243,2.04569084069458,1.87898860028532,2.2367753642143,1.8136530462194,2.14610904492585
X23170,2.03234993414599,2.30333980812492,2.37174168441149,2.14417301295133,2.05540368344104,2.09716971486159,1.82031129214415,2.22066437295871,1.92227883023628,2.08609684593
X23172,1.98948537851489,2.34159039833335,2.41496958268863,2.0293015293752,2.23833666310927,2.08564848866746,1.95017959342175,2.28711707767889,2.05425321249229,2.0619697957678
X23197,2.18011458830037,2.20943308266572,2.36905424925569,1.87831018457385,2.20742460198579,2.13376872915597,1.98887795396256,2.17629257920748,1.91822323659156,2.05492725693811
X23212,2.13945068000751,2.2452800801737,2.39230056063289,2.20191356682235,2.2436362537693,2.06717283797595,2.0254366795763,2.33210991407571,2.02352838160126,2.08591802391952
X23213,2.17765205689676,2.22025293319057,2.32488264459232,1.96452159098134,2.35157999810738,2.16546899727753,2.00694208286694,2.17126382766648,2.30474775275868,2.19235272913245
X23221,1.8546591481971,2.47335687383754,2.36823424715037,1.79507397019588,2.24928663170763,1.93501963350985,2.07643201760183,2.40330877513559,2.00078381198138,2.20998723152648
X32049,1.89752390329985,2.18293519082627,2.31676508008788,1.98553737297849,2.09968769805343,2.04139044425932,1.75694025524978,2.26015242703869,2.02923712793074,2.29451864651586
X32098,2.08473624994069,2.16586462065612,2.44237573060967,2.22921623224557,2.27769898668497,2.05450314888799,1.92029779220126,2.21669163635309,2.00971759945435,2.16737915624564
X34066,2.08197582766261,2.31501650184199,2.42228185186903,1.88391163745581,2.20965916859251,2.12390569547825,2.1218063454576,2.27474616092754,2.3153779147928,2.04454466724855
X34080,2.10959725311428,2.1687336491586,2.35645187312471,2.17705815053969,2.12202558288363,2.10765477886044,2.03475401268192,2.33457782403022,2.02938169680689,2.18579506414317
X34086,2.17506303665693,2.24206727797356,2.47165506746223,2.26606943787009,2.2915150454921,2.11492330250047,1.89012255991159,2.19817634648246,1.97456979544366,2.10005633907657
X34117,1.9493399747585,2.34129221274235,2.4093952574032,2.06482777891144,2.22094978447142,2.14146400958346,2.08821048189651,2.2846848350453,2.15018770857904,2.08889546221307
X34165,2.08326671636193,2.34368768814226,2.418917298928,1.99111976103169,2.24651197236325,2.10211870999202,1.95548700140462,2.25535930455058,2.06741577109082,2.10408171387084
X34168,2.13185133754758,2.05009125519737,2.32100048401296,1.92199501986067,2.20866664428257,2.11692757807406,1.92429682629623,2.30116708810014,1.96027223309099,2.05829451107838
X34202,2.00927655496271,2.33412445689971,2.4264032141646,1.84478193440438,2.23551002420448,2.10208816021206,1.99759408141963,2.2483495797857,1.97480992697582,2.12847929424435
X34801,2.20864467463803,2.1243802508903,2.37508992366002,2.11630129688707,2.23939073473132,2.12031833469863,1.92258449460894,2.18801900241682,1.90745440038494,2.15866737734272
X41170,1.94820323221509,2.07671407552335,2.43516303122535,2.02813772092109,2.22676072559948,2.1092964165924,1.84862960077792,2.27666197364066,2.14604121842601,2.21067373066022
X41192,1.97457951286791,2.21945562617754,2.42470626088872,2.10460843202663,2.23103753249475,2.14034730044416,2.01488968712004,2.28052862771213,1.95886727039718,2.13469647838943
X41300,2.09474139964983,2.28105803972968,2.42414321625433,2.14735950232374,2.20918828153249,2.16645948114793,2.13014534985452,2.30394317038933,2.10320933651416,2.12142046669784
X41310,1.90250893835767,2.30151351906372,2.40397945384779,2.19549307915807,2.27273497832516,2.06692351712086,2.14452913080199,2.35287413328721,2.16437993819603,2.09481525816649
X44080,1.84378566164689,2.28657968711865,2.35333523990371,1.77382289976247,2.19453763741076,2.0244876079518,1.98308756731145,2.33389963457623,1.79312686724645,2.178800332967
X44163,2.10744938452386,2.43588533390507,2.39995224668537,1.87949863686936,2.2461300787694,2.01620617107266,1.98208088608615,2.18968399625802,2.11837495395079,2.1212286703083
X44186,1.88518757601324,2.10034650235973,2.34965950037997,2.24589092431681,2.23066472628574,2.00486615261154,2.03520094999268,2.27668968233201,2.0517773934473,2.20391216548604
X44189,1.96044542679027,2.35379613399888,2.37032878458056,2.08394762402443,2.20239562881867,2.09499495777324,2.12152474054743,2.36170175488078,2.21877730629763,2.12096728850833
X44234,1.92941775118504,2.24437106336422,2.43466543335125,2.24725629849703,2.22138046054729,2.08521981525598,2.16317243961038,2.30812372640714,2.13830343433109,2.0861874865419
X44285,1.97518042146531,2.40223221827627,2.41842223662997,2.19480164440347,2.21721346179526,2.09463060164556,2.11265627421591,2.23643140150416,2.21617498974858,2.11366904022906
X44288,2.07106530878418,2.18151177529155,2.45185904374177,2.29765696971771,2.25384642749853,2.14517075990619,2.07670530158695,2.2986272711397,2.06501675285326,2.19497649674
X44341,2.14181052356818,2.31045702785407,2.4649437096424,2.01538823613947,2.331465024078,2.02577569818006,2.15573569382826,2.18895156122608,2.28971057085791,2.15984918275708
X44349,2.09823753503906,2.31053441325922,2.33537459323634,2.13765620304946,2.16319543131383,2.08339496658701,1.88305706391504,2.20252494995473,2.09592985918464,2.17779141511275
X44366,1.94661275930977,2.08966287541237,2.44683174661035,1.97265779148182,2.26584641703643,2.07287628748442,2.05067677410931,2.32092390433619,1.98140690390807,2.21845537820663
X51016,1.78370881617722,2.06868514854574,2.39673368933053,2.1468080914222,2.24183352562036,2.03053355806997,1.88567170266355,2.13420194369745,1.94237390390406,2.21353199674982
X51086,2.18622204867259,2.39696484008006,2.40084093008694,1.94324374020184,2.16805091203103,2.03990127747556,1.94406988537976,2.29259738144223,2.09649160964823,2.06823017855959
X60020,1.74722224846032,2.32641001217418,2.34101414671383,2.09303128144685,2.21342049038619,2.10380239192609,1.94123495161693,2.27984242801951,2.06619291492404,2.08855241137317
X60067,1.84455904527025,2.22166566778264,2.33812017639665,2.06845263419262,2.26238165712694,2.11856489432451,1.86478220987388,2.34444462908185,1.91463617675019,1.97318618132345
X60091,1.92305816290088,2.27681897940761,2.38431069150441,2.02948813871041,2.25329400338241,2.15291386542333,2.0872546893931,2.41763283558931,2.21613028836201,2.11839058331837
X60188,1.82723921933763,2.23356507828158,2.41462902478714,2.0420251996694,2.19607614035707,2.04183053225806,2.1049642974109,2.28878531250752,2.07285363902376,2.07801802896621
X60214,2.13575807345873,2.24914739575415,2.46108771792745,2.15377645236678,2.32407942580411,2.05826897644703,2.12948924814474,2.35038429012732,2.30467091615168,2.21059260356362
X70048,2.18394794268557,2.2102614490485,2.36725704272963,2.16731619177532,2.2739520521032,2.04954532001876,1.92618109048146,2.24832529762701,2.09858341150819,2.27080129728937
X70077,1.56203388713015,2.30753681296798,2.38200237436009,2.3152100616343,2.19103770024303,2.03708973175515,1.87556125654647,2.21818013452448,2.0322464172579,2.19451424102416
X70102,2.04104628774134,2.43224399720469,2.41579770013567,2.09755401598159,2.29788104629455,2.0100231332363,2.1257118670538,2.24293805568613,2.08881745015831,2.12765773163377
X70115,2.1960917136662,2.12358521331727,2.33198757233819,2.17505962862135,2.25502901702443,2.07054962550818,1.97104447592226,2.2646609788928,1.99650684373076,2.1401143976271
X70119,2.09989836670672,2.12053309986454,2.42301617503436,2.09694373087847,2.24257072243643,2.10748949442499,2.08480712117825,2.23585857994699,2.08107271060017,2.08982618414665
X70124,2.12424758931039,2.40585893305787,2.50452788808517,2.0220984048973,2.20452563739204,2.09239601892947,1.94843410405659,2.24918009684875,2.07567320039207,2.08408947329115
X92003,2.0262398485098,2.10225433974499,2.32026488042395,2.10157111639544,2.20413839946922,2.06056448591015,1.66881940894918,2.33932099077981,1.80716847174699,2.15108290281971
X92065,2.08382317827452,2.35449799538491,2.4216109116312,2.05007065928025,2.32227496883598,2.09608968902767,2.18181309483644,2.31267897789927,2.1267031572615,2.11187121901306
X92074,2.22809320099869,2.40810659569276,2.42378893767252,1.98468295971745,2.24052137367335,2.00481632039123,2.07444533138122,2.23602319287183,2.07957028339227,2.15949155701898
X93050,2.19626967711965,2.30612781015436,2.34162502057583,2.14586695339419,2.20161935060228,2.17374098358794,1.9671501182307,2.29908999223906,1.88269950779965,2.11862860042066
X94019,1.86824354478233,2.16484026487538,2.4056821489586,2.00649577851492,2.18456702972084,2.20093103326746,1.78208111805173,2.39210399019216,1.69834582319942,2.11675659406065
X94025,2.18417986381541,2.26517082723175,2.39408620933649,2.03804125498089,2.19291865347108,2.11304796647653,1.75398837154106,2.26981806991114,1.90497802942389,2.14039081667308
X94044,1.78732297586209,2.20425977221722,2.35355193410152,1.87393989036314,2.11664218702316,2.2805766747287,1.83628977943858,2.2955191881815,1.98345500819992,2.08312848653782
X94056,2.18342085391522,2.13713835222493,2.33003584962521,1.97890686291727,2.12645870644289,2.02923449921225,1.7762379648338,2.34095544469249,1.91043839974706,2.16094318458962
X94067,1.94555294240747,2.33626935439724,2.47837872249171,2.07405330114967,2.244530042001,2.08760686451209,1.88035930616913,2.17142802229221,2.16884224944392,2.02697650844279
X94082,1.94035187327788,2.24178676859219,2.34323267230485,1.98638419733501,2.32500096944503,2.0766463888774,1.84950465532793,2.31289575495976,2.15053470600682,2.10833264533213


================================================
FILE: causaldag/datasets/data/apoptosis_2.csv
================================================
,TP53,TNFSF10,IL1R1,PRKAR2B,FAS,ENDOG,CSF2RB,AIFM1,BIRC3,PIK3R1
X49,2.07529922411638,1.79399530122519,2.4102010632009,2.21074169694459,2.17797493045152,2.0557390949634,1.67275443723819,2.21681803243062,1.6646928491437,2.02780345101477
X152,2.14642472843588,1.71745788858983,2.33263115514597,2.20985558040177,2.15314845127586,2.03287259627647,1.61629236689459,2.19626300406167,1.6194337868046,1.87699482558184
X374,1.84349608200215,2.14064717114922,2.33649847793305,2.13560918709302,2.26693097198274,1.99717344299285,1.94493395845056,2.35045483370374,2.06522724553371,2.16332302566054
X379,1.66664965818521,2.30801631715791,2.49913330267654,1.93441576962958,2.02884537266497,2.08804319119382,1.73468811042224,2.35276476753713,2.14729292858775,2.0145989743249
X381,2.11798534308774,2.42369503280694,2.26611922177683,1.97600278936248,2.13583959707611,2.05375571726786,1.75353306158917,2.36309676725568,2.18234554257438,1.95772578299574
X386,1.84368914441572,2.29883406668289,2.27893154039382,1.98281086540368,2.22062312805734,2.05950410529732,1.96393528718906,2.42402366126443,2.09593231829879,1.98737696420548
X387,2.0887815378018,2.07090142850214,2.40434623868472,2.02837979942939,1.95686845829048,1.95007859187036,1.68769625985257,2.13717492907969,1.81916384880697,1.93395034341652
X424,2.18904454524578,2.37440144138264,2.33207398987965,1.82593220635186,2.17164348683288,2.02288970853849,1.93336319274345,2.42211149698924,2.18058241716491,2.08309486017774
X427,1.70973201547064,2.20777758682816,2.21581623204957,2.0084569559033,2.01314280560585,2.09079064626798,1.89099677624898,2.35849177930542,1.93600410293585,2.10264768416708
X428,2.1887622055893,2.10641447918126,2.40709374591982,2.24599675192585,2.28503702227412,2.08803079817654,1.66071640671213,2.271725805488,2.08741219148467,2.11690951776346
X434,1.7383481439221,1.55772979517733,2.42225434861854,2.10676483732873,1.94990928469909,2.04730696247119,1.5933146280466,2.29398925440193,1.63378705141002,1.90152676077028
X450,2.14576986641295,2.31118599893133,2.46627753365817,2.20880394362666,2.34286486053582,2.02812982606998,2.28136962811271,2.26019207339321,2.30193187969669,2.14432531571077
X457,2.22593728279598,2.40285386771226,2.30545796235022,2.02612778648269,2.18476955680953,2.15177848219673,2.17496419890923,2.28207417491916,2.11161827337506,1.98949221678101
X459,1.77383477750654,2.06932807252034,2.39614556112712,2.26456853455539,2.24216926187932,2.04499760155882,1.70916197308206,2.29514548763015,1.84302909666888,2.04235993899752
X469,2.30429662748292,2.20908287783623,1.97858199256879,2.19973919082174,2.19312730608365,2.05581973057686,1.59724791539998,2.08250559267748,1.90800502727493,1.99669967371506
X484,1.80141932885564,2.2929488128218,2.48768694784157,2.32031498542341,2.11726584761792,2.03437879704292,1.71621662197941,2.24430428479926,2.24711572250517,2.22209386808502
X488,2.20829089690344,2.30213299081125,2.33621520783408,1.82182138113466,2.0560705553566,2.04481645245191,1.75747508566091,2.41348583322638,2.14477623016705,2.20588254429389
X493,2.24705018408589,2.28015746339199,2.3168557806214,1.99231924944843,2.18354814651998,2.11558902768911,2.23682342411617,2.2902118592809,2.25745278071997,2.08821915546609
X496,2.09661326018816,2.18943207225712,2.35990449387489,1.86537386721313,1.80337507940028,2.05829578779283,1.60501012423194,2.21752381332803,1.97372540724159,2.13902208922861
X502,2.13335190854384,2.36220026431025,2.36836908820668,2.13066327100667,2.01980166921356,2.12312583590912,1.80896231478964,2.27922434308069,2.01383978884505,2.09812467002182
X510,1.76334970658759,2.20315473690868,2.38265056963914,2.29894949219918,2.23026920640302,1.94297298265927,1.76446877621436,2.19394587492761,1.96283468904893,2.07577859126055
X523,2.18939287837449,2.27137715166985,2.34223456037294,2.21451752206428,2.28346139517308,2.08786843546409,2.00155837551708,2.28930935911202,2.23540628937627,2.11645790395904
X525,2.24222768547269,2.29151100095773,2.22794451749388,1.90030141875406,1.99245152809837,2.17562406815187,1.75234793787014,2.37291307282708,2.10695577949511,2.03284247530147
X541,2.23778413742357,2.20787213481738,2.31758995488821,2.03912592934315,2.15473684439186,2.1109244624912,2.09456042322614,2.26378293223549,2.09877469604575,2.09151708790971
X552,2.16475648053164,2.43134763269344,2.38601590072282,2.0030368957272,2.19933900702007,2.1464282354707,2.14306519132508,2.3128007351837,2.2161117530547,2.01704871688851
X558,1.66648720920989,1.63536293602567,2.45570438397979,2.24637446515713,1.9087258752369,2.11193777302197,1.60948791118414,2.18837329786032,1.63699276636423,2.03847109864164
X561,1.8425412995068,2.33575194150811,2.43324749900948,1.97105422766381,2.18051462943988,2.19696454353036,2.07288635330228,2.37410264146698,2.19106229608857,2.0140012807638
X574,1.97114059608089,2.30325886595806,2.48995969495794,2.20248295005198,2.1596173174225,2.18565344480447,2.02208384327816,2.29746098715852,2.1469167621168,2.04641331544101
X575,2.13179914449019,2.25337699150098,2.36570166614259,1.99980156539912,2.22638955878271,2.07912399126604,2.10934615790724,2.32867282950728,2.18580630291423,2.09611796395586
X582,1.83871620766748,2.23442187724757,2.49614163366886,2.27837333977227,2.25761596934232,2.05959718851314,2.03275734590145,2.25019435452971,2.04843579311618,2.1622270229701
X2227,2.08260528177219,2.30072436290906,2.39824884664741,2.17369775716794,2.27857617163355,2.08773455935383,1.85147858315672,2.38283331800898,2.11890501382631,2.0847064079169
X3498,1.79123933398117,2.44446739451373,2.38794777830482,2.05423782975045,2.14107271557625,2.31245522261138,1.79085906398489,2.36196470481295,2.11666266082302,2.09020466094288
X20019,2.22214480629644,2.19191830170152,2.37793186894197,1.75508338243192,2.16632541054065,1.97791533233196,1.63031055529468,2.31419246603576,2.04694546737519,2.12895763277674
X20027,2.17976639966906,2.29729210984046,2.1888473640401,2.03220317285296,2.00590398373207,2.08370867450511,1.67132855603606,2.34232490216291,2.03487818197318,2.07479576675994
X20031,2.14897693264315,1.71640353921157,1.82854452627005,2.17682003559255,2.07755100574241,2.07155804844551,1.60341782803408,2.15536616629223,1.6327578760557,2.10363036885506
X20032,2.05558420514927,2.2801748488182,2.34637324411915,2.2242461830325,2.2264510697843,2.10883164037135,2.03193973472172,2.19794875949745,2.16455445105302,2.1765954752705
X20041,1.84634234699835,2.32489437991388,2.32672731024225,2.1097682528873,2.29255495895669,2.02900840356758,2.0385609516929,2.32699571460919,2.30318991005533,2.01990382896364
X20074,2.27634070201814,2.10897485815973,2.36125863622333,2.07294297163997,1.67556641887485,2.13689879975029,1.73944108821518,2.26918445032526,1.77694189587763,1.88740444146799
X22002,2.12388656509753,2.2686290570755,2.52632366724699,2.29275998430026,2.29961368272387,2.13128893252759,1.9549859816633,2.20266088491393,2.16631624266306,2.17813462935713
X22023,1.77789716323491,2.03388832045335,2.30663886534499,2.27507514042584,2.18443649052626,2.15170755060324,1.61814192239749,2.23399785351302,2.01654167721077,2.20898295365774
X22027,2.1253633102188,2.1595711686527,2.49033936582599,2.35574853756011,2.32362518960327,2.17908097309993,1.75481536263835,2.26381307916017,1.95217193168111,2.10607738692127
X22031,2.16154903928365,2.36033594242048,2.32455302139169,2.4067712193266,2.15073493161053,2.17944071097029,1.856858770599,2.34414057844405,1.79994256286936,2.31374261568992
X22046,1.94904238134722,2.27770923861592,2.28329931210975,1.86555191541822,2.13687165471733,1.83104428289096,1.74086960222466,2.3980143566167,1.99989090042176,1.95082519326898
X22048,2.05635713523246,2.17459489100509,2.48452074200183,2.19356789983268,1.72817871151086,2.08786719595268,1.74232409695663,2.38173078308296,1.96157819029823,1.90306825877559
X22057,2.20667753479477,1.76329140524853,2.19916158900613,2.20808978109467,2.13921639077698,1.96246661691387,1.55686590610595,2.33387540501568,1.62231465024778,2.00849318805477
X23026,1.51566994281208,2.01626875417005,2.46728224843426,2.09791730869396,2.09679509400729,1.94103686530232,1.59358694702729,2.47342684154705,2.30045582771681,2.17515732103572
X23036,2.14891396483017,2.31525054644484,2.45583479563466,2.24670127827212,2.17264154207537,2.13327491982146,2.01472433791281,2.26076259814021,2.15800430862728,2.08592795931461
X23043,2.11285818413938,2.04052528217584,2.42877094809377,2.08065954960693,2.27143905175488,2.05710134748238,1.72631742892884,2.23110520286702,1.99739192567897,2.1501830500764
X23052,2.19290414659064,2.28815041245759,2.51475990705529,2.24250169968703,2.22409476309172,2.16631051269688,2.10085683851344,2.26212553278654,2.14187511459251,2.15100843087233
X23053,1.81835920519145,2.27822272586664,2.42290623825676,1.83729513691507,2.19309271962336,2.170435602246,1.92994771021637,2.43785871705161,2.13276309026849,1.96776668803902
X23066,2.13544727755283,2.25224818323015,2.43195144888272,2.22426889404621,2.26760226729708,2.0921849978272,1.79040188145598,2.25752496358745,2.14822105707466,2.17284422154417
X23084,1.89683244354983,2.42622383935161,2.41440639276611,1.91348435520383,2.1570482076887,1.99798064134632,1.80555553108267,2.39322346780095,2.20124094536559,1.98103043396433
X23102,2.15985148960472,2.21854783438111,2.33161268620789,2.17705134804227,2.21436571393636,2.11344796285652,1.87832088388871,2.36857131570582,2.10994528567278,2.0157479967826
X23106,2.15375208260083,2.0944102002309,2.29866441717936,2.21218762603052,2.20288077308124,2.03780802004384,2.06191000849598,2.46682074807485,2.08066329503516,2.1712284766854
X23128,2.13124620529585,2.34143265961374,2.37495133493022,2.19113607999566,2.225558249693,2.03765423764823,2.18594565318259,2.43241439131615,2.25462938057289,2.1515807914565
X23139,1.77614485992905,2.44848554739814,2.43789452896222,2.08916288592153,2.31643770104017,2.06282804868466,1.92407637466148,2.22408719149279,1.98656252919186,2.1519296311031
X23143,2.0657241368046,2.29726798218101,2.35809737492421,2.06768267641375,2.10626359272304,2.02385483324008,1.90194631937392,2.34842137493632,2.06425302797021,1.9149751288315
X23162,1.79981526731288,2.42779205851724,2.38941028598584,2.1512876720827,1.86907692832124,2.23959949877439,2.22485055278463,2.37769720368902,2.18361910792883,2.09002162469253
X23165,1.69665360188385,2.26388272547645,2.43317905057745,1.99016897376018,2.27445410094622,2.26061035098229,1.77813203611315,2.21062768635902,2.37489924292456,2.12960457256017
X23177,2.10949657999919,2.28918572103093,2.45070505310332,2.30803521406582,2.35221204981198,2.17234997596467,1.83793988174979,2.27131112068892,2.07079678319605,2.08875676990792
X23182,1.84714056383073,2.39007019109344,2.31819856586573,2.11960291803996,1.96993075889892,2.09557322360707,1.87952306323152,2.391360330134,1.83295899247537,2.05757035138166
X23187,2.14563767259791,2.23295094450437,2.32085321019827,1.73491924005611,1.90262977805948,2.02892952096588,1.73236149061048,2.23580299024176,1.6680331823906,1.96093668307194
X23204,1.86197248492511,2.27632530302246,2.29611319537135,2.00811872583652,2.14196905772645,2.23609480172506,2.17654556612782,2.33167485321374,2.12209505793972,1.90859094118015
X23210,2.21066386420273,2.1977899730255,2.34221918223412,2.02948288258604,2.22543511401029,2.08824021953618,2.29202654721567,2.42381196959477,2.23498375287808,2.021438948091
X27006,2.25381177868265,2.14417652789188,2.41259846729718,2.31690112780337,2.00287092431843,2.0866976523196,1.70075284914552,2.26526217788232,1.66788416332248,1.92683799775371
X27098,1.82670181242562,2.0959335478536,2.44171640177903,2.11367507990855,2.04290592043864,2.06847032740247,1.56286189523115,2.29199016443241,1.9545328663462,2.03283068858601
X32013,1.95862892146309,1.99839280729775,2.50846040274174,2.3897283779501,2.21456338761271,1.89495063354386,1.67614844803952,2.11782536627802,1.76009334814904,2.25378237874586
X32022,2.18500691135365,2.22495322690516,2.29048518345114,2.1497287418286,2.17303661516618,2.17049152334933,1.8172176423607,2.36032272794194,1.73588376178017,1.97438792336865
X32032,2.1727030334461,2.21607577177151,2.31027743095437,2.01069015888928,2.20867982583762,2.26166309347346,2.30375540790832,2.34479172845643,2.13561509570453,2.01834110355577
X32034,2.18588047563556,1.9820643520819,2.47168715604022,2.25476365945355,1.9715904270537,2.00304229270893,1.6013896115745,2.28292509552575,1.62559665393299,1.96661013271046
X32048,2.07307884257286,2.23840810649495,2.15713611001539,2.03699713801533,2.17149984896422,2.26331917881921,1.80010455196355,2.34635697232272,2.19751675686984,1.98849744166249
X32054,1.58396419486064,2.21077458219808,2.3651466612474,2.27644130295484,2.159216905928,2.27447261432214,1.71644307491861,2.38378712838743,2.16900341339087,2.09040250029055
X32055,2.02315157416061,2.32314821535426,2.40156580088781,2.25996669423879,2.1325544919889,2.1808151200552,2.03195546431945,2.25535825619134,2.10809094996549,2.2375120290139
X32089,2.14061072108022,2.17972230220008,2.44281996699767,2.1493511594931,2.1910041594787,2.12098527568348,1.80199853727052,2.32877219803015,2.01139821922847,2.05183650459555
X32103,2.20542089556071,2.15836939736754,2.26573436919603,2.07843478507043,1.90195826152613,2.12665307952176,1.64750988911914,2.37465735163119,2.07346245249784,1.91714464635418
X32117,2.20580433241567,2.22618881235068,2.40879564726666,2.27368961070717,2.17111899475152,2.16208432775648,1.71711494289847,2.3089289282531,1.98655429919076,2.11830762465157
X34019,2.15146797393175,1.95444080220434,2.25547252087985,2.04441263063538,2.10547228296677,2.05432115010508,1.63252533495693,2.34635792949455,1.91172087126138,2.04663938544746
X34049,2.23070663362861,1.9982802920047,2.3986440832789,1.88893003864609,2.09532104239201,2.00728474167417,1.52725124144615,2.27994779180341,2.03429249060532,1.93848982930897
X34078,2.16896112465595,2.53282977151808,2.39162840420639,1.99411510801197,2.15249681708557,2.09891078007478,2.01158819925438,2.30906604617374,2.08888803275577,2.02785478318327
X34090,1.57851674259111,1.72473964999272,2.3366173694582,1.91324674681233,1.97211242292716,2.10287238296173,1.63687796685949,2.25954501534519,1.64759074791662,2.319343876809
X34102,1.78582690632493,2.2941697833927,2.20928269624369,2.34083225547755,1.97963639965237,2.13579824534716,1.85902551727992,2.32582298946122,1.86717610851281,2.14277777786241
X34103,2.18373398715372,2.16131756779766,2.39323716792621,2.20373334924905,1.92924781444613,2.1099258863486,1.59295887588623,2.36584342003272,1.7381899018853,2.06090071797457
X34113,2.19502549445827,2.26832589116227,2.48447072145172,1.95095028335532,2.03214944235074,2.07861995426931,1.61205249144157,2.19653878668,1.69940475107456,2.16345520083306
X34125,2.12991718938543,1.85634642669257,2.15186336093355,2.17361698700735,1.80434329308887,1.94684970753198,1.53217234493453,2.31729832065065,1.5687596575828,1.94534141592871
X34172,2.20436016944832,1.76895644524013,2.47296479550117,2.00034827897408,1.79633730824869,1.92238414143096,1.90799315711666,2.17068094711368,1.78400951576799,1.87358366603017
X34186,2.20049145748976,2.29746500769947,2.32722111861755,1.95076690731666,2.01593981621716,2.1327796814453,1.85030035294193,2.33661446983308,1.93825089168782,1.81808164766344
X34207,2.11141369158975,2.27575023743887,2.36090682991124,2.0925576482521,2.19375300283299,2.08256042290938,1.96469264835468,2.21680386814782,2.07218150124797,2.1570563042787
X41010,2.1035120095588,2.470396045007,2.09371789781739,1.68363402356061,2.02132104754196,2.0872546893931,1.87060453694015,2.27362682039847,2.41080790836091,2.05776453382946
X41023,2.16278494988925,2.3186218146311,2.46429484519616,2.13733537947373,2.17444485622401,2.02823113859355,1.99202189954315,2.15077683422188,1.98648708497973,2.0893968230158
X41079,2.033630560335,1.90336047247534,2.13941889523983,2.15839365487134,2.04280997379527,2.21759349306258,1.62326586410381,2.3104838157874,1.75530984638838,2.0484886556549
X41165,1.87353452167938,2.36643087424274,2.39952757622961,1.90293106779061,2.19208360738897,2.08242084913258,1.88737717749823,2.40330063745692,2.24120318450843,2.13590103077322
X41203,2.32971084067001,2.03601067826862,2.4990741484829,2.11177440527415,2.08018251708974,2.08133849133263,1.7080698418417,2.38571779095733,1.65106917940505,1.93105898586033
X41264,1.79039854358871,2.31610429536721,2.20133279371407,1.96855187953614,2.24540397301396,2.13603688035605,2.07219157406183,2.45256078395707,2.03330466692282,1.97626059348268
X41266,2.04836229665075,2.10378531294434,2.44861085488776,2.00539664445993,2.10903553747684,2.11181555225844,1.67180031754776,2.20709129633318,1.79907266252228,2.12737419543514
X41307,2.20483333496195,2.15243871855742,2.39670729470447,2.2056743329443,2.29936491377778,1.98444381305756,2.00370455108808,2.28942791570089,2.22041796366729,2.18191012974313
X41324,2.11801180295054,2.36614282081106,2.28361326049228,2.05459157295964,2.21281354660281,2.08938815965482,2.03988437193138,2.37804593532038,2.17012170128203,2.15293012562371
X41325,2.03880312405831,2.25734501978801,2.36951356841433,2.06305425047795,2.08342484777195,2.11131683354361,1.70262584185732,2.31985018975562,1.98432834247356,2.02871519181202
X41358,2.1865522748131,2.25779377278004,2.40930628251518,1.96942576263381,2.21446182535578,2.08479468799109,2.12861853578283,2.31492859752528,2.15127022179131,2.08404592521812
X44078,2.06376302354275,2.51655065512246,2.3504300486899,2.30349567828539,2.14255717599391,2.13170780008435,1.81037021003906,2.15481683544218,1.73495099415239,2.19989655996463
X44087,1.7314927000414,2.16588411109577,2.28296384924688,2.13883128369891,2.14151570064479,2.09759206971716,1.94569155373653,2.37282172402466,2.08838765560464,2.03707929908629
X44090,2.12477335167792,2.31242551681756,2.41573876298676,2.04558610963028,2.19464124340062,2.033082108389,2.1770660867282,2.34497577647815,2.09672998164237,2.0150883367035
X44102,2.0592554158575,2.37719893717294,2.23330253669536,2.09869499860172,1.84190268586298,2.16781407520878,1.66002075451016,2.2110540631982,1.66842543022082,2.16787929674175
X44110,2.07824958157756,2.38388670022859,2.23714803495975,1.82134901533357,2.16243182406064,2.04897202486364,2.1883004308868,2.3387067783481,2.06900097818228,1.92941629885663
X44192,2.2241391098771,2.36892698707671,2.40889006251488,1.86610598435671,2.24293805568613,2.02642439388937,1.53938662387851,2.24443783747009,1.9495321531006,2.26730086171941
X44196,2.21963925865667,2.16754627906642,2.46797409987659,2.34257858440036,2.2812398965496,2.09878082635528,1.66813314476334,2.26234938490764,1.89153692859111,2.16330578413259
X44219,2.19040470813765,1.73863291650148,2.34906306229046,1.96621405125246,2.04971917606253,2.10938740492593,1.67407330387959,2.18212898786866,1.70797741780377,2.20460505228083
X44242,1.65883931832867,2.11775318791081,2.38823512711014,2.20036630360847,2.17602363952608,2.01255760553891,1.63209723978816,2.34996760021248,2.17335870623424,2.05662956583309
X44262,2.11924742012897,2.28921409833557,2.49270780813707,2.24822499550638,2.34200674749572,2.14032730586622,1.89983629238011,2.25880142537989,2.1967989312062,2.13877474173474
X44286,2.11072458471882,2.19038457107135,2.40856181875542,2.15209238130283,1.71895935939815,2.04504417745425,1.67949555018954,2.23166143015712,1.61062920256615,1.96841779795288
X44303,1.87494799286067,2.28135226344603,2.21768276312745,1.88620867243777,2.20853042470519,2.01752225402014,2.02685135405811,2.34849205711489,2.03566074714142,2.07098463261701
X44306,2.18707210383138,2.1552491400788,2.31040444204618,1.9478254565395,2.00720547027236,2.12975197822082,1.50944960724463,2.31140409106224,2.40507037913821,2.13352126287199
X44377,2.13270501898182,2.16848782600711,2.27788863039626,2.23607770156945,2.06990748667185,1.99734850434959,1.70464081375702,2.21395713731764,1.67058381012736,2.02712667303136
X44417,2.07548999459121,2.09013540792323,2.37463036782101,1.85317750170119,1.92940903718295,2.12101165628846,1.89272182715409,2.21510160457735,2.01169655197872,2.08062209455299
X44428,2.13949541241356,1.77568089901536,2.3352400680158,2.56511088287714,1.78758075053164,1.98394059368042,1.66264118165789,2.09647440534715,1.66864788705003,2.11445751382496
X51005,2.09546620812724,2.28035482135242,2.40976095990425,2.0654541729439,2.24850581609555,2.00541145110865,2.04975909429455,2.31412920261179,2.11474956214775,2.1459020427551
X51053,2.17732567873944,2.23916914153929,2.39152868538594,2.12192735129179,2.09663291949241,2.02420759838738,1.91119151489016,2.39539305394917,2.12238129217109,1.93544702960569
X51062,1.88931258631234,2.24289453480433,2.33946460613764,2.18092354562567,2.24446645357916,2.12955820661037,1.74839605358672,2.22462571368416,2.41436525853437,2.10233986256437
X51068,2.01023346846723,2.24006267149445,2.50422958688783,2.27961938843929,2.31954938229175,2.15147262645242,1.85899746849373,2.24370731954919,2.09027514569872,2.02823903264485
X51080,1.83123015113654,2.42991353704952,2.40014818762432,2.04794700461194,2.15757897392986,2.14595701361178,2.04212251916614,2.18571751318007,2.068668722676,2.01240791034211
X51104,2.13970845246648,2.02075917309286,2.31951103758364,2.03739353549766,2.25063263403684,2.04258173938198,1.80863789055787,2.26968269716829,1.99493021876723,2.14160850289091
X51125,2.23373971063004,2.31431996921239,2.32049082428081,1.88802525290359,2.17804402317908,2.03973220917156,1.9907346371864,2.3165590015594,2.06718928843507,2.05497849648685
X51171,1.63605452660436,2.32719575100672,2.36078324389781,2.27664863214507,2.14405232583137,1.92520731669611,1.65613445794122,2.28988073328241,1.59712036192605,2.13601916189181
X51174,2.15488291017969,2.26120356696523,2.5225010411967,2.24052456575868,2.36023871753027,2.20618211630465,2.01590385287579,2.26807439030631,2.19175743750296,2.07458602270344
X60024,2.03904133319534,2.28104066965147,2.29283269255136,2.24479177176069,2.07429708160772,2.19448638746924,1.62698112643224,2.28784701916878,1.95047542658538,1.88651646575169
X60048,2.13442084687508,2.06239202110505,2.45904681459162,2.31830193384056,2.11939876239098,2.1976200546803,1.88890432861442,2.31192830889715,1.97386016830141,2.06701591230144
X60049,1.93317366906219,2.23481789862934,2.48077897598474,2.21135866331977,2.11173083603354,1.992399709681,2.1496366901421,2.1720503487875,2.08213416331832,1.96197611183139
X60065,2.12935607351098,1.970845240956,2.33072152492307,2.18440948028938,2.02753621793526,2.08779902045901,1.66679319578286,2.35144668318401,1.92610386460959,2.19512904991816
X60066,2.06611184469564,1.92926669773217,2.40789780750942,2.16223392706078,2.19113496209829,2.04958138153456,1.82282684174292,2.26425582238776,1.84022894706249,2.11456372308385
X60102,2.10918479292903,2.2139669713358,2.26338885954113,2.31008291395138,2.16899655587966,2.02662340109449,1.69054774283728,2.29726798218101,2.03426895119315,2.0782095330688
X60107,2.24476634353345,2.3773103031886,2.40723245441783,2.06083195243066,2.00615822940067,2.23463596233437,1.95627906272894,2.27805056790719,2.17036141636469,1.91276988388219
X60111,2.22878138224044,2.25758458898307,2.42383500098656,2.16657062007572,2.34164329294277,2.11374030612275,2.04358117622876,2.25716190419605,2.35076935935875,2.15513210016864
X60120,2.10225433974499,2.27419899286851,2.43675927898264,2.26054673400238,2.28594338472548,2.12350388060904,1.69790106841578,2.25614735968815,2.12853285097671,2.18225982861085
X60135,2.25859036233185,2.18320340517396,2.43375194228807,1.96947041346433,1.91854335688903,2.06550107330536,1.80889022961114,2.28942791570089,2.12398221334162,2.19317751010724
X60169,2.28935090618308,2.26296237904927,2.22689016999197,2.06211479685556,2.16181499259833,2.16572817694095,1.9581689872284,2.37724626924502,2.0523529359891,2.12710368892495
X60170,2.22585306563226,2.05321049630837,2.47714997777162,2.24908515523249,2.11411346321111,2.22050698195844,1.66322130395484,2.41241659886281,2.03080917755932,2.18883840033414
X60174,2.11128656348016,1.91907764137887,2.28561084206772,2.03837863272536,2.08121871157752,1.7184931940301,1.64452702534638,2.20363840911646,2.05777475291385,2.1552526163023
X60175,2.16005101179012,2.07882134940036,2.0680569828132,2.31577373919605,2.24409438027325,2.14145226124232,1.66509208435814,2.22305150569673,1.68770365762917,2.03403483465829
X60180,2.1555596350427,2.29740369269361,2.47815390121529,2.36542654993242,2.24358958095737,2.04858148066821,1.89728997043752,2.29860417966281,2.21047309355451,2.09872565221649
X60181,2.05074624151304,2.28184244401589,2.34205000709708,2.035522307745,2.21391780027788,2.09568514708597,1.70542967808783,2.39811797527106,2.23610548917383,2.19119644459788
X60228,2.10985556064356,1.92437857084165,2.28994251128369,1.94097226345426,2.23479970648931,2.21901977152871,1.77988592351554,2.25955858698964,2.16724291903699,2.23768490646343
X60258,2.09349359746102,2.13415105663535,2.2588724662859,2.03434741374563,2.08979525650928,2.08839261106128,1.94268925324924,2.31974501573429,1.95308718951777,2.09602330127151
X60267,2.19562218307689,2.20331598697254,2.4863855556674,2.20260010327306,2.26226505580546,2.0664348198186,1.62295810137855,2.22119172358748,2.17275768926815,2.14676368494399
X60318,2.15731189149172,2.12844596860765,2.23398071746134,2.06551755128855,2.043956840933,2.1134395053744,1.76305988108966,2.32830644454368,1.82385550304801,2.02682895635795
X70005,1.92625248268036,2.28848414021492,2.4223359689598,2.31602931310147,2.26858767465434,2.07185533907196,1.77869449289862,2.26896625997037,2.106454630613,2.04877226058482
X70039,2.06021794671208,2.42178667758952,2.37539307767294,2.06350269037833,2.03656013636147,2.04774058416113,1.77566734947656,2.25547461735767,2.18021065797696,2.02257220370049
X70049,1.71723346099148,1.92287837080146,2.43575754620752,1.74551132139567,2.16899084125107,2.07574346220518,1.61467020011176,2.34291576683606,2.43169484957782,2.13965902180181
X70054,2.13046967591554,1.81417632351206,2.43425262470849,2.23850619954482,1.92643312588721,2.16832086047938,1.67553646608792,2.35674083666189,1.63229273977021,1.76573713962241
X70055,2.19250903216416,2.25828100133751,2.44807148894083,2.25019224695266,2.24083840439607,2.1813977693191,1.60086325490833,2.33899995033608,2.00137729223314,2.20689764203191
X70056,2.20958783631962,2.25153597931827,2.3988511794104,2.31751508394204,2.31283339925011,2.12922050254294,1.69816831105905,2.27071045126506,1.9752067810109,2.10610781507584
X70057,2.09108721680266,2.08554040574166,2.46463336174843,2.42938160715308,2.27660244867043,2.02059214010213,1.71529410522372,2.21794834887619,2.2461163236476,2.2860765741602
X70070,2.18355265215596,2.15896526855228,2.46339866920314,2.29822761295259,2.20559059552276,2.2150175613791,1.63944903954579,2.2688018101864,1.97983803371761,2.14298073553118
X70088,2.1169323941018,2.36342616197234,2.57626052889692,2.21777202522388,2.1087090393604,1.92116507080293,1.70576030704885,2.17110644918116,1.6962502696206,2.04178640237602
X70100,1.78972406586598,2.34850351861904,2.46197402916941,2.00162323319503,2.08627936042148,2.10829256923612,1.87700553897933,2.29849674708544,1.99922069314016,2.02657727712247
X70103,1.93230516236135,2.2514012662989,2.3424248452723,2.25513807639793,2.22534545305287,2.12083417335574,1.95490386974471,2.3204230464839,2.06501675285326,2.12643008390264
X70107,2.05647353485167,2.31972338979811,2.41472110306089,2.13683152592751,2.2539682138099,2.08239592319377,2.22981653112206,2.35245943113918,2.21858590208616,2.16056174556885
X70118,2.19305813196679,2.14143933790765,2.45193311564667,2.36267875034438,2.26098988295303,2.21513434676862,2.00185155279753,2.35835181666008,2.33765199871419,2.11990427167232
X70125,2.13898086889473,2.41665011428202,2.43701895327211,2.10901490692214,2.12864828573448,2.03391186882694,1.96644360167058,2.22599234403003,2.00710872377632,1.99707572100099
X70135,2.06357508249981,1.91737692073301,2.30866059967022,2.02522687898505,2.27790400533726,1.92142715735009,1.71637298782188,2.10535657753805,1.78436049755497,2.15640258281596
X70144,2.15541135096722,2.34849874300828,2.4516566099703,2.19784549563766,2.2185336945787,2.05296922134872,1.97385183309265,2.2894491936009,2.26755152151531,2.11783859841359
X70148,2.22409043647078,2.16433860174255,2.33519167322269,2.21451970618572,1.88900262810886,2.14640368596867,1.72359839455933,2.39298962338863,2.18596700352429,2.09769885795067
X86058,2.23155944252545,2.31881861350132,2.29090818245965,2.23269038640461,2.09367230236855,2.01585989592429,2.04657350746508,2.30601221370144,2.10121648738259,2.07930028170312
X92004,1.88473055183994,2.4356787648328,2.55549014445179,1.97261050088527,2.35650682999779,2.14066598356824,1.93878338532487,2.38268379909964,2.21146273202273,2.0024714005023
X92071,1.99560194744675,2.39856686541138,2.36080399986798,2.11770747225018,2.19621406694253,2.0648189000627,1.96489030936669,2.35710926247916,2.12882081800291,2.0180420885091
X93031,1.92066266826834,2.32349299160573,2.40292623263412,2.04657867452251,2.18738746229612,1.97202057140925,1.63687018336517,2.33708603166811,2.05399295591374,2.06970807480997
X93075,2.05496440587268,2.08485560913117,2.31530090331213,2.08115632060572,1.7747150346188,1.96461553594789,1.66967281125957,2.13414513936705,2.00870652854499,2.12553402275303
X94084,2.04076178218474,2.29893544110942,2.22502887477517,2.02416796805907,1.97102497215385,1.96961551489606,1.78811450106196,2.22404176069524,2.25661130909981,2.03741960877138
X94099,2.17131856220398,2.33233708045762,2.49984041725568,2.30039269143713,2.28270988306381,2.12119989767682,1.67306038913105,2.28365096844015,2.01931328103081,2.19687562757144
X95002,2.27294307729036,1.97969855147272,2.45109388727389,2.34797519779277,2.25276544909215,2.08359166797999,1.60127468376215,2.26107536203729,1.80588917313386,2.19975692379421


================================================
FILE: causaldag/datasets/networks.py
================================================
from causaldag import DAG


cancer_network = DAG(arcs={
    ('Pollution', 'Cancer'),
    ('Smoker', 'Cancer'),
    ('Cancer', 'Xmy'),
    ('Cancer', 'Dysponoea')
})

earthquake_network = DAG(arcs={
    ('Burglary', 'Alarm'),
    ('Earthquake', 'Alarm'),
    ('Alarm', 'JohnCalls'),
    ('Alarm', 'MaryCalls')
})

sachs_network = DAG(arcs={
    ('PKC', 'PKA'),
    ('PKC', 'Jnk'),
    ('PKC', 'P38'),
    ('PKC', 'Raf'),
    ('PKC', 'Mek'),
    ('PKA', 'Jnk'),
    ('PKA', 'P38'),
    ('PKA', 'Raf'),
    ('PKA', 'Mek'),
    ('PKA', 'Erk'),
    ('PKA', 'Akt'),
    ('Raf', 'Mek'),
    ('Mek', 'Erk'),
    ('Erk', 'Akt'),
    ('Plcg', 'PIP3'),
    ('Plcg', 'PIP2'),
    ('PIP3', 'PIP2'),
})


================================================
FILE: causaldag/loaders.py
================================================
from causaldag import DAG
import numpy as np


def load_gml(filename):
    raise NotImplementedError
    pass





================================================
FILE: dev_setup.sh
================================================
#!/usr/bin/env

python3 -m venv venv
source venv/bin/activate
pip3 install numpy numexpr tqdm pygam scikit-learn networkx
pip3 install conditional_independence graphical_models graphical_model_learning
pip3 install twine wheel ipdb ipython
pip3 install jedi==0.17.2

# REPLACE WITH PATH TO OTHER PACKAGES
pip3 install -e ~/Documents/packages/conditional_independence/
pip3 install -e ~/Documents/packages/graphical_models/
pip3 install -e ~/Documents/packages/graphical_model_learning/


================================================
FILE: docs/.gitignore
================================================
_site
.sass-cache
.jekyll-cache
.jekyll-metadata
vendor


================================================
FILE: docs/404.html
================================================
---
permalink: /404.html
layout: default
---

<style type="text/css" media="screen">
  .container {
    margin: 10px auto;
    max-width: 600px;
    text-align: center;
  }
  h1 {
    margin: 30px 0;
    font-size: 4em;
    line-height: 1;
    letter-spacing: -1px;
  }
</style>

<div class="container">
  <h1>404</h1>

  <p><strong>Page not found :(</strong></p>
  <p>The requested page could not be found.</p>
</div>


================================================
FILE: docs/Gemfile
================================================
source "https://rubygems.org"
# Hello! This is where you manage which Jekyll version is used to run.
# When you want to use a different version, change it below, save the
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
#
#     bundle exec jekyll serve
#
# This will help ensure the proper Jekyll version is running.
# Happy Jekylling!
# gem "jekyll", "~> 3.5"
# This is the default theme for new Jekyll sites. You may change this to anything you like.
gem "jekyll-theme-cayman", "~> 0.1.1"
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
# uncomment the line below. To upgrade, run `bundle update github-pages`.
gem "github-pages", "~> 204", group: :jekyll_plugins
# If you have any plugins, put them here!
group :jekyll_plugins do
  gem "jekyll-feed", "~> 0.12"
end

# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library.
install_if -> { RUBY_PLATFORM =~ %r!mingw|mswin|java! } do
  gem "tzinfo", "~> 1.2"
  gem "tzinfo-data"
end

# Performance-booster for watching directories on Windows
gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform?



================================================
FILE: docs/_config.yml
================================================
# Welcome to Jekyll!
#
# This config file is meant for settings that affect your whole blog, values
# which you are expected to set up once and rarely edit after that. If you find
# yourself editing this file very often, consider using Jekyll's data files
# feature for the data you need to update frequently.
#
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'bundle exec jekyll serve'. If you change this file, please restart the server process.
#
# If you need help with YAML syntax, here are some quick references for you: 
# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml
# https://learnxinyminutes.com/docs/yaml/
#
# Site settings
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.

title: CausalDAG
email: your-email@example.com
description: >- # this means to ignore newlines until "baseurl:"
  Python package for the creation, manipulation, and learning of Causal DAGs.
baseurl: "/causaldag" # the subpath of your site, e.g. /blog
url: "https://uhlerlab.github.io" # the base hostname & protocol for your site, e.g. http://example.com
twitter_username: jekyllrb
github_username:  jekyll

# Build settings
theme: jekyll-theme-cayman
plugins:
  - jekyll-feed

# Exclude from processing.
# The following items will not be processed, by default.
# Any item listed under the `exclude:` key here will be automatically added to
# the internal "default list".
#
# Excluded items can be processed by explicitly listing the directories or
# their entries' file path in the `include:` list.
#
# exclude:
#   - .sass-cache/
#   - .jekyll-cache/
#   - gemfiles/
#   - Gemfile
#   - Gemfile.lock
#   - node_modules/
#   - vendor/bundle/
#   - vendor/cache/
#   - vendor/gems/
#   - vendor/ruby/


================================================
FILE: docs/_layouts/default.html
================================================
<!DOCTYPE html>
<html lang="{{ site.lang | default: "en-US" }}">
  <head>

    {% if site.google_analytics %}
      <script async src="https://www.googletagmanager.com/gtag/js?id={{ site.google_analytics }}"></script>
      <script>
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());
        gtag('config', '{{ site.google_analytics }}');
      </script>
    {% endif %}
    <meta charset="UTF-8">

{% seo %}
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="theme-color" content="#157878">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <link rel="stylesheet" href="{{ '/assets/css/style.css?v=' | append: site.github.build_revision | relative_url }}">
  </head>
  <body>

    <header class="page-header" role="banner">
      <h1 class="project-name">{{ page.title | default: site.title | default: site.github.repository_name }}</h1>
      <h2 class="project-tagline">{{ page.description | default: site.description | default: site.github.project_tagline }}</h2>
      {% if site.github.is_project_page %}
        <a href="{{ site.github.repository_url }}" class="btn">View on GitHub</a>
      {% endif %}
      {% if site.show_downloads %}
        <a href="{{ site.github.zip_url }}" class="btn">Download .zip</a>
        <a href="{{ site.github.tar_url }}" class="btn">Download .tar.gz</a>
      {% endif %}
    </header>

    <main id="content" class="main-content" role="main">
      {{ content }}

      <footer class="site-footer">
        {% if site.github.is_project_page %}
          <span class="site-footer-owner"><a href="{{ site.github.repository_url }}">{{ site.github.repository_name }}</a> is maintained by <a href="{{ site.github.owner_url }}">{{ site.github.owner_name }}</a>.</span>
        {% endif %}
        <span class="site-footer-credits">This page was generated by <a href="https://pages.github.com">GitHub Pages</a>.</span>
      </footer>
    </main>
  </body>
</html>
<script type="text/javascript"
        src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_CHTML"></script>

================================================
FILE: docs/dci.markdown
================================================
---
layout: default
title: DCI (Difference Causal Inference)
description: Learning differences of causal graphs.
---

The Difference Causal Inference (DCI) algorithm directly learns the difference between two causal graphs given two datasets. DCI is implemented as a part of the [causaldag](https://github.com/uhlerlab/causaldag) package. The source code
for DCI can be found in the package [here](https://github.com/uhlerlab/causaldag/blob/master/causaldag/structure_learning/difference/difference_dag.py).

![](images/dci.png)

## Install
To install the causaldag package:
```
$ pip3 install causaldag
```

## Simple Example
```python
from causaldag import dci, dci_stability_selection
from causaldag.datasets import create_synthetic_difference
import numpy as np
import itertools as itr

X1, X2, true_difference = create_synthetic_difference(nnodes=8, nsamples=10000)
p = X1.shape[1]

difference_matrix = dci(X1, X2, difference_ug=list(itr.combinations(range(p), 2)))
ddag_edges = set(zip(*np.where(difference_matrix != 0)))
print(true_difference)
print(ddag_edges)
```

## [Tutorial](./dci_tutorial.html)
DCI is applied to gene expression data collected from two different conditions to learn the causal difference gene regulatory network.


[back](./)

================================================
FILE: docs/dci_tutorial.markdown
================================================
---
layout: default
title: DCI Tutorial for Gene Expression Data
description: DCI is applied to gene expression data collected from two different conditions to learn the causal difference gene regulatory network.
---

## Difference Causal Inference (DCI) Tutorial for Gene Expression Data
- DCI [1,2] directly estimates the differences between two causal graphs given gene expression data from two conditions such as healthy and diseased states, different cell types or different time points.
- Changes between two causal graphs are the edges that appeared, disappeared or changed weight between the two states.
- DCI infers the differences between causal graphs directly without estimating each possibly large causal graph separately.


In this tutorial, we apply DCI to bulk RNA-seq data collected from two ovarian cancer patient cohorts with
different survival rates to obtain the causal difference gene regulatory network. For applications of DCI to larger gene expression datasets, we recommend running DCI on a subset of genes (e.g. differentially expressed genes). For most robust results, we recommend using DCI with stability selection [3].


### Algorithm details
DCI algorithm consists of three main steps:
1. Initialization with a difference undirected graph.
2. Estimation of the skeleton of the difference causal graph.
3. Orienting edges in the difference causal graph.

### References

[1] Belyaeva, A., Squires, C., & Uhler, C. (2020). DCI: Learning Causal Differences between Gene Regulatory Networks. In submission.           
[2] Wang, Y., Squires, C., Belyaeva, A., & Uhler, C. (2018). Direct estimation of differences in causal graphs. In Advances in Neural Information Processing Systems (pp. 3770-3781). [[paper]](https://arxiv.org/abs/1802.05631)                        
[3] Meinshausen, N. and Buhlmann, P. (2010). Stability selection.
Journal of the Royal Statistical Society: Series B (Statistical Methodology), 72(4), pp.417-473. [[paper]](https://arxiv.org/pdf/0809.2932.pdf) 

### Table of Contents

<a href='#install'>Installation</a>
<br/>
<a href='#data'>Loading data</a>
<br/>
<a href='#pre'>Data preprocessing</a>
<br/>
<a href='#DCI'>Running DCI</a>
<br/>
<a href='#graph'>Visualizing difference causal graph</a>
<br/>
<a href='#DCI_stability'>Running DCI with stability selection</a>
<br/>

<a id="install"></a>

### Installation 

DCI can be installed directly in this notebook with:


```python
!pip install --user causaldag
```


Import causaldag package that DCI is part of as well as auxilary python packages for data processing and plotting.


```python
from causaldag import dci, dci_stability_selection
from causaldag import get_directed_and_undirected_edges
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx
from sklearn.preprocessing import StandardScaler

# Matplotlib command for Jupyter notebooks only
%matplotlib inline
```

<a id="data"></a>

### Loading data
Read in two gene expression datasets, corresponding to two conditions of interest. DCI expects two matrices of size \\(n_1 \times p\\) and \\(n_2 \times p\\), where \\(n_1\\) and \\(n_2\\) are the number of samples in each dataset and \\(p\\) corresponds to the number of genes. We recommend transforming RNA-seq counts with \\(\log(x + 1)\\) such that the distribution of each gene is approximately Gaussian. 


```python
path_in = 'causaldag/datasets/data/'
gene_exp_diff_1 = pd.read_csv(os.path.join(path_in, 'apoptosis_1.csv'), index_col=0)
gene_exp_diff_2 = pd.read_csv(os.path.join(path_in, 'apoptosis_2.csv'), index_col=0)
gene_names = gene_exp_diff_1.columns.values
```


```python
gene_exp_diff_1.shape, gene_exp_diff_2.shape
```




    ((83, 10), (168, 10))




```python
gene_names
```




    array(['TP53', 'TNFSF10', 'IL1R1', 'PRKAR2B', 'FAS', 'ENDOG', 'CSF2RB',
           'AIFM1', 'BIRC3', 'PIK3R1'], dtype=object)



<a id="pre"></a>
### Data preprocessing
Prior to running DCI, the data should be at least mean cenetered (along with any other transformations).


```python
scaler = StandardScaler(with_std=False)
X1 = scaler.fit_transform(gene_exp_diff_1.values)
X2 = scaler.fit_transform(gene_exp_diff_2.values)
```

<a id="DCI"></a>
### Running DCI
Run DCI on the two datasets with default parameters or by specifying your own hyperparameters.


```python
d_dag = dci(X1, X2, alpha_ug = 0.001, alpha_skeleton=0.5, alpha_orient=0.001, max_set_size=3, verbose=1)
```

    Running KLIEP to get difference undirected graph...
    Maximum iteration reached
    Difference undirected graph:  [(0, 2), (0, 4), (0, 8), (0, 9), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 3), (2, 4), (2, 6), (2, 9), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 6), (5, 8), (5, 9), (6, 7), (6, 8), (7, 8), (7, 9), (8, 9)]
    DCI skeleton estimation...
    Removing edge 0-2 since p-value=0.82759 > alpha=0.50000
    Removing edge 0-4 since p-value=0.56434 < alpha=0.50000
    Removing edge 0-8 since p-value=0.57503 > alpha=0.50000
    Removing edge 0-9 since p-value=0.95151 > alpha=0.50000
    Removing edge 1-3 since p-value=0.55181 > alpha=0.50000
    Removing edge 1-4 since p-value=0.77913 > alpha=0.50000
    Removing edge 1-6 since p-value=0.64699 < alpha=0.50000
    Removing edge 1-7 since p-value=0.51028 < alpha=0.50000
    Removing edge 1-8 since p-value=0.62069 < alpha=0.50000
    Removing edge 1-9 since p-value=0.84008 > alpha=0.50000
    Removing edge 2-3 since p-value=0.59656 < alpha=0.50000
    Removing edge 2-4 since p-value=0.54203 < alpha=0.50000
    Removing edge 2-9 since p-value=0.70060 > alpha=0.50000
    Removing edge 3-4 since p-value=0.97752 > alpha=0.50000
    Removing edge 3-5 since p-value=0.79810 > alpha=0.50000
    Removing edge 3-6 since p-value=0.72510 > alpha=0.50000
    Removing edge 3-7 since p-value=0.54904 < alpha=0.50000
    Removing edge 3-9 since p-value=0.71211 < alpha=0.50000
    Removing edge 4-5 since p-value=0.70280 > alpha=0.50000
    Removing edge 4-6 since p-value=0.65148 > alpha=0.50000
    Removing edge 4-7 since p-value=0.50519 > alpha=0.50000
    Removing edge 4-8 since p-value=0.96052 > alpha=0.50000
    Removing edge 4-9 since p-value=0.70320 < alpha=0.50000
    Removing edge 5-6 since p-value=0.64493 < alpha=0.50000
    Removing edge 5-8 since p-value=0.66995 < alpha=0.50000
    Removing edge 6-7 since p-value=0.51135 < alpha=0.50000
    Removing edge 6-8 since p-value=0.63820 > alpha=0.50000
    Removing edge 7-9 since p-value=0.61907 > alpha=0.50000
    Removing edge 8-9 since p-value=0.67268 > alpha=0.50000
    DCI edge orientation...
    Oriented (5, 9) as (5, 9) since p-value=0.00100 > alpha=0.00100
    Oriented (1, 5) as (5, 1) since p-value=0.00100 > alpha=0.00100
    Oriented (3, 8) as (3, 8) since p-value=0.01109 > alpha=0.00100
    Oriented (2, 6) as (6, 2) since p-value=0.00288 > alpha=0.00100
    Oriented (7, 8) as (7, 8) since p-value=0.23781 > alpha=0.00100


<a id="graph"></a>
### Visualizing causal graphs
Plot directed and undirected edges corresponding to the estimated difference causal graph.


```python
def visualize_ddag(d_dag, gene_names):
    """
    Plots causal graph.

    Parameters
    ----------
    d_dag: array, shape = [n_features, n_features]
        Adjacency matrix corresponding to partially directed acyclic graph (can contain both directed and undirected edges.)
    gene_names: array, shape = [n_features,]
        Names of genes corresponding to each node in the d_dag.
    """
    # obtain directed and undirected edges separately
    ddag_directed, ddag_undirected = get_directed_and_undirected_edges(d_dag)
    # construct networkx graphs for directed and undirected edges separately and together
    G = nx.from_numpy_matrix(d_dag, create_using=nx.MultiDiGraph())
    G_directed = nx.from_numpy_matrix(ddag_directed, create_using=nx.MultiDiGraph())
    G_undirected = nx.from_numpy_matrix(ddag_undirected, create_using=nx.Graph())
    # rename nodes from numbers to gene names
    node_label_mapping = {}
    for i in range(len(gene_names)):
        node_label_mapping[i] = gene_names[i]
    G = nx.relabel_nodes(G, node_label_mapping)
    G_directed = nx.relabel_nodes(G_directed, node_label_mapping)
    G_undirected = nx.relabel_nodes(G_undirected, node_label_mapping)
    # draw causal graph
    pos = nx.circular_layout(G)
    nx.draw(G_directed, arrowstyle='->', arrowsize=20, width = 2, with_labels=True, pos=pos)
    nx.draw(G_undirected, width = 2, with_labels=True, pos=pos)
```


```python
visualize_ddag(d_dag, gene_names)
```


![png](images/DCI_15_0.png)


<a id="DCI_stability"></a>
### Running DCI with stability selection
Since running DCI requires choosing several hyperparameters, we also implemented DCI with stability selection, which computes the difference causal graph that is robust across different hyperparameter settings. There are three main hyperparameters corresponding to the three steps of the DCI algorithm:
1. List of hyperparameters for L1 regularization of the KLIEP algorithm, which computes the difference undirected graph (alpha_ug_grid).
2. List of significance levels for hypothesis testing to determine the skeleton of the difference causal graph (alpha_skeleton_grid).
3. List of significance levels for hypothesis testing to orient edges of the difference causal graph (alpha_orient_grid).

To speed up computation, we recommend to run DCI with stability selection in parallel.


```python
d_dag_stable, stability_scores = dci_stability_selection(X1, X2, alpha_ug_grid = [0.001, 0.01], alpha_skeleton_grid = [0.1, 0.5], alpha_orient_grid = [0.001, 0.01], edge_threshold=0, max_set_size=3, n_jobs = 10, n_bootstrap_iterations=50, random_state=42, verbose=1)
```

```python
visualize_ddag(d_dag_stable, gene_names)
```


![png](images/DCI_18_0.png)

[back](./dci.html)

================================================
FILE: docs/gspo.markdown
================================================
---
layout: default
title: GSPo (Greedy Sparsest Poset)
description: Learning causal graphs in the presence of latent variables.
---

The GSPo algorithm learns causal graphs, up to Markov equivalence, from observational data with latent confounders.
GSPo is implemented as a part of the [causaldag](https://github.com/uhlerlab/causaldag) package. The source code
for GSPo can be found in the package [here](https://github.com/uhlerlab/causaldag/blob/master/causaldag/structure_learning/mag/gspo.py). 
GSPo is described in our paper, [Ordering-Based Causal Structure Learning in the Presence of Latent Variables
](https://arxiv.org/abs/1910.09014).


## Install
To install the causaldag package:
```
$ pip3 install causaldag
```

## Simple Example
Coming soon..

## [Tutorial](./gspo_tutorial.html)


[back](./)


================================================
FILE: docs/gspo_tutorial.markdown
================================================
---
layout: default
title: GSPo tutorial
---

Coming soon.


================================================
FILE: docs/index.markdown
================================================
---
layout: default
---

CausalDAG is a Python package for the creation, manipulation, and learning
of Causal DAGs. CausalDAG requires Python 3.5+.

## Install
Install the latest version of CausalDAG:
```
$ pip3 install causaldag
```

## Documentation
Documentation is available at [https://causaldag.readthedocs.io/en/latest/index.html](https://causaldag.readthedocs.io/en/latest/index.html)

## Simple Example
Find the CPDAG (complete partially directed acyclic graph,
AKA the *essential graph*) corresponding to a DAG:
```
>>> import causaldag as cd
>>> dag = cd.DAG(arcs={(1, 2), (2, 3), (1, 3)})
>>> cpdag = dag.cpdag()
>>> iv = dag.optimal_intervention(cpdag=cpdag)
>>> icpdag = dag.interventional_cpdag([iv], cpdag=cpdag)
>>> dag.reversible_arcs()
{(1,2), (2,3)}
```

## Sample structure learning algorithms
### [Difference Causal Inference (DCI)](./dci.html)
DCI is a structure learning algorithm that directly learns the difference between two causal graphs given two datasets. It has been applied to learning differences between gene regulatory networks given gene expression data corresponding to two condtions.

![](images/dci.png)

### [Unknown Target Interventional Greedy Sparsest Permutations (UT-IGSP)](./utigsp.html)
UT-IGSP is a structure learning algorithm that uses interventional data, with unknown or only partially known targets,
to discover a causal graph. It has been applied to learning protein signalling networks from protein mass spectroscopy data.

## License

Released under the 3-Clause BSD license (see LICENSE.txt):
```
Copyright (C) 2018
Chandler Squires <csquires@mit.edu>
```



================================================
FILE: docs/utigsp.markdown
================================================
---
layout: default
title: UT-IGSP (Unknown-Target Interventional GSP)
description: Learning causal graphs from interventional data with unknown (or partially known) intervention targets.
---

The UT-IGSP algorithm learns a causal graph from interventional data. UT-IGSP is implemented as a part of the [causaldag](https://github.com/uhlerlab/causaldag) package. The source code
for UT-IGSP can be found in the package [here](https://github.com/uhlerlab/causaldag/blob/master/causaldag/structure_learning/dag/gsp.py). UT-IGSP is described in our paper, [Permutation-Based Causal Structure Learning
with Unknown Intervention Targets](https://arxiv.org/pdf/1910.09007.pdf).


## Install
To install the causaldag package:
```
$ pip3 install causaldag
```

## Simple Example
```python
from causaldag import unknown_target_igsp
import causaldag as cd
import random
from causaldag.utils.ci_tests import gauss_ci_suffstat, gauss_ci_test, MemoizedCI_Tester
from causaldag.utils.invariance_tests import gauss_invariance_suffstat, gauss_invariance_test, MemoizedInvarianceTester

# Generate a random graph
nnodes = 10
nodes = set(range(nnodes))
exp_nbrs = 2
d = cd.rand.directed_erdos(nnodes, exp_nbrs/(nnodes-1))
g = cd.rand.rand_weights(d)

# Choose random intervention targets
num_targets = 2
num_settings = 2
targets_list = [random.sample(nodes, num_targets) for _ in range(num_settings)]
print(targets_list)

# Generate observational data
nsamples_obs = 1000
obs_samples = g.sample(nsamples_obs)

# Generate interventional data
iv_mean = 1
iv_var = .1
nsamples_iv = 1000
ivs = [{target: cd.GaussIntervention(iv_mean, iv_var) for target in targets} for targets in targets_list]
iv_samples_list = [g.sample_interventional(iv, nsamples_iv) for iv in ivs]

# Form sufficient statistics
obs_suffstat = gauss_ci_suffstat(obs_samples)
invariance_suffstat = gauss_invariance_suffstat(obs_samples, iv_samples_list)

# Create conditional independence tester and invariance tester
alpha = 1e-3
alpha_inv = 1e-3
ci_tester = MemoizedCI_Tester(gauss_ci_test, obs_suffstat, alpha=alpha)
invariance_tester = MemoizedInvarianceTester(gauss_invariance_test, invariance_suffstat, alpha=alpha_inv)

# Run UT-IGSP
setting_list = [dict(known_interventions=[]) for _ in targets_list]
est_dag, est_targets_list = unknown_target_igsp(setting_list, nodes, ci_tester, invariance_tester)
print(est_targets_list)
```

## [Tutorial](./utigsp_tutorial.html)

## Code base
A codebase for reproducing the results of our paper can be found [here](https://github.com/csquires/utigsp).


[back](./)


================================================
FILE: docs/utigsp_tutorial.markdown
================================================
---
layout: default
title: UT-IGSP tutorial
description: UT-IGSP is applied to protein mass spectroscopy data to learn a causal graph.
---

Coming soon.


================================================
FILE: profiling/__init__.py
================================================


================================================
FILE: profiling/compare_all_dags.py
================================================
import causaldag as cd
import time
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1729)
dags = cd.rand.directed_erdos(8, .5, 50)
cpdags = [dag.cpdag() for dag in dags]
arcs = np.array([len(dag.arcs) for dag in dags])
dir_arcs = np.array([len(cpdag.arcs) for cpdag in cpdags])
edges = np.array([len(cpdag.edges) for cpdag in cpdags])


def run_all_dags():
    all_dags_times = np.zeros(len(dags))
    all_dags_list = []
    for i, cpdag in enumerate(cpdags):
        print(i)

        start = time.time()
        all_dags = cpdag.all_dags()
        all_dags_times[i] = time.time() - start
        all_dags_list.append(all_dags)
    return all_dags_times, all_dags_list


def run_all_dags2():
    all_dags2_times = np.zeros(len(dags))
    all_dags_list = []
    for i, cpdag in enumerate(cpdags):
        print(i)

        start = time.time()
        all_dags = cpdag.all_dags2()
        all_dags2_times[i] = time.time() - start
        all_dags_list.append(all_dags)
    return all_dags2_times, all_dags_list


times1, all_dags = run_all_dags()
times2, all_dags2 = run_all_dags2()
print(all(d1 == d2 for d1, d2 in zip(all_dags, all_dags2)))

mean1 = times1.mean()
mean2 = times2.mean()

median1 = np.median(times1)
median2 = np.median(times2)

================================================
FILE: profiling/profile_cpdag.py
================================================
import causaldag as cd
from line_profiler import LineProfiler
from tqdm import tqdm

nnodes = 100
ngraphs = 100
dags = cd.rand.directed_erdos(nnodes, 40/(nnodes-1), ngraphs)
print('to undirected, then to_complete_pdag_new')
cpdags1 = list(tqdm((dag.cpdag_new(new=True) for dag in dags), total=ngraphs))
print('to undirected, then to_complete_pdag')
cpdag2 = list(tqdm((dag.cpdag_new(new=False) for dag in dags), total=ngraphs))
print('remove unprotected')
cpdag3 = list(tqdm((dag.cpdag() for dag in dags), total=ngraphs))


def compute_cpdags_new():
    return list(tqdm((dag.cpdag_new(new=True) for dag in dags), total=ngraphs))


def compute_cpdags():
    return list(tqdm((dag.cpdag_new(new=False) for dag in dags), total=ngraphs))


lp = LineProfiler()
NEW = True
if NEW:
    lp.add_function(cd.DAG.cpdag_new)
    lp.runcall(compute_cpdags_new)
else:
    lp.add_function(cd.DAG.cpdag_new)
    lp.runcall(compute_cpdags)
lp.print_stats()




# cpdags1 = list(tqdm((dag.cpdag() for dag in dags), total=ngraphs))
# equal = [cpdag1 == cpdag2 for cpdag1, cpdag2 in zip(cpdags1, cpdags2)]
# print(all(equal))


================================================
FILE: profiling/profile_gsp.py
================================================
from line_profiler import LineProfiler
import causaldag as cd
from causaldag.inference.structural import gsp
from causaldag.utils.ci_tests import gauss_ci_test
import numpy as np
import random
np.random.seed(1729)
random.seed(1729)

nnodes = 15
g = cd.rand.rand_weights(cd.rand.directed_erdos(nnodes, 3/(nnodes-1), 1))
iv_node = random
nsamples = 100
samples = {
    frozenset(): g.sample(nsamples),
    frozenset({iv_node}): g.sample_interventional_perfect({iv_node: cd.GaussIntervention(1, .1)}, nsamples)
}
corr = np.corrcoef(samples[frozenset()], rowvar=False)
suffstat = dict(C=corr, n=nsamples)
profiler = LineProfiler()


def run_gsp():
    for i in range(20):
        gsp(suffstat, nnodes, gauss_ci_test, nruns=10)

profiler.add_function(gsp)
profiler.runcall(run_gsp)
profiler.print_stats()


================================================
FILE: profiling/profile_hsic.py
================================================
from line_profiler import LineProfiler
import causaldag as cd
import random
import numpy as np
from causaldag.utils.ci_tests import hsic_test, gauss_ci_test
from tqdm import trange

nnodes = 10
nsamples = 2000
nruns = 30

g = cd.rand.directed_erdos(nnodes, .5)
g = cd.rand.rand_weights(g)
samples = g.sample(nsamples)
# corr = np.corrcoef(samples, rowvar=False)
# suffstat = dict(C=corr, n=nsamples)


def run_hsic_test():
    for _ in trange(nruns):
        i, j = random.sample(list(range(nnodes)), 2)
        cond_set = random.sample(set(range(nnodes)) - {i, j}, 7)
        hsic_test(samples, i, j, cond_set)


profiler = LineProfiler()
profiler.add_function(hsic_test)
profiler.runcall(run_hsic_test)
profiler.print_stats()


# def run_gauss_ci_test():
#     for _ in range(nruns):
#         i, j = random.sample(list(range(nnodes)), 2)
#         cond_set = set(random.sample(set(range(nnodes)) - {i, j}, 2))
#         gauss_ci_test(suffstat, i, j, cond_set)
#
#
# profiler = LineProfiler()
# profiler.add_function(gauss_ci_test)
# profiler.runcall(run_gauss_ci_test)
# profiler.print_stats()


================================================
FILE: profiling/profile_igsp.py
================================================
from line_profiler import LineProfiler
import causaldag as cd
from causaldag.inference.structural import igsp
from causaldag.utils.ci_tests import gauss_ci_test, hsic_invariance_test
import numpy as np
import random
np.random.seed(1729)
random.seed(1729)

nnodes = 15
g = cd.rand.rand_weights(cd.rand.directed_erdos(nnodes, 3/(nnodes-1), 1))
iv_node = random
nsamples = 20
samples = {
    frozenset(): g.sample(nsamples),
    frozenset({iv_node}): g.sample_interventional_perfect({iv_node: cd.GaussIntervention(1, .1)}, nsamples)
}
corr = np.corrcoef(samples[frozenset()], rowvar=False)
suffstat = dict(C=corr, n=nsamples)
profiler = LineProfiler()


def run_igsp():
    for i in range(100):
        igsp(samples, suffstat, nnodes, gauss_ci_test, hsic_invariance_test, nruns=10)

profiler.add_function(igsp)
profiler.runcall(run_igsp)
profiler.print_stats()


================================================
FILE: profiling/profile_init.py
================================================
import causaldag as cd
from line_profiler import LineProfiler
from tqdm import tqdm

nnodes = 500
ngraphs = 100
dags = cd.rand.directed_erdos(nnodes, 40/(nnodes-1), ngraphs)
cpdags1 = [dag.cpdag_new(new=True) for dag in dags]
arcs_edges = [(cpdag.arcs, cpdag.edges) for cpdag in cpdags1]

print('add consecutively')
pdags = list(tqdm((cd.PDAG(arcs=arcs, edges=edges, new=False) for arcs, edges in arcs_edges), total=ngraphs))
print('add all at once')
pdags2 = list(tqdm((cd.PDAG(arcs=arcs, edges=edges, new=True) for arcs, edges in arcs_edges), total=ngraphs))
print('add consecutively')
pdags = list(tqdm((cd.PDAG(arcs=arcs, edges=edges, new=False) for arcs, edges in arcs_edges), total=ngraphs))
eq = [p == p2 for p, p2 in zip(pdags, pdags2)]
a = [p.num_edges for p in pdags]


def init_new():
    return list(tqdm((cd.PDAG(arcs=arcs, edges=edges, new=True) for arcs, edges in arcs_edges), total=ngraphs))


def init():
    return list(tqdm((cd.PDAG(arcs=arcs, edges=edges, new=False) for arcs, edges in arcs_edges), total=ngraphs))


lp = LineProfiler()
NEW = False
if NEW:
    lp.add_function(cd.PDAG._add_arcs_from)
    lp.runcall(init_new)
else:
    lp.add_function(cd.PDAG._add_arc)
    lp.runcall(init)
lp.print_stats()



# cpdags1 = list(tqdm((dag.cpdag() for dag in dags), total=ngraphs))
# equal = [cpdag1 == cpdag2 for cpdag1, cpdag2 in zip(cpdags1, cpdags2)]
# print(all(equal))


================================================
FILE: profiling/profile_pc.py
================================================
from line_profiler import LineProfiler
import causaldag as cd
from causaldag.inference.structural import pcalg, skeleton
import numpy as np
from causaldag.utils.ci_tests import MemoizedCI_Tester, gauss_ci_suffstat, gauss_ci_test
import random
np.random.seed(1729)
random.seed(1729)

nnodes = 20
nodes = set(range(nnodes))
g = cd.rand.rand_weights(cd.rand.directed_erdos(nnodes, 3/(nnodes-1), 1))
iv_node = random
nsamples = 1000
samples = g.sample(nsamples)
suffstat = gauss_ci_suffstat(samples)
profiler = LineProfiler()


def run_pc():
    for i in range(100):
        ci_tester = MemoizedCI_Tester(gauss_ci_test, suffstat)
        pcalg(nodes, ci_tester, max_cond_set=None, verbose=True)


profiler.add_function(pcalg)
profiler.runcall(run_pc)
profiler.print_stats()


================================================
FILE: profiling/profile_perm2dag.py
================================================
import causaldag as cd
from causaldag.utils.ci_tests import MemoizedCI_Tester, gauss_ci_test, gauss_ci_suffstat
import numpy as np
from tqdm import tqdm
import random
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

nnodes = 50
exp_nbrs_list = [2]*5 + [3]*5 + [4]*5 + [5]*5
ngraphs = len(exp_nbrs_list)
nsamples = 2*nnodes
dags = [cd.rand.directed_erdos(nnodes, exp_nbrs/(nnodes-1)) for exp_nbrs in exp_nbrs_list]
gdags = [cd.rand.rand_weights(dag) for dag in dags]
samples = [gdag.sample(nsamples) for gdag in gdags]
suffstats = [gauss_ci_suffstat(samples) for samples in samples]
ci_testers1 = [MemoizedCI_Tester(gauss_ci_test, suffstat) for suffstat in suffstats]

perms = [random.sample(list(range(nnodes)), nnodes) for _ in range(ngraphs)]
imaps1 = list(tqdm((cd.permutation2dag(perm, ci_tester, verbose=False) for perm, ci_tester in zip(perms, ci_testers1)), total=ngraphs))
true_max_degrees = [dag.max_in_degree for dag in dags]
ci_tests_per_dag = [list(zip(*ci_tester.ci_dict.keys()))[-1] for ci_tester in ci_testers1]
ci_tests_sizes = [np.array([len(ci_test) for ci_test in ci_tests]) for ci_tests in ci_tests_per_dag]
max_ci_test_sizes = [sizes.max() for sizes in ci_tests_sizes]

plt.clf()
plt.scatter(true_max_degrees, max_ci_test_sizes)
plt.xlabel('Max degree')
plt.ylabel('Max test size')
# plt.ion()
# plt.show()


================================================
FILE: profiling/time_create_graph.py
================================================
import causaldag as cd
import networkx as nx
from profiling.time_dec import timed


@timed
def test_create_nx_small():
    for _ in range(10000):
        g = nx.DiGraph()
        g.add_edge(1, 2)
        g.add_edge(2, 3)
        g.add_edge(1, 3)


@timed
def test_create_dag_small():
    for _ in range(10000):
        g = cd.DAG()
        g.add_arc(1, 2)
        g.add_arc(2, 3)
        g.add_arc(1, 3)


test_create_nx_small()
test_create_dag_small()

import numpy as np
np.random.seed(1729)
nnodes_large = 1000
arcs = cd.rand.directed_erdos(nnodes_large, .5).arcs
print(len(arcs))


@timed
def test_create_nx_large():
    for i in range(10):
        print(i)
        g = nx.DiGraph()
        g.add_nodes_from(range(nnodes_large))
        g.add_edges_from(arcs)


@timed
def test_create_dag_large():
    for i in range(10):
        print(i)
        g = cd.DAG(nodes=range(nnodes_large), arcs=arcs)


@timed
def test_diff():
    for i in range(5):
        gs = [cd.rand.directed_erdos(200, .5) for _ in range(10)]


@timed
def test_all_at_once():
    for i in range(5):
        gs = cd.rand.directed_erdos(200, .5, 10)


test_diff()
test_all_at_once()



================================================
FILE: profiling/time_dec.py
================================================
from functools import wraps
import time


def timed(func):
    """This decorator prints the execution time for the decorated function."""
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print("{} ran in {}s".format(func.__name__, round(end - start, 2)))
        return result
    return wrapper


================================================
FILE: release.sh
================================================
#!/usr/bin/env

python3 setup.py sdist bdist_wheel
python3 -m twine upload --repository pypi dist/*


================================================
FILE: requirements/default.txt
================================================
scipy==1.1.0
dataclasses==0.6
numpy==1.14.5
#scikit_sparse==0.4.3
matplotlib==2.1.0
pandas==0.21.0
scikit_learn==0.20.2
typing==3.6.6
cvxopt==1.2.3
joblib=0.14.1


================================================
FILE: requirements.txt
================================================
-r requirements/default.txt

================================================
FILE: setup.py
================================================
import setuptools

setuptools.setup(
    name='causaldag',
    version='0.1a.163',
    description='Causal DAG manipulation and inference',
    long_description='CausalDAG is a Python package for the creation, manipulation, and learning of Causal DAGs.',
    author='Chandler Squires',
    author_email='chandlersquires18@gmail.com',
    packages=setuptools.find_packages(exclude=['tests']),
    python_requires='>3.5.0',
    zip_safe=False,
    classifiers=[
        'Topic :: Scientific/Engineering',
        'Topic :: Scientific/Engineering :: Mathematics',
        'Topic :: Scientific/Engineering :: Artificial Intelligence',
    ],
    install_requires=[
        'scipy',
        'dataclasses',
        'numpy',
        # 'scikit_sparse',
        'matplotlib',
        'numexpr',
        'pandas',
        'scikit_learn',
        'typing',
        'pygam',
        'tqdm',
        'networkx',
        'joblib',
        'ipdb',
        'frozendict',
        'conditional_independence',
        'graphical_models',
        'graphical_model_learning'
    ]
)



================================================
FILE: sphinx_docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
SOURCEDIR     = .
BUILDDIR      = _build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

================================================
FILE: sphinx_docs/_build/html/.buildinfo
================================================
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 4273a0b90eec6648e4b017575e023df0
tags: 645f666f9bcd5a90fca523b33c5a78b7


================================================
FILE: sphinx_docs/_build/html/_sources/index.rst.txt
================================================
.. causaldag documentation master file, created by
   sphinx-quickstart on Fri Feb  8 15:19:11 2019.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Welcome to causaldag's documentation!
=====================================

The `causaldag` package provides a unified namespace for 3 packages. Please refer to their documentation for details:

.. _graphical_models: https://graphical-models.readthedocs.io/en/latest/
.. _graphical_model_learning: https://graphical-model-learning.readthedocs.io/en/latest/
.. _conditional_independence: https://conditional-independence.readthedocs.io/en/latest/


- graphical_models_
- graphical_model_learning_
- conditional_independence_


================================================
FILE: sphinx_docs/_build/html/_static/basic.css
================================================
/*
 * basic.css
 * ~~~~~~~~~
 *
 * Sphinx stylesheet -- basic theme.
 *
 * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
 * :license: BSD, see LICENSE for details.
 *
 */

/* -- main layout ----------------------------------------------------------- */

div.clearer {
    clear: both;
}

/* -- relbar ---------------------------------------------------------------- */

div.related {
    width: 100%;
    font-size: 90%;
}

div.related h3 {
    display: none;
}

div.related ul {
    margin: 0;
    padding: 0 0 0 10px;
    list-style: none;
}

div.related li {
    display: inline;
}

div.related li.right {
    float: right;
    margin-right: 5px;
}

/* -- sidebar --------------------------------------------------------------- */

div.sphinxsidebarwrapper {
    padding: 10px 5px 0 10px;
}

div.sphinxsidebar {
    float: left;
    width: 230px;
    margin-left: -100%;
    font-size: 90%;
    word-wrap: break-word;
    overflow-wrap : break-word;
}

div.sphinxsidebar ul {
    list-style: none;
}

div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
    margin-left: 20px;
    list-style: square;
}

div.sphinxsidebar ul ul {
    margin-top: 0;
    margin-bottom: 0;
}

div.sphinxsidebar form {
    margin-top: 10px;
}

div.sphinxsidebar input {
    border: 1px solid #98dbcc;
    font-family: sans-serif;
    font-size: 1em;
}

div.sphinxsidebar #searchbox form.search {
    overflow: hidden;
}

div.sphinxsidebar #searchbox input[type="text"] {
    float: left;
    width: 80%;
    padding: 0.25em;
    box-sizing: border-box;
}

div.sphinxsidebar #searchbox input[type="submit"] {
    float: left;
    width: 20%;
    border-left: none;
    padding: 0.25em;
    box-sizing: border-box;
}


img {
    border: 0;
    max-width: 100%;
}

/* -- search page ----------------------------------------------------------- */

ul.search {
    margin: 10px 0 0 20px;
    padding: 0;
}

ul.search li {
    padding: 5px 0 5px 20px;
    background-image: url(file.png);
    background-repeat: no-repeat;
    background-position: 0 7px;
}

ul.search li a {
    font-weight: bold;
}

ul.search li div.context {
    color: #888;
    margin: 2px 0 0 30px;
    text-align: left;
}

ul.keywordmatches li.goodmatch a {
    font-weight: bold;
}

/* -- index page ------------------------------------------------------------ */

table.contentstable {
    width: 90%;
    margin-left: auto;
    margin-right: auto;
}

table.contentstable p.biglink {
    line-height: 150%;
}

a.biglink {
    font-size: 1.3em;
}

span.linkdescr {
    font-style: italic;
    padding-top: 5px;
    font-size: 90%;
}

/* -- general index --------------------------------------------------------- */

table.indextable {
    width: 100%;
}

table.indextable td {
    text-align: left;
    vertical-align: top;
}

table.indextable ul {
    margin-top: 0;
    margin-bottom: 0;
    list-style-type: none;
}

table.indextable > tbody > tr > td > ul {
    padding-left: 0em;
}

table.indextable tr.pcap {
    height: 10px;
}

table.indextable tr.cap {
    margin-top: 10px;
    background-color: #f2f2f2;
}

img.toggler {
    margin-right: 3px;
    margin-top: 3px;
    cursor: pointer;
}

div.modindex-jumpbox {
    border-top: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
    margin: 1em 0 1em 0;
    padding: 0.4em;
}

div.genindex-jumpbox {
    border-top: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
    margin: 1em 0 1em 0;
    padding: 0.4em;
}

/* -- domain module index --------------------------------------------------- */

table.modindextable td {
    padding: 2px;
    border-collapse: collapse;
}

/* -- general body styles --------------------------------------------------- */

div.body {
    min-width: 450px;
    max-width: 800px;
}

div.body p, div.body dd, div.body li, div.body blockquote {
    -moz-hyphens: auto;
    -ms-hyphens: auto;
    -webkit-hyphens: auto;
    hyphens: auto;
}

a.headerlink {
    visibility: hidden;
}

h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
    visibility: visible;
}

div.body p.caption {
    text-align: inherit;
}

div.body td {
    text-align: left;
}

.first {
    margin-top: 0 !important;
}

p.rubric {
    margin-top: 30px;
    font-weight: bold;
}

img.align-left, .figure.align-left, object.align-left {
    clear: left;
    float: left;
    margin-right: 1em;
}

img.align-right, .figure.align-right, object.align-right {
    clear: right;
    float: right;
    margin-left: 1em;
}

img.align-center, .figure.align-center, object.align-center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

.align-left {
    text-align: left;
}

.align-center {
    text-align: center;
}

.align-right {
    text-align: right;
}

/* -- sidebars -------------------------------------------------------------- */

div.sidebar {
    margin: 0 0 0.5em 1em;
    border: 1px solid #ddb;
    padding: 7px 7px 0 7px;
    background-color: #ffe;
    width: 40%;
    float: right;
}

p.sidebar-title {
    font-weight: bold;
}

/* -- topics ---------------------------------------------------------------- */

div.topic {
    border: 1px solid #ccc;
    padding: 7px 7px 0 7px;
    margin: 10px 0 10px 0;
}

p.topic-title {
    font-size: 1.1em;
    font-weight: bold;
    margin-top: 10px;
}

/* -- admonitions ----------------------------------------------------------- */

div.admonition {
    margin-top: 10px;
    margin-bottom: 10px;
    padding: 7px;
}

div.admonition dt {
    font-weight: bold;
}

div.admonition dl {
    margin-bottom: 0;
}

p.admonition-title {
    margin: 0px 10px 5px 0px;
    font-weight: bold;
}

div.body p.centered {
    text-align: center;
    margin-top: 25px;
}

/* -- tables ---------------------------------------------------------------- */

table.docutils {
    border: 0;
    border-collapse: collapse;
}

table.align-center {
    margin-left: auto;
    margin-right: auto;
}

table caption span.caption-number {
    font-style: italic;
}

table caption span.caption-text {
}

table.docutils td, table.docutils th {
    padding: 1px 8px 1px 5px;
    border-top: 0;
    border-left: 0;
    border-right: 0;
    border-bottom: 1px solid #aaa;
}

table.footnote td, table.footnote th {
    border: 0 !important;
}

th {
    text-align: left;
    padding-right: 5px;
}

table.citation {
    border-left: solid 1px gray;
    margin-left: 1px;
}

table.citation td {
    border-bottom: none;
}

/* -- figures --------------------------------------------------------------- */

div.figure {
    margin: 0.5em;
    padding: 0.5em;
}

div.figure p.caption {
    padding: 0.3em;
}

div.figure p.caption span.caption-number {
    font-style: italic;
}

div.figure p.caption span.caption-text {
}

/* -- field list styles ----------------------------------------------------- */

table.field-list td, table.field-list th {
    border: 0 !important;
}

.field-list ul {
    margin: 0;
    padding-left: 1em;
}

.field-list p {
    margin: 0;
}

.field-name {
    -moz-hyphens: manual;
    -ms-hyphens: manual;
    -webkit-hyphens: manual;
    hyphens: manual;
}

/* -- hlist styles ---------------------------------------------------------- */

table.hlist td {
    vertical-align: top;
}


/* -- other body styles ----------------------------------------------------- */

ol.arabic {
    list-style: decimal;
}

ol.loweralpha {
    list-style: lower-alpha;
}

ol.upperalpha {
    list-style: upper-alpha;
}

ol.lowerroman {
    list-style: lower-roman;
}

ol.upperroman {
    list-style: upper-roman;
}

dl {
    margin-bottom: 15px;
}

dd p {
    margin-top: 0px;
}

dd ul, dd table {
    margin-bottom: 10px;
}

dd {
    margin-top: 3px;
    margin-bottom: 10px;
    margin-left: 30px;
}

dt:target, span.highlighted {
    background-color: #fbe54e;
}

rect.highlighted {
    fill: #fbe54e;
}

dl.glossary dt {
    font-weight: bold;
    font-size: 1.1em;
}

.optional {
    font-size: 1.3em;
}

.sig-paren {
    font-size: larger;
}

.versionmodified {
    font-style: italic;
}

.system-message {
    background-color: #fda;
    padding: 5px;
    border: 3px solid red;
}

.footnote:target  {
    background-color: #ffa;
}

.line-block {
    display: block;
    margin-top: 1em;
    margin-bottom: 1em;
}

.line-block .line-block {
    margin-top: 0;
    margin-bottom: 0;
    margin-left: 1.5em;
}

.guilabel, .menuselection {
    font-family: sans-serif;
}

.accelerator {
    text-decoration: underline;
}

.classifier {
    font-style: oblique;
}

abbr, acronym {
    border-bottom: dotted 1px;
    cursor: help;
}

/* -- code displays --------------------------------------------------------- */

pre {
    overflow: auto;
    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
}

span.pre {
    -moz-hyphens: none;
    -ms-hyphens: none;
    -webkit-hyphens: none;
    hyphens: none;
}

td.linenos pre {
    padding: 5px 0px;
    border: 0;
    background-color: transparent;
    color: #aaa;
}

table.highlighttable {
    margin-left: 0.5em;
}

table.highlighttable td {
    padding: 0 0.5em 0 0.5em;
}

div.code-block-caption {
    padding: 2px 5px;
    font-size: small;
}

div.code-block-caption code {
    background-color: transparent;
}

div.code-block-caption + div > div.highlight > pre {
    margin-top: 0;
}

div.code-block-caption span.caption-number {
    padding: 0.1em 0.3em;
    font-style: italic;
}

div.code-block-caption span.caption-text {
}

div.literal-block-wrapper {
    padding: 1em 1em 0;
}

div.literal-block-wrapper div.highlight {
    margin: 0;
}

code.descname {
    background-color: transparent;
    font-weight: bold;
    font-size: 1.2em;
}

code.descclassname {
    background-color: transparent;
}

code.xref, a code {
    background-color: transparent;
    font-weight: bold;
}

h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
    background-color: transparent;
}

.viewcode-link {
    float: right;
}

.viewcode-back {
    float: right;
    font-family: sans-serif;
}

div.viewcode-block:target {
    margin: -1px -10px;
    padding: 0 10px;
}

/* -- math display ---------------------------------------------------------- */

img.math {
    vertical-align: middle;
}

div.body div.math p {
    text-align: center;
}

span.eqno {
    float: right;
}

span.eqno a.headerlink {
    position: relative;
    left: 0px;
    z-index: 1;
}

div.math:hover a.headerlink {
    visibility: visible;
}

/* -- printout stylesheet --------------------------------------------------- */

@media print {
    div.document,
    div.documentwrapper,
    div.bodywrapper {
        margin: 0 !important;
        width: 100%;
    }

    div.sphinxsidebar,
    div.related,
    div.footer,
    #top-link {
        display: none;
    }
}

================================================
FILE: sphinx_docs/_build/html/_static/css/badge_only.css
================================================
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}

================================================
FILE: sphinx_docs/_build/html/_static/css/theme.css
================================================
html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*!
 *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
 *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
 */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li span.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li span.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li span.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li span.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li span.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p.caption .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.btn .wy-menu-vertical li span.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p.caption .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.nav .wy-menu-vertical li span.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p.caption .btn .headerlink,.rst-content p.caption .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li span.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol li,.rst-content ol.arabic li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content ol.arabic li p:last-child,.rst-content ol.arabic li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover span.toctree-expand,.wy-menu-vertical li.on a:hover span.toctree-expand{color:grey}.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toc
Download .txt
gitextract_8r8o36c7/

├── .coverage
├── .gitignore
├── .travis.yml
├── LICENSE.txt
├── README.md
├── causaldag/
│   ├── __init__.py
│   ├── datasets/
│   │   ├── __init__.py
│   │   ├── data/
│   │   │   ├── apoptosis_1.csv
│   │   │   └── apoptosis_2.csv
│   │   └── networks.py
│   └── loaders.py
├── dev_setup.sh
├── docs/
│   ├── .gitignore
│   ├── 404.html
│   ├── Gemfile
│   ├── _config.yml
│   ├── _layouts/
│   │   └── default.html
│   ├── dci.markdown
│   ├── dci_tutorial.markdown
│   ├── gspo.markdown
│   ├── gspo_tutorial.markdown
│   ├── index.markdown
│   ├── utigsp.markdown
│   └── utigsp_tutorial.markdown
├── profiling/
│   ├── __init__.py
│   ├── compare_all_dags.py
│   ├── profile_cpdag.py
│   ├── profile_gsp.py
│   ├── profile_hsic.py
│   ├── profile_igsp.py
│   ├── profile_init.py
│   ├── profile_pc.py
│   ├── profile_perm2dag.py
│   ├── time_create_graph.py
│   └── time_dec.py
├── release.sh
├── requirements/
│   └── default.txt
├── requirements.txt
├── setup.py
├── sphinx_docs/
│   ├── Makefile
│   ├── _build/
│   │   ├── doctrees/
│   │   │   ├── environment.pickle
│   │   │   └── index.doctree
│   │   └── html/
│   │       ├── .buildinfo
│   │       ├── _sources/
│   │       │   └── index.rst.txt
│   │       ├── _static/
│   │       │   ├── basic.css
│   │       │   ├── css/
│   │       │   │   ├── badge_only.css
│   │       │   │   └── theme.css
│   │       │   ├── doctools.js
│   │       │   ├── documentation_options.js
│   │       │   ├── jquery.js
│   │       │   ├── js/
│   │       │   │   ├── badge_only.js
│   │       │   │   └── theme.js
│   │       │   ├── language_data.js
│   │       │   ├── pygments.css
│   │       │   ├── searchtools.js
│   │       │   └── underscore.js
│   │       ├── genindex.html
│   │       ├── index.html
│   │       ├── objects.inv
│   │       ├── search.html
│   │       └── searchindex.js
│   ├── conf.py
│   ├── index.rst
│   └── requirements.txt
└── tests/
    ├── R_scripts/
    │   ├── config.R
    │   ├── evaluate_bge_score.R
    │   ├── fadcor.R
    │   ├── test_dag2cpdag.R
    │   ├── test_dag2icpdag.R
    │   └── test_msep.R
    ├── __init__.py
    ├── create_test_data/
    │   └── create_bge_data.py
    ├── data/
    │   ├── bge_data/
    │   │   ├── dag_amat
    │   │   ├── dag_amat.npy
    │   │   ├── r_bge.npy
    │   │   └── samples.npy
    │   ├── cpdag1.txt
    │   ├── dag1.txt
    │   ├── icpdag1.txt
    │   ├── interventions.txt
    │   └── random_mag.txt
    ├── test_ci_tests.py
    ├── test_classes/
    │   ├── __init__.py
    │   ├── test_ancestral_graph.py
    │   ├── test_dag.py
    │   ├── test_dag_basics.py
    │   └── test_pdag.py
    ├── test_gaussdag.py
    ├── test_id_formula.py
    ├── test_interventions.py
    ├── test_scores/
    │   ├── test_bge_score.py
    │   └── test_max_likelihood.py
    └── test_structure_learning/
        ├── __init__.py
        ├── test_gsp.py
        └── test_pcalg.py
Download .txt
SYMBOL INDEX (210 symbols across 29 files)

FILE: causaldag/datasets/__init__.py
  function create_synthetic_difference (line 7) | def create_synthetic_difference(

FILE: causaldag/loaders.py
  function load_gml (line 5) | def load_gml(filename):

FILE: profiling/compare_all_dags.py
  function run_all_dags (line 14) | def run_all_dags():
  function run_all_dags2 (line 27) | def run_all_dags2():

FILE: profiling/profile_cpdag.py
  function compute_cpdags_new (line 16) | def compute_cpdags_new():
  function compute_cpdags (line 20) | def compute_cpdags():

FILE: profiling/profile_gsp.py
  function run_gsp (line 23) | def run_gsp():

FILE: profiling/profile_hsic.py
  function run_hsic_test (line 19) | def run_hsic_test():

FILE: profiling/profile_igsp.py
  function run_igsp (line 23) | def run_igsp():

FILE: profiling/profile_init.py
  function init_new (line 21) | def init_new():
  function init (line 25) | def init():

FILE: profiling/profile_pc.py
  function run_pc (line 20) | def run_pc():

FILE: profiling/time_create_graph.py
  function test_create_nx_small (line 7) | def test_create_nx_small():
  function test_create_dag_small (line 16) | def test_create_dag_small():
  function test_create_nx_large (line 35) | def test_create_nx_large():
  function test_create_dag_large (line 44) | def test_create_dag_large():
  function test_diff (line 51) | def test_diff():
  function test_all_at_once (line 57) | def test_all_at_once():

FILE: profiling/time_dec.py
  function timed (line 5) | def timed(func):

FILE: sphinx_docs/_build/html/_static/doctools.js
  function highlight (line 69) | function highlight(node, addItems) {

FILE: sphinx_docs/_build/html/_static/jquery.js
  function DOMEval (line 97) | function DOMEval( code, doc, node ) {
  function toType (line 115) | function toType( obj ) {
  function isArrayLike (line 484) | function isArrayLike( obj ) {
  function Sizzle (line 716) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 855) | function createCache() {
  function markFunction (line 873) | function markFunction( fn ) {
  function assert (line 882) | function assert( fn ) {
  function addHandle (line 904) | function addHandle( attrs, handler ) {
  function siblingCheck (line 919) | function siblingCheck( a, b ) {
  function createInputPseudo (line 945) | function createInputPseudo( type ) {
  function createButtonPseudo (line 956) | function createButtonPseudo( type ) {
  function createDisabledPseudo (line 967) | function createDisabledPseudo( disabled ) {
  function createPositionalPseudo (line 1023) | function createPositionalPseudo( fn ) {
  function testContext (line 1046) | function testContext( context ) {
  function setFilters (line 2128) | function setFilters() {}
  function toSelector (line 2199) | function toSelector( tokens ) {
  function addCombinator (line 2209) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2273) | function elementMatcher( matchers ) {
  function multipleContexts (line 2287) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2296) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2317) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2410) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2468) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function nodeName (line 2804) | function nodeName( elem, name ) {
  function winnow (line 2814) | function winnow( elements, qualifier, not ) {
  function sibling (line 3109) | function sibling( cur, dir ) {
  function createOptions (line 3196) | function createOptions( options ) {
  function Identity (line 3421) | function Identity( v ) {
  function Thrower (line 3424) | function Thrower( ex ) {
  function adoptValue (line 3428) | function adoptValue( value, resolve, reject, noValue ) {
  function resolve (line 3521) | function resolve( depth, deferred, handler, special ) {
  function completed (line 3886) | function completed() {
  function fcamelCase (line 3981) | function fcamelCase( all, letter ) {
  function camelCase (line 3988) | function camelCase( string ) {
  function Data (line 4005) | function Data() {
  function getData (line 4174) | function getData( data ) {
  function dataAttr (line 4199) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4512) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getDefaultDisplay (line 4579) | function getDefaultDisplay( elem ) {
  function showHide (line 4602) | function showHide( elements, show ) {
  function getAll (line 4703) | function getAll( context, tag ) {
  function setGlobalEval (line 4728) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 4744) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 4867) | function returnTrue() {
  function returnFalse (line 4871) | function returnFalse() {
  function safeActiveElement (line 4877) | function safeActiveElement() {
  function on (line 4883) | function on( elem, types, selector, data, fn, one ) {
  function manipulationTarget (line 5611) | function manipulationTarget( elem, content ) {
  function disableScript (line 5622) | function disableScript( elem ) {
  function restoreScript (line 5626) | function restoreScript( elem ) {
  function cloneCopyEvent (line 5636) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 5671) | function fixInput( src, dest ) {
  function domManip (line 5684) | function domManip( collection, args, callback, ignored ) {
  function remove (line 5774) | function remove( elem, selector, keepData ) {
  function computeStyleTests (line 6067) | function computeStyleTests() {
  function roundPixelMeasures (line 6109) | function roundPixelMeasures( measure ) {
  function curCSS (line 6154) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 6207) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 6244) | function vendorPropName( name ) {
  function finalPropName (line 6265) | function finalPropName( name ) {
  function setPositiveNumber (line 6273) | function setPositiveNumber( elem, value, subtract ) {
  function boxModelAdjustment (line 6285) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
  function getWidthOrHeight (line 6350) | function getWidthOrHeight( elem, dimension, extra ) {
  function Tween (line 6683) | function Tween( elem, options, prop, end, easing ) {
  function schedule (line 6806) | function schedule() {
  function createFxNow (line 6819) | function createFxNow() {
  function genFx (line 6827) | function genFx( type, includeWidth ) {
  function createTween (line 6847) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6861) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 7033) | function propFilter( props, specialEasing ) {
  function Animation (line 7070) | function Animation( elem, properties, options ) {
  function stripAndCollapse (line 7785) | function stripAndCollapse( value ) {
  function getClass (line 7791) | function getClass( elem ) {
  function classesToArray (line 7795) | function classesToArray( value ) {
  function buildParams (line 8417) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 8567) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8601) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8630) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8650) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8708) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 9221) | function done( status, nativeStatusText, responses, headers ) {

FILE: sphinx_docs/_build/html/_static/js/badge_only.js
  function r (line 1) | function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{...

FILE: sphinx_docs/_build/html/_static/js/theme.js
  function t (line 1) | function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{...

FILE: sphinx_docs/_build/html/_static/language_data.js
  function splitQuery (line 278) | function splitQuery(query) {

FILE: sphinx_docs/_build/html/_static/searchtools.js
  function splitQuery (line 45) | function splitQuery(query) {
  function pulse (line 102) | function pulse() {
  function displayNextItem (line 233) | function displayNextItem() {

FILE: tests/test_ci_tests.py
  class TestKCI (line 13) | class TestKCI(TestCase):
    method test_hsic_invariance_cond_set_false_negatives (line 124) | def test_hsic_invariance_cond_set_false_negatives(self):

FILE: tests/test_classes/test_ancestral_graph.py
  class TestAncestralGraph (line 12) | class TestAncestralGraph(TestCase):
    method setUp (line 13) | def setUp(self):
    method test_children (line 16) | def test_children(self):
    method test_parents (line 22) | def test_parents(self):
    method test_spouses (line 28) | def test_spouses(self):
    method test_neighbors (line 34) | def test_neighbors(self):
    method test_add_node (line 40) | def test_add_node(self):
    method test_add_directed (line 44) | def test_add_directed(self):
    method test_msep_from_given (line 86) | def test_msep_from_given(self):
    method test_msep (line 91) | def test_msep(self):
    method test_disc_paths (line 152) | def test_disc_paths(self):
    method test_legitimate_mark_changes (line 166) | def test_legitimate_mark_changes(self):
    method test_ancestor_dict (line 179) | def test_ancestor_dict(self):
    method test_fast_markov_equivalence_simple (line 188) | def test_fast_markov_equivalence_simple(self):
    method test_fast_markov_equivalence_all (line 196) | def test_fast_markov_equivalence_all(self):

FILE: tests/test_classes/test_dag.py
  class TestDAG (line 7) | class TestDAG(TestCase):
    method setUp (line 8) | def setUp(self):
    method test_neighbors (line 11) | def test_neighbors(self):
    method test_children (line 18) | def test_children(self):
    method test_parents (line 25) | def test_parents(self):
    method test_downstream (line 32) | def test_downstream(self):
    method test_upstream (line 39) | def test_upstream(self):
    method test_sources (line 46) | def test_sources(self):
    method test_sinks (line 49) | def test_sinks(self):
    method test_add_node (line 52) | def test_add_node(self):
    method test_add_arc (line 56) | def test_add_arc(self):
    method test_topological_sort (line 65) | def test_topological_sort(self):
    method test_add_arc_cycle (line 71) | def test_add_arc_cycle(self):
    method test_interventional_cpdag_2node (line 81) | def test_interventional_cpdag_2node(self):
    method test_interventional_cpdag_3node (line 90) | def test_interventional_cpdag_3node(self):
    method test_incident_arcs (line 110) | def test_incident_arcs(self):
    method test_shd (line 117) | def test_shd(self):
    method test_dsep (line 133) | def test_dsep(self):
    method test_is_invariant (line 150) | def test_is_invariant(self):
    method test_marginal_mag (line 160) | def test_marginal_mag(self):
    method test_markov_blanket (line 167) | def test_markov_blanket(self):

FILE: tests/test_classes/test_dag_basics.py
  class TestDAG (line 7) | class TestDAG(TestCase):
    method setUp (line 8) | def setUp(self):
    method test_neighbors (line 11) | def test_neighbors(self):
    method test_children (line 18) | def test_children(self):
    method test_parents (line 25) | def test_parents(self):
    method test_downstream (line 32) | def test_downstream(self):
    method test_upstream (line 39) | def test_upstream(self):
    method test_add_node (line 46) | def test_add_node(self):
    method test_add_arc (line 50) | def test_add_arc(self):
    method test_topological_sort (line 59) | def test_topological_sort(self):
    method test_add_arc_cycle (line 65) | def test_add_arc_cycle(self):
    method test_amat (line 81) | def test_amat(self):
    method test_incident_arcs (line 89) | def test_incident_arcs(self):

FILE: tests/test_classes/test_pdag.py
  class TestDAG (line 11) | class TestDAG(TestCase):
    method test_copy (line 12) | def test_copy(self):
    method test_cpdag_confounding (line 27) | def test_cpdag_confounding(self):
    method test_cpdag_v (line 53) | def test_cpdag_v(self):
    method test_interventional_cpdag (line 127) | def test_interventional_cpdag(self):
    method test_pdag2alldags_3nodes_complete (line 146) | def test_pdag2alldags_3nodes_complete(self):
    method test_pdag2alldags_3nodes_chain (line 163) | def test_pdag2alldags_3nodes_chain(self):
    method test_pdag2alldags_5nodes (line 174) | def test_pdag2alldags_5nodes(self):
    method test_pdag2alldags_6nodes_complete (line 187) | def test_pdag2alldags_6nodes_complete(self):
    method test_icpdag2alldags (line 193) | def test_icpdag2alldags(self):
    method test_optimal_intervention_1intervention (line 199) | def test_optimal_intervention_1intervention(self):
    method test_optimal_intervention_2interventions (line 205) | def test_optimal_intervention_2interventions(self):
    method test_optimal_intervention_2interventions2 (line 212) | def test_optimal_intervention_2interventions2(self):
    method test_fully_orienting_interventions_6nodes_complete (line 219) | def test_fully_orienting_interventions_6nodes_complete(self):
    method test_to_dag (line 223) | def test_to_dag(self):
    method test_to_dag_complete3 (line 234) | def test_to_dag_complete3(self):
    method test_from_amat (line 259) | def test_from_amat(self):
    method test_shd (line 269) | def test_shd(self):
    method test_to_complete_pdag (line 305) | def test_to_complete_pdag(self):

FILE: tests/test_gaussdag.py
  class TestGaussDAG (line 8) | class TestGaussDAG(TestCase):
    method setUp (line 9) | def setUp(self):
    method test_arcs (line 16) | def test_arcs(self):
    method test_add_node (line 19) | def test_add_node(self):
    method test_add_arc (line 22) | def test_add_arc(self):
    method test_remove_node (line 25) | def test_remove_node(self):
    method test_remove_arc (line 28) | def test_remove_arc(self):
    method test_logpdf_observational (line 41) | def test_logpdf_observational(self):

FILE: tests/test_id_formula.py
  class TestIDFormula (line 6) | class TestIDFormula(TestCase):
    method test_marginalizing_probability_term (line 7) | def test_marginalizing_probability_term(self):
    method test_marginalizing_prob_term_twice (line 17) | def test_marginalizing_prob_term_twice(self):
    method test_conditioning_probability_term (line 39) | def test_conditioning_probability_term(self):
    method test_marginalizing_product (line 53) | def test_marginalizing_product(self):
    method test_conditioning_product (line 62) | def test_conditioning_product(self):
    method test_marginalizing_marginal (line 71) | def test_marginalizing_marginal(self):
    method test_conditioning_marginal (line 89) | def test_conditioning_marginal(self):

FILE: tests/test_interventions.py
  class TestDAG (line 10) | class TestDAG(TestCase):
    method setUp (line 11) | def setUp(self):
    method test_arcs (line 18) | def test_arcs(self):
    method test_add_node (line 21) | def test_add_node(self):
    method test_add_arc (line 24) | def test_add_arc(self):
    method test_remove_node (line 27) | def test_remove_node(self):
    method test_remove_arc (line 30) | def test_remove_arc(self):
    method test_scaling_intervention (line 97) | def test_scaling_intervention(self):
    method test_mixed_interventions (line 145) | def test_mixed_interventions(self):

FILE: tests/test_scores/test_bge_score.py
  class TestBGEScore (line 13) | class TestBGEScore(TestCase):
    method test_1 (line 14) | def test_1(self):

FILE: tests/test_scores/test_max_likelihood.py
  class TestDAG (line 7) | class TestDAG(TestCase):
    method test1 (line 8) | def test1(self):

FILE: tests/test_structure_learning/test_gsp.py
  class TestGSP (line 18) | class TestGSP(TestCase):
    method test_gsp (line 19) | def test_gsp(self):

FILE: tests/test_structure_learning/test_pcalg.py
  class TestDAG (line 7) | class TestDAG(TestCase):
    method test_cpdag_confounding (line 8) | def test_cpdag_confounding(self):
Condensed preview — 95 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (754K chars).
[
  {
    "path": ".gitignore",
    "chars": 239,
    "preview": "# Compiled python modules.\n*.pyc\n\n# Setuptools distribution folder.\n/dist/\nbuild/\n\n# Python egg metadata, regenerated fr"
  },
  {
    "path": ".travis.yml",
    "chars": 75,
    "preview": "language:\n  python\nafter_success:\n  bash <(curl -s https://codecov.io/bash)"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1578,
    "preview": "License\n=======\n\nCausalDAG is distributed with the 3-clause BSD license.\n\n::\nCopyright 2018, CausalDAG Developers\nChandl"
  },
  {
    "path": "README.md",
    "chars": 2445,
    "preview": "[![PyPI version](https://badge.fury.io/py/causaldag.svg)](https://badge.fury.io/py/causaldag)\n\n**This package is nearing"
  },
  {
    "path": "causaldag/__init__.py",
    "chars": 993,
    "preview": "\"\"\"\nCausalDAG\n=========\n\nCausalDAG is a Python package for the creation, manipulation, and learning of Causal DAGs.\n\nSim"
  },
  {
    "path": "causaldag/datasets/__init__.py",
    "chars": 1404,
    "preview": "from graphical_models.rand import *\nimport numpy as np\nimport random\nfrom .networks import *\n\n\ndef create_synthetic_diff"
  },
  {
    "path": "causaldag/datasets/data/apoptosis_1.csv",
    "chars": 14610,
    "preview": ",TP53,TNFSF10,IL1R1,PRKAR2B,FAS,ENDOG,CSF2RB,AIFM1,BIRC3,PIK3R1\nX129,2.21285183322192,2.34644502829575,2.30345571389366,"
  },
  {
    "path": "causaldag/datasets/data/apoptosis_2.csv",
    "chars": 29551,
    "preview": ",TP53,TNFSF10,IL1R1,PRKAR2B,FAS,ENDOG,CSF2RB,AIFM1,BIRC3,PIK3R1\nX49,2.07529922411638,1.79399530122519,2.4102010632009,2."
  },
  {
    "path": "causaldag/datasets/networks.py",
    "chars": 689,
    "preview": "from causaldag import DAG\n\n\ncancer_network = DAG(arcs={\n    ('Pollution', 'Cancer'),\n    ('Smoker', 'Cancer'),\n    ('Can"
  },
  {
    "path": "causaldag/loaders.py",
    "chars": 113,
    "preview": "from causaldag import DAG\nimport numpy as np\n\n\ndef load_gml(filename):\n    raise NotImplementedError\n    pass\n\n\n\n"
  },
  {
    "path": "dev_setup.sh",
    "chars": 486,
    "preview": "#!/usr/bin/env\n\npython3 -m venv venv\nsource venv/bin/activate\npip3 install numpy numexpr tqdm pygam scikit-learn network"
  },
  {
    "path": "docs/.gitignore",
    "chars": 56,
    "preview": "_site\n.sass-cache\n.jekyll-cache\n.jekyll-metadata\nvendor\n"
  },
  {
    "path": "docs/404.html",
    "chars": 419,
    "preview": "---\npermalink: /404.html\nlayout: default\n---\n\n<style type=\"text/css\" media=\"screen\">\n  .container {\n    margin: 10px aut"
  },
  {
    "path": "docs/Gemfile",
    "chars": 1149,
    "preview": "source \"https://rubygems.org\"\n# Hello! This is where you manage which Jekyll version is used to run.\n# When you want to "
  },
  {
    "path": "docs/_config.yml",
    "chars": 1991,
    "preview": "# Welcome to Jekyll!\n#\n# This config file is meant for settings that affect your whole blog, values\n# which you are expe"
  },
  {
    "path": "docs/_layouts/default.html",
    "chars": 2201,
    "preview": "<!DOCTYPE html>\n<html lang=\"{{ site.lang | default: \"en-US\" }}\">\n  <head>\n\n    {% if site.google_analytics %}\n      <scr"
  },
  {
    "path": "docs/dci.markdown",
    "chars": 1256,
    "preview": "---\nlayout: default\ntitle: DCI (Difference Causal Inference)\ndescription: Learning differences of causal graphs.\n---\n\nTh"
  },
  {
    "path": "docs/dci_tutorial.markdown",
    "chars": 9871,
    "preview": "---\nlayout: default\ntitle: DCI Tutorial for Gene Expression Data\ndescription: DCI is applied to gene expression data col"
  },
  {
    "path": "docs/gspo.markdown",
    "chars": 811,
    "preview": "---\nlayout: default\ntitle: GSPo (Greedy Sparsest Poset)\ndescription: Learning causal graphs in the presence of latent va"
  },
  {
    "path": "docs/gspo_tutorial.markdown",
    "chars": 59,
    "preview": "---\nlayout: default\ntitle: GSPo tutorial\n---\n\nComing soon.\n"
  },
  {
    "path": "docs/index.markdown",
    "chars": 1615,
    "preview": "---\nlayout: default\n---\n\nCausalDAG is a Python package for the creation, manipulation, and learning\nof Causal DAGs. Caus"
  },
  {
    "path": "docs/utigsp.markdown",
    "chars": 2558,
    "preview": "---\nlayout: default\ntitle: UT-IGSP (Unknown-Target Interventional GSP)\ndescription: Learning causal graphs from interven"
  },
  {
    "path": "docs/utigsp_tutorial.markdown",
    "chars": 153,
    "preview": "---\nlayout: default\ntitle: UT-IGSP tutorial\ndescription: UT-IGSP is applied to protein mass spectroscopy data to learn a"
  },
  {
    "path": "profiling/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "profiling/compare_all_dags.py",
    "chars": 1261,
    "preview": "import causaldag as cd\nimport time\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nnp.random.seed(1729)\ndags = cd.ra"
  },
  {
    "path": "profiling/profile_cpdag.py",
    "chars": 1107,
    "preview": "import causaldag as cd\nfrom line_profiler import LineProfiler\nfrom tqdm import tqdm\n\nnnodes = 100\nngraphs = 100\ndags = c"
  },
  {
    "path": "profiling/profile_gsp.py",
    "chars": 800,
    "preview": "from line_profiler import LineProfiler\nimport causaldag as cd\nfrom causaldag.inference.structural import gsp\nfrom causal"
  },
  {
    "path": "profiling/profile_hsic.py",
    "chars": 1097,
    "preview": "from line_profiler import LineProfiler\nimport causaldag as cd\nimport random\nimport numpy as np\nfrom causaldag.utils.ci_t"
  },
  {
    "path": "profiling/profile_igsp.py",
    "chars": 858,
    "preview": "from line_profiler import LineProfiler\nimport causaldag as cd\nfrom causaldag.inference.structural import igsp\nfrom causa"
  },
  {
    "path": "profiling/profile_init.py",
    "chars": 1393,
    "preview": "import causaldag as cd\nfrom line_profiler import LineProfiler\nfrom tqdm import tqdm\n\nnnodes = 500\nngraphs = 100\ndags = c"
  },
  {
    "path": "profiling/profile_pc.py",
    "chars": 770,
    "preview": "from line_profiler import LineProfiler\nimport causaldag as cd\nfrom causaldag.inference.structural import pcalg, skeleton"
  },
  {
    "path": "profiling/profile_perm2dag.py",
    "chars": 1344,
    "preview": "import causaldag as cd\nfrom causaldag.utils.ci_tests import MemoizedCI_Tester, gauss_ci_test, gauss_ci_suffstat\nimport n"
  },
  {
    "path": "profiling/time_create_graph.py",
    "chars": 1154,
    "preview": "import causaldag as cd\nimport networkx as nx\nfrom profiling.time_dec import timed\n\n\n@timed\ndef test_create_nx_small():\n "
  },
  {
    "path": "profiling/time_dec.py",
    "chars": 399,
    "preview": "from functools import wraps\nimport time\n\n\ndef timed(func):\n    \"\"\"This decorator prints the execution time for the decor"
  },
  {
    "path": "release.sh",
    "chars": 100,
    "preview": "#!/usr/bin/env\n\npython3 setup.py sdist bdist_wheel\npython3 -m twine upload --repository pypi dist/*\n"
  },
  {
    "path": "requirements/default.txt",
    "chars": 162,
    "preview": "scipy==1.1.0\ndataclasses==0.6\nnumpy==1.14.5\n#scikit_sparse==0.4.3\nmatplotlib==2.1.0\npandas==0.21.0\nscikit_learn==0.20.2\n"
  },
  {
    "path": "requirements.txt",
    "chars": 27,
    "preview": "-r requirements/default.txt"
  },
  {
    "path": "setup.py",
    "chars": 1063,
    "preview": "import setuptools\n\nsetuptools.setup(\n    name='causaldag',\n    version='0.1a.163',\n    description='Causal DAG manipulat"
  },
  {
    "path": "sphinx_docs/Makefile",
    "chars": 580,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHI"
  },
  {
    "path": "sphinx_docs/_build/html/.buildinfo",
    "chars": 230,
    "preview": "# Sphinx build info version 1\n# This file hashes the configuration used when building these files. When it is not found,"
  },
  {
    "path": "sphinx_docs/_build/html/_sources/index.rst.txt",
    "chars": 745,
    "preview": ".. causaldag documentation master file, created by\n   sphinx-quickstart on Fri Feb  8 15:19:11 2019.\n   You can adapt th"
  },
  {
    "path": "sphinx_docs/_build/html/_static/basic.css",
    "chars": 10912,
    "preview": "/*\n * basic.css\n * ~~~~~~~~~\n *\n * Sphinx stylesheet -- basic theme.\n *\n * :copyright: Copyright 2007-2019 by the Sphinx"
  },
  {
    "path": "sphinx_docs/_build/html/_static/css/badge_only.css",
    "chars": 3275,
    "preview": ".fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:\""
  },
  {
    "path": "sphinx_docs/_build/html/_static/css/theme.css",
    "chars": 122337,
    "preview": "html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgr"
  },
  {
    "path": "sphinx_docs/_build/html/_static/doctools.js",
    "chars": 9313,
    "preview": "/*\n * doctools.js\n * ~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for all documentation.\n *\n * :copyright: Copyright 20"
  },
  {
    "path": "sphinx_docs/_build/html/_static/documentation_options.js",
    "chars": 304,
    "preview": "var DOCUMENTATION_OPTIONS = {\n    URL_ROOT: document.getElementById(\"documentation_options\").getAttribute('data-url_root"
  },
  {
    "path": "sphinx_docs/_build/html/_static/jquery.js",
    "chars": 271809,
    "preview": "/*!\n * jQuery JavaScript Library v3.3.1-dfsg\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *"
  },
  {
    "path": "sphinx_docs/_build/html/_static/js/badge_only.js",
    "chars": 934,
    "preview": "!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.expo"
  },
  {
    "path": "sphinx_docs/_build/html/_static/js/theme.js",
    "chars": 4916,
    "preview": "!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.expo"
  },
  {
    "path": "sphinx_docs/_build/html/_static/language_data.js",
    "chars": 10847,
    "preview": "/*\n * language_data.js\n * ~~~~~~~~~~~~~~~~\n *\n * This script contains the language-specific data used by searchtools.js,"
  },
  {
    "path": "sphinx_docs/_build/html/_static/pygments.css",
    "chars": 4810,
    "preview": "pre { line-height: 125%; }\ntd.linenos pre { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right:"
  },
  {
    "path": "sphinx_docs/_build/html/_static/searchtools.js",
    "chars": 15059,
    "preview": "/*\n * searchtools.js\n * ~~~~~~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for the full-text search.\n *\n * :copyright: C"
  },
  {
    "path": "sphinx_docs/_build/html/_static/underscore.js",
    "chars": 58307,
    "preview": "//     Underscore.js 1.9.1\n//     http://underscorejs.org\n//     (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Invest"
  },
  {
    "path": "sphinx_docs/_build/html/genindex.html",
    "chars": 3798,
    "preview": "\n\n\n<!DOCTYPE html>\n<html class=\"writer-html4\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" />\n  \n  <meta name=\"viewport\" c"
  },
  {
    "path": "sphinx_docs/_build/html/index.html",
    "chars": 4747,
    "preview": "\n\n<!DOCTYPE html>\n<html class=\"writer-html4\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" />\n  \n  <meta name=\"viewport\" co"
  },
  {
    "path": "sphinx_docs/_build/html/search.html",
    "chars": 4268,
    "preview": "\n\n<!DOCTYPE html>\n<html class=\"writer-html4\" lang=\"en\" >\n<head>\n  <meta charset=\"utf-8\" />\n  \n  <meta name=\"viewport\" co"
  },
  {
    "path": "sphinx_docs/_build/html/searchindex.js",
    "chars": 759,
    "preview": "Search.setIndex({docnames:[\"index\"],envversion:{\"sphinx.domains.c\":1,\"sphinx.domains.changeset\":1,\"sphinx.domains.cpp\":1"
  },
  {
    "path": "sphinx_docs/conf.py",
    "chars": 5614,
    "preview": "# -*- coding: utf-8 -*-\n#\n# Configuration file for the Sphinx documentation builder.\n#\n# This file does only contain a s"
  },
  {
    "path": "sphinx_docs/index.rst",
    "chars": 745,
    "preview": ".. causaldag documentation master file, created by\n   sphinx-quickstart on Fri Feb  8 15:19:11 2019.\n   You can adapt th"
  },
  {
    "path": "sphinx_docs/requirements.txt",
    "chars": 93,
    "preview": "dataclasses==0.6\ntyping==3.6.6\nnumpy==1.19.4\nscipy==1.4.1\nscikit-learn==0.23.1\nnumba==0.49.1\n"
  },
  {
    "path": "tests/R_scripts/config.R",
    "chars": 35,
    "preview": "library(here)\n\nTEST_FOLDER = here()"
  },
  {
    "path": "tests/R_scripts/evaluate_bge_score.R",
    "chars": 585,
    "preview": "library(\"BiDAG\")\nlibrary(\"RcppCNPy\")\n\nsamples = npyLoad(\"tests/data/bge_data/samples.npy\")\nmyScore = scoreparameters(\n  "
  },
  {
    "path": "tests/R_scripts/fadcor.R",
    "chars": 306,
    "preview": "\nlibrary('energy')\n# source('/Users/chandlersquires/Desktop/energy-master/R/dcov2d.R')\nlibrary('RcppCNPy')\n\n# args = com"
  },
  {
    "path": "tests/R_scripts/test_dag2cpdag.R",
    "chars": 205,
    "preview": "library(pcalg)\n\namat = read.table('~/Documents/causaldag/tests/dag1.txt')\ncpdag = dag2cpdag(as.matrix(amat))\nwrite.table"
  },
  {
    "path": "tests/R_scripts/test_dag2icpdag.R",
    "chars": 454,
    "preview": "library(pcalg)\n\namat = read.table('~/Documents/causaldag/tests/dag1.txt')\nintervention_mat = as.matrix(read.table('~/Doc"
  },
  {
    "path": "tests/R_scripts/test_msep.R",
    "chars": 604,
    "preview": "#!/usr/bin/env Rscript\nsuppressMessages(library(ggm))\nsuppressMessages(library(tseries))\n# source('./config')\n\nargs = co"
  },
  {
    "path": "tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "tests/create_test_data/create_bge_data.py",
    "chars": 360,
    "preview": "import causaldag as cd\nimport numpy as np\nimport random\nimport os\nnp.random.seed(12312)\nrandom.seed(12312)\n\nd = cd.rand."
  },
  {
    "path": "tests/data/bge_data/dag_amat.npy",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "tests/data/cpdag1.txt",
    "chars": 1800,
    "preview": "0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1\n1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1\n"
  },
  {
    "path": "tests/data/dag1.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "tests/data/icpdag1.txt",
    "chars": 1800,
    "preview": "0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1\n0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1\n"
  },
  {
    "path": "tests/data/interventions.txt",
    "chars": 1250,
    "preview": "8.300000000000000000e+01 5.000000000000000000e+00 5.200000000000000000e+01 6.400000000000000000e+01 5.800000000000000000"
  },
  {
    "path": "tests/data/random_mag.txt",
    "chars": 2500,
    "preview": "0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000"
  },
  {
    "path": "tests/test_ci_tests.py",
    "chars": 9981,
    "preview": "from unittest import TestCase\nimport unittest\nimport numpy as np\nimport causaldag as cd\nfrom causaldag import GaussInter"
  },
  {
    "path": "tests/test_classes/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "tests/test_classes/test_ancestral_graph.py",
    "chars": 8805,
    "preview": "from unittest import TestCase\nimport unittest\nimport numpy as np\nimport subprocess\nimport os\nimport causaldag as cd\nimpo"
  },
  {
    "path": "tests/test_classes/test_dag.py",
    "chars": 6622,
    "preview": "from unittest import TestCase\nimport unittest\nimport numpy as np\nimport causaldag as cd\n\n\nclass TestDAG(TestCase):\n    d"
  },
  {
    "path": "tests/test_classes/test_dag_basics.py",
    "chars": 3809,
    "preview": "from unittest import TestCase\nimport unittest\nimport numpy as np\nimport causaldag as cd\n\n\nclass TestDAG(TestCase):\n    d"
  },
  {
    "path": "tests/test_classes/test_pdag.py",
    "chars": 13242,
    "preview": "# Author: Chandler Squires\nfrom unittest import TestCase\nimport unittest\nimport os\nimport causaldag as cd\nimport numpy a"
  },
  {
    "path": "tests/test_gaussdag.py",
    "chars": 1388,
    "preview": "from unittest import TestCase\nimport unittest\nimport numpy as np\nimport causaldag as cd\nfrom scipy.stats import multivar"
  },
  {
    "path": "tests/test_id_formula.py",
    "chars": 3898,
    "preview": "from unittest import TestCase\nimport unittest\nfrom causaldag import IDFormula, MarginalDistribution, Product, Probabilit"
  },
  {
    "path": "tests/test_interventions.py",
    "chars": 6078,
    "preview": "from unittest import TestCase\nimport unittest\nimport numpy as np\nimport causaldag as cd\nfrom scipy.stats import multivar"
  },
  {
    "path": "tests/test_scores/test_bge_score.py",
    "chars": 999,
    "preview": "from unittest import TestCase\nimport sys\nsys.path.insert(1, \"C:/Users/skarn/OneDrive/Documents/MIT/year_3/SuperUROP/caus"
  },
  {
    "path": "tests/test_scores/test_max_likelihood.py",
    "chars": 198,
    "preview": "from unittest import TestCase\nimport unittest\nimport numpy as np\nimport causaldag as cd\n\n\nclass TestDAG(TestCase):\n    d"
  },
  {
    "path": "tests/test_structure_learning/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "tests/test_structure_learning/test_gsp.py",
    "chars": 15816,
    "preview": "from unittest import TestCase\nimport unittest\nimport numpy as np\nimport causaldag as cd\nimport causaldag.classes.interve"
  },
  {
    "path": "tests/test_structure_learning/test_pcalg.py",
    "chars": 293,
    "preview": "# Author: Chandler Squires\nfrom unittest import TestCase\nimport unittest\nimport causaldag as cd\n\n\nclass TestDAG(TestCase"
  }
]

// ... and 7 more files (download for full content)

About this extraction

This page contains the full source code of the uhlerlab/causaldag GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 95 files (684.9 KB), approximately 214.8k tokens, and a symbol index with 210 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!