Metadata-Version: 2.1
Name: RCAEval
Version: 0.0.8
Description-Content-Type: text/markdown
License-File: LICENSE
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?

[![DOI](https://zenodo.org/badge/840137303.svg)](https://zenodo.org/doi/10.5281/zenodo.13294048)
[![pypi package](https://img.shields.io/pypi/v/RCAEval.svg)](https://pypi.org/project/RCAEval)
[![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)
[![Upload Python Package](https://github.com/phamquiluan/RCAEval/actions/workflows/python-publish.yml/badge.svg)](https://github.com/phamquiluan/RCAEval/actions/workflows/python-publish.yml)

This repository includes artifacts for reuse and reproduction of experimental results presented in our ASE'24 paper titled "Root Cause Analysis for Microservices based on Causal Inference: How Far Are We?".

**Table of Contents** 
  * [Installation](#installation)
    + [Prerequisites](#prerequisites)
    + [Pre-installation](#pre-installation)
    + [Install the Dev environment](#install-the-dev-environment)
    + [Install the RCD environment](#install-the-rcd-environment)
    + [Install the fGES environment](#install-the-fges-environment)
  * [How-to-use](#how-to-use)
    + [Data format](#data-format)
    + [Basic usage example](#basic-usage-example)
  * [Reproducibility](#reproducibility)
    + [Reproduce RQ1 - Causal Discovery Performance](#reproduce-rq1---causal-discovery-performance)
    + [Reproduce RQ2 - Root Cause Analysis Performance](#reproduce-rq2---root-cause-analysis-performance)
    + [Reproduce RQ3 - Efficiency](#reproduce-rq3---efficiency)
    + [Reproduce RQ4 - Data lengths](#reproduce-rq4---data-lengths)
  * [Download Experimental Data - Supplementary Material](#download-experimental-data---supplementary-material)
  * [Licensing](#licensing)
  * [Acknowledgments](#acknowledgments)


## Installation

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

### Prerequisites
- 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
```

## How-to-use

### Data format

TBD

### Basic usage example

TBD


## 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.

## 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).

## Licensing

This repository includes code from various sources with different licenses:

- **CIRCA**: Licensed under the [BSD 3-Clause License](LICENSES/LICENSE_CIRCA). Original source: [CIRCA GitHub Repository](https://github.com/NetManAIOps/CIRCA).
- **RCD**: Licensed under the [MIT License](LICENSES/LICENSE_RCD). Original source: [RCD GitHub Repository](https://github.com/azamikram/rcd).
- **E-Diagnosis**: Licensed under the [BSD 3-Clause License](LICENSES/LICENSE_E-Diagnosis). Original source: [PyRCA GitHub Repository](https://github.com/salesforce/PyRCA).
- **CausalAI**: Licensed under the [BSD 3-Clause License](LICENSES/LICENSE_CausalAI). Original source: [CausalAI GitHub Repository](https://github.com/salesforce/causalai).
- **MicroCause**: Licensed under the [BSD 3-Clause License](LICENSES/LICENSE_MicroCause). Original source: [MicroCause GitHub Repository](https://github.com/PanYicheng/dycause_rca).

We have included their corresponding LICENSE into the [LICENSES](LICENSES) directory. For the code implemented by us, we distribute them under the [MIT LICENSE](LICENSE).

## Acknowledgments

We would like to express our sincere gratitude to the researchers and developers who created the baselines used in our study. Their work has been instrumental in making this project possible. We deeply appreciate the time, effort, and expertise that have gone into developing and maintaining these resources. Your commitment to advancing the field of root cause analysis and making your work accessible to the research community has been invaluable. This project would not have been feasible without your contributions.
