UnitMatchPy 2.42__tar.gz → 3.0__tar.gz
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.
- {unitmatchpy-2.42/UnitMatchPy.egg-info → unitmatchpy-3.0}/PKG-INFO +1 -1
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/bayes_functions.py +30 -14
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/metric_functions.py +47 -34
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/overlord.py +8 -3
- unitmatchpy-3.0/UnitMatchPy/run.py +114 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/utils.py +384 -19
- {unitmatchpy-2.42 → unitmatchpy-3.0/UnitMatchPy.egg-info}/PKG-INFO +1 -1
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy.egg-info/SOURCES.txt +1 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/pyproject.toml +1 -1
- {unitmatchpy-2.42 → unitmatchpy-3.0}/LICENSE +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/MANIFEST.in +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/README.md +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/GUI.py +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/GUI_icon.png +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/LICENSE +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/README.txt +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awdark.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awlight.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awtemplate.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awthemes.n7 +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awthemes.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awwinxpblue.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/colorutils.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demoscaled.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demoscaledb.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demottk.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/README.txt +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-left-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-right-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-right-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-up-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-up-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-left-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-right-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-right-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-up-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-left-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-right-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-right-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-up-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-left-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-left-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-right-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-right-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-up-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-up-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-p.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-af-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-af.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-f.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-p.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sa-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sa.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-ua.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sa-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sa.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-ua.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sa.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-ua.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-f.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-d-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/empty/empty/empty.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-f.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/labelframe/square/labelframe-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/labelframe/square/labelframe-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-d-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-h.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-i-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-i.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-h.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-i-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-i.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-a.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-d.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-h.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-i-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-i.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/diag-mask.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sa.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-ua.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sa.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-ua.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sa.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-ua.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-ud.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-un.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-ha.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-ha.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vn-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-vd.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-vn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/settings.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-h-grip-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-h-grip.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-v-grip-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-v-grip.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/sizegrip/circle/sizegrip-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/sizegrip/circle/sizegrip.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-right-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-right-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-down-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-right-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-right-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-right-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-n-base.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-n.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-sn.svg +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/pkgIndex.tcl +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/UM Logo.ico +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/__init__.py +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/assign_unique_id.py +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/default_params.py +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/extract_raw_data.py +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/param_functions.py +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/save_utils.py +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy.egg-info/dependency_links.txt +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy.egg-info/top_level.txt +0 -0
- {unitmatchpy-2.42 → unitmatchpy-3.0}/setup.cfg +0 -0
|
@@ -26,7 +26,7 @@ def get_parameter_kernels(scores_to_include, labels, cond, param, add_one = 1):
|
|
|
26
26
|
ndarray
|
|
27
27
|
The probability distributions for each metric
|
|
28
28
|
"""
|
|
29
|
-
print('Calculating the probability distributions of the metric scores')
|
|
29
|
+
# print('Calculating the probability distributions of the metric scores')
|
|
30
30
|
score_vector = param['score_vector']
|
|
31
31
|
bins = param['bins']
|
|
32
32
|
smooth_prob = param['smooth_prob']
|
|
@@ -73,27 +73,43 @@ def apply_naive_bayes(parameter_kernels, priors, predictors, param, cond):
|
|
|
73
73
|
ndarray
|
|
74
74
|
The probability the unit is or is not a match
|
|
75
75
|
"""
|
|
76
|
-
print('Calculating the match probabilities')
|
|
76
|
+
# print('Calculating the match probabilities')
|
|
77
77
|
|
|
78
78
|
score_vector = param['score_vector']
|
|
79
79
|
n_pairs = predictors.shape[0] ** 2
|
|
80
|
+
n_metrics = predictors.shape[2]
|
|
80
81
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
min_idx = np.
|
|
82
|
+
predictors_flat = predictors.reshape(n_pairs, n_metrics)
|
|
83
|
+
|
|
84
|
+
# Process in chunks
|
|
85
|
+
chunk_size = min(1000, n_pairs)
|
|
86
|
+
min_idx = np.zeros((n_pairs, n_metrics), dtype=int)
|
|
87
|
+
|
|
88
|
+
for start_idx in range(0, n_pairs, chunk_size):
|
|
89
|
+
end_idx = min(start_idx + chunk_size, n_pairs)
|
|
90
|
+
chunk = predictors_flat[start_idx:end_idx] # (chunk_size, n_metrics)
|
|
91
|
+
|
|
92
|
+
# For each metric, find closest score indices for this chunk
|
|
93
|
+
for metric_idx in range(n_metrics):
|
|
94
|
+
metric_values = chunk[:, metric_idx] # (chunk_size,)
|
|
95
|
+
# Broadcast: (chunk_size, 1) - (1, n_scores) = (chunk_size, n_scores)
|
|
96
|
+
distances = np.abs(metric_values[:, np.newaxis] - score_vector[np.newaxis, :])
|
|
97
|
+
min_idx[start_idx:end_idx, metric_idx] = np.argmin(distances, axis=1)
|
|
86
98
|
|
|
87
99
|
likelihood = np.full((n_pairs, len(cond)), np.nan)
|
|
88
100
|
for ck in range(len(cond)):
|
|
89
|
-
tmp_prob = np.zeros_like(min_idx, np.float64)
|
|
90
|
-
for yy in range(min_idx.shape[1]):
|
|
91
|
-
tmp_prob[:,yy] = parameter_kernels[min_idx[:,yy],yy,ck]
|
|
92
|
-
likelihood[:,ck] = np.prod(tmp_prob, axis=1)
|
|
93
101
|
|
|
102
|
+
metric_indices = np.arange(n_metrics)[np.newaxis, :] # (1, n_metrics)
|
|
103
|
+
|
|
104
|
+
# Extract probabilities for all pairs and metrics at once
|
|
105
|
+
tmp_prob = parameter_kernels[min_idx, metric_indices, ck] # (n_pairs, n_metrics)
|
|
106
|
+
|
|
107
|
+
# Compute product across metrics for each pair
|
|
108
|
+
likelihood[:, ck] = np.prod(tmp_prob, axis=1)
|
|
94
109
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
denominator = np.nansum(priors[np.newaxis, :] * likelihood, axis=1) # (n_pairs,)
|
|
111
|
+
|
|
112
|
+
# Compute final probabilities for all conditions at once
|
|
113
|
+
prob = (priors[np.newaxis, :] * likelihood) / denominator[:, np.newaxis] # (n_pairs, len(cond))
|
|
98
114
|
|
|
99
115
|
return prob
|
|
@@ -168,24 +168,35 @@ def get_Euclidean_dist(avg_waveform_per_tp_flip,param):
|
|
|
168
168
|
ndarray
|
|
169
169
|
The euclidean distance between each unit for each time point
|
|
170
170
|
"""
|
|
171
|
-
#
|
|
172
|
-
# if arrays become too large
|
|
173
|
-
|
|
171
|
+
# Memory-efficient implementation using loops instead of massive tiling
|
|
174
172
|
waveidx = param['waveidx']
|
|
175
173
|
n_units = param['n_units']
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
174
|
+
|
|
175
|
+
# Extract the relevant slices once
|
|
176
|
+
data_cv0 = avg_waveform_per_tp_flip[:,:,waveidx,0,:] # (3, n_units, len(waveidx), n_flips)
|
|
177
|
+
data_cv1 = avg_waveform_per_tp_flip[:,:,waveidx,1,:] # (3, n_units, len(waveidx), n_flips)
|
|
178
|
+
|
|
179
|
+
# Initialise output array to match original
|
|
180
|
+
euclid_dist = np.full((n_units, len(waveidx), data_cv0.shape[-1], n_units), np.nan)
|
|
181
|
+
|
|
182
|
+
# Process unit by unit
|
|
183
|
+
for i in range(n_units):
|
|
184
|
+
for j in range(n_units):
|
|
185
|
+
# Get data for units i and j
|
|
186
|
+
unit_i_data = data_cv0[:, i, :, :] # (3, len(waveidx), n_flips)
|
|
187
|
+
unit_j_data = data_cv1[:, j, :, :] # (3, len(waveidx), n_flips)
|
|
188
|
+
|
|
189
|
+
# Check for NaN values
|
|
190
|
+
w = np.isnan(np.abs(unit_i_data[0,:,:] - unit_j_data[0,:,:]))
|
|
191
|
+
|
|
192
|
+
# Compute Euclidean distance between units i and j
|
|
193
|
+
diff = unit_i_data - unit_j_data # (3, len(waveidx), n_flips)
|
|
194
|
+
tmp_euclid = np.linalg.norm(diff, axis=0) # (len(waveidx), n_flips)
|
|
195
|
+
tmp_euclid[w] = np.nan
|
|
196
|
+
|
|
197
|
+
# Store result
|
|
198
|
+
euclid_dist[i, :, :, j] = tmp_euclid
|
|
199
|
+
|
|
189
200
|
return euclid_dist
|
|
190
201
|
|
|
191
202
|
def centroid_metrics(euclid_dist, param):
|
|
@@ -323,7 +334,7 @@ def dist_angle(avg_waveform_per_tp_flip, param):
|
|
|
323
334
|
for dim_id2 in np.arange(1,avg_waveform_per_tp_flip.shape[0]):
|
|
324
335
|
if dim_id2 <= dim_id1:
|
|
325
336
|
continue
|
|
326
|
-
ang = np.abs( x1[dim_id1,:,:,:,:] - x2[dim_id1,:,:,:,:]) / np.abs(x1[dim_id2,:,:,:,:] - x2[dim_id2,:,:,:,:])
|
|
337
|
+
ang = np.abs( x1[dim_id1,:,:,:,:] - x2[dim_id1,:,:,:,:]) / (np.abs(x1[dim_id2,:,:,:,:] - x2[dim_id2,:,:,:,:]) + 1e-10)
|
|
327
338
|
|
|
328
339
|
loc_angle[:,:,:,:,count_id] = np.arctan(ang) * good_angle # only selects angles for units where there is sufficient distance between time poitns
|
|
329
340
|
count_id +=1
|
|
@@ -766,23 +777,25 @@ def drift_n_sessions(candidate_pairs, session_switch, avg_centroid, avg_waveform
|
|
|
766
777
|
drifts = np.zeros( (n_sessions - 1, 3))
|
|
767
778
|
|
|
768
779
|
for did in range(n_sessions - 1):
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
780
|
+
idx = np.argwhere( ( (best_pairs[:,0] >= session_switch[did]) * (best_pairs[:,0] < session_switch[did + 1]) *
|
|
781
|
+
(best_pairs[:,1] >= session_switch[did + 1]) * (best_pairs[:,1] < session_switch[did + 2]) ) == True)
|
|
782
|
+
|
|
783
|
+
pairs = best_pairs[idx,:].squeeze()
|
|
784
|
+
if pairs.ndim == 1:
|
|
785
|
+
pairs = np.expand_dims(pairs, axis = 0)
|
|
786
|
+
if best_match == True:
|
|
787
|
+
pairs = get_good_matches(pairs, total_score)
|
|
788
|
+
|
|
789
|
+
#Test to see if there are enough matches to do drift correction per shank
|
|
790
|
+
if test_matches_per_shank(pairs, avg_centroid, did, param) == True and best_drift == True:
|
|
791
|
+
drifts = np.zeros( (n_sessions - 1, param['no_shanks'], 3))
|
|
792
|
+
drifts[did,:,:], avg_waveform_per_tp, avg_centroid = apply_drift_correction_per_shank(pairs, did, session_switch, avg_centroid, avg_waveform_per_tp, param)
|
|
793
|
+
print(f'Done drift correction per shank for session pair {did+1} and {did+2}')
|
|
794
|
+
elif len(pairs)>0: #if there exist pairs across sessions:
|
|
795
|
+
drifts = np.zeros( (n_sessions - 1, 3))
|
|
796
|
+
drifts[did,:], avg_waveform_per_tp, avg_centroid = apply_drift_correction_basic(pairs, did, session_switch, avg_centroid, avg_waveform_per_tp)
|
|
797
|
+
elif len(pairs)==0:
|
|
798
|
+
print('No pairs across sessions to perform drift correction.')
|
|
786
799
|
return drifts, avg_centroid, avg_waveform_per_tp
|
|
787
800
|
|
|
788
801
|
|
|
@@ -38,7 +38,7 @@ def extract_parameters(waveform, channel_pos, clus_info, param):
|
|
|
38
38
|
|
|
39
39
|
return extracted_wave_properties
|
|
40
40
|
|
|
41
|
-
def extract_metric_scores(extracted_wave_properties, session_switch, within_session, param, niter = 2):
|
|
41
|
+
def extract_metric_scores(extracted_wave_properties, session_switch, within_session, param, niter = 2, to_use = None):
|
|
42
42
|
"""
|
|
43
43
|
This function runs all of the metric calculations and drift correction to calculate the probability
|
|
44
44
|
distribution needed for UnitMatch.
|
|
@@ -56,6 +56,8 @@ def extract_metric_scores(extracted_wave_properties, session_switch, within_sess
|
|
|
56
56
|
niter : int, optional
|
|
57
57
|
The number of pass through the function, 1 mean no drift correction
|
|
58
58
|
2 is one pass of drift correction, by default 2
|
|
59
|
+
to_use : list, optional
|
|
60
|
+
A list of scores to include in the total score calculation. If None (default), all scores are included.
|
|
59
61
|
|
|
60
62
|
Returns
|
|
61
63
|
-------
|
|
@@ -106,7 +108,11 @@ def extract_metric_scores(extracted_wave_properties, session_switch, within_sess
|
|
|
106
108
|
|
|
107
109
|
scores_to_include = {'amp_score' : amp_score, 'spatial_decay_score' : spatial_decay_score, 'centroid_overlord_score' : centroid_overlord_score,
|
|
108
110
|
'centroid_dist' : centroid_dist, 'waveform_score' : waveform_score, 'trajectory_score': trajectory_score }
|
|
109
|
-
|
|
111
|
+
if to_use is not None:
|
|
112
|
+
to_exclude = [key for key in scores_to_include if key not in to_use]
|
|
113
|
+
for key in to_exclude:
|
|
114
|
+
scores_to_include.pop(key, None)
|
|
115
|
+
|
|
110
116
|
total_score, predictors = mf.get_total_score(scores_to_include, param)
|
|
111
117
|
|
|
112
118
|
#Initial thresholding
|
|
@@ -120,7 +126,6 @@ def extract_metric_scores(extracted_wave_properties, session_switch, within_sess
|
|
|
120
126
|
|
|
121
127
|
drifts, avg_centroid, avg_waveform_per_tp = mf.drift_n_sessions(candidate_pairs, session_switch, avg_centroid, avg_waveform_per_tp, total_score, param)
|
|
122
128
|
|
|
123
|
-
|
|
124
129
|
thrs_opt = mf.get_threshold(total_score, within_session, euclid_dist, param, is_first_pass = False)
|
|
125
130
|
param['n_expected_matches'] = np.sum( (total_score > thrs_opt).astype(int))
|
|
126
131
|
prior_match = 1 - ( param['n_expected_matches'] / len(include_these_pairs))
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# This is an example usage script. It will need to be modified to run on your data.
|
|
2
|
+
# The script processes data from lots of mice concurrently so it is fast.
|
|
3
|
+
# The end result of the script is to write MatchProb values to a SQL database with a match table for each mouse/probe/location combination.
|
|
4
|
+
# It also assumes that the waveform snippets are stored in a specific directory structure: root/mouse/probe/location/experiment_id/processed_waveforms
|
|
5
|
+
|
|
6
|
+
import os, sys
|
|
7
|
+
sys.path.insert(0, os.path.dirname(os.getcwd()))
|
|
8
|
+
sys.path.insert(0, os.getcwd())
|
|
9
|
+
sys.path.insert(0, os.path.join(os.path.dirname(os.getcwd()), 'UnitMatchPy'))
|
|
10
|
+
import bayes_functions as bf
|
|
11
|
+
import utils as util
|
|
12
|
+
import overlord as ov
|
|
13
|
+
import numpy as np
|
|
14
|
+
import default_params as default_params
|
|
15
|
+
from concurrent.futures import ProcessPoolExecutor
|
|
16
|
+
import pandas as pd
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def process_single_location(location_data, path_lookup, param):
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
mouse, probe, loc, mt_path = location_data
|
|
23
|
+
|
|
24
|
+
print(f"Processing {mouse}, {probe}, {loc}")
|
|
25
|
+
|
|
26
|
+
# Check if already processed (with retry logic)
|
|
27
|
+
table_name = f'{mouse}_{probe}_{loc}'
|
|
28
|
+
|
|
29
|
+
# Create robust database connection with retry logic
|
|
30
|
+
conn, cursor = util.create_robust_db_connection(r"C:\Users\suyash\UCL\DeepUnitMatch\DeepMatch\matchtables.db")
|
|
31
|
+
|
|
32
|
+
def _check_if_processed():
|
|
33
|
+
cursor.execute(f"PRAGMA table_info({table_name})")
|
|
34
|
+
columns = [column[1] for column in cursor.fetchall()]
|
|
35
|
+
if "MatchProbNew" in columns:
|
|
36
|
+
# additionally check if the column contains NULLs
|
|
37
|
+
cursor.execute(f"SELECT COUNT(*) FROM {table_name} WHERE MatchProbNew IS NULL")
|
|
38
|
+
count_null = cursor.fetchone()[0]
|
|
39
|
+
if count_null == 0:
|
|
40
|
+
return True
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
if util.retry_db_operation(_check_if_processed):
|
|
44
|
+
print(f"Skipping {mouse}, {probe}, {loc} as it is already processed.")
|
|
45
|
+
conn.close()
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
KS_dirs = path_lookup.loc[(path_lookup['mouse'] == mouse) & (path_lookup['probe'] == probe) & (path_lookup['loc'] == loc), 'recordings'].to_list()[0]
|
|
49
|
+
param['KS_dirs'] = KS_dirs
|
|
50
|
+
wave_paths, unit_label_paths, channel_pos = util.paths_from_KS(KS_dirs)
|
|
51
|
+
param = util.get_probe_geometry(channel_pos[0], param)
|
|
52
|
+
|
|
53
|
+
waveform, session_id, session_switch, within_session, good_units, param = util.load_good_waveforms(wave_paths, unit_label_paths, param, good_units_only = False)
|
|
54
|
+
waveform, session_switch, within_session, session_id, good_units, param = util.filter_good_units_and_merge(mt_path, mouse, KS_dirs, waveform, session_switch, param)
|
|
55
|
+
# waveform, session_switch, within_session, session_id, good_units, param = util.filter_good_units(mouse, probe, loc, conn, waveform, session_switch, param)
|
|
56
|
+
|
|
57
|
+
mt = pd.read_sql_query(f"SELECT RecSes1,RecSes2,ID1,ID2 FROM {table_name}", conn)
|
|
58
|
+
ids = {}
|
|
59
|
+
for session in mt['RecSes1'].unique():
|
|
60
|
+
df = mt.loc[mt['RecSes1'] == session]
|
|
61
|
+
ids[session] = df['ID1'].unique()
|
|
62
|
+
|
|
63
|
+
clus_info = {'session_switch' : session_switch, 'session_id' : session_id}
|
|
64
|
+
|
|
65
|
+
# STEP 1
|
|
66
|
+
# Extract parameters from waveform
|
|
67
|
+
extracted_wave_properties = ov.extract_parameters(waveform, channel_pos, clus_info, param)
|
|
68
|
+
|
|
69
|
+
# STEP 2, 3, 4
|
|
70
|
+
# Extract metric scores
|
|
71
|
+
total_score, candidate_pairs, scores_to_include, predictors = ov.extract_metric_scores(extracted_wave_properties, session_switch, within_session, param, niter = 2)
|
|
72
|
+
|
|
73
|
+
prior_match = 1 - (param['n_expected_matches'] / param['n_units']**2 )
|
|
74
|
+
priors = np.array((prior_match, 1-prior_match))
|
|
75
|
+
|
|
76
|
+
labels = candidate_pairs.astype(int)
|
|
77
|
+
cond = np.unique(labels)
|
|
78
|
+
parameter_kernels = bf.get_parameter_kernels(scores_to_include, labels, cond, param, add_one = 1)
|
|
79
|
+
probability = bf.apply_naive_bayes(parameter_kernels, priors, predictors, param, cond)
|
|
80
|
+
|
|
81
|
+
util.add_col_to_sql(conn, cursor, mouse, probe, loc, "MatchProbNew", probability[:, 1], overwrite=True)
|
|
82
|
+
conn.close()
|
|
83
|
+
|
|
84
|
+
print(f"Finished processing {mouse}, {probe}, {loc}")
|
|
85
|
+
return probability[:, 1]
|
|
86
|
+
|
|
87
|
+
except Exception as e:
|
|
88
|
+
print(f"Error processing {mt_path}: {e}")
|
|
89
|
+
try:
|
|
90
|
+
if 'conn' in locals():
|
|
91
|
+
conn.close()
|
|
92
|
+
except:
|
|
93
|
+
pass
|
|
94
|
+
return None
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
if __name__ == "__main__":
|
|
98
|
+
param = default_params.get_default_param()
|
|
99
|
+
root = r"path/to/data/root" # Root directory containing all data folders - data should be organised under this as mouse/probe/location
|
|
100
|
+
|
|
101
|
+
paths = pd.DataFrame(util.read_datapaths(os.listdir(root), r'/server/data/base'))
|
|
102
|
+
valid_locs = util.get_valid_locations(root)
|
|
103
|
+
# paths is a pandas dataframe with columns mouse, probe, loc, recordings, where recordings is a list of KS_dirs for that mouse/probe/location
|
|
104
|
+
# valid_locs is a list of tuples (mouse, probe, loc, mt_path) for each location with a match table
|
|
105
|
+
|
|
106
|
+
max_workers = min(os.cpu_count() - 1, 12)
|
|
107
|
+
|
|
108
|
+
with ProcessPoolExecutor(max_workers=max_workers) as executor:
|
|
109
|
+
# Submit all jobs
|
|
110
|
+
future_to_location = {
|
|
111
|
+
executor.submit(process_single_location, location, paths, param): location
|
|
112
|
+
for location in valid_locs
|
|
113
|
+
}
|
|
114
|
+
|