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

## Prerequisites

We recommend using machines equipped with at least 8 cores, 16GB RAM, and ~30GB available disk space with Ubuntu 22.04 and Python3.10 to stably reproduce the experimental results in our paper.

## Installation

The `default` environment, are used for most methods, can be easily installed as follows. We require Ubuntu and Python 3.10 to reproduce our results stably. Detailed installation instructions for all methods are in [SETUP.md](SETUP.md).


Open your terminal and run the following commands

```bash
sudo apt update -y
sudo apt install -y build-essential \
  libxml2 libxml2-dev zlib1g-dev \
  python3-tk graphviz
```

Clone RCAEval from GitHub

```bash
git clone https://github.com/phamquiluan/RCAEval.git && cd RCAEval
```

Create virtual environment 

```bash
python3.10 -m venv env
. env/bin/activate
```

Install RCAEval using pip

```bash
pip install pip==20.0.2
pip install -e .[default]
```

Or, install RCAEval from PyPI

```bash
# Install RCAEval from PyPI
pip install pip==20.0.2
pip install RCAEval[default]
```

Test the installation

```bash
pytest tests/test.py::test_basic
```

Expected output after running the above code (it takes less than 1 minute)

```bash 
$ pytest tests/test.py::test_basic
============================== test session starts ===============================
platform linux -- Python 3.10.12, pytest-7.3.1, pluggy-1.0.0
rootdir: /home/ubuntu/RCAEval
plugins: dvc-2.57.3, hydra-core-1.3.2
collected 1 item                                                                 

tests/test.py .                                                            [100%]

=============================== 1 passed in 3.16s ================================
```


## How-to-use

### Data format

The data must be a `pandas.DataFrame` that consists of multivariate time series metrics data. We require the data to have a column named `time` that stores the timestep. Each other column stores a time series for metrics data with the name format of `<service>_<metric>`. For example, the column `cart_cpu` stores the CPU utilization of service `cart`. A sample of valid data could be downloaded using the `download_data()` method that we will demonstrate shortly below.



### Basic usage example

RCAEval stores all the RCA methods in the `e2e` module (implemented in `RCAEval.e2e`). A basic example to use BARO, an RCA baseline, to perform RCA are presented as follows,

```python
# You can put the code here to a file named test.py
from RCAEval.e2e import baro
from RCAEval.utility import download_data, read_data

# download a sample data to data.csv
download_data()

# read data from data.csv
data = read_data("data.csv")
anomaly_detected_timestamp = 1692569339

# perform root cause analysis
root_causes = baro(data, anomaly_detected_timestamp)["ranks"]

# print the top 5 root causes
print("Top 5 root causes:", root_causes[:5])
```

Expected output after running the above code (it takes around 1 minute)

```
$ python test.py
Downloading data.csv..: 100%|████████████████████| 570k/570k [00:00<00:00, 19.8MiB/s]
Top 5 root causes: ['emailservice_mem', 'recommendationservice_mem', 'cartservice_mem', 'checkoutservice_latency', 'cartservice_latency']
```


## Reproducibility

### Reproduce RQ1 - Causal Discovery Performance

We provide a script named `rq1.py` to assist in reproducing the RQ1 results from our paper. This script can be executed using Python with the following syntax: 

```
python rq1.py [-h] [--dataset] [--method] [--length LENGTH] [--test]
```

The available options and their descriptions are as follows:

```
options:
  -h, --help            Show this help message and exit
  --dataset             Choose a dataset. Valid options:
                        [circa10, circa50, rcd10, rcd50, causil10, causil50]
  --method METHOD       Choose a method (e.g. `pc`, `fci`, etc.)
  --length LENGTH       Specify the length of the time series (used for RQ4)
  --test                Perform smoke test on certain methods without fully run
```

For example, in Table 3, PC achieves F1, F1-S, and SHD scores of 0.49, 0.65, and 16 on the CIRCA 10 dataset. To reproduce these results, you can run the following commands:

```bash
python rq1.py --dataset circa10 --method pc
```

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

```
F1:   0.49
F1-S: 0.65
SHD:  16
Avg speed: 0.08
```

We can replace the pc method with other methods (e.g., fci, granger) and substitute circa10 with other datasets to replicate the corresponding results shown in Table 3. This reproduction process is also integrated into our Continuous Integration (CI) setup. For more details, refer to the [.github/workflows/reproduce-rq1.yml](.github/workflows/reproduce-rq1.yml) file.


### Reproduce RQ2 - Root Cause Analysis Performance

We provide a script named `rq2.py` to assist in reproducing the RQ2 results from our paper. This script can be executed using Python with the following syntax: 

```
python rq2.py [-h] [--dataset] [--method] [--tbias TBIAS] [--length LENGTH] [--test] 
```

The available options and their descriptions are as follows:

```
options:
  -h, --help            Show this help message and exit
  --dataset             Choose a dataset. Valid options:
                        [online-boutique, sock-shop-1, sock-shop-2, train-ticket,
                         circa10, circa50, rcd10, rcd50, causil10, causil50]
  --method METHOD       Choose a method (e.g. `nsigma`, `baro`, etc.)
  --tdelta              Specify $t_delta$ to simulate delay in anomaly detection
  --length LENGTH       Specify the length of the time series (used for RQ4)
  --test                Perform smoke test on certain methods without fully run
```

For example, in Table 5, BARO [ $t_\Delta = 0$ ] achieves Avg@5 of 0.97, 1, 0.91, 0.98, and 0.67 for CPU, MEM, DISK, DELAY, and LOSS fault types on the Online Boutique dataset. To reproduce these results, you can run the following commands:

```bash
python rq2.py --dataset online-boutique --method baro 
```

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

