Metadata-Version: 2.1
Name: RCAEval
Version: 0.0.7
Description-Content-Type: text/markdown
Provides-Extra: dev
Requires-Dist: aiobotocore ==2.5.0 ; extra == 'dev'
Requires-Dist: aiohttp ==3.8.4 ; extra == 'dev'
Requires-Dist: aiohttp-retry ==2.8.3 ; extra == 'dev'
Requires-Dist: aioitertools ==0.11.0 ; extra == 'dev'
Requires-Dist: aiosignal ==1.3.1 ; extra == 'dev'
Requires-Dist: amqp ==5.1.1 ; extra == 'dev'
Requires-Dist: antlr4-python3-runtime ==4.9.3 ; extra == 'dev'
Requires-Dist: appdirs ==1.4.4 ; extra == 'dev'
Requires-Dist: asttokens ==2.2.1 ; extra == 'dev'
Requires-Dist: async-timeout ==4.0.2 ; extra == 'dev'
Requires-Dist: asyncssh ==2.13.1 ; extra == 'dev'
Requires-Dist: atpublic ==3.1.1 ; extra == 'dev'
Requires-Dist: attrs ==23.1.0 ; extra == 'dev'
Requires-Dist: backcall ==0.2.0 ; extra == 'dev'
Requires-Dist: billiard ==3.6.4.0 ; extra == 'dev'
Requires-Dist: boto3 ==1.26.76 ; extra == 'dev'
Requires-Dist: botocore ==1.29.76 ; extra == 'dev'
Requires-Dist: cairocffi ==1.5.1 ; extra == 'dev'
Requires-Dist: CairoSVG ==2.7.0 ; extra == 'dev'
Requires-Dist: causal-learn ==0.1.3.3 ; extra == 'dev'
Requires-Dist: causality ==0.0.10 ; extra == 'dev'
Requires-Dist: celery ==5.2.7 ; extra == 'dev'
Requires-Dist: certifi ==2023.5.7 ; extra == 'dev'
Requires-Dist: cffi ==1.15.1 ; extra == 'dev'
Requires-Dist: cfgv ==3.3.1 ; extra == 'dev'
Requires-Dist: charset-normalizer ==3.1.0 ; extra == 'dev'
Requires-Dist: click ==8.1.3 ; extra == 'dev'
Requires-Dist: click-didyoumean ==0.3.0 ; extra == 'dev'
Requires-Dist: click-plugins ==1.1.1 ; extra == 'dev'
Requires-Dist: click-repl ==0.2.0 ; extra == 'dev'
Requires-Dist: colorama ==0.4.6 ; extra == 'dev'
Requires-Dist: comm ==0.1.3 ; extra == 'dev'
Requires-Dist: configobj ==5.0.8 ; extra == 'dev'
Requires-Dist: contourpy ==1.0.7 ; extra == 'dev'
Requires-Dist: cryptography ==40.0.2 ; extra == 'dev'
Requires-Dist: cssselect2 ==0.7.0 ; extra == 'dev'
Requires-Dist: cycler ==0.11.0 ; extra == 'dev'
Requires-Dist: debugpy ==1.6.7 ; extra == 'dev'
Requires-Dist: decorator ==5.1.1 ; extra == 'dev'
Requires-Dist: defusedxml ==0.7.1 ; extra == 'dev'
Requires-Dist: dictdiffer ==0.9.0 ; extra == 'dev'
Requires-Dist: diskcache ==5.6.1 ; extra == 'dev'
Requires-Dist: distlib ==0.3.6 ; extra == 'dev'
Requires-Dist: distro ==1.8.0 ; extra == 'dev'
Requires-Dist: dpath ==2.1.5 ; extra == 'dev'
Requires-Dist: dulwich ==0.21.5 ; extra == 'dev'
Requires-Dist: dvc ==2.57.3 ; extra == 'dev'
Requires-Dist: dvc-data ==0.51.0 ; extra == 'dev'
Requires-Dist: dvc-http ==2.30.2 ; extra == 'dev'
Requires-Dist: dvc-objects ==0.22.0 ; extra == 'dev'
Requires-Dist: dvc-render ==0.5.3 ; extra == 'dev'
Requires-Dist: dvc-s3 ==2.22.0 ; extra == 'dev'
Requires-Dist: dvc-studio-client ==0.9.2 ; extra == 'dev'
Requires-Dist: dvc-task ==0.2.1 ; extra == 'dev'
Requires-Dist: et-xmlfile ==1.1.0 ; extra == 'dev'
Requires-Dist: exceptiongroup ==1.1.1 ; extra == 'dev'
Requires-Dist: executing ==1.2.0 ; extra == 'dev'
Requires-Dist: filelock ==3.12.0 ; extra == 'dev'
Requires-Dist: flatten-dict ==0.4.2 ; extra == 'dev'
Requires-Dist: flufl.lock ==7.1.1 ; extra == 'dev'
Requires-Dist: fonttools ==4.39.4 ; extra == 'dev'
Requires-Dist: frozenlist ==1.3.3 ; extra == 'dev'
Requires-Dist: fsspec ==2023.5.0 ; extra == 'dev'
Requires-Dist: funcy ==2.0 ; extra == 'dev'
Requires-Dist: gitdb ==4.0.10 ; extra == 'dev'
Requires-Dist: GitPython ==3.1.31 ; extra == 'dev'
Requires-Dist: grandalf ==0.8 ; extra == 'dev'
Requires-Dist: graphviz ==0.20.1 ; extra == 'dev'
Requires-Dist: hydra-core ==1.3.2 ; extra == 'dev'
Requires-Dist: identify ==2.5.24 ; extra == 'dev'
Requires-Dist: idna ==3.4 ; extra == 'dev'
Requires-Dist: igraph ==0.10.4 ; extra == 'dev'
Requires-Dist: iniconfig ==2.0.0 ; extra == 'dev'
Requires-Dist: ipykernel ==6.23.1 ; extra == 'dev'
Requires-Dist: ipython ==8.13.2 ; extra == 'dev'
Requires-Dist: iterative-telemetry ==0.0.8 ; extra == 'dev'
Requires-Dist: jedi ==0.18.2 ; extra == 'dev'
Requires-Dist: jmespath ==1.0.1 ; extra == 'dev'
Requires-Dist: joblib ==1.2.0 ; extra == 'dev'
Requires-Dist: jupyter-client ==8.2.0 ; extra == 'dev'
Requires-Dist: jupyter-core ==5.3.0 ; extra == 'dev'
Requires-Dist: kiwisolver ==1.4.4 ; extra == 'dev'
Requires-Dist: kombu ==5.2.4 ; extra == 'dev'
Requires-Dist: lazy-loader ==0.2 ; extra == 'dev'
Requires-Dist: littleutils ==0.2.2 ; extra == 'dev'
Requires-Dist: llvmlite ==0.39.1 ; extra == 'dev'
Requires-Dist: markdown-it-py ==2.2.0 ; extra == 'dev'
Requires-Dist: mdurl ==0.1.2 ; extra == 'dev'
Requires-Dist: multidict ==6.0.4 ; extra == 'dev'
Requires-Dist: nanotime ==0.5.2 ; extra == 'dev'
Requires-Dist: nest-asyncio ==1.5.6 ; extra == 'dev'
Requires-Dist: networkx ==2.5 ; extra == 'dev'
Requires-Dist: nodeenv ==1.8.0 ; extra == 'dev'
Requires-Dist: numba ==0.56.4 ; extra == 'dev'
Requires-Dist: numpy ==1.23.5 ; extra == 'dev'
Requires-Dist: omegaconf ==2.3.0 ; extra == 'dev'
Requires-Dist: openpyxl ==3.1.2 ; extra == 'dev'
Requires-Dist: orjson ==3.8.12 ; extra == 'dev'
Requires-Dist: outdated ==0.2.2 ; extra == 'dev'
Requires-Dist: packaging ==23.1 ; extra == 'dev'
Requires-Dist: pandas ==2.0.1 ; extra == 'dev'
Requires-Dist: pandas-flavor ==0.5.0 ; extra == 'dev'
Requires-Dist: parso ==0.8.3 ; extra == 'dev'
Requires-Dist: pathspec ==0.11.1 ; extra == 'dev'
Requires-Dist: patsy ==0.5.3 ; extra == 'dev'
Requires-Dist: pexpect ==4.8.0 ; extra == 'dev'
Requires-Dist: pickleshare ==0.7.5 ; extra == 'dev'
Requires-Dist: Pillow ==9.5.0 ; extra == 'dev'
Requires-Dist: pingouin ==0.5.3 ; extra == 'dev'
Requires-Dist: platformdirs ==3.5.1 ; extra == 'dev'
Requires-Dist: pluggy ==1.0.0 ; extra == 'dev'
Requires-Dist: pre-commit ==3.3.2 ; extra == 'dev'
Requires-Dist: prompt-toolkit ==3.0.38 ; extra == 'dev'
Requires-Dist: psutil ==5.9.5 ; extra == 'dev'
Requires-Dist: ptyprocess ==0.7.0 ; extra == 'dev'
Requires-Dist: pure-eval ==0.2.2 ; extra == 'dev'
Requires-Dist: pyagrum ==1.8.0 ; extra == 'dev'
Requires-Dist: pycparser ==2.21 ; extra == 'dev'
Requires-Dist: pydot ==1.4.2 ; extra == 'dev'
Requires-Dist: pydotplus ==2.0.2 ; extra == 'dev'
Requires-Dist: pygit2 ==1.12.1 ; extra == 'dev'
Requires-Dist: Pygments ==2.15.1 ; extra == 'dev'
Requires-Dist: pygtrie ==2.5.0 ; extra == 'dev'
Requires-Dist: pyparsing ==3.0.9 ; extra == 'dev'
Requires-Dist: pytest ==7.3.1 ; extra == 'dev'
Requires-Dist: python-dateutil ==2.8.2 ; extra == 'dev'
Requires-Dist: python-igraph ==0.10.4 ; extra == 'dev'
Requires-Dist: pytz ==2023.3 ; extra == 'dev'
Requires-Dist: PyYAML ==6.0 ; extra == 'dev'
Requires-Dist: pyzmq ==25.0.2 ; extra == 'dev'
Requires-Dist: requests ==2.30.0 ; extra == 'dev'
Requires-Dist: rich ==13.3.5 ; extra == 'dev'
Requires-Dist: ruamel.yaml ==0.17.26 ; extra == 'dev'
Requires-Dist: ruamel.yaml.clib ==0.2.7 ; extra == 'dev'
Requires-Dist: s3fs ==2023.5.0 ; extra == 'dev'
Requires-Dist: s3transfer ==0.6.1 ; extra == 'dev'
Requires-Dist: scikit-learn ==1.2.2 ; extra == 'dev'
Requires-Dist: scikit-network ==0.31.0 ; extra == 'dev'
Requires-Dist: scipy ==1.10.1 ; extra == 'dev'
Requires-Dist: scmrepo ==1.0.3 ; extra == 'dev'
Requires-Dist: seaborn ==0.12.2 ; extra == 'dev'
Requires-Dist: shortuuid ==1.0.11 ; extra == 'dev'
Requires-Dist: shtab ==1.6.1 ; extra == 'dev'
Requires-Dist: six ==1.16.0 ; extra == 'dev'
Requires-Dist: smmap ==5.0.0 ; extra == 'dev'
Requires-Dist: sqltrie ==0.3.1 ; extra == 'dev'
Requires-Dist: stack-data ==0.6.2 ; extra == 'dev'
Requires-Dist: statsmodels ==0.14.0 ; extra == 'dev'
Requires-Dist: tabulate ==0.9.0 ; extra == 'dev'
Requires-Dist: texttable ==1.6.7 ; extra == 'dev'
Requires-Dist: threadpoolctl ==3.1.0 ; extra == 'dev'
Requires-Dist: tigramite ==4.2.2.1 ; extra == 'dev'
Requires-Dist: tinycss2 ==1.2.1 ; extra == 'dev'
Requires-Dist: tk ==0.1.0 ; extra == 'dev'
Requires-Dist: tomli ==2.0.1 ; extra == 'dev'
Requires-Dist: tomlkit ==0.11.8 ; extra == 'dev'
Requires-Dist: torch ==1.12.1 ; extra == 'dev'
Requires-Dist: tornado ==6.3.2 ; extra == 'dev'
Requires-Dist: tqdm ==4.65.0 ; extra == 'dev'
Requires-Dist: traitlets ==5.9.0 ; extra == 'dev'
Requires-Dist: typing-extensions ==4.5.0 ; extra == 'dev'
Requires-Dist: tzdata ==2023.3 ; extra == 'dev'
Requires-Dist: urllib3 ==1.26.15 ; extra == 'dev'
Requires-Dist: vine ==5.0.0 ; extra == 'dev'
Requires-Dist: virtualenv ==20.23.0 ; extra == 'dev'
Requires-Dist: voluptuous ==0.13.1 ; extra == 'dev'
Requires-Dist: wcwidth ==0.2.6 ; extra == 'dev'
Requires-Dist: webencodings ==0.5.1 ; extra == 'dev'
Requires-Dist: wrapt ==1.15.0 ; extra == 'dev'
Requires-Dist: xarray ==2023.5.0 ; extra == 'dev'
Requires-Dist: yarl ==1.9.2 ; extra == 'dev'
Requires-Dist: zc.lockfile ==3.0.post1 ; extra == 'dev'
Provides-Extra: rcd
Requires-Dist: aiobotocore ==2.5.0 ; extra == 'rcd'
Requires-Dist: aiohttp ==3.8.4 ; extra == 'rcd'
Requires-Dist: aiohttp-retry ==2.8.3 ; extra == 'rcd'
Requires-Dist: aioitertools ==0.11.0 ; extra == 'rcd'
Requires-Dist: aiosignal ==1.3.1 ; extra == 'rcd'
Requires-Dist: amqp ==5.1.1 ; extra == 'rcd'
Requires-Dist: antlr4-python3-runtime ==4.9.3 ; extra == 'rcd'
Requires-Dist: appdirs ==1.4.4 ; extra == 'rcd'
Requires-Dist: asttokens ==2.2.1 ; extra == 'rcd'
Requires-Dist: async-timeout ==4.0.2 ; extra == 'rcd'
Requires-Dist: asyncssh ==2.13.1 ; extra == 'rcd'
Requires-Dist: atpublic ==3.1.1 ; extra == 'rcd'
Requires-Dist: attrs ==23.1.0 ; extra == 'rcd'
Requires-Dist: backcall ==0.2.0 ; extra == 'rcd'
Requires-Dist: billiard ==3.6.4.0 ; extra == 'rcd'
Requires-Dist: boto3 ==1.26.76 ; extra == 'rcd'
Requires-Dist: botocore ==1.29.76 ; extra == 'rcd'
Requires-Dist: cairocffi ==1.5.1 ; extra == 'rcd'
Requires-Dist: CairoSVG ==2.7.0 ; extra == 'rcd'
Requires-Dist: causal-learn ==0.1.3.3 ; extra == 'rcd'
Requires-Dist: causality ==0.0.10 ; extra == 'rcd'
Requires-Dist: celery ==5.2.7 ; extra == 'rcd'
Requires-Dist: certifi ==2023.5.7 ; extra == 'rcd'
Requires-Dist: cffi ==1.15.1 ; extra == 'rcd'
Requires-Dist: cfgv ==3.3.1 ; extra == 'rcd'
Requires-Dist: charset-normalizer ==3.1.0 ; extra == 'rcd'
Requires-Dist: click ==8.1.3 ; extra == 'rcd'
Requires-Dist: click-didyoumean ==0.3.0 ; extra == 'rcd'
Requires-Dist: click-plugins ==1.1.1 ; extra == 'rcd'
Requires-Dist: click-repl ==0.2.0 ; extra == 'rcd'
Requires-Dist: colorama ==0.4.6 ; extra == 'rcd'
Requires-Dist: comm ==0.1.3 ; extra == 'rcd'
Requires-Dist: configobj ==5.0.8 ; extra == 'rcd'
Requires-Dist: contourpy ==1.0.7 ; extra == 'rcd'
Requires-Dist: cryptography ==40.0.2 ; extra == 'rcd'
Requires-Dist: cssselect2 ==0.7.0 ; extra == 'rcd'
Requires-Dist: cycler ==0.11.0 ; extra == 'rcd'
Requires-Dist: debugpy ==1.6.7 ; extra == 'rcd'
Requires-Dist: decorator ==5.1.1 ; extra == 'rcd'
Requires-Dist: defusedxml ==0.7.1 ; extra == 'rcd'
Requires-Dist: dictdiffer ==0.9.0 ; extra == 'rcd'
Requires-Dist: diskcache ==5.6.1 ; extra == 'rcd'
Requires-Dist: distlib ==0.3.6 ; extra == 'rcd'
Requires-Dist: distro ==1.8.0 ; extra == 'rcd'
Requires-Dist: dpath ==2.1.5 ; extra == 'rcd'
Requires-Dist: dulwich ==0.21.5 ; extra == 'rcd'
Requires-Dist: dvc ==2.57.3 ; extra == 'rcd'
Requires-Dist: dvc-data ==0.51.0 ; extra == 'rcd'
Requires-Dist: dvc-http ==2.30.2 ; extra == 'rcd'
Requires-Dist: dvc-objects ==0.22.0 ; extra == 'rcd'
Requires-Dist: dvc-render ==0.5.3 ; extra == 'rcd'
Requires-Dist: dvc-s3 ==2.22.0 ; extra == 'rcd'
Requires-Dist: dvc-studio-client ==0.9.2 ; extra == 'rcd'
Requires-Dist: dvc-task ==0.2.1 ; extra == 'rcd'
Requires-Dist: et-xmlfile ==1.1.0 ; extra == 'rcd'
Requires-Dist: exceptiongroup ==1.1.1 ; extra == 'rcd'
Requires-Dist: executing ==1.2.0 ; extra == 'rcd'
Requires-Dist: filelock ==3.12.0 ; extra == 'rcd'
Requires-Dist: flatten-dict ==0.4.2 ; extra == 'rcd'
Requires-Dist: flufl.lock ==7.1.1 ; extra == 'rcd'
Requires-Dist: fonttools ==4.39.4 ; extra == 'rcd'
Requires-Dist: frozenlist ==1.3.3 ; extra == 'rcd'
Requires-Dist: fsspec ==2023.5.0 ; extra == 'rcd'
Requires-Dist: funcy ==2.0 ; extra == 'rcd'
Requires-Dist: gitdb ==4.0.10 ; extra == 'rcd'
Requires-Dist: GitPython ==3.1.31 ; extra == 'rcd'
Requires-Dist: grandalf ==0.8 ; extra == 'rcd'
Requires-Dist: graphviz ==0.20.1 ; extra == 'rcd'
Requires-Dist: hydra-core ==1.3.2 ; extra == 'rcd'
Requires-Dist: identify ==2.5.24 ; extra == 'rcd'
Requires-Dist: idna ==3.4 ; extra == 'rcd'
Requires-Dist: igraph ==0.10.4 ; extra == 'rcd'
Requires-Dist: iniconfig ==2.0.0 ; extra == 'rcd'
Requires-Dist: ipykernel ==6.23.1 ; extra == 'rcd'
Requires-Dist: ipython ==8.13.2 ; extra == 'rcd'
Requires-Dist: iterative-telemetry ==0.0.8 ; extra == 'rcd'
Requires-Dist: jedi ==0.18.2 ; extra == 'rcd'
Requires-Dist: jmespath ==1.0.1 ; extra == 'rcd'
Requires-Dist: joblib ==1.2.0 ; extra == 'rcd'
Requires-Dist: jupyter-client ==8.2.0 ; extra == 'rcd'
Requires-Dist: jupyter-core ==5.3.0 ; extra == 'rcd'
Requires-Dist: kiwisolver ==1.4.4 ; extra == 'rcd'
Requires-Dist: kombu ==5.2.4 ; extra == 'rcd'
Requires-Dist: lazy-loader ==0.2 ; extra == 'rcd'
Requires-Dist: littleutils ==0.2.2 ; extra == 'rcd'
Requires-Dist: llvmlite ==0.39.1 ; extra == 'rcd'
Requires-Dist: markdown-it-py ==2.2.0 ; extra == 'rcd'
Requires-Dist: mdurl ==0.1.2 ; extra == 'rcd'
Requires-Dist: multidict ==6.0.4 ; extra == 'rcd'
Requires-Dist: nanotime ==0.5.2 ; extra == 'rcd'
Requires-Dist: nest-asyncio ==1.5.6 ; extra == 'rcd'
Requires-Dist: networkx ==2.5 ; extra == 'rcd'
Requires-Dist: nodeenv ==1.8.0 ; extra == 'rcd'
Requires-Dist: numba ==0.56.4 ; extra == 'rcd'
Requires-Dist: numpy ==1.23.5 ; extra == 'rcd'
Requires-Dist: omegaconf ==2.3.0 ; extra == 'rcd'
Requires-Dist: openpyxl ==3.1.2 ; extra == 'rcd'
Requires-Dist: orjson ==3.8.12 ; extra == 'rcd'
Requires-Dist: outdated ==0.2.2 ; extra == 'rcd'
Requires-Dist: packaging ==23.1 ; extra == 'rcd'
Requires-Dist: pandas ==2.0.1 ; extra == 'rcd'
Requires-Dist: pandas-flavor ==0.5.0 ; extra == 'rcd'
Requires-Dist: parso ==0.8.3 ; extra == 'rcd'
Requires-Dist: pathspec ==0.11.1 ; extra == 'rcd'
Requires-Dist: patsy ==0.5.3 ; extra == 'rcd'
Requires-Dist: pexpect ==4.8.0 ; extra == 'rcd'
Requires-Dist: pickleshare ==0.7.5 ; extra == 'rcd'
Requires-Dist: Pillow ==9.5.0 ; extra == 'rcd'
Requires-Dist: pingouin ==0.5.3 ; extra == 'rcd'
Requires-Dist: platformdirs ==3.5.1 ; extra == 'rcd'
Requires-Dist: pluggy ==1.0.0 ; extra == 'rcd'
Requires-Dist: pre-commit ==3.3.2 ; extra == 'rcd'
Requires-Dist: prompt-toolkit ==3.0.38 ; extra == 'rcd'
Requires-Dist: psutil ==5.9.5 ; extra == 'rcd'
Requires-Dist: ptyprocess ==0.7.0 ; extra == 'rcd'
Requires-Dist: pure-eval ==0.2.2 ; extra == 'rcd'
Requires-Dist: pyagrum ==1.8.0 ; extra == 'rcd'
Requires-Dist: pycparser ==2.21 ; extra == 'rcd'
Requires-Dist: pydot ==1.4.2 ; extra == 'rcd'
Requires-Dist: pydotplus ==2.0.2 ; extra == 'rcd'
Requires-Dist: pygit2 ==1.12.1 ; extra == 'rcd'
Requires-Dist: Pygments ==2.15.1 ; extra == 'rcd'
Requires-Dist: pygtrie ==2.5.0 ; extra == 'rcd'
Requires-Dist: pyparsing ==3.0.9 ; extra == 'rcd'
Requires-Dist: pytest ==7.3.1 ; extra == 'rcd'
Requires-Dist: python-dateutil ==2.8.2 ; extra == 'rcd'
Requires-Dist: python-igraph ==0.10.4 ; extra == 'rcd'
Requires-Dist: pytz ==2023.3 ; extra == 'rcd'
Requires-Dist: PyYAML ==6.0 ; extra == 'rcd'
Requires-Dist: pyzmq ==25.0.2 ; extra == 'rcd'
Requires-Dist: requests ==2.30.0 ; extra == 'rcd'
Requires-Dist: rich ==13.3.5 ; extra == 'rcd'
Requires-Dist: ruamel.yaml ==0.17.26 ; extra == 'rcd'
Requires-Dist: ruamel.yaml.clib ==0.2.7 ; extra == 'rcd'
Requires-Dist: s3fs ==2023.5.0 ; extra == 'rcd'
Requires-Dist: s3transfer ==0.6.1 ; extra == 'rcd'
Requires-Dist: scikit-learn ==1.2.2 ; extra == 'rcd'
Requires-Dist: scikit-network ==0.31.0 ; extra == 'rcd'
Requires-Dist: scipy ==1.10.1 ; extra == 'rcd'
Requires-Dist: scmrepo ==1.0.3 ; extra == 'rcd'
Requires-Dist: seaborn ==0.12.2 ; extra == 'rcd'
Requires-Dist: shortuuid ==1.0.11 ; extra == 'rcd'
Requires-Dist: shtab ==1.6.1 ; extra == 'rcd'
Requires-Dist: six ==1.16.0 ; extra == 'rcd'
Requires-Dist: smmap ==5.0.0 ; extra == 'rcd'
Requires-Dist: sqltrie ==0.3.1 ; extra == 'rcd'
Requires-Dist: stack-data ==0.6.2 ; extra == 'rcd'
Requires-Dist: statsmodels ==0.14.0 ; extra == 'rcd'
Requires-Dist: tabulate ==0.9.0 ; extra == 'rcd'
Requires-Dist: texttable ==1.6.7 ; extra == 'rcd'
Requires-Dist: threadpoolctl ==3.1.0 ; extra == 'rcd'
Requires-Dist: tigramite ==4.2.2.1 ; extra == 'rcd'
Requires-Dist: tinycss2 ==1.2.1 ; extra == 'rcd'
Requires-Dist: tk ==0.1.0 ; extra == 'rcd'
Requires-Dist: tomli ==2.0.1 ; extra == 'rcd'
Requires-Dist: tomlkit ==0.11.8 ; extra == 'rcd'
Requires-Dist: torch ==1.12.1 ; extra == 'rcd'
Requires-Dist: tornado ==6.3.2 ; extra == 'rcd'
Requires-Dist: tqdm ==4.65.0 ; extra == 'rcd'
Requires-Dist: traitlets ==5.9.0 ; extra == 'rcd'
Requires-Dist: typing-extensions ==4.5.0 ; extra == 'rcd'
Requires-Dist: tzdata ==2023.3 ; extra == 'rcd'
Requires-Dist: urllib3 ==1.26.15 ; extra == 'rcd'
Requires-Dist: vine ==5.0.0 ; extra == 'rcd'
Requires-Dist: virtualenv ==20.23.0 ; extra == 'rcd'
Requires-Dist: voluptuous ==0.13.1 ; extra == 'rcd'
Requires-Dist: wcwidth ==0.2.6 ; extra == 'rcd'
Requires-Dist: webencodings ==0.5.1 ; extra == 'rcd'
Requires-Dist: wrapt ==1.15.0 ; extra == 'rcd'
Requires-Dist: xarray ==2023.5.0 ; extra == 'rcd'
Requires-Dist: yarl ==1.9.2 ; extra == 'rcd'
Requires-Dist: zc.lockfile ==3.0.post1 ; extra == 'rcd'

