xplia 1.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- venv/Lib/site-packages/_distutils_hack/__init__.py +222 -0
- venv/Lib/site-packages/_distutils_hack/override.py +1 -0
- venv/Lib/site-packages/pip/__init__.py +13 -0
- venv/Lib/site-packages/pip/__main__.py +24 -0
- venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
- venv/Lib/site-packages/pip/_internal/__init__.py +19 -0
- venv/Lib/site-packages/pip/_internal/build_env.py +311 -0
- venv/Lib/site-packages/pip/_internal/cache.py +292 -0
- venv/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
- venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +171 -0
- venv/Lib/site-packages/pip/_internal/cli/base_command.py +236 -0
- venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1074 -0
- venv/Lib/site-packages/pip/_internal/cli/command_context.py +27 -0
- venv/Lib/site-packages/pip/_internal/cli/main.py +79 -0
- venv/Lib/site-packages/pip/_internal/cli/main_parser.py +134 -0
- venv/Lib/site-packages/pip/_internal/cli/parser.py +294 -0
- venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +68 -0
- venv/Lib/site-packages/pip/_internal/cli/req_command.py +508 -0
- venv/Lib/site-packages/pip/_internal/cli/spinners.py +159 -0
- venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
- venv/Lib/site-packages/pip/_internal/commands/__init__.py +132 -0
- venv/Lib/site-packages/pip/_internal/commands/cache.py +222 -0
- venv/Lib/site-packages/pip/_internal/commands/check.py +54 -0
- venv/Lib/site-packages/pip/_internal/commands/completion.py +121 -0
- venv/Lib/site-packages/pip/_internal/commands/configuration.py +282 -0
- venv/Lib/site-packages/pip/_internal/commands/debug.py +199 -0
- venv/Lib/site-packages/pip/_internal/commands/download.py +147 -0
- venv/Lib/site-packages/pip/_internal/commands/freeze.py +108 -0
- venv/Lib/site-packages/pip/_internal/commands/hash.py +59 -0
- venv/Lib/site-packages/pip/_internal/commands/help.py +41 -0
- venv/Lib/site-packages/pip/_internal/commands/index.py +139 -0
- venv/Lib/site-packages/pip/_internal/commands/inspect.py +92 -0
- venv/Lib/site-packages/pip/_internal/commands/install.py +778 -0
- venv/Lib/site-packages/pip/_internal/commands/list.py +368 -0
- venv/Lib/site-packages/pip/_internal/commands/search.py +174 -0
- venv/Lib/site-packages/pip/_internal/commands/show.py +189 -0
- venv/Lib/site-packages/pip/_internal/commands/uninstall.py +113 -0
- venv/Lib/site-packages/pip/_internal/commands/wheel.py +183 -0
- venv/Lib/site-packages/pip/_internal/configuration.py +381 -0
- venv/Lib/site-packages/pip/_internal/distributions/__init__.py +21 -0
- venv/Lib/site-packages/pip/_internal/distributions/base.py +39 -0
- venv/Lib/site-packages/pip/_internal/distributions/installed.py +23 -0
- venv/Lib/site-packages/pip/_internal/distributions/sdist.py +150 -0
- venv/Lib/site-packages/pip/_internal/distributions/wheel.py +34 -0
- venv/Lib/site-packages/pip/_internal/exceptions.py +733 -0
- venv/Lib/site-packages/pip/_internal/index/__init__.py +2 -0
- venv/Lib/site-packages/pip/_internal/index/collector.py +505 -0
- venv/Lib/site-packages/pip/_internal/index/package_finder.py +1029 -0
- venv/Lib/site-packages/pip/_internal/index/sources.py +223 -0
- venv/Lib/site-packages/pip/_internal/locations/__init__.py +467 -0
- venv/Lib/site-packages/pip/_internal/locations/_distutils.py +173 -0
- venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +213 -0
- venv/Lib/site-packages/pip/_internal/locations/base.py +81 -0
- venv/Lib/site-packages/pip/_internal/main.py +12 -0
- venv/Lib/site-packages/pip/_internal/metadata/__init__.py +127 -0
- venv/Lib/site-packages/pip/_internal/metadata/_json.py +84 -0
- venv/Lib/site-packages/pip/_internal/metadata/base.py +688 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +4 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +55 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +224 -0
- venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +188 -0
- venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +270 -0
- venv/Lib/site-packages/pip/_internal/models/__init__.py +2 -0
- venv/Lib/site-packages/pip/_internal/models/candidate.py +34 -0
- venv/Lib/site-packages/pip/_internal/models/direct_url.py +237 -0
- venv/Lib/site-packages/pip/_internal/models/format_control.py +80 -0
- venv/Lib/site-packages/pip/_internal/models/index.py +28 -0
- venv/Lib/site-packages/pip/_internal/models/installation_report.py +53 -0
- venv/Lib/site-packages/pip/_internal/models/link.py +581 -0
- venv/Lib/site-packages/pip/_internal/models/scheme.py +31 -0
- venv/Lib/site-packages/pip/_internal/models/search_scope.py +132 -0
- venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +51 -0
- venv/Lib/site-packages/pip/_internal/models/target_python.py +110 -0
- venv/Lib/site-packages/pip/_internal/models/wheel.py +92 -0
- venv/Lib/site-packages/pip/_internal/network/__init__.py +2 -0
- venv/Lib/site-packages/pip/_internal/network/auth.py +561 -0
- venv/Lib/site-packages/pip/_internal/network/cache.py +69 -0
- venv/Lib/site-packages/pip/_internal/network/download.py +186 -0
- venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +210 -0
- venv/Lib/site-packages/pip/_internal/network/session.py +519 -0
- venv/Lib/site-packages/pip/_internal/network/utils.py +96 -0
- venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +60 -0
- venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +124 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +39 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +41 -0
- venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +74 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +37 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +46 -0
- venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +102 -0
- venv/Lib/site-packages/pip/_internal/operations/check.py +187 -0
- venv/Lib/site-packages/pip/_internal/operations/freeze.py +255 -0
- venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +2 -0
- venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +46 -0
- venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +740 -0
- venv/Lib/site-packages/pip/_internal/operations/prepare.py +743 -0
- venv/Lib/site-packages/pip/_internal/pyproject.py +179 -0
- venv/Lib/site-packages/pip/_internal/req/__init__.py +92 -0
- venv/Lib/site-packages/pip/_internal/req/constructors.py +506 -0
- venv/Lib/site-packages/pip/_internal/req/req_file.py +552 -0
- venv/Lib/site-packages/pip/_internal/req/req_install.py +874 -0
- venv/Lib/site-packages/pip/_internal/req/req_set.py +119 -0
- venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +650 -0
- venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/base.py +20 -0
- venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +600 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +141 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +555 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +730 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +155 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +255 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +80 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +165 -0
- venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +299 -0
- venv/Lib/site-packages/pip/_internal/self_outdated_check.py +242 -0
- venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
- venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +109 -0
- venv/Lib/site-packages/pip/_internal/utils/_log.py +38 -0
- venv/Lib/site-packages/pip/_internal/utils/appdirs.py +52 -0
- venv/Lib/site-packages/pip/_internal/utils/compat.py +63 -0
- venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +165 -0
- venv/Lib/site-packages/pip/_internal/utils/datetime.py +11 -0
- venv/Lib/site-packages/pip/_internal/utils/deprecation.py +120 -0
- venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +87 -0
- venv/Lib/site-packages/pip/_internal/utils/egg_link.py +72 -0
- venv/Lib/site-packages/pip/_internal/utils/encoding.py +36 -0
- venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +84 -0
- venv/Lib/site-packages/pip/_internal/utils/filesystem.py +153 -0
- venv/Lib/site-packages/pip/_internal/utils/filetypes.py +27 -0
- venv/Lib/site-packages/pip/_internal/utils/glibc.py +88 -0
- venv/Lib/site-packages/pip/_internal/utils/hashes.py +151 -0
- venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py +35 -0
- venv/Lib/site-packages/pip/_internal/utils/logging.py +348 -0
- venv/Lib/site-packages/pip/_internal/utils/misc.py +735 -0
- venv/Lib/site-packages/pip/_internal/utils/models.py +39 -0
- venv/Lib/site-packages/pip/_internal/utils/packaging.py +57 -0
- venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +146 -0
- venv/Lib/site-packages/pip/_internal/utils/subprocess.py +260 -0
- venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +246 -0
- venv/Lib/site-packages/pip/_internal/utils/unpacking.py +257 -0
- venv/Lib/site-packages/pip/_internal/utils/urls.py +62 -0
- venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +104 -0
- venv/Lib/site-packages/pip/_internal/utils/wheel.py +136 -0
- venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
- venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +112 -0
- venv/Lib/site-packages/pip/_internal/vcs/git.py +526 -0
- venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +163 -0
- venv/Lib/site-packages/pip/_internal/vcs/subversion.py +324 -0
- venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +705 -0
- venv/Lib/site-packages/pip/_internal/wheel_builder.py +355 -0
- venv/Lib/site-packages/pip/_vendor/__init__.py +120 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +18 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +61 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +137 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +65 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +9 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +188 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +39 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py +32 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +439 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +111 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +139 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +190 -0
- venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +33 -0
- venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +4 -0
- venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
- venv/Lib/site-packages/pip/_vendor/certifi/core.py +108 -0
- venv/Lib/site-packages/pip/_vendor/chardet/__init__.py +115 -0
- venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py +386 -0
- venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py +261 -0
- venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +106 -0
- venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +147 -0
- venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +112 -0
- venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +90 -0
- venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachinedict.py +19 -0
- venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +49 -0
- venv/Lib/site-packages/pip/_vendor/chardet/enums.py +85 -0
- venv/Lib/site-packages/pip/_vendor/chardet/escprober.py +102 -0
- venv/Lib/site-packages/pip/_vendor/chardet/escsm.py +261 -0
- venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +102 -0
- venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py +196 -0
- venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py +388 -0
- venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py +284 -0
- venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +316 -0
- venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py +325 -0
- venv/Lib/site-packages/pip/_vendor/chardet/johabfreq.py +2382 -0
- venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py +47 -0
- venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +238 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +4649 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py +4397 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py +4380 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py +4649 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py +5725 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py +4380 -0
- venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py +4380 -0
- venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +147 -0
- venv/Lib/site-packages/pip/_vendor/chardet/macromanprober.py +162 -0
- venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +95 -0
- venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +57 -0
- venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +661 -0
- venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py +352 -0
- venv/Lib/site-packages/pip/_vendor/chardet/resultdict.py +16 -0
- venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py +162 -0
- venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +88 -0
- venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +105 -0
- venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +362 -0
- venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py +225 -0
- venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +82 -0
- venv/Lib/site-packages/pip/_vendor/chardet/version.py +9 -0
- venv/Lib/site-packages/pip/_vendor/colorama/__init__.py +7 -0
- venv/Lib/site-packages/pip/_vendor/colorama/ansi.py +102 -0
- venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +277 -0
- venv/Lib/site-packages/pip/_vendor/colorama/initialise.py +121 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/__init__.py +1 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/ansi_test.py +76 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py +294 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/initialise_test.py +189 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/isatty_test.py +57 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/utils.py +49 -0
- venv/Lib/site-packages/pip/_vendor/colorama/tests/winterm_test.py +131 -0
- venv/Lib/site-packages/pip/_vendor/colorama/win32.py +180 -0
- venv/Lib/site-packages/pip/_vendor/colorama/winterm.py +195 -0
- venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +23 -0
- venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1116 -0
- venv/Lib/site-packages/pip/_vendor/distlib/database.py +1350 -0
- venv/Lib/site-packages/pip/_vendor/distlib/index.py +508 -0
- venv/Lib/site-packages/pip/_vendor/distlib/locators.py +1300 -0
- venv/Lib/site-packages/pip/_vendor/distlib/manifest.py +393 -0
- venv/Lib/site-packages/pip/_vendor/distlib/markers.py +152 -0
- venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +1076 -0
- venv/Lib/site-packages/pip/_vendor/distlib/resources.py +358 -0
- venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +437 -0
- venv/Lib/site-packages/pip/_vendor/distlib/util.py +1932 -0
- venv/Lib/site-packages/pip/_vendor/distlib/version.py +739 -0
- venv/Lib/site-packages/pip/_vendor/distlib/wheel.py +1082 -0
- venv/Lib/site-packages/pip/_vendor/distro/__init__.py +54 -0
- venv/Lib/site-packages/pip/_vendor/distro/__main__.py +4 -0
- venv/Lib/site-packages/pip/_vendor/distro/distro.py +1399 -0
- venv/Lib/site-packages/pip/_vendor/idna/__init__.py +44 -0
- venv/Lib/site-packages/pip/_vendor/idna/codec.py +112 -0
- venv/Lib/site-packages/pip/_vendor/idna/compat.py +13 -0
- venv/Lib/site-packages/pip/_vendor/idna/core.py +400 -0
- venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +2151 -0
- venv/Lib/site-packages/pip/_vendor/idna/intranges.py +54 -0
- venv/Lib/site-packages/pip/_vendor/idna/package_data.py +2 -0
- venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8600 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +57 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +193 -0
- venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +1010 -0
- venv/Lib/site-packages/pip/_vendor/packaging/__about__.py +26 -0
- venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +25 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +301 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +136 -0
- venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/pip/_vendor/packaging/markers.py +304 -0
- venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +146 -0
- venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +802 -0
- venv/Lib/site-packages/pip/_vendor/packaging/tags.py +487 -0
- venv/Lib/site-packages/pip/_vendor/packaging/utils.py +136 -0
- venv/Lib/site-packages/pip/_vendor/packaging/version.py +504 -0
- venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3361 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +566 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +53 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +210 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +223 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +91 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +223 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +4 -0
- venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +255 -0
- venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +82 -0
- venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +17 -0
- venv/Lib/site-packages/pip/_vendor/pygments/cmdline.py +668 -0
- venv/Lib/site-packages/pip/_vendor/pygments/console.py +70 -0
- venv/Lib/site-packages/pip/_vendor/pygments/filter.py +71 -0
- venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +940 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +124 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +158 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +23 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py +108 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py +170 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py +989 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/img.py +645 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py +154 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py +521 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/other.py +161 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py +83 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py +146 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py +188 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py +127 -0
- venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py +338 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +943 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +362 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +559 -0
- venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +1198 -0
- venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +43 -0
- venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +88 -0
- venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +91 -0
- venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +104 -0
- venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +217 -0
- venv/Lib/site-packages/pip/_vendor/pygments/style.py +197 -0
- venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +103 -0
- venv/Lib/site-packages/pip/_vendor/pygments/token.py +213 -0
- venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +153 -0
- venv/Lib/site-packages/pip/_vendor/pygments/util.py +330 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/__init__.py +322 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/actions.py +217 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/common.py +432 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/core.py +6115 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__init__.py +656 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/exceptions.py +299 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/helpers.py +1100 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/results.py +796 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/testing.py +331 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/unicode.py +361 -0
- venv/Lib/site-packages/pip/_vendor/pyparsing/util.py +284 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +23 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_compat.py +8 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +330 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +18 -0
- venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +353 -0
- venv/Lib/site-packages/pip/_vendor/requests/__init__.py +182 -0
- venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
- venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +50 -0
- venv/Lib/site-packages/pip/_vendor/requests/adapters.py +538 -0
- venv/Lib/site-packages/pip/_vendor/requests/api.py +157 -0
- venv/Lib/site-packages/pip/_vendor/requests/auth.py +315 -0
- venv/Lib/site-packages/pip/_vendor/requests/certs.py +24 -0
- venv/Lib/site-packages/pip/_vendor/requests/compat.py +67 -0
- venv/Lib/site-packages/pip/_vendor/requests/cookies.py +561 -0
- venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +141 -0
- venv/Lib/site-packages/pip/_vendor/requests/help.py +131 -0
- venv/Lib/site-packages/pip/_vendor/requests/hooks.py +33 -0
- venv/Lib/site-packages/pip/_vendor/requests/models.py +1034 -0
- venv/Lib/site-packages/pip/_vendor/requests/packages.py +16 -0
- venv/Lib/site-packages/pip/_vendor/requests/sessions.py +833 -0
- venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +128 -0
- venv/Lib/site-packages/pip/_vendor/requests/structures.py +99 -0
- venv/Lib/site-packages/pip/_vendor/requests/utils.py +1094 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +26 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +6 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +133 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +43 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py +547 -0
- venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +170 -0
- venv/Lib/site-packages/pip/_vendor/rich/__init__.py +177 -0
- venv/Lib/site-packages/pip/_vendor/rich/__main__.py +274 -0
- venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +451 -0
- venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +3610 -0
- venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +32 -0
- venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +76 -0
- venv/Lib/site-packages/pip/_vendor/rich/_extension.py +10 -0
- venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +24 -0
- venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +270 -0
- venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +94 -0
- venv/Lib/site-packages/pip/_vendor/rich/_loop.py +43 -0
- venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +69 -0
- venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +309 -0
- venv/Lib/site-packages/pip/_vendor/rich/_pick.py +17 -0
- venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +160 -0
- venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +482 -0
- venv/Lib/site-packages/pip/_vendor/rich/_stack.py +16 -0
- venv/Lib/site-packages/pip/_vendor/rich/_timer.py +19 -0
- venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +662 -0
- venv/Lib/site-packages/pip/_vendor/rich/_windows.py +72 -0
- venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +56 -0
- venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +56 -0
- venv/Lib/site-packages/pip/_vendor/rich/abc.py +33 -0
- venv/Lib/site-packages/pip/_vendor/rich/align.py +311 -0
- venv/Lib/site-packages/pip/_vendor/rich/ansi.py +240 -0
- venv/Lib/site-packages/pip/_vendor/rich/bar.py +94 -0
- venv/Lib/site-packages/pip/_vendor/rich/box.py +517 -0
- venv/Lib/site-packages/pip/_vendor/rich/cells.py +154 -0
- venv/Lib/site-packages/pip/_vendor/rich/color.py +622 -0
- venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +38 -0
- venv/Lib/site-packages/pip/_vendor/rich/columns.py +187 -0
- venv/Lib/site-packages/pip/_vendor/rich/console.py +2633 -0
- venv/Lib/site-packages/pip/_vendor/rich/constrain.py +37 -0
- venv/Lib/site-packages/pip/_vendor/rich/containers.py +167 -0
- venv/Lib/site-packages/pip/_vendor/rich/control.py +225 -0
- venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +190 -0
- venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +37 -0
- venv/Lib/site-packages/pip/_vendor/rich/emoji.py +96 -0
- venv/Lib/site-packages/pip/_vendor/rich/errors.py +34 -0
- venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +57 -0
- venv/Lib/site-packages/pip/_vendor/rich/filesize.py +89 -0
- venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +232 -0
- venv/Lib/site-packages/pip/_vendor/rich/json.py +140 -0
- venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +101 -0
- venv/Lib/site-packages/pip/_vendor/rich/layout.py +443 -0
- venv/Lib/site-packages/pip/_vendor/rich/live.py +375 -0
- venv/Lib/site-packages/pip/_vendor/rich/live_render.py +113 -0
- venv/Lib/site-packages/pip/_vendor/rich/logging.py +289 -0
- venv/Lib/site-packages/pip/_vendor/rich/markup.py +246 -0
- venv/Lib/site-packages/pip/_vendor/rich/measure.py +151 -0
- venv/Lib/site-packages/pip/_vendor/rich/padding.py +141 -0
- venv/Lib/site-packages/pip/_vendor/rich/pager.py +34 -0
- venv/Lib/site-packages/pip/_vendor/rich/palette.py +100 -0
- venv/Lib/site-packages/pip/_vendor/rich/panel.py +308 -0
- venv/Lib/site-packages/pip/_vendor/rich/pretty.py +994 -0
- venv/Lib/site-packages/pip/_vendor/rich/progress.py +1702 -0
- venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +224 -0
- venv/Lib/site-packages/pip/_vendor/rich/prompt.py +376 -0
- venv/Lib/site-packages/pip/_vendor/rich/protocol.py +42 -0
- venv/Lib/site-packages/pip/_vendor/rich/region.py +10 -0
- venv/Lib/site-packages/pip/_vendor/rich/repr.py +149 -0
- venv/Lib/site-packages/pip/_vendor/rich/rule.py +130 -0
- venv/Lib/site-packages/pip/_vendor/rich/scope.py +86 -0
- venv/Lib/site-packages/pip/_vendor/rich/screen.py +54 -0
- venv/Lib/site-packages/pip/_vendor/rich/segment.py +739 -0
- venv/Lib/site-packages/pip/_vendor/rich/spinner.py +137 -0
- venv/Lib/site-packages/pip/_vendor/rich/status.py +132 -0
- venv/Lib/site-packages/pip/_vendor/rich/style.py +796 -0
- venv/Lib/site-packages/pip/_vendor/rich/styled.py +42 -0
- venv/Lib/site-packages/pip/_vendor/rich/syntax.py +948 -0
- venv/Lib/site-packages/pip/_vendor/rich/table.py +1002 -0
- venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +153 -0
- venv/Lib/site-packages/pip/_vendor/rich/text.py +1307 -0
- venv/Lib/site-packages/pip/_vendor/rich/theme.py +115 -0
- venv/Lib/site-packages/pip/_vendor/rich/themes.py +5 -0
- venv/Lib/site-packages/pip/_vendor/rich/traceback.py +756 -0
- venv/Lib/site-packages/pip/_vendor/rich/tree.py +251 -0
- venv/Lib/site-packages/pip/_vendor/six.py +998 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py +608 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py +94 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py +76 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/after.py +51 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/before.py +46 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py +71 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/nap.py +43 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/retry.py +272 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/stop.py +103 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py +59 -0
- venv/Lib/site-packages/pip/_vendor/tenacity/wait.py +228 -0
- venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +11 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +691 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_re.py +107 -0
- venv/Lib/site-packages/pip/_vendor/tomli/_types.py +10 -0
- venv/Lib/site-packages/pip/_vendor/typing_extensions.py +3072 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +102 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +337 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +572 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1132 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +397 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +130 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +518 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +921 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +323 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +155 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1076 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +537 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/request.py +170 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/response.py +879 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +149 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +57 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +137 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +620 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +495 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +159 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +271 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +435 -0
- venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +152 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py +342 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/labels.py +231 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py +59 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/tests.py +153 -0
- venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py +325 -0
- venv/Lib/site-packages/pip/py.typed +4 -0
- venv/Lib/site-packages/pkg_resources/__init__.py +3296 -0
- venv/Lib/site-packages/pkg_resources/_vendor/__init__.py +0 -0
- venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py +608 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__init__.py +36 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_adapters.py +170 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_common.py +104 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_compat.py +98 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_itertools.py +35 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/_legacy.py +121 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/abc.py +137 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/readers.py +122 -0
- venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/simple.py +116 -0
- venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__init__.py +0 -0
- venv/Lib/site-packages/pkg_resources/_vendor/jaraco/context.py +213 -0
- venv/Lib/site-packages/pkg_resources/_vendor/jaraco/functools.py +525 -0
- venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__init__.py +599 -0
- venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__init__.py +4 -0
- venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/more.py +4316 -0
- venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/recipes.py +698 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py +26 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py +25 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/_manylinux.py +301 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/_musllinux.py +136 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py +304 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py +146 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py +802 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py +487 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py +136 -0
- venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py +504 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__init__.py +331 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/actions.py +207 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/common.py +424 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/core.py +5814 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__init__.py +642 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/exceptions.py +267 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/helpers.py +1088 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/results.py +760 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/testing.py +331 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/unicode.py +352 -0
- venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/util.py +235 -0
- venv/Lib/site-packages/pkg_resources/_vendor/zipp.py +329 -0
- venv/Lib/site-packages/pkg_resources/extern/__init__.py +76 -0
- venv/Lib/site-packages/setuptools/__init__.py +247 -0
- venv/Lib/site-packages/setuptools/_deprecation_warning.py +7 -0
- venv/Lib/site-packages/setuptools/_distutils/__init__.py +24 -0
- venv/Lib/site-packages/setuptools/_distutils/_collections.py +56 -0
- venv/Lib/site-packages/setuptools/_distutils/_functools.py +20 -0
- venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py +12 -0
- venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +572 -0
- venv/Lib/site-packages/setuptools/_distutils/archive_util.py +280 -0
- venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py +408 -0
- venv/Lib/site-packages/setuptools/_distutils/ccompiler.py +1220 -0
- venv/Lib/site-packages/setuptools/_distutils/cmd.py +436 -0
- venv/Lib/site-packages/setuptools/_distutils/command/__init__.py +25 -0
- venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py +55 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist.py +157 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py +144 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py +615 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build.py +153 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +208 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +787 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_py.py +407 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +173 -0
- venv/Lib/site-packages/setuptools/_distutils/command/check.py +151 -0
- venv/Lib/site-packages/setuptools/_distutils/command/clean.py +76 -0
- venv/Lib/site-packages/setuptools/_distutils/command/config.py +377 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install.py +814 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_data.py +84 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py +91 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py +45 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py +238 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py +61 -0
- venv/Lib/site-packages/setuptools/_distutils/command/py37compat.py +31 -0
- venv/Lib/site-packages/setuptools/_distutils/command/register.py +319 -0
- venv/Lib/site-packages/setuptools/_distutils/command/sdist.py +531 -0
- venv/Lib/site-packages/setuptools/_distutils/command/upload.py +205 -0
- venv/Lib/site-packages/setuptools/_distutils/config.py +139 -0
- venv/Lib/site-packages/setuptools/_distutils/core.py +291 -0
- venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py +364 -0
- venv/Lib/site-packages/setuptools/_distutils/debug.py +5 -0
- venv/Lib/site-packages/setuptools/_distutils/dep_util.py +96 -0
- venv/Lib/site-packages/setuptools/_distutils/dir_util.py +243 -0
- venv/Lib/site-packages/setuptools/_distutils/dist.py +1286 -0
- venv/Lib/site-packages/setuptools/_distutils/errors.py +127 -0
- venv/Lib/site-packages/setuptools/_distutils/extension.py +248 -0
- venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py +470 -0
- venv/Lib/site-packages/setuptools/_distutils/file_util.py +249 -0
- venv/Lib/site-packages/setuptools/_distutils/filelist.py +371 -0
- venv/Lib/site-packages/setuptools/_distutils/log.py +80 -0
- venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py +832 -0
- venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py +695 -0
- venv/Lib/site-packages/setuptools/_distutils/py38compat.py +8 -0
- venv/Lib/site-packages/setuptools/_distutils/py39compat.py +22 -0
- venv/Lib/site-packages/setuptools/_distutils/spawn.py +109 -0
- venv/Lib/site-packages/setuptools/_distutils/sysconfig.py +558 -0
- venv/Lib/site-packages/setuptools/_distutils/text_file.py +287 -0
- venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +401 -0
- venv/Lib/site-packages/setuptools/_distutils/util.py +513 -0
- venv/Lib/site-packages/setuptools/_distutils/version.py +358 -0
- venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py +175 -0
- venv/Lib/site-packages/setuptools/_entry_points.py +86 -0
- venv/Lib/site-packages/setuptools/_imp.py +82 -0
- venv/Lib/site-packages/setuptools/_importlib.py +47 -0
- venv/Lib/site-packages/setuptools/_itertools.py +23 -0
- venv/Lib/site-packages/setuptools/_path.py +29 -0
- venv/Lib/site-packages/setuptools/_reqs.py +19 -0
- venv/Lib/site-packages/setuptools/_vendor/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +1047 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +68 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +30 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +71 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +104 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +73 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +48 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py +99 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__init__.py +36 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_adapters.py +170 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_common.py +104 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_compat.py +98 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_itertools.py +35 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/_legacy.py +121 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/abc.py +137 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/readers.py +122 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_resources/simple.py +116 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py +213 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools.py +525 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py +599 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py +4 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py +3824 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py +620 -0
- venv/Lib/site-packages/setuptools/_vendor/ordered_set.py +488 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py +26 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +25 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +301 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py +136 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +304 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +146 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +802 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +487 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +136 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +504 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/__init__.py +331 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/actions.py +207 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/common.py +424 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/core.py +5814 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__init__.py +642 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/exceptions.py +267 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/helpers.py +1088 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/results.py +760 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/testing.py +331 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/unicode.py +352 -0
- venv/Lib/site-packages/setuptools/_vendor/pyparsing/util.py +235 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py +11 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py +691 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py +107 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py +10 -0
- venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py +2296 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp.py +329 -0
- venv/Lib/site-packages/setuptools/archive_util.py +213 -0
- venv/Lib/site-packages/setuptools/build_meta.py +511 -0
- venv/Lib/site-packages/setuptools/command/__init__.py +12 -0
- venv/Lib/site-packages/setuptools/command/alias.py +78 -0
- venv/Lib/site-packages/setuptools/command/bdist_egg.py +457 -0
- venv/Lib/site-packages/setuptools/command/bdist_rpm.py +40 -0
- venv/Lib/site-packages/setuptools/command/build.py +146 -0
- venv/Lib/site-packages/setuptools/command/build_clib.py +101 -0
- venv/Lib/site-packages/setuptools/command/build_ext.py +383 -0
- venv/Lib/site-packages/setuptools/command/build_py.py +368 -0
- venv/Lib/site-packages/setuptools/command/develop.py +193 -0
- venv/Lib/site-packages/setuptools/command/dist_info.py +142 -0
- venv/Lib/site-packages/setuptools/command/easy_install.py +2312 -0
- venv/Lib/site-packages/setuptools/command/editable_wheel.py +844 -0
- venv/Lib/site-packages/setuptools/command/egg_info.py +763 -0
- venv/Lib/site-packages/setuptools/command/install.py +139 -0
- venv/Lib/site-packages/setuptools/command/install_egg_info.py +63 -0
- venv/Lib/site-packages/setuptools/command/install_lib.py +122 -0
- venv/Lib/site-packages/setuptools/command/install_scripts.py +70 -0
- venv/Lib/site-packages/setuptools/command/py36compat.py +134 -0
- venv/Lib/site-packages/setuptools/command/register.py +18 -0
- venv/Lib/site-packages/setuptools/command/rotate.py +64 -0
- venv/Lib/site-packages/setuptools/command/saveopts.py +22 -0
- venv/Lib/site-packages/setuptools/command/sdist.py +210 -0
- venv/Lib/site-packages/setuptools/command/setopt.py +149 -0
- venv/Lib/site-packages/setuptools/command/test.py +251 -0
- venv/Lib/site-packages/setuptools/command/upload.py +17 -0
- venv/Lib/site-packages/setuptools/command/upload_docs.py +213 -0
- venv/Lib/site-packages/setuptools/config/__init__.py +35 -0
- venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +377 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py +34 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +318 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +36 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +51 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +1035 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +259 -0
- venv/Lib/site-packages/setuptools/config/expand.py +462 -0
- venv/Lib/site-packages/setuptools/config/pyprojecttoml.py +493 -0
- venv/Lib/site-packages/setuptools/config/setupcfg.py +762 -0
- venv/Lib/site-packages/setuptools/dep_util.py +25 -0
- venv/Lib/site-packages/setuptools/depends.py +176 -0
- venv/Lib/site-packages/setuptools/discovery.py +600 -0
- venv/Lib/site-packages/setuptools/dist.py +1222 -0
- venv/Lib/site-packages/setuptools/errors.py +58 -0
- venv/Lib/site-packages/setuptools/extension.py +148 -0
- venv/Lib/site-packages/setuptools/extern/__init__.py +76 -0
- venv/Lib/site-packages/setuptools/glob.py +167 -0
- venv/Lib/site-packages/setuptools/installer.py +104 -0
- venv/Lib/site-packages/setuptools/launch.py +36 -0
- venv/Lib/site-packages/setuptools/logging.py +36 -0
- venv/Lib/site-packages/setuptools/monkey.py +165 -0
- venv/Lib/site-packages/setuptools/msvc.py +1703 -0
- venv/Lib/site-packages/setuptools/namespaces.py +107 -0
- venv/Lib/site-packages/setuptools/package_index.py +1126 -0
- venv/Lib/site-packages/setuptools/py34compat.py +13 -0
- venv/Lib/site-packages/setuptools/sandbox.py +530 -0
- venv/Lib/site-packages/setuptools/unicode_utils.py +42 -0
- venv/Lib/site-packages/setuptools/version.py +6 -0
- venv/Lib/site-packages/setuptools/wheel.py +222 -0
- venv/Lib/site-packages/setuptools/windows_support.py +29 -0
- xplia/__init__.py +72 -0
- xplia/api/__init__.py +432 -0
- xplia/api/fastapi_app.py +453 -0
- xplia/cli.py +321 -0
- xplia/compliance/__init__.py +39 -0
- xplia/compliance/ai_act.py +538 -0
- xplia/compliance/compliance_checker.py +511 -0
- xplia/compliance/compliance_report.py +236 -0
- xplia/compliance/expert_review/__init__.py +18 -0
- xplia/compliance/expert_review/evaluation_criteria.py +209 -0
- xplia/compliance/expert_review/integration.py +270 -0
- xplia/compliance/expert_review/trust_expert_evaluator.py +379 -0
- xplia/compliance/explanation_rights.py +45 -0
- xplia/compliance/formatters/__init__.py +35 -0
- xplia/compliance/formatters/csv_formatter.py +179 -0
- xplia/compliance/formatters/html_formatter.py +689 -0
- xplia/compliance/formatters/html_trust_formatter.py +147 -0
- xplia/compliance/formatters/json_formatter.py +107 -0
- xplia/compliance/formatters/pdf_formatter.py +641 -0
- xplia/compliance/formatters/pdf_trust_formatter.py +309 -0
- xplia/compliance/formatters/trust_formatter_mixin.py +267 -0
- xplia/compliance/formatters/xml_formatter.py +173 -0
- xplia/compliance/gdpr.py +803 -0
- xplia/compliance/hipaa.py +134 -0
- xplia/compliance/report_base.py +205 -0
- xplia/compliance/report_generator.py +820 -0
- xplia/compliance/translations.py +299 -0
- xplia/core/__init__.py +98 -0
- xplia/core/base.py +391 -0
- xplia/core/config.py +297 -0
- xplia/core/factory.py +416 -0
- xplia/core/model_adapters/__init__.py +47 -0
- xplia/core/model_adapters/base.py +160 -0
- xplia/core/model_adapters/pytorch_adapter.py +339 -0
- xplia/core/model_adapters/sklearn_adapter.py +215 -0
- xplia/core/model_adapters/tensorflow_adapter.py +280 -0
- xplia/core/model_adapters/xgboost_adapter.py +295 -0
- xplia/core/optimizations.py +322 -0
- xplia/core/performance/__init__.py +57 -0
- xplia/core/performance/cache_manager.py +502 -0
- xplia/core/performance/memory_optimizer.py +465 -0
- xplia/core/performance/parallel_executor.py +327 -0
- xplia/core/registry.py +1234 -0
- xplia/explainers/__init__.py +70 -0
- xplia/explainers/__init__updated.py +62 -0
- xplia/explainers/adaptive/__init__.py +24 -0
- xplia/explainers/adaptive/explainer_selector.py +405 -0
- xplia/explainers/adaptive/explanation_quality.py +395 -0
- xplia/explainers/adaptive/fusion_strategies.py +297 -0
- xplia/explainers/adaptive/meta_explainer.py +320 -0
- xplia/explainers/adversarial/__init__.py +21 -0
- xplia/explainers/adversarial/adversarial_xai.py +678 -0
- xplia/explainers/anchor_explainer.py +1769 -0
- xplia/explainers/attention_explainer.py +996 -0
- xplia/explainers/bayesian/__init__.py +8 -0
- xplia/explainers/bayesian/bayesian_explainer.py +127 -0
- xplia/explainers/bias/__init__.py +17 -0
- xplia/explainers/bias/advanced_bias_detection.py +934 -0
- xplia/explainers/calibration/__init__.py +26 -0
- xplia/explainers/calibration/audience_adapter.py +376 -0
- xplia/explainers/calibration/audience_profiles.py +372 -0
- xplia/explainers/calibration/calibration_metrics.py +299 -0
- xplia/explainers/calibration/explanation_calibrator.py +460 -0
- xplia/explainers/causal/__init__.py +19 -0
- xplia/explainers/causal/causal_inference.py +669 -0
- xplia/explainers/certified/__init__.py +21 -0
- xplia/explainers/certified/certified_explanations.py +619 -0
- xplia/explainers/continual/__init__.py +8 -0
- xplia/explainers/continual/continual_explainer.py +102 -0
- xplia/explainers/counterfactual_explainer.py +804 -0
- xplia/explainers/counterfactuals/__init__.py +17 -0
- xplia/explainers/counterfactuals/advanced_counterfactuals.py +259 -0
- xplia/explainers/expert_evaluator.py +538 -0
- xplia/explainers/feature_importance_explainer.py +376 -0
- xplia/explainers/federated/__init__.py +17 -0
- xplia/explainers/federated/federated_xai.py +664 -0
- xplia/explainers/generative/__init__.py +15 -0
- xplia/explainers/generative/generative_explainer.py +243 -0
- xplia/explainers/gradient_explainer.py +3590 -0
- xplia/explainers/graph/__init__.py +26 -0
- xplia/explainers/graph/gnn_explainer.py +638 -0
- xplia/explainers/graph/molecular_explainer.py +438 -0
- xplia/explainers/lime_explainer.py +1580 -0
- xplia/explainers/llm/__init__.py +23 -0
- xplia/explainers/llm/llm_explainability.py +737 -0
- xplia/explainers/metalearning/__init__.py +15 -0
- xplia/explainers/metalearning/metalearning_explainer.py +276 -0
- xplia/explainers/moe/__init__.py +8 -0
- xplia/explainers/moe/moe_explainer.py +108 -0
- xplia/explainers/multimodal/__init__.py +30 -0
- xplia/explainers/multimodal/base.py +262 -0
- xplia/explainers/multimodal/diffusion_explainer.py +608 -0
- xplia/explainers/multimodal/foundation_model_explainer.py +323 -0
- xplia/explainers/multimodal/registry.py +139 -0
- xplia/explainers/multimodal/text_image_explainer.py +381 -0
- xplia/explainers/multimodal/vision_language_explainer.py +608 -0
- xplia/explainers/nas/__init__.py +5 -0
- xplia/explainers/nas/nas_explainer.py +65 -0
- xplia/explainers/neuralodes/__init__.py +5 -0
- xplia/explainers/neuralodes/neuralode_explainer.py +64 -0
- xplia/explainers/neurosymbolic/__init__.py +8 -0
- xplia/explainers/neurosymbolic/neurosymbolic_explainer.py +97 -0
- xplia/explainers/partial_dependence_explainer.py +509 -0
- xplia/explainers/privacy/__init__.py +21 -0
- xplia/explainers/privacy/differential_privacy_xai.py +624 -0
- xplia/explainers/quantum/__init__.py +5 -0
- xplia/explainers/quantum/quantum_explainer.py +79 -0
- xplia/explainers/recommender/__init__.py +8 -0
- xplia/explainers/recommender/recsys_explainer.py +124 -0
- xplia/explainers/reinforcement/__init__.py +15 -0
- xplia/explainers/reinforcement/rl_explainer.py +173 -0
- xplia/explainers/shap_explainer.py +2238 -0
- xplia/explainers/streaming/__init__.py +19 -0
- xplia/explainers/streaming/streaming_xai.py +703 -0
- xplia/explainers/timeseries/__init__.py +15 -0
- xplia/explainers/timeseries/timeseries_explainer.py +252 -0
- xplia/explainers/trust/__init__.py +24 -0
- xplia/explainers/trust/confidence_report.py +368 -0
- xplia/explainers/trust/fairwashing.py +489 -0
- xplia/explainers/trust/uncertainty.py +453 -0
- xplia/explainers/unified_explainer.py +566 -0
- xplia/explainers/unified_explainer_utils.py +309 -0
- xplia/integrations/__init__.py +3 -0
- xplia/integrations/mlflow_integration.py +331 -0
- xplia/integrations/wandb_integration.py +375 -0
- xplia/plugins/__init__.py +36 -0
- xplia/plugins/example_visualizer.py +11 -0
- xplia/utils/__init__.py +18 -0
- xplia/utils/performance.py +119 -0
- xplia/utils/validation.py +109 -0
- xplia/visualizations/__init__.py +31 -0
- xplia/visualizations/base.py +256 -0
- xplia/visualizations/boxplot_chart.py +224 -0
- xplia/visualizations/charts_impl.py +65 -0
- xplia/visualizations/gauge_chart.py +211 -0
- xplia/visualizations/gradient_viz.py +117 -0
- xplia/visualizations/heatmap_chart.py +173 -0
- xplia/visualizations/histogram_chart.py +176 -0
- xplia/visualizations/line_chart.py +100 -0
- xplia/visualizations/pie_chart.py +134 -0
- xplia/visualizations/radar_chart.py +154 -0
- xplia/visualizations/registry.py +76 -0
- xplia/visualizations/sankey_chart.py +190 -0
- xplia/visualizations/scatter_chart.py +252 -0
- xplia/visualizations/table_chart.py +263 -0
- xplia/visualizations/treemap_chart.py +216 -0
- xplia/visualizations.py +535 -0
- xplia/visualizers/__init__.py +87 -0
- xplia/visualizers/base_visualizer.py +294 -0
- xplia-1.0.1.dist-info/METADATA +685 -0
- xplia-1.0.1.dist-info/RECORD +870 -0
- xplia-1.0.1.dist-info/WHEEL +5 -0
- xplia-1.0.1.dist-info/entry_points.txt +2 -0
- xplia-1.0.1.dist-info/licenses/LICENSE +21 -0
- xplia-1.0.1.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Unified Explainer pour XPLIA - Framework d'explicabilité avancé
|
|
3
|
+
=============================================================
|
|
4
|
+
|
|
5
|
+
Ce module implémente l'UnifiedExplainer de XPLIA, le système d'explicabilité d'IA le plus avancé au monde.
|
|
6
|
+
|
|
7
|
+
Caractéristiques principales:
|
|
8
|
+
- **Multi-méthodes**: Combine intelligemment toutes les approches (SHAP, LIME, Counterfactual, etc.)
|
|
9
|
+
- **Multi-niveaux**: Adapte automatiquement les explications à l'audience (technique/non-technique)
|
|
10
|
+
- **Multi-évaluations**: Quantifie la qualité, cohérence, fidélité et robustesse des explications
|
|
11
|
+
- **Multi-modèles**: Compatible avec tous les frameworks ML/DL (scikit-learn, TensorFlow, PyTorch, etc.)
|
|
12
|
+
- **Multi-formats**: Génère des explications textuelles, visuelles, interactives, et techniques
|
|
13
|
+
- **Conforme**: Répond aux exigences du RGPD, AI Act, HIPAA et autres réglementations
|
|
14
|
+
- **Extensible**: Architecture modulaire avec hooks et système de plugins
|
|
15
|
+
- **Robuste**: Tests étendus, détection des divergences et métriques de fiabilité
|
|
16
|
+
- **Performant**: Optimisé pour les grands volumes de données et le traitement en temps réel
|
|
17
|
+
|
|
18
|
+
L'UnifiedExplainer est le cœur de XPLIA, offrant des explications holistiques et adaptatives tout en
|
|
19
|
+
minimisant la complexité pour l'utilisateur final et en satisfaisant aux exigences réglementaires.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import logging
|
|
23
|
+
import time
|
|
24
|
+
import json
|
|
25
|
+
import hashlib
|
|
26
|
+
import threading
|
|
27
|
+
from typing import Any, Dict, List, Optional, Tuple, Union, Callable, Set
|
|
28
|
+
from enum import Enum
|
|
29
|
+
from dataclasses import dataclass, field
|
|
30
|
+
|
|
31
|
+
import numpy as np
|
|
32
|
+
import pandas as pd
|
|
33
|
+
from scipy import stats
|
|
34
|
+
|
|
35
|
+
from ..core.base import (AudienceLevel, ExplainerBase, ExplainabilityMethod,
|
|
36
|
+
ExplanationResult, FeatureImportance, ModelMetadata)
|
|
37
|
+
from ..core.registry import register_explainer
|
|
38
|
+
from ..core.factory import create_explainer
|
|
39
|
+
from ..plugins import PluginRegistry
|
|
40
|
+
from ..compliance import ComplianceChecker
|
|
41
|
+
|
|
42
|
+
# Configuration avancée du logger avec rotation des fichiers et niveaux multiples
|
|
43
|
+
logger = logging.getLogger(__name__)
|
|
44
|
+
|
|
45
|
+
@dataclass
|
|
46
|
+
class ExplanationQualityMetrics:
|
|
47
|
+
"""Métriques détaillées de la qualité d'une explication."""
|
|
48
|
+
coherence: float = 0.0 # Cohérence interne de l'explication
|
|
49
|
+
fidelity: float = 0.0 # Fidélité au modèle original
|
|
50
|
+
stability: float = 0.0 # Stabilité face aux petites perturbations
|
|
51
|
+
sparsity: float = 0.0 # Parcimonie (moins de facteurs = meilleur)
|
|
52
|
+
completeness: float = 0.0 # Couverture des facteurs importants
|
|
53
|
+
consistency: float = 0.0 # Cohérence entre plusieurs runs
|
|
54
|
+
contrastivity: float = 0.0 # Capacité à contraster les décisions
|
|
55
|
+
actionability: float = 0.0 # Caractère actionable des explications
|
|
56
|
+
regulatory_compliance: Dict[str, float] = field(default_factory=dict) # Scores de conformité aux réglementations
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def overall_score(self) -> float:
|
|
60
|
+
"""Score global agrégé de qualité."""
|
|
61
|
+
metrics = [self.coherence, self.fidelity, self.stability,
|
|
62
|
+
self.sparsity, self.completeness, self.consistency,
|
|
63
|
+
self.contrastivity, self.actionability]
|
|
64
|
+
# Ajout des scores réglementaires s'ils existent
|
|
65
|
+
if self.regulatory_compliance:
|
|
66
|
+
metrics.extend(self.regulatory_compliance.values())
|
|
67
|
+
return np.mean([m for m in metrics if m > 0])
|
|
68
|
+
|
|
69
|
+
class ExplanationStrategy(Enum):
|
|
70
|
+
"""Stratégies d'explication adaptées à différents contextes."""
|
|
71
|
+
TECHNICAL = "technical" # Pour experts techniques (data scientists, ML engineers)
|
|
72
|
+
BUSINESS = "business" # Pour décideurs métier (managers, stakeholders)
|
|
73
|
+
REGULATORY = "regulatory" # Orienté conformité réglementaire (AI Act, RGPD)
|
|
74
|
+
EDUCATIONAL = "educational" # Pour sensibilisation et formation
|
|
75
|
+
ADVERSARIAL = "adversarial" # Pour tests de robustesse et sécurité
|
|
76
|
+
INTERACTIVE = "interactive" # Pour exploration interactive
|
|
77
|
+
DEBUGGING = "debugging" # Pour debug et diagnostic du modèle
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@register_explainer
|
|
81
|
+
class UnifiedExplainer(ExplainerBase):
|
|
82
|
+
"""
|
|
83
|
+
Framework d'explicabilité avancé combinant toutes les méthodes d'interprétabilité de l'IA.
|
|
84
|
+
|
|
85
|
+
L'UnifiedExplainer, fleuron de XPLIA, est le système d'explicabilité IA le plus avancé et complet au monde.
|
|
86
|
+
Il orchestre intelligemment toutes les approches d'interprétabilité (SHAP, LIME, Counterfactual,
|
|
87
|
+
Feature Importance, Grad-CAM, etc.) pour produire une explication holistique, cohérente et contextualisée.
|
|
88
|
+
|
|
89
|
+
Fonctionnalités avancées:
|
|
90
|
+
- Adaptation automatique au niveau de l'audience (technique → grand public)
|
|
91
|
+
- Détection et résolution des divergences entre méthodes d'explicabilité
|
|
92
|
+
- Validation multi-métrique de la qualité, cohérence et fiabilité
|
|
93
|
+
- Sélection intelligente des explications les plus pertinentes selon le contexte
|
|
94
|
+
- Multiple niveaux d'abstraction (global, local, contrefactuel, causal)
|
|
95
|
+
- Explications multi-formats (texte, visualisation, interactif, programmatique)
|
|
96
|
+
- Conformité réglementaire (RGPD, AI Act, HIPAA) intégrée et auditée
|
|
97
|
+
- Extensibilité via plugins et hooks pour cas d'usage spécifiques
|
|
98
|
+
- Optimisation pour grands volumes de données et traitement en temps réel
|
|
99
|
+
- Robustesse face aux attaques adversariales et aux données aberrantes
|
|
100
|
+
|
|
101
|
+
L'UnifiedExplainer transforme l'explicabilité de l'intelligence artificielle en un atout stratégique,
|
|
102
|
+
permettant de combiner excellence technique, conformité réglementaire et accessibilité pour tous.
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
def __init__(self, model, **kwargs):
|
|
106
|
+
"""
|
|
107
|
+
Initialise l'UnifiedExplainer avec configuration complète et auto-optimisation.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
model: Modèle à expliquer (scikit-learn, TensorFlow, PyTorch, custom)
|
|
111
|
+
methods (List[ExplainabilityMethod], optional): Méthodes d'explicabilité à utiliser
|
|
112
|
+
weights (Dict[ExplainabilityMethod, float], optional): Pondération des méthodes
|
|
113
|
+
aggregation_strategy (str, optional): Stratégie d'agrégation ('weighted', 'consensus', 'adaptive', 'ensemble')
|
|
114
|
+
explanation_strategy (ExplanationStrategy, optional): Contexte d'explication (TECHNICAL, BUSINESS, etc.)
|
|
115
|
+
audience_level (AudienceLevel, optional): Niveau de l'audience cible (EXPERT, INTERMEDIATE, NOVICE)
|
|
116
|
+
compliance_requirements (List[str], optional): Exigences réglementaires à respecter ('rgpd', 'ai_act', 'hipaa')
|
|
117
|
+
evaluation_metrics (List[str], optional): Métriques d'évaluation spécifiques à calculer
|
|
118
|
+
optimization_target (str, optional): Cible d'optimisation ('quality', 'performance', 'sparsity', 'regulatory')
|
|
119
|
+
max_features (int, optional): Nombre maximal de caractéristiques à inclure dans l'explication
|
|
120
|
+
feature_selection (str, optional): Méthode de sélection des caractéristiques ('auto', 'importance', 'clustering')
|
|
121
|
+
enable_caching (bool, optional): Activer le cache des explications pour performances optimales
|
|
122
|
+
enable_stability_checks (bool, optional): Activer les tests de stabilité et robustesse
|
|
123
|
+
enable_hooks (bool, optional): Activer les hooks personnalisables
|
|
124
|
+
confidence_threshold (float, optional): Seuil de confiance pour l'inclusion des résultats
|
|
125
|
+
interactive_mode (bool, optional): Préparer pour utilisation interactive/dashboard
|
|
126
|
+
background_data (numpy.ndarray, optional): Données de référence pour certaines méthodes (comme SHAP)
|
|
127
|
+
timeout (int, optional): Timeout en secondes pour chaque méthode d'explicabilité
|
|
128
|
+
n_jobs (int, optional): Nombre de jobs parallèles pour les calculs
|
|
129
|
+
random_state (int, optional): Graine pour reproducibiité
|
|
130
|
+
verbose (int, optional): Niveau de verbosité (0-3)
|
|
131
|
+
**kwargs: Paramètres spécifiques pour explainers individuels
|
|
132
|
+
|
|
133
|
+
Note:
|
|
134
|
+
L'UnifiedExplainer détecte automatiquement le type de modèle et optimise la configuration
|
|
135
|
+
en fonction des données, du contexte et des exigences réglementaires. Il maintient un
|
|
136
|
+
audit trail complet et s'adapte intelligemment aux ressources disponibles.
|
|
137
|
+
"""
|
|
138
|
+
super().__init__(model, **kwargs)
|
|
139
|
+
|
|
140
|
+
# Identification et métadonnées
|
|
141
|
+
self._method = ExplainabilityMethod.UNIFIED
|
|
142
|
+
self._version = "2.5.0"
|
|
143
|
+
self._instance_id = hashlib.sha256(str(time.time()).encode()).hexdigest()[:12]
|
|
144
|
+
|
|
145
|
+
# Détection automatique du framework ML/DL et adaptation des stratégies
|
|
146
|
+
self._model_framework = self._detect_model_framework(model)
|
|
147
|
+
self._is_classifier = self._detect_is_classifier(model)
|
|
148
|
+
self._supported_model_types = self._get_supported_model_types()
|
|
149
|
+
|
|
150
|
+
# Paramètres de configuration principale
|
|
151
|
+
self._explanation_strategy = kwargs.get('explanation_strategy', ExplanationStrategy.TECHNICAL)
|
|
152
|
+
self._audience_level = kwargs.get('audience_level', AudienceLevel.INTERMEDIATE)
|
|
153
|
+
self._optimization_target = kwargs.get('optimization_target', 'quality')
|
|
154
|
+
self._compliance_requirements = self._setup_compliance(kwargs.get('compliance_requirements', ['rgpd', 'ai_act']))
|
|
155
|
+
self._max_features = kwargs.get('max_features', 15)
|
|
156
|
+
self._feature_selection = kwargs.get('feature_selection', 'auto')
|
|
157
|
+
self._confidence_threshold = kwargs.get('confidence_threshold', 0.7)
|
|
158
|
+
self._timeout = kwargs.get('timeout', 300) # 5 minutes par défaut
|
|
159
|
+
self._n_jobs = kwargs.get('n_jobs', -1) # Tous les CPU par défaut
|
|
160
|
+
self._random_state = kwargs.get('random_state', 42)
|
|
161
|
+
self._verbose = kwargs.get('verbose', 1)
|
|
162
|
+
|
|
163
|
+
# Configuration des options avancées
|
|
164
|
+
self._enable_caching = kwargs.get('enable_caching', True)
|
|
165
|
+
self._cache = {} if self._enable_caching else None
|
|
166
|
+
self._enable_stability_checks = kwargs.get('enable_stability_checks', True)
|
|
167
|
+
self._enable_hooks = kwargs.get('enable_hooks', True)
|
|
168
|
+
self._interactive_mode = kwargs.get('interactive_mode', False)
|
|
169
|
+
self._background_data = kwargs.get('background_data', None)
|
|
170
|
+
|
|
171
|
+
# Configuration des métriques d'évaluation
|
|
172
|
+
self._evaluation_metrics = kwargs.get('evaluation_metrics', [
|
|
173
|
+
'coherence', 'fidelity', 'stability', 'sparsity', 'completeness'
|
|
174
|
+
])
|
|
175
|
+
|
|
176
|
+
# Sélection intelligente des méthodes d'explicabilité adaptées au modèle et au contexte
|
|
177
|
+
self._methods_to_use = self._select_optimal_methods(kwargs.get('methods', None))
|
|
178
|
+
|
|
179
|
+
# Stratégie d'agrégation avancée
|
|
180
|
+
self._aggregation_strategy = kwargs.get('aggregation_strategy', 'adaptive')
|
|
181
|
+
self._weights = self._initialize_weights(kwargs.get('weights', {}))
|
|
182
|
+
|
|
183
|
+
# Système de hooks avancé pour l'extensibilité
|
|
184
|
+
self._hooks = {
|
|
185
|
+
'pre_explain': [],
|
|
186
|
+
'post_explain': [],
|
|
187
|
+
'pre_method': {},
|
|
188
|
+
'post_method': {},
|
|
189
|
+
'pre_aggregate': [],
|
|
190
|
+
'post_aggregate': [],
|
|
191
|
+
'on_error': [],
|
|
192
|
+
'on_timeout': []
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
# Journalisation avancée et monitoring
|
|
196
|
+
self._logger = logger
|
|
197
|
+
self._performance_metrics = {'time_per_method': {}, 'memory_usage': {}}
|
|
198
|
+
self._explanation_history = []
|
|
199
|
+
self._last_quality_metrics = ExplanationQualityMetrics()
|
|
200
|
+
|
|
201
|
+
# Gestion des ressources et optimisations
|
|
202
|
+
self._thread_pool = threading.ThreadPool(processes=min(8, self._n_jobs if self._n_jobs > 0 else 4))
|
|
203
|
+
|
|
204
|
+
# Intégration plugins et compliance
|
|
205
|
+
self._load_plugins()
|
|
206
|
+
|
|
207
|
+
# Initialisation des explainers individuels (avec auto-configuration)
|
|
208
|
+
self._explainers = {}
|
|
209
|
+
self._initialize_explainers(**kwargs)
|
|
210
|
+
|
|
211
|
+
# Audit
|
|
212
|
+
self.add_audit_record("initialization", {
|
|
213
|
+
"model_framework": self._model_framework,
|
|
214
|
+
"is_classifier": self._is_classifier,
|
|
215
|
+
"methods": [m.value for m in self._methods_to_use],
|
|
216
|
+
"strategy": self._explanation_strategy.value,
|
|
217
|
+
"audience": self._audience_level.value,
|
|
218
|
+
"compliance": list(self._compliance_requirements.keys()),
|
|
219
|
+
"instance_id": self._instance_id
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
def _initialize_explainers(self, **kwargs):
|
|
223
|
+
"""
|
|
224
|
+
Initialise les explainers individuels à utiliser.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
**kwargs: Paramètres à transmettre aux explainers
|
|
228
|
+
"""
|
|
229
|
+
from ..core.factory import create_explainer
|
|
230
|
+
|
|
231
|
+
for method in self._methods_to_use:
|
|
232
|
+
try:
|
|
233
|
+
# Création de l'explainer spécifique
|
|
234
|
+
explainer = create_explainer(self._model, method=method, **kwargs)
|
|
235
|
+
self._explainers[method] = explainer
|
|
236
|
+
self._logger.info(f"Explainer initialisé: {method.value}")
|
|
237
|
+
except Exception as e:
|
|
238
|
+
self._logger.warning(f"Échec de l'initialisation de l'explainer {method.value}: {str(e)}")
|
|
239
|
+
continue
|
|
240
|
+
|
|
241
|
+
if not self._explainers:
|
|
242
|
+
raise ValueError("Aucun explainer n'a pu être initialisé.")
|
|
243
|
+
|
|
244
|
+
self.add_audit_record("explainers_initialization", {
|
|
245
|
+
"methods": [m.value for m in self._explainers.keys()]
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
def explain(self, X, y=None, **kwargs) -> ExplanationResult:
|
|
249
|
+
"""
|
|
250
|
+
Génère des explications unifiées pour un ensemble de données.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
X: Données à expliquer
|
|
254
|
+
y: Labels réels (optionnel)
|
|
255
|
+
**kwargs: Paramètres additionnels
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
ExplanationResult: Résultat d'explication unifié
|
|
259
|
+
"""
|
|
260
|
+
self.add_audit_record("explain_call", {
|
|
261
|
+
"data_shape": X.shape if hasattr(X, "shape") else "unknown",
|
|
262
|
+
"has_labels": y is not None,
|
|
263
|
+
"params": {k: str(v) for k, v in kwargs.items()}
|
|
264
|
+
})
|
|
265
|
+
|
|
266
|
+
audience_level = kwargs.get('audience_level', AudienceLevel.TECHNICAL)
|
|
267
|
+
|
|
268
|
+
# Collecter les résultats de chaque explainer
|
|
269
|
+
explanations = {}
|
|
270
|
+
for method, explainer in self._explainers.items():
|
|
271
|
+
try:
|
|
272
|
+
self._logger.info(f"Exécution de l'explainer {method.value}...")
|
|
273
|
+
explanation = explainer.explain(X, y, **kwargs)
|
|
274
|
+
explanations[method] = explanation
|
|
275
|
+
self._logger.info(f"Explication {method.value} réussie")
|
|
276
|
+
except Exception as e:
|
|
277
|
+
self._logger.warning(f"Échec de l'explainer {method.value}: {str(e)}")
|
|
278
|
+
continue
|
|
279
|
+
|
|
280
|
+
if not explanations:
|
|
281
|
+
raise RuntimeError("Tous les explainers ont échoué. Impossible de générer une explication unifiée.")
|
|
282
|
+
|
|
283
|
+
# Agréger les résultats
|
|
284
|
+
unified_explanation = self._aggregate_explanations(explanations, audience_level, **kwargs)
|
|
285
|
+
|
|
286
|
+
return unified_explanation
|
|
287
|
+
|
|
288
|
+
def explain_instance(self, instance, **kwargs) -> ExplanationResult:
|
|
289
|
+
"""
|
|
290
|
+
Explique une instance spécifique avec une approche unifiée.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
instance: Instance à expliquer
|
|
294
|
+
**kwargs: Paramètres additionnels
|
|
295
|
+
|
|
296
|
+
Returns:
|
|
297
|
+
ExplanationResult: Explication unifiée pour l'instance
|
|
298
|
+
"""
|
|
299
|
+
# Conversion en format compatible
|
|
300
|
+
if isinstance(instance, pd.DataFrame) or isinstance(instance, pd.Series):
|
|
301
|
+
X = instance
|
|
302
|
+
else:
|
|
303
|
+
X = np.array([instance])
|
|
304
|
+
|
|
305
|
+
# Déléguer à la méthode explain
|
|
306
|
+
return self.explain(X, **kwargs)
|
|
307
|
+
|
|
308
|
+
def _aggregate_explanations(self, explanations: Dict[ExplainabilityMethod, ExplanationResult],
|
|
309
|
+
audience_level: AudienceLevel, **kwargs) -> ExplanationResult:
|
|
310
|
+
"""
|
|
311
|
+
Agrège les explications de différentes méthodes.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
explanations: Dictionnaire des explications par méthode
|
|
315
|
+
audience_level: Niveau d'audience cible
|
|
316
|
+
**kwargs: Paramètres additionnels
|
|
317
|
+
|
|
318
|
+
Returns:
|
|
319
|
+
ExplanationResult: Explication agrégée
|
|
320
|
+
"""
|
|
321
|
+
# Récupérer les métadonnées du modèle (toutes les explications devraient avoir les mêmes)
|
|
322
|
+
any_explanation = next(iter(explanations.values()))
|
|
323
|
+
model_metadata = any_explanation.model_metadata
|
|
324
|
+
|
|
325
|
+
# Récupérer toutes les caractéristiques
|
|
326
|
+
all_features = set()
|
|
327
|
+
for explanation in explanations.values():
|
|
328
|
+
all_features.update(fi.feature_name for fi in explanation.feature_importances)
|
|
329
|
+
|
|
330
|
+
# Agréger les importances par caractéristique selon la stratégie choisie
|
|
331
|
+
aggregated_importances = {}
|
|
332
|
+
confidence_intervals = {}
|
|
333
|
+
|
|
334
|
+
if self._aggregation_strategy == 'weighted':
|
|
335
|
+
# Paramétrage des poids par méthode (par défaut égaux)
|
|
336
|
+
weights = self._weights or {method: 1.0 for method in explanations.keys()}
|
|
337
|
+
total_weight = sum(weights.get(method, 1.0) for method in explanations.keys())
|
|
338
|
+
|
|
339
|
+
# Normalisation des poids
|
|
340
|
+
weights = {method: w/total_weight for method, w in weights.items()}
|
|
341
|
+
|
|
342
|
+
# Agrégation pondérée
|
|
343
|
+
for feature in all_features:
|
|
344
|
+
feature_importances = []
|
|
345
|
+
feature_std_devs = []
|
|
346
|
+
for method, explanation in explanations.items():
|
|
347
|
+
for fi in explanation.feature_importances:
|
|
348
|
+
if fi.feature_name == feature:
|
|
349
|
+
weight = weights.get(method, 1.0 / len(explanations))
|
|
350
|
+
feature_importances.append(fi.importance * weight)
|
|
351
|
+
if fi.std_dev is not None:
|
|
352
|
+
feature_std_devs.append(fi.std_dev * weight)
|
|
353
|
+
break
|
|
354
|
+
|
|
355
|
+
aggregated_importances[feature] = sum(feature_importances)
|
|
356
|
+
if feature_std_devs:
|
|
357
|
+
confidence_intervals[feature] = (
|
|
358
|
+
aggregated_importances[feature] - 1.96 * np.mean(feature_std_devs),
|
|
359
|
+
aggregated_importances[feature] + 1.96 * np.mean(feature_std_devs)
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
elif self._aggregation_strategy == 'voting':
|
|
363
|
+
# Système de vote basé sur le rang des caractéristiques
|
|
364
|
+
for explanation in explanations.values():
|
|
365
|
+
fis = sorted(explanation.feature_importances, key=lambda x: abs(x.importance), reverse=True)
|
|
366
|
+
for i, fi in enumerate(fis):
|
|
367
|
+
if fi.feature_name not in aggregated_importances:
|
|
368
|
+
aggregated_importances[fi.feature_name] = 0
|
|
369
|
+
# Vote inversement proportionnel au rang
|
|
370
|
+
aggregated_importances[fi.feature_name] += 1 / (i + 1)
|
|
371
|
+
|
|
372
|
+
# Normalisation
|
|
373
|
+
total = sum(aggregated_importances.values())
|
|
374
|
+
for feature in aggregated_importances:
|
|
375
|
+
aggregated_importances[feature] /= total
|
|
376
|
+
|
|
377
|
+
else:
|
|
378
|
+
# Moyenne simple par défaut
|
|
379
|
+
for feature in all_features:
|
|
380
|
+
importances = []
|
|
381
|
+
for explanation in explanations.values():
|
|
382
|
+
for fi in explanation.feature_importances:
|
|
383
|
+
if fi.feature_name == feature:
|
|
384
|
+
importances.append(fi.importance)
|
|
385
|
+
break
|
|
386
|
+
|
|
387
|
+
if importances:
|
|
388
|
+
aggregated_importances[feature] = sum(importances) / len(importances)
|
|
389
|
+
|
|
390
|
+
# Créer les objets FeatureImportance agrégés
|
|
391
|
+
feature_importances = []
|
|
392
|
+
for feature, importance in aggregated_importances.items():
|
|
393
|
+
ci = confidence_intervals.get(feature, None)
|
|
394
|
+
fi = FeatureImportance(
|
|
395
|
+
feature_name=feature,
|
|
396
|
+
importance=importance,
|
|
397
|
+
confidence_interval=ci if ci else None,
|
|
398
|
+
std_dev=None, # À calculer si nécessaire
|
|
399
|
+
p_value=None # À calculer si nécessaire
|
|
400
|
+
)
|
|
401
|
+
feature_importances.append(fi)
|
|
402
|
+
|
|
403
|
+
# Trier par importance absolue décroissante
|
|
404
|
+
feature_importances.sort(key=lambda x: abs(x.importance), reverse=True)
|
|
405
|
+
|
|
406
|
+
# Calculer des métriques de qualité de l'explication
|
|
407
|
+
explanation_quality = self._calculate_explanation_quality(explanations)
|
|
408
|
+
explanation_fidelity = self._calculate_explanation_fidelity(explanations)
|
|
409
|
+
|
|
410
|
+
# Stocker les explications brutes selon le niveau d'audience
|
|
411
|
+
if audience_level == AudienceLevel.TECHNICAL:
|
|
412
|
+
raw_explanation = {
|
|
413
|
+
method.value: explanation.raw_explanation
|
|
414
|
+
for method, explanation in explanations.items()
|
|
415
|
+
if explanation.raw_explanation is not None
|
|
416
|
+
}
|
|
417
|
+
else:
|
|
418
|
+
# Pour les audiences non-techniques, simplifier les données brutes
|
|
419
|
+
raw_explanation = None
|
|
420
|
+
|
|
421
|
+
# Calculer des métriques additionnelles
|
|
422
|
+
additional_metrics = self._calculate_additional_metrics(explanations)
|
|
423
|
+
|
|
424
|
+
# Créer le résultat final
|
|
425
|
+
unified_result = ExplanationResult(
|
|
426
|
+
method=ExplainabilityMethod.UNIFIED,
|
|
427
|
+
model_metadata=model_metadata,
|
|
428
|
+
feature_importances=feature_importances,
|
|
429
|
+
raw_explanation=raw_explanation,
|
|
430
|
+
audience_level=audience_level,
|
|
431
|
+
explanation_quality=explanation_quality,
|
|
432
|
+
explanation_fidelity=explanation_fidelity,
|
|
433
|
+
additional_metrics=additional_metrics
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
self.add_audit_record("aggregation_complete", {
|
|
437
|
+
"aggregation_strategy": self._aggregation_strategy,
|
|
438
|
+
"methods_used": [m.value for m in explanations.keys()],
|
|
439
|
+
"explanation_quality": explanation_quality,
|
|
440
|
+
"explanation_fidelity": explanation_fidelity
|
|
441
|
+
})
|
|
442
|
+
|
|
443
|
+
return unified_result
|
|
444
|
+
|
|
445
|
+
def _calculate_explanation_quality(self, explanations: Dict[ExplainabilityMethod, ExplanationResult]) -> float:
|
|
446
|
+
"""
|
|
447
|
+
Calcule une métrique de qualité globale pour l'explication unifiée.
|
|
448
|
+
|
|
449
|
+
Args:
|
|
450
|
+
explanations: Dictionnaire des explications par méthode
|
|
451
|
+
|
|
452
|
+
Returns:
|
|
453
|
+
float: Score de qualité entre 0 et 1
|
|
454
|
+
"""
|
|
455
|
+
# Calculer la cohérence entre les différentes méthodes
|
|
456
|
+
if len(explanations) <= 1:
|
|
457
|
+
return 1.0 # Une seule méthode est toujours cohérente avec elle-même
|
|
458
|
+
|
|
459
|
+
# Extraire les caractéristiques communes à toutes les méthodes
|
|
460
|
+
common_features = set()
|
|
461
|
+
first = True
|
|
462
|
+
for explanation in explanations.values():
|
|
463
|
+
features = {fi.feature_name for fi in explanation.feature_importances}
|
|
464
|
+
if first:
|
|
465
|
+
common_features = features
|
|
466
|
+
first = False
|
|
467
|
+
else:
|
|
468
|
+
common_features = common_features.intersection(features)
|
|
469
|
+
|
|
470
|
+
if not common_features:
|
|
471
|
+
return 0.5 # Pas de caractéristiques communes, qualité moyenne
|
|
472
|
+
|
|
473
|
+
# Calculer la corrélation de rang entre les méthodes pour ces caractéristiques
|
|
474
|
+
import scipy.stats as stats
|
|
475
|
+
|
|
476
|
+
rankings = {}
|
|
477
|
+
for method, explanation in explanations.items():
|
|
478
|
+
# Extraire et trier les importances des caractéristiques communes
|
|
479
|
+
feature_importances = {
|
|
480
|
+
fi.feature_name: abs(fi.importance)
|
|
481
|
+
for fi in explanation.feature_importances
|
|
482
|
+
if fi.feature_name in common_features
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
# Convertir en rangs
|
|
486
|
+
sorted_features = sorted(feature_importances.keys(),
|
|
487
|
+
key=lambda f: feature_importances[f],
|
|
488
|
+
reverse=True)
|
|
489
|
+
rankings[method] = {f: i for i, f in enumerate(sorted_features)}
|
|
490
|
+
|
|
491
|
+
# Calculer la corrélation moyenne de Spearman entre toutes les paires de méthodes
|
|
492
|
+
methods = list(rankings.keys())
|
|
493
|
+
correlations = []
|
|
494
|
+
for i in range(len(methods)):
|
|
495
|
+
for j in range(i+1, len(methods)):
|
|
496
|
+
method1, method2 = methods[i], methods[j]
|
|
497
|
+
|
|
498
|
+
# Préparer les données pour la corrélation
|
|
499
|
+
features = list(common_features)
|
|
500
|
+
ranks1 = [rankings[method1][f] for f in features]
|
|
501
|
+
ranks2 = [rankings[method2][f] for f in features]
|
|
502
|
+
|
|
503
|
+
# Calculer la corrélation
|
|
504
|
+
corr, _ = stats.spearmanr(ranks1, ranks2)
|
|
505
|
+
correlations.append(corr)
|
|
506
|
+
|
|
507
|
+
# La qualité est la moyenne des corrélations, normalisée entre 0 et 1
|
|
508
|
+
if not correlations:
|
|
509
|
+
return 0.8 # Valeur par défaut raisonnable si pas de corrélation calculable
|
|
510
|
+
|
|
511
|
+
# Transformer de [-1, 1] à [0, 1]
|
|
512
|
+
avg_corr = np.mean(correlations)
|
|
513
|
+
quality = (avg_corr + 1) / 2
|
|
514
|
+
|
|
515
|
+
return quality
|
|
516
|
+
|
|
517
|
+
def _calculate_explanation_fidelity(self, explanations: Dict[ExplainabilityMethod, ExplanationResult]) -> float:
|
|
518
|
+
"""
|
|
519
|
+
Calcule la fidélité des explications par rapport au modèle.
|
|
520
|
+
|
|
521
|
+
Args:
|
|
522
|
+
explanations: Dictionnaire des explications par méthode
|
|
523
|
+
|
|
524
|
+
Returns:
|
|
525
|
+
float: Score de fidélité entre 0 et 1
|
|
526
|
+
"""
|
|
527
|
+
# Calculer la moyenne des fidélités individuelles si disponibles
|
|
528
|
+
fidelities = [
|
|
529
|
+
e.explanation_fidelity for e in explanations.values()
|
|
530
|
+
if e.explanation_fidelity is not None
|
|
531
|
+
]
|
|
532
|
+
|
|
533
|
+
if fidelities:
|
|
534
|
+
return np.mean(fidelities)
|
|
535
|
+
|
|
536
|
+
# Si aucune fidélité n'est disponible, utiliser une heuristique basée
|
|
537
|
+
# sur la qualité des explications individuelles
|
|
538
|
+
qualities = [e.explanation_quality for e in explanations.values()]
|
|
539
|
+
return np.mean(qualities) if qualities else 0.8
|
|
540
|
+
|
|
541
|
+
def _calculate_additional_metrics(self, explanations: Dict[ExplainabilityMethod, ExplanationResult]) -> Dict[str, Any]:
|
|
542
|
+
"""
|
|
543
|
+
Calcule des métriques additionnelles pour l'explication unifiée.
|
|
544
|
+
|
|
545
|
+
Args:
|
|
546
|
+
explanations: Dictionnaire des explications par méthode
|
|
547
|
+
|
|
548
|
+
Returns:
|
|
549
|
+
Dict[str, Any]: Métriques additionnelles
|
|
550
|
+
"""
|
|
551
|
+
metrics = {
|
|
552
|
+
"methods_used": [method.value for method in explanations.keys()],
|
|
553
|
+
"method_weights": self._weights or "uniform",
|
|
554
|
+
"aggregation_strategy": self._aggregation_strategy,
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
# Agrégation des métriques spécifiques aux méthodes
|
|
558
|
+
method_metrics = {}
|
|
559
|
+
for method, explanation in explanations.items():
|
|
560
|
+
if explanation.additional_metrics:
|
|
561
|
+
method_metrics[method.value] = explanation.additional_metrics
|
|
562
|
+
|
|
563
|
+
if method_metrics:
|
|
564
|
+
metrics["method_specific_metrics"] = method_metrics
|
|
565
|
+
|
|
566
|
+
return metrics
|