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,804 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Counterfactual Explainer pour XPLIA
|
|
3
|
+
==================================
|
|
4
|
+
|
|
5
|
+
Ce module implémente l'explainer basé sur les exemples contrefactuels
|
|
6
|
+
dans le framework XPLIA. Cette approche génère des exemples alternatifs
|
|
7
|
+
qui auraient conduit à une prédiction différente.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from typing import Any, Dict, List, Optional, Tuple, Union
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
from ..core.base import (AudienceLevel, ExplainerBase, ExplainabilityMethod,
|
|
17
|
+
ExplanationResult, FeatureImportance, ModelMetadata)
|
|
18
|
+
from ..core.registry import register_explainer
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@register_explainer
|
|
22
|
+
class CounterfactualExplainer(ExplainerBase):
|
|
23
|
+
"""
|
|
24
|
+
Explainer basé sur les exemples contrefactuels.
|
|
25
|
+
|
|
26
|
+
Cette classe génère des exemples contrefactuels qui montrent comment
|
|
27
|
+
modifier les entrées pour obtenir une prédiction différente du modèle.
|
|
28
|
+
|
|
29
|
+
Caractéristiques principales:
|
|
30
|
+
- Génération d'exemples contrefactuels pour des instances spécifiques
|
|
31
|
+
- Support de différents algorithmes de génération de contrefactuels
|
|
32
|
+
- Contraintes personnalisables sur les caractéristiques modifiables
|
|
33
|
+
- Visualisations adaptées au niveau d'audience
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, model, **kwargs):
|
|
37
|
+
"""
|
|
38
|
+
Initialise l'explainer contrefactuel.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
model: Modèle à expliquer
|
|
42
|
+
**kwargs: Paramètres additionnels
|
|
43
|
+
feature_names: Noms des caractéristiques
|
|
44
|
+
categorical_features: Indices ou noms des caractéristiques catégorielles
|
|
45
|
+
continuous_features: Indices ou noms des caractéristiques continues
|
|
46
|
+
method: Méthode de génération ('dice', 'genetic', 'optimization')
|
|
47
|
+
target_class: Classe cible pour les contrefactuels (None = opposée à la prédiction)
|
|
48
|
+
feature_ranges: Dictionnaire des plages valides pour chaque caractéristique
|
|
49
|
+
proximity_weight: Poids pour la proximité aux données d'origine
|
|
50
|
+
sparsity_weight: Poids pour la parcimonie (moins de changements)
|
|
51
|
+
diversity_weight: Poids pour la diversité des contrefactuels
|
|
52
|
+
"""
|
|
53
|
+
super().__init__(model, **kwargs)
|
|
54
|
+
self._method = ExplainabilityMethod.COUNTERFACTUAL
|
|
55
|
+
|
|
56
|
+
# Paramètres
|
|
57
|
+
self._feature_names = kwargs.get('feature_names', None)
|
|
58
|
+
self._categorical_features = kwargs.get('categorical_features', [])
|
|
59
|
+
self._continuous_features = kwargs.get('continuous_features', [])
|
|
60
|
+
self._counterfactual_method = kwargs.get('method', 'dice') # 'dice', 'genetic', 'optimization'
|
|
61
|
+
self._target_class = kwargs.get('target_class', None)
|
|
62
|
+
self._feature_ranges = kwargs.get('feature_ranges', {})
|
|
63
|
+
self._proximity_weight = kwargs.get('proximity_weight', 0.5)
|
|
64
|
+
self._sparsity_weight = kwargs.get('sparsity_weight', 0.2)
|
|
65
|
+
self._diversity_weight = kwargs.get('diversity_weight', 0.3)
|
|
66
|
+
|
|
67
|
+
# Explainer spécifique
|
|
68
|
+
self._cf_explainer = None
|
|
69
|
+
|
|
70
|
+
# Métadonnées du modèle
|
|
71
|
+
self._metadata = None
|
|
72
|
+
|
|
73
|
+
# Logger
|
|
74
|
+
self._logger = logging.getLogger(__name__)
|
|
75
|
+
|
|
76
|
+
def explain_instance(self, instance, X_background=None, **kwargs) -> ExplanationResult:
|
|
77
|
+
"""
|
|
78
|
+
Génère des explications contrefactuelles pour une instance spécifique.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
instance: Instance à expliquer (array, liste, dict ou pandas.Series)
|
|
82
|
+
X_background: Données d'arrière-plan pour contraindre les contrefactuels (optionnel)
|
|
83
|
+
**kwargs: Paramètres additionnels
|
|
84
|
+
desired_class: Classe désirée pour le contrefactuel (par défaut: opposée à la prédiction)
|
|
85
|
+
num_counterfactuals: Nombre de contrefactuels à générer
|
|
86
|
+
feature_weights: Poids pour chaque caractéristique (importance du changement)
|
|
87
|
+
immutable_features: Caractéristiques qui ne peuvent pas être modifiées
|
|
88
|
+
audience_level: Niveau d'audience (TECHNICAL, BUSINESS, PUBLIC)
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
ExplanationResult: Résultat standardisé de l'explication
|
|
92
|
+
"""
|
|
93
|
+
# Paramètres
|
|
94
|
+
audience_level = kwargs.get('audience_level', AudienceLevel.TECHNICAL)
|
|
95
|
+
desired_class = kwargs.get('desired_class', self._target_class)
|
|
96
|
+
num_counterfactuals = kwargs.get('num_counterfactuals', 3)
|
|
97
|
+
feature_weights = kwargs.get('feature_weights', None)
|
|
98
|
+
immutable_features = kwargs.get('immutable_features', [])
|
|
99
|
+
|
|
100
|
+
# Convertir l'instance en format approprié
|
|
101
|
+
if isinstance(instance, dict):
|
|
102
|
+
# Convertir dict en array
|
|
103
|
+
feature_names = list(instance.keys())
|
|
104
|
+
instance_array = np.array([instance[f] for f in feature_names]).reshape(1, -1)
|
|
105
|
+
elif isinstance(instance, pd.Series):
|
|
106
|
+
feature_names = instance.index.tolist()
|
|
107
|
+
instance_array = instance.values.reshape(1, -1)
|
|
108
|
+
elif isinstance(instance, (list, np.ndarray)):
|
|
109
|
+
instance_array = np.array(instance).reshape(1, -1)
|
|
110
|
+
feature_names = kwargs.get('feature_names', self._feature_names) or \
|
|
111
|
+
[f"feature_{i}" for i in range(instance_array.shape[1])]
|
|
112
|
+
else:
|
|
113
|
+
raise ValueError("Format d'instance non supporté. Utilisez un dict, pandas.Series, liste ou numpy.ndarray.")
|
|
114
|
+
|
|
115
|
+
# Convertir les données d'arrière-plan en format approprié
|
|
116
|
+
if X_background is not None:
|
|
117
|
+
if isinstance(X_background, pd.DataFrame):
|
|
118
|
+
X_values = X_background.values
|
|
119
|
+
else:
|
|
120
|
+
X_values = np.array(X_background)
|
|
121
|
+
else:
|
|
122
|
+
X_values = None
|
|
123
|
+
|
|
124
|
+
# Tracer l'action
|
|
125
|
+
self.add_audit_record("explain_instance", {
|
|
126
|
+
"n_features": len(feature_names),
|
|
127
|
+
"audience_level": audience_level.value if isinstance(audience_level, AudienceLevel) else audience_level,
|
|
128
|
+
"counterfactual_method": self._counterfactual_method,
|
|
129
|
+
"num_counterfactuals": num_counterfactuals
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
# Initialiser l'explainer contrefactuel si nécessaire
|
|
134
|
+
if self._cf_explainer is None:
|
|
135
|
+
self._initialize_cf_explainer(feature_names, X_values)
|
|
136
|
+
|
|
137
|
+
# Générer les contrefactuels
|
|
138
|
+
counterfactuals, metadata = self._generate_counterfactuals(
|
|
139
|
+
instance_array,
|
|
140
|
+
feature_names,
|
|
141
|
+
desired_class,
|
|
142
|
+
num_counterfactuals,
|
|
143
|
+
feature_weights,
|
|
144
|
+
immutable_features
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
# Calculer les changements de caractéristiques
|
|
148
|
+
feature_changes = self._calculate_feature_changes(instance_array[0], counterfactuals, feature_names)
|
|
149
|
+
|
|
150
|
+
# Extraire les métadonnées du modèle
|
|
151
|
+
if not self._metadata:
|
|
152
|
+
self._extract_metadata()
|
|
153
|
+
|
|
154
|
+
# Créer le résultat d'explication
|
|
155
|
+
result = ExplanationResult(
|
|
156
|
+
method=ExplainabilityMethod.COUNTERFACTUAL,
|
|
157
|
+
model_metadata=self._metadata,
|
|
158
|
+
feature_importances=self._convert_changes_to_importances(feature_changes),
|
|
159
|
+
raw_explanation={
|
|
160
|
+
"instance": instance_array[0].tolist(),
|
|
161
|
+
"counterfactuals": counterfactuals.tolist() if isinstance(counterfactuals, np.ndarray) else counterfactuals,
|
|
162
|
+
"feature_names": feature_names,
|
|
163
|
+
"feature_changes": feature_changes,
|
|
164
|
+
"metadata": metadata
|
|
165
|
+
},
|
|
166
|
+
audience_level=audience_level
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
return result
|
|
170
|
+
|
|
171
|
+
except Exception as e:
|
|
172
|
+
self._logger.error(f"Erreur lors de la génération des contrefactuels: {str(e)}")
|
|
173
|
+
raise RuntimeError(f"Échec de l'explication contrefactuelle: {str(e)}")
|
|
174
|
+
|
|
175
|
+
def explain(self, X, y=None, **kwargs) -> ExplanationResult:
|
|
176
|
+
"""
|
|
177
|
+
Génère des explications contrefactuelles pour un ensemble de données.
|
|
178
|
+
Pour les explications contrefactuelles, cette méthode sélectionne un échantillon
|
|
179
|
+
représentatif et génère des contrefactuels pour chaque instance.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
X: Données d'entrée à expliquer
|
|
183
|
+
y: Valeurs cibles réelles (optionnel)
|
|
184
|
+
**kwargs: Paramètres additionnels
|
|
185
|
+
max_instances: Nombre maximum d'instances à expliquer
|
|
186
|
+
sampling_strategy: Stratégie d'échantillonnage ('random', 'stratified', 'kmeans')
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
ExplanationResult: Résultat standardisé de l'explication
|
|
190
|
+
"""
|
|
191
|
+
# Paramètres
|
|
192
|
+
audience_level = kwargs.get('audience_level', AudienceLevel.TECHNICAL)
|
|
193
|
+
max_instances = kwargs.get('max_instances', 5)
|
|
194
|
+
sampling_strategy = kwargs.get('sampling_strategy', 'random')
|
|
195
|
+
|
|
196
|
+
# Conversion des données en format approprié
|
|
197
|
+
if isinstance(X, pd.DataFrame):
|
|
198
|
+
feature_names = X.columns.tolist()
|
|
199
|
+
X_values = X.values
|
|
200
|
+
else:
|
|
201
|
+
X_values = np.array(X)
|
|
202
|
+
feature_names = kwargs.get('feature_names', self._feature_names) or \
|
|
203
|
+
[f"feature_{i}" for i in range(X_values.shape[1])]
|
|
204
|
+
|
|
205
|
+
# Échantillonner des instances représentatives
|
|
206
|
+
sampled_indices = self._sample_instances(X_values, y, max_instances, sampling_strategy)
|
|
207
|
+
sampled_instances = X_values[sampled_indices]
|
|
208
|
+
|
|
209
|
+
# Tracer l'action
|
|
210
|
+
self.add_audit_record("explain", {
|
|
211
|
+
"n_samples": X_values.shape[0],
|
|
212
|
+
"n_features": X_values.shape[1],
|
|
213
|
+
"audience_level": audience_level.value if isinstance(audience_level, AudienceLevel) else audience_level,
|
|
214
|
+
"max_instances": max_instances,
|
|
215
|
+
"sampling_strategy": sampling_strategy
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
try:
|
|
219
|
+
# Générer des contrefactuels pour chaque instance échantillonnée
|
|
220
|
+
all_counterfactuals = []
|
|
221
|
+
all_feature_changes = []
|
|
222
|
+
|
|
223
|
+
for instance in sampled_instances:
|
|
224
|
+
# Utiliser explain_instance pour chaque instance
|
|
225
|
+
instance_result = self.explain_instance(
|
|
226
|
+
instance,
|
|
227
|
+
X_background=X_values,
|
|
228
|
+
feature_names=feature_names,
|
|
229
|
+
audience_level=audience_level,
|
|
230
|
+
**kwargs
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
# Collecter les résultats
|
|
234
|
+
all_counterfactuals.append(instance_result.raw_explanation["counterfactuals"])
|
|
235
|
+
all_feature_changes.append(instance_result.raw_explanation["feature_changes"])
|
|
236
|
+
|
|
237
|
+
# Agréger les changements de caractéristiques
|
|
238
|
+
aggregated_changes = self._aggregate_feature_changes(all_feature_changes, feature_names)
|
|
239
|
+
|
|
240
|
+
# Extraire les métadonnées du modèle
|
|
241
|
+
if not self._metadata:
|
|
242
|
+
self._extract_metadata()
|
|
243
|
+
|
|
244
|
+
# Créer le résultat d'explication
|
|
245
|
+
result = ExplanationResult(
|
|
246
|
+
method=ExplainabilityMethod.COUNTERFACTUAL,
|
|
247
|
+
model_metadata=self._metadata,
|
|
248
|
+
feature_importances=self._convert_changes_to_importances(aggregated_changes),
|
|
249
|
+
raw_explanation={
|
|
250
|
+
"sampled_instances": sampled_instances.tolist(),
|
|
251
|
+
"sampled_indices": sampled_indices.tolist(),
|
|
252
|
+
"all_counterfactuals": all_counterfactuals,
|
|
253
|
+
"all_feature_changes": all_feature_changes,
|
|
254
|
+
"aggregated_changes": aggregated_changes,
|
|
255
|
+
"feature_names": feature_names
|
|
256
|
+
},
|
|
257
|
+
audience_level=audience_level
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
return result
|
|
261
|
+
|
|
262
|
+
except Exception as e:
|
|
263
|
+
self._logger.error(f"Erreur lors de la génération des contrefactuels: {str(e)}")
|
|
264
|
+
raise RuntimeError(f"Échec de l'explication contrefactuelle: {str(e)}")
|
|
265
|
+
|
|
266
|
+
def _initialize_cf_explainer(self, feature_names, X_background=None):
|
|
267
|
+
"""
|
|
268
|
+
Initialise l'explainer contrefactuel selon la méthode choisie.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
feature_names: Noms des caractéristiques
|
|
272
|
+
X_background: Données d'arrière-plan pour contraindre les contrefactuels
|
|
273
|
+
"""
|
|
274
|
+
self._feature_names = feature_names
|
|
275
|
+
|
|
276
|
+
if self._counterfactual_method == 'dice':
|
|
277
|
+
try:
|
|
278
|
+
import dice_ml
|
|
279
|
+
except ImportError:
|
|
280
|
+
raise ImportError("Le package DiCE est requis pour cette méthode. "
|
|
281
|
+
"Installez-le avec 'pip install dice-ml'.")
|
|
282
|
+
|
|
283
|
+
# L'initialisation complète sera faite lors de la première génération de contrefactuels
|
|
284
|
+
# car elle nécessite des données d'arrière-plan et des informations sur le modèle
|
|
285
|
+
self._cf_explainer = 'dice'
|
|
286
|
+
|
|
287
|
+
elif self._counterfactual_method == 'genetic':
|
|
288
|
+
# Implémentation d'un algorithme génétique personnalisé
|
|
289
|
+
self._cf_explainer = 'genetic'
|
|
290
|
+
|
|
291
|
+
elif self._counterfactual_method == 'optimization':
|
|
292
|
+
# Implémentation basée sur l'optimisation
|
|
293
|
+
self._cf_explainer = 'optimization'
|
|
294
|
+
|
|
295
|
+
else:
|
|
296
|
+
raise ValueError(f"Méthode contrefactuelle non supportée: {self._counterfactual_method}")
|
|
297
|
+
|
|
298
|
+
def _sample_instances(self, X, y=None, max_instances=5, strategy='random'):
|
|
299
|
+
"""
|
|
300
|
+
Échantillonne des instances représentatives à partir des données.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
X: Données d'entrée
|
|
304
|
+
y: Valeurs cibles réelles (optionnel)
|
|
305
|
+
max_instances: Nombre maximum d'instances à sélectionner
|
|
306
|
+
strategy: Stratégie d'échantillonnage ('random', 'stratified', 'kmeans')
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
numpy.ndarray: Indices des instances sélectionnées
|
|
310
|
+
"""
|
|
311
|
+
n_samples = X.shape[0]
|
|
312
|
+
max_instances = min(max_instances, n_samples)
|
|
313
|
+
|
|
314
|
+
if strategy == 'random':
|
|
315
|
+
# Échantillonnage aléatoire
|
|
316
|
+
indices = np.random.choice(n_samples, max_instances, replace=False)
|
|
317
|
+
|
|
318
|
+
elif strategy == 'stratified' and y is not None:
|
|
319
|
+
# Échantillonnage stratifié par classe
|
|
320
|
+
try:
|
|
321
|
+
from sklearn.model_selection import StratifiedShuffleSplit
|
|
322
|
+
except ImportError:
|
|
323
|
+
self._logger.warning("scikit-learn est requis pour l'échantillonnage stratifié. "
|
|
324
|
+
"Utilisation de l'échantillonnage aléatoire.")
|
|
325
|
+
return np.random.choice(n_samples, max_instances, replace=False)
|
|
326
|
+
|
|
327
|
+
sss = StratifiedShuffleSplit(n_splits=1, test_size=max_instances/n_samples, random_state=42)
|
|
328
|
+
for _, test_idx in sss.split(X, y):
|
|
329
|
+
indices = test_idx
|
|
330
|
+
if len(indices) > max_instances:
|
|
331
|
+
indices = indices[:max_instances]
|
|
332
|
+
break
|
|
333
|
+
|
|
334
|
+
elif strategy == 'kmeans':
|
|
335
|
+
# Échantillonnage basé sur le clustering k-means
|
|
336
|
+
try:
|
|
337
|
+
from sklearn.cluster import KMeans
|
|
338
|
+
from sklearn.preprocessing import StandardScaler
|
|
339
|
+
except ImportError:
|
|
340
|
+
self._logger.warning("scikit-learn est requis pour l'échantillonnage k-means. "
|
|
341
|
+
"Utilisation de l'échantillonnage aléatoire.")
|
|
342
|
+
return np.random.choice(n_samples, max_instances, replace=False)
|
|
343
|
+
|
|
344
|
+
# Normaliser les données
|
|
345
|
+
scaler = StandardScaler()
|
|
346
|
+
X_scaled = scaler.fit_transform(X)
|
|
347
|
+
|
|
348
|
+
# Appliquer k-means
|
|
349
|
+
kmeans = KMeans(n_clusters=max_instances, random_state=42, n_init=10)
|
|
350
|
+
clusters = kmeans.fit_predict(X_scaled)
|
|
351
|
+
|
|
352
|
+
# Sélectionner l'instance la plus proche de chaque centroide
|
|
353
|
+
indices = []
|
|
354
|
+
for i in range(max_instances):
|
|
355
|
+
cluster_points = np.where(clusters == i)[0]
|
|
356
|
+
if len(cluster_points) > 0:
|
|
357
|
+
# Trouver le point le plus proche du centroide
|
|
358
|
+
centroid = kmeans.cluster_centers_[i]
|
|
359
|
+
distances = np.linalg.norm(X_scaled[cluster_points] - centroid, axis=1)
|
|
360
|
+
closest_idx = cluster_points[np.argmin(distances)]
|
|
361
|
+
indices.append(closest_idx)
|
|
362
|
+
|
|
363
|
+
# Compléter si nécessaire
|
|
364
|
+
if len(indices) < max_instances:
|
|
365
|
+
remaining = np.setdiff1d(np.arange(n_samples), indices)
|
|
366
|
+
additional = np.random.choice(remaining, max_instances - len(indices), replace=False)
|
|
367
|
+
indices = np.concatenate([indices, additional])
|
|
368
|
+
else:
|
|
369
|
+
# Par défaut, échantillonnage aléatoire
|
|
370
|
+
indices = np.random.choice(n_samples, max_instances, replace=False)
|
|
371
|
+
|
|
372
|
+
return indices
|
|
373
|
+
|
|
374
|
+
def _generate_counterfactuals(self, instance, feature_names, desired_class=None,
|
|
375
|
+
num_counterfactuals=3, feature_weights=None, immutable_features=None):
|
|
376
|
+
"""
|
|
377
|
+
Génère des exemples contrefactuels pour une instance donnée.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
instance: Instance à expliquer
|
|
381
|
+
feature_names: Noms des caractéristiques
|
|
382
|
+
desired_class: Classe désirée pour le contrefactuel
|
|
383
|
+
num_counterfactuals: Nombre de contrefactuels à générer
|
|
384
|
+
feature_weights: Poids pour chaque caractéristique
|
|
385
|
+
immutable_features: Caractéristiques qui ne peuvent pas être modifiées
|
|
386
|
+
|
|
387
|
+
Returns:
|
|
388
|
+
tuple: (contrefactuels, métadonnées)
|
|
389
|
+
"""
|
|
390
|
+
if self._cf_explainer == 'dice':
|
|
391
|
+
return self._generate_dice_counterfactuals(
|
|
392
|
+
instance, feature_names, desired_class,
|
|
393
|
+
num_counterfactuals, feature_weights, immutable_features
|
|
394
|
+
)
|
|
395
|
+
elif self._cf_explainer == 'genetic':
|
|
396
|
+
return self._generate_genetic_counterfactuals(
|
|
397
|
+
instance, feature_names, desired_class,
|
|
398
|
+
num_counterfactuals, feature_weights, immutable_features
|
|
399
|
+
)
|
|
400
|
+
elif self._cf_explainer == 'optimization':
|
|
401
|
+
return self._generate_optimization_counterfactuals(
|
|
402
|
+
instance, feature_names, desired_class,
|
|
403
|
+
num_counterfactuals, feature_weights, immutable_features
|
|
404
|
+
)
|
|
405
|
+
else:
|
|
406
|
+
raise ValueError(f"Méthode contrefactuelle non initialisée")
|
|
407
|
+
|
|
408
|
+
def _generate_dice_counterfactuals(self, instance, feature_names, desired_class=None,
|
|
409
|
+
num_counterfactuals=3, feature_weights=None, immutable_features=None):
|
|
410
|
+
"""
|
|
411
|
+
Génère des exemples contrefactuels en utilisant DiCE.
|
|
412
|
+
|
|
413
|
+
Args:
|
|
414
|
+
instance: Instance à expliquer
|
|
415
|
+
feature_names: Noms des caractéristiques
|
|
416
|
+
desired_class: Classe désirée pour le contrefactuel
|
|
417
|
+
num_counterfactuals: Nombre de contrefactuels à générer
|
|
418
|
+
feature_weights: Poids pour chaque caractéristique
|
|
419
|
+
immutable_features: Caractéristiques qui ne peuvent pas être modifiées
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
tuple: (contrefactuels, métadonnées)
|
|
423
|
+
"""
|
|
424
|
+
try:
|
|
425
|
+
import dice_ml
|
|
426
|
+
from dice_ml.utils import helpers
|
|
427
|
+
except ImportError:
|
|
428
|
+
raise ImportError("Le package DiCE est requis pour cette méthode. "
|
|
429
|
+
"Installez-le avec 'pip install dice-ml'.")
|
|
430
|
+
|
|
431
|
+
# Créer un ensemble de données synthétique pour initialiser DiCE
|
|
432
|
+
# (nécessaire car DiCE a besoin d'un dataset)
|
|
433
|
+
synthetic_data = np.random.normal(0, 1, size=(100, instance.shape[1]))
|
|
434
|
+
|
|
435
|
+
# Déterminer les types de caractéristiques
|
|
436
|
+
continuous_features = []
|
|
437
|
+
categorical_features = []
|
|
438
|
+
|
|
439
|
+
if self._continuous_features:
|
|
440
|
+
continuous_features = self._continuous_features
|
|
441
|
+
if self._categorical_features:
|
|
442
|
+
categorical_features = self._categorical_features
|
|
443
|
+
|
|
444
|
+
# Si aucun n'est spécifié, supposer que toutes sont continues
|
|
445
|
+
if not continuous_features and not categorical_features:
|
|
446
|
+
continuous_features = list(range(instance.shape[1]))
|
|
447
|
+
|
|
448
|
+
# Créer le dataset DiCE
|
|
449
|
+
d = dice_ml.Data(
|
|
450
|
+
dataframe=pd.DataFrame(synthetic_data, columns=feature_names),
|
|
451
|
+
continuous_features=[feature_names[i] for i in continuous_features if i < len(feature_names)],
|
|
452
|
+
outcome_name='target' # Nom factice
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
# Créer le modèle backend DiCE
|
|
456
|
+
# Utiliser le backend approprié selon le type de modèle
|
|
457
|
+
model_type = self._get_model_type()
|
|
458
|
+
if model_type in ['sklearn', 'xgboost', 'lightgbm', 'catboost']:
|
|
459
|
+
m = dice_ml.Model(model=self._model, backend='sklearn')
|
|
460
|
+
elif model_type == 'tensorflow':
|
|
461
|
+
m = dice_ml.Model(model=self._model, backend='TF2')
|
|
462
|
+
elif model_type == 'pytorch':
|
|
463
|
+
m = dice_ml.Model(model=self._model, backend='PYT')
|
|
464
|
+
else:
|
|
465
|
+
# Utiliser le backend générique
|
|
466
|
+
m = dice_ml.Model(model=self._model, backend='sklearn')
|
|
467
|
+
|
|
468
|
+
# Créer l'explainer DiCE
|
|
469
|
+
exp = dice_ml.Dice(d, m)
|
|
470
|
+
|
|
471
|
+
# Préparer les paramètres pour la génération de contrefactuels
|
|
472
|
+
query_instance = pd.DataFrame(instance, columns=feature_names)
|
|
473
|
+
|
|
474
|
+
# Déterminer la classe désirée
|
|
475
|
+
if desired_class is None:
|
|
476
|
+
# Prédire la classe actuelle
|
|
477
|
+
if hasattr(self._model, 'predict_proba'):
|
|
478
|
+
pred = self._model.predict_proba(instance)[0]
|
|
479
|
+
current_class = np.argmax(pred)
|
|
480
|
+
# Classe opposée pour binaire, classe avec 2e plus grande proba pour multi-classe
|
|
481
|
+
if len(pred) == 2:
|
|
482
|
+
desired_class = 1 - current_class
|
|
483
|
+
else:
|
|
484
|
+
sorted_indices = np.argsort(pred)[::-1]
|
|
485
|
+
desired_class = sorted_indices[1] # 2e classe la plus probable
|
|
486
|
+
else:
|
|
487
|
+
pred = self._model.predict(instance)[0]
|
|
488
|
+
if isinstance(pred, (int, float, np.integer, np.floating)):
|
|
489
|
+
# Pour la régression, augmenter la valeur de 20%
|
|
490
|
+
desired_class = pred * 1.2
|
|
491
|
+
else:
|
|
492
|
+
# Pour la classification sans probabilités
|
|
493
|
+
desired_class = 1 - pred if pred in [0, 1] else None
|
|
494
|
+
|
|
495
|
+
# Paramètres pour DiCE
|
|
496
|
+
dice_params = {
|
|
497
|
+
'total_CFs': num_counterfactuals,
|
|
498
|
+
'desired_class': desired_class,
|
|
499
|
+
'proximity_weight': self._proximity_weight,
|
|
500
|
+
'diversity_weight': self._diversity_weight,
|
|
501
|
+
'sparsity_weight': self._sparsity_weight
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
# Ajouter les caractéristiques immuables si spécifiées
|
|
505
|
+
if immutable_features:
|
|
506
|
+
dice_params['features_to_vary'] = [f for f in feature_names if f not in immutable_features]
|
|
507
|
+
|
|
508
|
+
# Générer les contrefactuels
|
|
509
|
+
cf_obj = exp.generate_counterfactuals(query_instance, **dice_params)
|
|
510
|
+
|
|
511
|
+
# Extraire les contrefactuels
|
|
512
|
+
if hasattr(cf_obj, 'cf_examples_list') and cf_obj.cf_examples_list:
|
|
513
|
+
counterfactuals = cf_obj.cf_examples_list[0].final_cfs_df.values
|
|
514
|
+
metadata = {
|
|
515
|
+
'proximity': cf_obj.cf_examples_list[0].proximity,
|
|
516
|
+
'sparsity': cf_obj.cf_examples_list[0].sparsity,
|
|
517
|
+
'diversity': cf_obj.cf_examples_list[0].diversity,
|
|
518
|
+
'desired_class': desired_class
|
|
519
|
+
}
|
|
520
|
+
else:
|
|
521
|
+
# Fallback si DiCE échoue
|
|
522
|
+
self._logger.warning("DiCE n'a pas réussi à générer des contrefactuels. Utilisation de contrefactuels aléatoires.")
|
|
523
|
+
counterfactuals = self._generate_random_counterfactuals(instance, feature_names, num_counterfactuals)
|
|
524
|
+
metadata = {
|
|
525
|
+
'method': 'random_fallback',
|
|
526
|
+
'desired_class': desired_class
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
return counterfactuals, metadata
|
|
530
|
+
|
|
531
|
+
def _generate_genetic_counterfactuals(self, instance, feature_names, desired_class=None,
|
|
532
|
+
num_counterfactuals=3, feature_weights=None, immutable_features=None):
|
|
533
|
+
"""
|
|
534
|
+
Génère des exemples contrefactuels en utilisant un algorithme génétique.
|
|
535
|
+
|
|
536
|
+
Note: Cette méthode est un placeholder pour une implémentation future.
|
|
537
|
+
Pour l'instant, elle génère des contrefactuels aléatoires.
|
|
538
|
+
"""
|
|
539
|
+
self._logger.warning("L'algorithme génétique pour les contrefactuels n'est pas encore implémenté. "
|
|
540
|
+
"Utilisation de contrefactuels aléatoires.")
|
|
541
|
+
|
|
542
|
+
counterfactuals = self._generate_random_counterfactuals(instance, feature_names, num_counterfactuals)
|
|
543
|
+
metadata = {
|
|
544
|
+
'method': 'random_placeholder',
|
|
545
|
+
'desired_class': desired_class
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return counterfactuals, metadata
|
|
549
|
+
|
|
550
|
+
def _generate_optimization_counterfactuals(self, instance, feature_names, desired_class=None,
|
|
551
|
+
num_counterfactuals=3, feature_weights=None, immutable_features=None):
|
|
552
|
+
"""
|
|
553
|
+
Génère des exemples contrefactuels en utilisant des méthodes d'optimisation.
|
|
554
|
+
|
|
555
|
+
Note: Cette méthode est un placeholder pour une implémentation future.
|
|
556
|
+
Pour l'instant, elle génère des contrefactuels aléatoires.
|
|
557
|
+
"""
|
|
558
|
+
self._logger.warning("L'algorithme d'optimisation pour les contrefactuels n'est pas encore implémenté. "
|
|
559
|
+
"Utilisation de contrefactuels aléatoires.")
|
|
560
|
+
|
|
561
|
+
counterfactuals = self._generate_random_counterfactuals(instance, feature_names, num_counterfactuals)
|
|
562
|
+
metadata = {
|
|
563
|
+
'method': 'random_placeholder',
|
|
564
|
+
'desired_class': desired_class
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return counterfactuals, metadata
|
|
568
|
+
|
|
569
|
+
def _generate_random_counterfactuals(self, instance, feature_names, num_counterfactuals=3):
|
|
570
|
+
"""
|
|
571
|
+
Génère des exemples contrefactuels aléatoires (pour fallback).
|
|
572
|
+
"""
|
|
573
|
+
# Créer des variations aléatoires de l'instance
|
|
574
|
+
counterfactuals = []
|
|
575
|
+
for _ in range(num_counterfactuals):
|
|
576
|
+
# Copier l'instance
|
|
577
|
+
cf = instance.copy()
|
|
578
|
+
|
|
579
|
+
# Modifier aléatoirement 1 à 3 caractéristiques
|
|
580
|
+
n_features_to_change = np.random.randint(1, min(4, instance.shape[1] + 1))
|
|
581
|
+
features_to_change = np.random.choice(instance.shape[1], n_features_to_change, replace=False)
|
|
582
|
+
|
|
583
|
+
for idx in features_to_change:
|
|
584
|
+
# Pour les caractéristiques continues, ajouter une perturbation
|
|
585
|
+
if idx in self._continuous_features or not self._categorical_features:
|
|
586
|
+
cf[0, idx] = cf[0, idx] + np.random.normal(0, abs(cf[0, idx]) * 0.2 + 0.1)
|
|
587
|
+
# Pour les caractéristiques catégorielles, changer la valeur
|
|
588
|
+
elif idx in self._categorical_features:
|
|
589
|
+
current_val = cf[0, idx]
|
|
590
|
+
# Supposer que les valeurs catégorielles sont des entiers
|
|
591
|
+
possible_values = list(range(10)) # Valeurs arbitraires
|
|
592
|
+
new_val = np.random.choice([v for v in possible_values if v != current_val])
|
|
593
|
+
cf[0, idx] = new_val
|
|
594
|
+
|
|
595
|
+
counterfactuals.append(cf[0])
|
|
596
|
+
|
|
597
|
+
return np.array(counterfactuals)
|
|
598
|
+
|
|
599
|
+
def _calculate_feature_changes(self, instance, counterfactuals, feature_names):
|
|
600
|
+
"""
|
|
601
|
+
Calcule les changements de caractéristiques entre l'instance et les contrefactuels.
|
|
602
|
+
|
|
603
|
+
Args:
|
|
604
|
+
instance: Instance d'origine
|
|
605
|
+
counterfactuals: Contrefactuels générés
|
|
606
|
+
feature_names: Noms des caractéristiques
|
|
607
|
+
|
|
608
|
+
Returns:
|
|
609
|
+
dict: Changements de caractéristiques
|
|
610
|
+
"""
|
|
611
|
+
changes = {}
|
|
612
|
+
|
|
613
|
+
# Convertir en array numpy si nécessaire
|
|
614
|
+
if not isinstance(counterfactuals, np.ndarray):
|
|
615
|
+
counterfactuals = np.array(counterfactuals)
|
|
616
|
+
|
|
617
|
+
# Pour chaque caractéristique
|
|
618
|
+
for i, feature in enumerate(feature_names):
|
|
619
|
+
if i >= instance.shape[0]:
|
|
620
|
+
continue
|
|
621
|
+
|
|
622
|
+
# Valeur d'origine
|
|
623
|
+
original_value = instance[i]
|
|
624
|
+
|
|
625
|
+
# Valeurs dans les contrefactuels
|
|
626
|
+
if counterfactuals.ndim > 1 and i < counterfactuals.shape[1]:
|
|
627
|
+
cf_values = counterfactuals[:, i]
|
|
628
|
+
else:
|
|
629
|
+
continue
|
|
630
|
+
|
|
631
|
+
# Calculer les changements
|
|
632
|
+
absolute_diffs = np.abs(cf_values - original_value)
|
|
633
|
+
mean_diff = np.mean(absolute_diffs)
|
|
634
|
+
max_diff = np.max(absolute_diffs)
|
|
635
|
+
min_diff = np.min(absolute_diffs)
|
|
636
|
+
std_diff = np.std(absolute_diffs)
|
|
637
|
+
|
|
638
|
+
# Calculer le pourcentage de contrefactuels qui ont changé cette caractéristique
|
|
639
|
+
changed_ratio = np.sum(absolute_diffs > 0) / len(cf_values)
|
|
640
|
+
|
|
641
|
+
# Stocker les résultats
|
|
642
|
+
changes[feature] = {
|
|
643
|
+
'original_value': float(original_value),
|
|
644
|
+
'mean_diff': float(mean_diff),
|
|
645
|
+
'max_diff': float(max_diff),
|
|
646
|
+
'min_diff': float(min_diff),
|
|
647
|
+
'std_diff': float(std_diff),
|
|
648
|
+
'changed_ratio': float(changed_ratio)
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
return changes
|
|
652
|
+
|
|
653
|
+
def _aggregate_feature_changes(self, all_feature_changes, feature_names):
|
|
654
|
+
"""
|
|
655
|
+
Agrège les changements de caractéristiques à partir de plusieurs instances.
|
|
656
|
+
|
|
657
|
+
Args:
|
|
658
|
+
all_feature_changes: Liste de dictionnaires de changements de caractéristiques
|
|
659
|
+
feature_names: Noms des caractéristiques
|
|
660
|
+
|
|
661
|
+
Returns:
|
|
662
|
+
dict: Changements de caractéristiques agrégés
|
|
663
|
+
"""
|
|
664
|
+
aggregated = {}
|
|
665
|
+
|
|
666
|
+
# Pour chaque caractéristique
|
|
667
|
+
for feature in feature_names:
|
|
668
|
+
# Collecter les statistiques de tous les changements
|
|
669
|
+
mean_diffs = []
|
|
670
|
+
max_diffs = []
|
|
671
|
+
changed_ratios = []
|
|
672
|
+
|
|
673
|
+
for changes in all_feature_changes:
|
|
674
|
+
if feature in changes:
|
|
675
|
+
mean_diffs.append(changes[feature]['mean_diff'])
|
|
676
|
+
max_diffs.append(changes[feature]['max_diff'])
|
|
677
|
+
changed_ratios.append(changes[feature]['changed_ratio'])
|
|
678
|
+
|
|
679
|
+
# Calculer les statistiques agrégées
|
|
680
|
+
if mean_diffs:
|
|
681
|
+
aggregated[feature] = {
|
|
682
|
+
'mean_diff': float(np.mean(mean_diffs)),
|
|
683
|
+
'max_diff': float(np.max(max_diffs)),
|
|
684
|
+
'changed_ratio': float(np.mean(changed_ratios)),
|
|
685
|
+
'importance_score': float(np.mean(changed_ratios) * np.mean(mean_diffs))
|
|
686
|
+
}
|
|
687
|
+
else:
|
|
688
|
+
aggregated[feature] = {
|
|
689
|
+
'mean_diff': 0.0,
|
|
690
|
+
'max_diff': 0.0,
|
|
691
|
+
'changed_ratio': 0.0,
|
|
692
|
+
'importance_score': 0.0
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
return aggregated
|
|
696
|
+
|
|
697
|
+
def _convert_changes_to_importances(self, feature_changes):
|
|
698
|
+
"""
|
|
699
|
+
Convertit les changements de caractéristiques en importances de caractéristiques.
|
|
700
|
+
|
|
701
|
+
Args:
|
|
702
|
+
feature_changes: Dictionnaire de changements de caractéristiques
|
|
703
|
+
|
|
704
|
+
Returns:
|
|
705
|
+
list: Liste d'objets FeatureImportance
|
|
706
|
+
"""
|
|
707
|
+
importances = []
|
|
708
|
+
|
|
709
|
+
# Calculer un score d'importance pour chaque caractéristique
|
|
710
|
+
for feature, changes in feature_changes.items():
|
|
711
|
+
# Pour les changements agrégés
|
|
712
|
+
if 'importance_score' in changes:
|
|
713
|
+
importance = changes['importance_score']
|
|
714
|
+
# Pour les changements d'une seule instance
|
|
715
|
+
else:
|
|
716
|
+
# Le score d'importance est une combinaison de la fréquence de changement et de l'ampleur du changement
|
|
717
|
+
importance = changes['changed_ratio'] * changes['mean_diff']
|
|
718
|
+
|
|
719
|
+
importances.append(FeatureImportance(
|
|
720
|
+
feature_name=feature,
|
|
721
|
+
importance=float(importance),
|
|
722
|
+
std=float(changes.get('std_diff', 0.0)),
|
|
723
|
+
additional_info={
|
|
724
|
+
'changed_ratio': float(changes['changed_ratio']),
|
|
725
|
+
'mean_diff': float(changes['mean_diff']),
|
|
726
|
+
'max_diff': float(changes.get('max_diff', 0.0))
|
|
727
|
+
}
|
|
728
|
+
))
|
|
729
|
+
|
|
730
|
+
# Normaliser les importances
|
|
731
|
+
total_importance = sum(imp.importance for imp in importances)
|
|
732
|
+
if total_importance > 0:
|
|
733
|
+
for imp in importances:
|
|
734
|
+
imp.importance = imp.importance / total_importance
|
|
735
|
+
|
|
736
|
+
# Trier par importance décroissante
|
|
737
|
+
importances.sort(key=lambda x: x.importance, reverse=True)
|
|
738
|
+
|
|
739
|
+
return importances
|
|
740
|
+
|
|
741
|
+
def _extract_metadata(self):
|
|
742
|
+
"""
|
|
743
|
+
Extrait les métadonnées du modèle.
|
|
744
|
+
"""
|
|
745
|
+
# Déterminer le type de modèle
|
|
746
|
+
model_type = self._get_model_type()
|
|
747
|
+
|
|
748
|
+
# Déterminer le type de tâche (classification ou régression)
|
|
749
|
+
task_type = self._get_task_type()
|
|
750
|
+
|
|
751
|
+
# Créer les métadonnées du modèle
|
|
752
|
+
self._metadata = ModelMetadata(
|
|
753
|
+
model_type=model_type,
|
|
754
|
+
framework=model_type, # Utiliser le type comme framework pour simplifier
|
|
755
|
+
task_type=task_type,
|
|
756
|
+
feature_names=self._feature_names,
|
|
757
|
+
target_names=None, # Pas disponible pour les contrefactuels
|
|
758
|
+
model_parameters={
|
|
759
|
+
'counterfactual_method': self._counterfactual_method,
|
|
760
|
+
'proximity_weight': self._proximity_weight,
|
|
761
|
+
'diversity_weight': self._diversity_weight,
|
|
762
|
+
'sparsity_weight': self._sparsity_weight
|
|
763
|
+
}
|
|
764
|
+
)
|
|
765
|
+
|
|
766
|
+
def _get_model_type(self):
|
|
767
|
+
"""
|
|
768
|
+
Détermine le type de modèle (framework).
|
|
769
|
+
|
|
770
|
+
Returns:
|
|
771
|
+
str: Type de modèle (sklearn, tensorflow, pytorch, etc.)
|
|
772
|
+
"""
|
|
773
|
+
model_module = self._model.__module__.split('.')[0].lower()
|
|
774
|
+
|
|
775
|
+
if model_module in ['sklearn', 'scikit']:
|
|
776
|
+
return 'sklearn'
|
|
777
|
+
elif model_module in ['tensorflow', 'tf', 'keras']:
|
|
778
|
+
return 'tensorflow'
|
|
779
|
+
elif model_module in ['torch', 'pytorch']:
|
|
780
|
+
return 'pytorch'
|
|
781
|
+
elif model_module in ['xgboost']:
|
|
782
|
+
return 'xgboost'
|
|
783
|
+
elif model_module in ['lightgbm']:
|
|
784
|
+
return 'lightgbm'
|
|
785
|
+
elif model_module in ['catboost']:
|
|
786
|
+
return 'catboost'
|
|
787
|
+
else:
|
|
788
|
+
return 'unknown'
|
|
789
|
+
|
|
790
|
+
def _get_task_type(self):
|
|
791
|
+
"""
|
|
792
|
+
Détermine le type de tâche (classification ou régression).
|
|
793
|
+
|
|
794
|
+
Returns:
|
|
795
|
+
str: Type de tâche ('classification' ou 'regression')
|
|
796
|
+
"""
|
|
797
|
+
# Vérifier les méthodes disponibles sur le modèle
|
|
798
|
+
if hasattr(self._model, 'predict_proba'):
|
|
799
|
+
return 'classification'
|
|
800
|
+
elif hasattr(self._model, '_estimator_type'):
|
|
801
|
+
return self._model._estimator_type
|
|
802
|
+
else:
|
|
803
|
+
# Par défaut, supposer que c'est une classification
|
|
804
|
+
return 'classification'
|