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.
Files changed (291) hide show
  1. {unitmatchpy-2.42/UnitMatchPy.egg-info → unitmatchpy-3.0}/PKG-INFO +1 -1
  2. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/bayes_functions.py +30 -14
  3. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/metric_functions.py +47 -34
  4. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/overlord.py +8 -3
  5. unitmatchpy-3.0/UnitMatchPy/run.py +114 -0
  6. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/utils.py +384 -19
  7. {unitmatchpy-2.42 → unitmatchpy-3.0/UnitMatchPy.egg-info}/PKG-INFO +1 -1
  8. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy.egg-info/SOURCES.txt +1 -0
  9. {unitmatchpy-2.42 → unitmatchpy-3.0}/pyproject.toml +1 -1
  10. {unitmatchpy-2.42 → unitmatchpy-3.0}/LICENSE +0 -0
  11. {unitmatchpy-2.42 → unitmatchpy-3.0}/MANIFEST.in +0 -0
  12. {unitmatchpy-2.42 → unitmatchpy-3.0}/README.md +0 -0
  13. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/GUI.py +0 -0
  14. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/GUI_icon.png +0 -0
  15. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/LICENSE +0 -0
  16. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/README.txt +0 -0
  17. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awdark.tcl +0 -0
  18. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awlight.tcl +0 -0
  19. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awtemplate.tcl +0 -0
  20. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awthemes.n7 +0 -0
  21. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awthemes.tcl +0 -0
  22. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/awwinxpblue.tcl +0 -0
  23. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/colorutils.tcl +0 -0
  24. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demoscaled.tcl +0 -0
  25. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demoscaledb.tcl +0 -0
  26. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/demottk.tcl +0 -0
  27. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/README.txt +0 -0
  28. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-d.svg +0 -0
  29. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-n-base.svg +0 -0
  30. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-n.svg +0 -0
  31. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-down-sn.svg +0 -0
  32. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-left-n.svg +0 -0
  33. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-right-n.svg +0 -0
  34. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-right-sn.svg +0 -0
  35. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-up-d.svg +0 -0
  36. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/chevron/arrow-up-n.svg +0 -0
  37. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-n-base.svg +0 -0
  38. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-n.svg +0 -0
  39. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-down-sn.svg +0 -0
  40. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-left-n.svg +0 -0
  41. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-right-n.svg +0 -0
  42. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-right-sn.svg +0 -0
  43. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/open/arrow-up-n.svg +0 -0
  44. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-n-base.svg +0 -0
  45. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-n.svg +0 -0
  46. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-down-sn.svg +0 -0
  47. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-left-n.svg +0 -0
  48. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-right-n.svg +0 -0
  49. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-right-sn.svg +0 -0
  50. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid/arrow-up-n.svg +0 -0
  51. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-d.svg +0 -0
  52. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-n-base.svg +0 -0
  53. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-down-n.svg +0 -0
  54. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-left-d.svg +0 -0
  55. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-left-n.svg +0 -0
  56. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-right-d.svg +0 -0
  57. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-right-n.svg +0 -0
  58. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-up-d.svg +0 -0
  59. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/arrow-up-n.svg +0 -0
  60. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/arrow/solid-bg/settings.tcl +0 -0
  61. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-a.svg +0 -0
  62. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-d.svg +0 -0
  63. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-n.svg +0 -0
  64. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/button-p.svg +0 -0
  65. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-accent-gradient/settings.tcl +0 -0
  66. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-a.svg +0 -0
  67. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-af-base.svg +0 -0
  68. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-af.svg +0 -0
  69. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-d.svg +0 -0
  70. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-f.svg +0 -0
  71. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-n.svg +0 -0
  72. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/button-p.svg +0 -0
  73. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-flat/settings.tcl +0 -0
  74. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-d.svg +0 -0
  75. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-n-base.svg +0 -0
  76. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/button-n.svg +0 -0
  77. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/button/roundedrect-gradient/settings.tcl +0 -0
  78. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sa-base.svg +0 -0
  79. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sa.svg +0 -0
  80. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sd.svg +0 -0
  81. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sn-base.svg +0 -0
  82. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-sn.svg +0 -0
  83. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-ua.svg +0 -0
  84. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-ud.svg +0 -0
  85. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check/cb-un.svg +0 -0
  86. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sa-base.svg +0 -0
  87. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sa.svg +0 -0
  88. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sd.svg +0 -0
  89. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sn-base.svg +0 -0
  90. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-sn.svg +0 -0
  91. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-ua.svg +0 -0
  92. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-ud.svg +0 -0
  93. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-check-rev/cb-un.svg +0 -0
  94. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sa.svg +0 -0
  95. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sd.svg +0 -0
  96. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sn-base.svg +0 -0
  97. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-sn.svg +0 -0
  98. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-ua.svg +0 -0
  99. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-ud.svg +0 -0
  100. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/roundedrect-square/cb-un.svg +0 -0
  101. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sd.svg +0 -0
  102. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sn-base.svg +0 -0
  103. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-sn.svg +0 -0
  104. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-ud.svg +0 -0
  105. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-check-gradient/cb-un.svg +0 -0
  106. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sd.svg +0 -0
  107. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sn-base.svg +0 -0
  108. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-sn.svg +0 -0
  109. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-ud.svg +0 -0
  110. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/checkbutton/square-x/cb-un.svg +0 -0
  111. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-d.svg +0 -0
  112. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-n-base.svg +0 -0
  113. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-arrow-down-n.svg +0 -0
  114. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-a.svg +0 -0
  115. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-d.svg +0 -0
  116. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-f.svg +0 -0
  117. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-n-base.svg +0 -0
  118. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/combo-entry-n.svg +0 -0
  119. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/rounded/settings.tcl +0 -0
  120. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-a.svg +0 -0
  121. {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
  122. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-d.svg +0 -0
  123. {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
  124. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/combo-arrow-down-n.svg +0 -0
  125. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/combobox/solid-bg/settings.tcl +0 -0
  126. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/empty/empty/empty.svg +0 -0
  127. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-a.svg +0 -0
  128. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-d.svg +0 -0
  129. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-f.svg +0 -0
  130. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-n-base.svg +0 -0
  131. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/entry-n.svg +0 -0
  132. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/entry/roundedrect/settings.tcl +0 -0
  133. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/labelframe/square/labelframe-d.svg +0 -0
  134. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/labelframe/square/labelframe-n.svg +0 -0
  135. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-a.svg +0 -0
  136. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-d.svg +0 -0
  137. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-n-base.svg +0 -0
  138. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/chevron/mb-arrow-down-n.svg +0 -0
  139. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-d-base.svg +0 -0
  140. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-d.svg +0 -0
  141. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-n-base.svg +0 -0
  142. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/menubutton/solid/mb-arrow-down-n.svg +0 -0
  143. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-a.svg +0 -0
  144. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-d.svg +0 -0
  145. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-h.svg +0 -0
  146. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-i-base.svg +0 -0
  147. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/notebook-tab-i.svg +0 -0
  148. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-dark/settings.tcl +0 -0
  149. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-a.svg +0 -0
  150. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-d.svg +0 -0
  151. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-h.svg +0 -0
  152. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-i-base.svg +0 -0
  153. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/notebook-tab-i.svg +0 -0
  154. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light/settings.tcl +0 -0
  155. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-a.svg +0 -0
  156. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-d.svg +0 -0
  157. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-h.svg +0 -0
  158. {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
  159. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/notebook-tab-i.svg +0 -0
  160. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/notebook/roundedtop-light-accent/settings.tcl +0 -0
  161. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/settings.tcl +0 -0
  162. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hd.svg +0 -0
  163. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hn-base.svg +0 -0
  164. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-hn.svg +0 -0
  165. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-vd.svg +0 -0
  166. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/slider-vn.svg +0 -0
  167. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hd.svg +0 -0
  168. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hn-base.svg +0 -0
  169. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-hn.svg +0 -0
  170. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-vd.svg +0 -0
  171. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect/trough-vn.svg +0 -0
  172. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/settings.tcl +0 -0
  173. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hd.svg +0 -0
  174. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hn-base.svg +0 -0
  175. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-hn.svg +0 -0
  176. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-vd.svg +0 -0
  177. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-bord/slider-vn.svg +0 -0
  178. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/diag-mask.svg +0 -0
  179. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/settings.tcl +0 -0
  180. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hd.svg +0 -0
  181. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hn-base.svg +0 -0
  182. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-hn.svg +0 -0
  183. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vd.svg +0 -0
  184. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vn-base.svg +0 -0
  185. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rect-diag/slider-vn.svg +0 -0
  186. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/settings.tcl +0 -0
  187. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-hd.svg +0 -0
  188. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-hn.svg +0 -0
  189. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-vd.svg +0 -0
  190. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/slider-vn.svg +0 -0
  191. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hd.svg +0 -0
  192. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hn-base.svg +0 -0
  193. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-hn.svg +0 -0
  194. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vd.svg +0 -0
  195. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vn-base.svg +0 -0
  196. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/rounded-line/trough-vn.svg +0 -0
  197. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/progressbar/settings.tcl +0 -0
  198. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sa.svg +0 -0
  199. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sd.svg +0 -0
  200. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sn-base.svg +0 -0
  201. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-sn.svg +0 -0
  202. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-ua.svg +0 -0
  203. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-ud.svg +0 -0
  204. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle/rb-un.svg +0 -0
  205. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sd.svg +0 -0
  206. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sn-base.svg +0 -0
  207. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-sn.svg +0 -0
  208. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-ud.svg +0 -0
  209. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-gradient/rb-un.svg +0 -0
  210. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sa.svg +0 -0
  211. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sd.svg +0 -0
  212. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sn-base.svg +0 -0
  213. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-sn.svg +0 -0
  214. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-ua.svg +0 -0
  215. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-ud.svg +0 -0
  216. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-hlbg/rb-un.svg +0 -0
  217. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sa.svg +0 -0
  218. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sd.svg +0 -0
  219. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sn-base.svg +0 -0
  220. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-sn.svg +0 -0
  221. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-ua.svg +0 -0
  222. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-ud.svg +0 -0
  223. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/circle-circle-rev/rb-un.svg +0 -0
  224. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sd.svg +0 -0
  225. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sn-base.svg +0 -0
  226. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-sn.svg +0 -0
  227. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-ud.svg +0 -0
  228. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/radiobutton/octagon-circle/rb-un.svg +0 -0
  229. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-ha.svg +0 -0
  230. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-hd.svg +0 -0
  231. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle/scale-hn.svg +0 -0
  232. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-ha.svg +0 -0
  233. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-hd.svg +0 -0
  234. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/circle-rev/scale-hn.svg +0 -0
  235. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hd.svg +0 -0
  236. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hn-base.svg +0 -0
  237. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-hn.svg +0 -0
  238. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-vd.svg +0 -0
  239. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-bord-grip/scale-vn.svg +0 -0
  240. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hd.svg +0 -0
  241. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hn-base.svg +0 -0
  242. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-hn.svg +0 -0
  243. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hd.svg +0 -0
  244. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hn-base.svg +0 -0
  245. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-hn.svg +0 -0
  246. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vd.svg +0 -0
  247. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vn-base.svg +0 -0
  248. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-trough-vn.svg +0 -0
  249. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-vd.svg +0 -0
  250. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/scale-vn.svg +0 -0
  251. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scale/rect-narrow/settings.tcl +0 -0
  252. {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
  253. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-h-grip.svg +0 -0
  254. {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
  255. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/scrollbar-grip/circle/sb-slider-v-grip.svg +0 -0
  256. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/sizegrip/circle/sizegrip-base.svg +0 -0
  257. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/sizegrip/circle/sizegrip.svg +0 -0
  258. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-base.svg +0 -0
  259. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-n.svg +0 -0
  260. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-down-sn.svg +0 -0
  261. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-right-n.svg +0 -0
  262. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/chevron/tree-arrow-right-sn.svg +0 -0
  263. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-n-base.svg +0 -0
  264. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-n.svg +0 -0
  265. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-down-sn.svg +0 -0
  266. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-n-base.svg +0 -0
  267. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-n.svg +0 -0
  268. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/open/tree-arrow-right-sn.svg +0 -0
  269. {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
  270. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-down-n.svg +0 -0
  271. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-down-sn.svg +0 -0
  272. {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
  273. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-right-n.svg +0 -0
  274. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/plusminus-box/tree-arrow-right-sn.svg +0 -0
  275. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-n-base.svg +0 -0
  276. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-n.svg +0 -0
  277. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-down-sn.svg +0 -0
  278. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-n-base.svg +0 -0
  279. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-n.svg +0 -0
  280. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/i/awthemes/treeview/solid/tree-arrow-right-sn.svg +0 -0
  281. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/TkinterTheme/awthemes-10.4.0/pkgIndex.tcl +0 -0
  282. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/UM Logo.ico +0 -0
  283. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/__init__.py +0 -0
  284. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/assign_unique_id.py +0 -0
  285. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/default_params.py +0 -0
  286. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/extract_raw_data.py +0 -0
  287. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/param_functions.py +0 -0
  288. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy/save_utils.py +0 -0
  289. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy.egg-info/dependency_links.txt +0 -0
  290. {unitmatchpy-2.42 → unitmatchpy-3.0}/UnitMatchPy.egg-info/top_level.txt +0 -0
  291. {unitmatchpy-2.42 → unitmatchpy-3.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UnitMatchPy
3
- Version: 2.42
3
+ Version: 3.0
4
4
  Summary: Automatic matching of neurons across sessions
5
5
  Author: Enny van Beest
6
6
  License: CC BY-NC-SA 4.0 International
@@ -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
- unravel = np.reshape(predictors , (predictors.shape[0] * predictors.shape[1], predictors.shape[2],1))
82
- x1 = np.tile(unravel, ( 1, 1, len(score_vector)))
83
- tmp = np.expand_dims(score_vector, axis = (0,1))
84
- x2 = np.tile(tmp, (x1.shape[0], x1.shape[1], 1))
85
- min_idx = np.argmin( np.abs(x1 - x2), axis = 2)
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
- prob = np.full((n_pairs,2), np.nan )
96
- for ck in range(len(cond)):
97
- prob[:,ck] = priors[ck] * likelihood[:,ck] / np.nansum((priors * likelihood), axis =1)
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
- # NOTE these arrays could get very large, may needed calculate in batches or use dask
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
- x1 = np.tile( np.expand_dims(avg_waveform_per_tp_flip[:,:,waveidx,0,:], axis = -1), (1,1,1,1,n_units)).squeeze()
178
- x2 = np.swapaxes(np.tile( np.expand_dims(avg_waveform_per_tp_flip[:,:,waveidx,1,:], axis = -1), (1,1,1,1,n_units)).squeeze(), 1, 4)
179
-
180
- w = np.isnan( np.abs(x1[0,:,:,:,:] - x2[0,:,:,:,:])).squeeze()
181
-
182
- tmp_euclid = np.linalg.norm(x1-x2, axis = 0)
183
- tmp_euclid[w] = np.nan
184
- euclid_dist = tmp_euclid
185
- del x1
186
- del x2
187
- del w
188
- del tmp_euclid
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
- idx = np.argwhere( ( (best_pairs[:,0] >= session_switch[did]) * (best_pairs[:,0] < session_switch[did + 1]) *
770
- (best_pairs[:,1] >= session_switch[did + 1]) * (best_pairs[:,1] < session_switch[did + 2]) ) == True)
771
-
772
- pairs = best_pairs[idx,:].squeeze()
773
- if best_match == True:
774
- pairs = get_good_matches(pairs, total_score)
775
-
776
- #Test to see if there are enough matches to do drift correction per shank
777
- if test_matches_per_shank(pairs, avg_centroid, did, param) == True and best_drift == True:
778
- drifts = np.zeros( (n_sessions - 1, param['no_shanks'], 3))
779
- drifts[did,:,:], avg_waveform_per_tp, avg_centroid = apply_drift_correction_per_shank(pairs, did, session_switch, avg_centroid, avg_waveform_per_tp, param)
780
- print(f'Done drift correction per shank for session pair {did+1} and {did+2}')
781
- elif len(pairs)>0: #if there exist pairs across sessions:
782
- drifts = np.zeros( (n_sessions - 1, 3))
783
- drifts[did,:], avg_waveform_per_tp, avg_centroid = apply_drift_correction_basic(pairs, did, session_switch, avg_centroid, avg_waveform_per_tp)
784
- elif len(pairs)==0:
785
- print('No pairs across sessions to perform drift correction.')
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
+