# 🕵️ Root Cause Analysis for Microservices based on Causal Inference: How Far Are We?

[![Build and test](https://github.com/phamquiluan/RCAEval/actions/workflows/build-and-test.yml/badge.svg)](https://github.com/phamquiluan/RCAEval/actions/workflows/build-and-test.yml)
[![pypi package](https://img.shields.io/pypi/v/RCAEval.svg)](https://pypi.org/project/RCAEval)


## Download Experimental Data \& Supplementary Material

You can download our supplementary material and all the data we used for this research from this [Google Drive](https://drive.google.com/drive/folders/1BG2P1ETEyKW62dU0I1ZpE64Ng9fy5_ju?usp=sharing).

## Installation

We maintain 3 environments for different methods that could be installed easily as follows.

### OS & Hardware requirements
- Ubuntu 22.04
- 8 CPU, 16GB RAM, 30GB free disk.

### Pre-installation

Open your terminal and run commands
```bash
sudo apt update -y
sudo apt install -y build-essential \
  libxml2 libxml2-dev zlib1g-dev \
  python3-tk graphviz

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update -y
sudo apt-get install -y python3.8 python3.8-dev python3.8-venv
sudo apt-get install -y python3.10 python3.10-dev python3.10-venv
```

### Install the Dev environment
By installing this environment, you can run the following:
- PC-based, FCI-based, LiNGAM-based, GES-based
- CausalRCA
- CIRCA, Nsigma, Dummy

```bash
python3.10 -m venv env-dev
. env-dev/bin/activate
pip install pip==20.0.2
pip install -e .[dev]
```


### Install the RCD environment
By installing this environment, you can run the RCD algorithm

```bash
python3.8 -m venv env-rcd
. env-rcd/bin/activate
pip install pip==20.0.2
pip install -e .[rcd]
bash script/link.sh
```

### Install the fGES environment
By installing this environment, you can run the fGES-based algorithm

```bash
python3.8 -m venv env-fges
. env-fges/bin/activate

pip install pip==20.0.2
pip install -e .[rcd]

cd LIB
pip install -e .
cd ..

# it MUST be performed in this order
sudo apt-get install -y gcc graphviz libgraphviz-dev pkg-config
pip install dill pygobnilp
pip install -U numba
pip install category_encoders sortedcontainers fcit
pip install pgmpy
pip install feature_engine
```

## Reproducibility

### Reproduce RQ1 - Causal Discovery Performance

To reproduce the causal discovery performance, as presented in Table 3. You can download the corresponding dataset and extracted to folder `./data`. Then, you can run the file `graph_eval.py` to obtain the results for one iteration. For example:

As presented in Table 3, PC achieves F1, F1-S, and SHD of 0.49, 0.65, and 16 on the CIRCA 10 dataset. To reproduce this results as presented in the Table 3. You can run the following commands:

```bash
python graph_eval.py -i data/syn_circa/10 -m pc -w 5
```

The expected output should be exactly as presented in the paper (it takes around 1 minute to run the code)

```
F1:   0.49
F1-S: 0.65
SHD:  16
```

We can replace the method `pc` and dataset `syn_circa/10` to replicate corresponding results.



### Reproduce RQ2 - Root Cause Analysis Performance

To reproduce the root cause analysis performance, as presented in Table 5. You can download the corresponding dataset and extracted to folder `./data`. Then, you can run the file `eval.py` to reproduce the results. For example:


As presented in Table 5, NSigma [ $t_\Delta = 0$ ] achieves Avg@5 of 0.94, 1, 0.9, 0.98, and 0.67 for CPU, MEM, DISK, DELAY, and LOSS fault types on the Online Boutique dataset. To reproduce the RCA performance of NSigma [ $t_\Delta = 0$ ] as presented in the Table 5. You can run the following commands:

```bash
python eval.py -i data/online-boutique -o output-tmp -m nsigma --iter-num 10 -w 10 --length 10
```

<details>
<summary>Expected output after running the above code (it takes around 1 minute)</summary>

<br />

The results are exactly as presented in the paper (Table 5).
```
Evaluation results
s_cpu: 0.94
s_mem: 1.0
s_disk: 0.9
s_delay: 0.98
s_loss: 0.67
```
</details>

As presented in Table 5, NSigma [ $t_\Delta = 60$ ] achieves Avg@5 of 0.16, 0.24, 0.43, 0.55, and 0.38 for CPU, MEM, DISK, DELAY, and LOSS fault types on the Online Boutique dataset. To reproduce the RCA performance of NSigma [ $t_\Delta = 60$ ] as presented in the Table 5. You can run the following commands:

```bash
python eval.py -i data/online-boutique -o output-tmp -m nsigma --iter-num 10 -w 10 --length 10 --ad-delay 60
```

<details>
<summary>Expected output after running the above code (it takes around 1 minute)</summary>

<br />

The results are exactly as presented in the paper (Table 5).
```
Evaluation results
s_cpu: 0.16
s_mem: 0.24
s_disk: 0.43
s_delay: 0.55
s_loss: 0.38
```
</details>


We can replace the method `nsigma` by `baro`, `pc_pagerank`, `fci_pagerank`, `rcd`, `e_diagnosis`, etc. to replicate corresponding results.

### Reproduce RQ3 - Efficiency

The efficiency is captured in our evaluation script and saved in the corresponding output directory.

### Reproduce RQ4 - Data lengths

Our RQ4 relies on the scripts of RQ1 and RQ2, which we presented above.