```
--- Evaluation results ---
Avg@5-CPU:   0.97
Avg@5-MEM:   1.0
Avg@5-DISK:  0.91
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.67
---
Avg speed: 0.07
```

As presented in Table 5, BARO [ $t_\Delta = 60$ ] achieves Avg@5 of 0.94, 0.99, 0.87, 0.99, and 0.6 for CPU, MEM, DISK, DELAY, and LOSS fault types on the Online Boutique dataset. To reproduce these results, you can run the following commands:

```bash
python rq2.py --dataset online-boutique --method baro --tdelta 60
```

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

```
--- Evaluation results ---
Avg@5-CPU:   0.94
Avg@5-MEM:   0.99
Avg@5-DISK:  0.87
Avg@5-DELAY: 0.99
Avg@5-LOSS:  0.6
---
Avg speed: 0.07
```

We can replace the baro method with other methods (e.g., nsigma, fci_randomwalk) and substitute online-boutique with other datasets to replicate the corresponding results shown in Table 5. This reproduction process is also integrated into our Continuous Integration (CI) setup. For more details, refer to the [.github/workflows/reproduce-rq2.yml](.github/workflows/reproduce-rq2.yml) file.


### Reproduce RQ3 - Efficiency

The running time of each method is recorded in the scripts of RQ1 and RQ2 as we described and presented above.

### Reproduce RQ4 - Data lengths

Our RQ4 relies on the scripts of RQ1 and RQ2 as we described and presented above, with the option `--length`. 

As presented in Figure 3, BARO maintains stable accuracy on the Online Boutique dataset when we vary the data length from 60 to 600. To reproduce these results, for example, you can run the following Bash script:

```bash
# You can put the code here to a file named tmp.sh
for length in 60 120 180 240 300 360 420 480 540 600; do
    python rq2.py --dataset online-boutique --method baro --length $length
done
```


<details>
<summary>Expected output after running the above code (it takes few minutes)</summary>

<br />

The output list presents the `Avg@5` scores when we vary the data length. You can see that BARO can maintain a stable performance.


```
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.64it/s]
--- Evaluation results ---
Avg@5-CPU:   0.84
Avg@5-MEM:   0.98
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 120 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.37it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 180 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.46it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 240 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.47it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 300 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.40it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 360 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.42it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 420 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.53it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 480 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.37it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 540 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.50it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
=== VARY LENGTH: 600 ===
100%|█████████████████████████████████████████████████████████████████████| 125/125 [00:08<00:00, 14.49it/s]
--- Evaluation results ---
Avg@5-CPU:   0.82
Avg@5-MEM:   0.99
Avg@5-DISK:  0.94
Avg@5-DELAY: 0.98
Avg@5-LOSS:  0.66
---
Avg speed: 0.07
```
</details>


## Download Datasets

Our datasets and their description are publicly available in Zenodo repository with the following information:
- Dataset DOI: [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.13305663.svg)](https://doi.org/10.5281/zenodo.13305663)
- Dataset URL: https://zenodo.org/records/13305663

We also provide utility functions to download our datasets using Python. The downloaded datasets will be available at directory `data`.

```python
from RCAEval.utility import (
    download_syn_rcd_dataset,
    download_syn_circa_dataset,
    download_syn_causil_dataset,
    download_rca_circa_dataset,
    download_rca_rcd_dataset,
    download_online_boutique_dataset,
    download_sock_shop_1_dataset,
    download_sock_shop_2_dataset,
    download_train_ticket_dataset,
)

download_syn_rcd_dataset()
download_syn_circa_dataset()
download_syn_causil_dataset()
download_rca_circa_dataset()
download_rca_rcd_dataset()
download_online_boutique_dataset()
download_sock_shop_1_dataset()
download_sock_shop_2_dataset()
download_train_ticket_dataset()
```
<details>
<summary>Expected output after running the above code (it takes few minutes to download our datasets)</summary>

```
$ python test.py
Downloading syn_rcd.zip..: 100%|██████████| 11.2M/11.2M [00:03<00:00, 3.56MiB/s]
Downloading syn_circa.zip..: 100%|████████| 52.5M/52.5M [00:06<00:00, 7.51MiB/s]
Downloading syn_causil.zip..: 100%|███████| 73.8M/73.8M [00:09<00:00, 8.05MiB/s]
Downloading rca_circa.zip..: 100%|████████| 52.7M/52.7M [00:06<00:00, 7.95MiB/s]
Downloading rca_rcd.zip..: 100%|██████████| 22.7M/22.7M [00:04<00:00, 5.16MiB/s]
Downloading online-boutique.zip..: 100%|██| 31.0M/31.0M [00:04<00:00, 6.49MiB/s]
Downloading sock-shop-1.zip..: 100%|██████| 3.54M/3.54M [00:02<00:00, 1.68MiB/s]
Downloading sock-shop-2.zip..: 100%|██████| 79.1M/79.1M [00:09<00:00, 8.38MiB/s]
Downloading train-ticket.zip..: 100%|███████| 280M/280M [00:27<00:00, 10.1MiB/s]
```
</details>


## Download Paper and Supplementary Material

- Our paper can be downloaded at [docs/ase-paper.pdf](docs/ase-paper.pdf)
- Our supplementary material can be downloaded at [docs/ase-paper-supplementary-material.pdf](docs/ase-paper-supplementary-material.pdf)

## Licensing

This repository includes code from various sources with different licenses. We have included their corresponding LICENSE into the [LICENSES](LICENSES) directory:

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

**For the code implemented by us and for our datasets, 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. This project would not have been feasible without their contributions.


## Contact

[luan.pham\@rmit.edu.au](mailto:luan.pham@rmit.edu.au?subject=BARO)
