howso-engine 68.2.0__tar.gz → 69.0.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 (128) hide show
  1. {howso_engine-68.2.0 → howso_engine-69.0.0}/LICENSE-3RD-PARTY.txt +34 -34
  2. {howso_engine-68.2.0/howso_engine.egg-info → howso_engine-69.0.0}/PKG-INFO +2 -2
  3. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/base.py +64 -9
  4. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/group_reaction.py +1 -0
  5. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/direct/client.py +33 -0
  6. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/engine/trainee.py +35 -23
  7. howso_engine-69.0.0/howso/howso-engine/howso.caml +0 -0
  8. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/howso-engine/migrations/migrations.caml +0 -0
  9. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/howso-engine/version.json +4 -4
  10. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/scikit/scikit.py +6 -0
  11. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/progress.py +15 -61
  12. {howso_engine-68.2.0 → howso_engine-69.0.0/howso_engine.egg-info}/PKG-INFO +2 -2
  13. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso_engine.egg-info/requires.txt +1 -1
  14. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso_engine.egg-info/scm_file_list.json +1 -0
  15. {howso_engine-68.2.0 → howso_engine-69.0.0}/pyproject.toml +1 -1
  16. {howso_engine-68.2.0 → howso_engine-69.0.0}/requirements-3.11-dev.txt +9 -7
  17. {howso_engine-68.2.0 → howso_engine-69.0.0}/requirements-3.11.txt +6 -4
  18. {howso_engine-68.2.0 → howso_engine-69.0.0}/requirements-3.12-dev.txt +9 -7
  19. {howso_engine-68.2.0 → howso_engine-69.0.0}/requirements-3.12.txt +6 -4
  20. {howso_engine-68.2.0 → howso_engine-69.0.0}/requirements-3.13-dev.txt +9 -7
  21. {howso_engine-68.2.0 → howso_engine-69.0.0}/requirements-3.13.txt +6 -4
  22. {howso_engine-68.2.0 → howso_engine-69.0.0}/requirements-3.14-dev.txt +9 -7
  23. {howso_engine-68.2.0 → howso_engine-69.0.0}/requirements-3.14.txt +6 -4
  24. howso_engine-69.0.0/version.json +5 -0
  25. howso_engine-68.2.0/howso/howso-engine/howso.caml +0 -0
  26. howso_engine-68.2.0/version.json +0 -5
  27. {howso_engine-68.2.0 → howso_engine-69.0.0}/.coveragerc +0 -0
  28. {howso_engine-68.2.0 → howso_engine-69.0.0}/.flake8 +0 -0
  29. {howso_engine-68.2.0 → howso_engine-69.0.0}/.github/CODEOWNERS +0 -0
  30. {howso_engine-68.2.0 → howso_engine-69.0.0}/.github/templates/version_summary.md +0 -0
  31. {howso_engine-68.2.0 → howso_engine-69.0.0}/.github/workflows/build-pr.yml +0 -0
  32. {howso_engine-68.2.0 → howso_engine-69.0.0}/.github/workflows/build-release.yml +0 -0
  33. {howso_engine-68.2.0 → howso_engine-69.0.0}/.github/workflows/build.yml +0 -0
  34. {howso_engine-68.2.0 → howso_engine-69.0.0}/.github/workflows/rebuild-requirements.yml +0 -0
  35. {howso_engine-68.2.0 → howso_engine-69.0.0}/.github/workflows/version-update.yml +0 -0
  36. {howso_engine-68.2.0 → howso_engine-69.0.0}/.gitignore +0 -0
  37. {howso_engine-68.2.0 → howso_engine-69.0.0}/.gitmodules +0 -0
  38. {howso_engine-68.2.0 → howso_engine-69.0.0}/.pylintrc +0 -0
  39. {howso_engine-68.2.0 → howso_engine-69.0.0}/CONTRIBUTING.md +0 -0
  40. {howso_engine-68.2.0 → howso_engine-69.0.0}/LICENSE.txt +0 -0
  41. {howso_engine-68.2.0 → howso_engine-69.0.0}/MANIFEST.in +0 -0
  42. {howso_engine-68.2.0 → howso_engine-69.0.0}/Makefile +0 -0
  43. {howso_engine-68.2.0 → howso_engine-69.0.0}/README.md +0 -0
  44. {howso_engine-68.2.0 → howso_engine-69.0.0}/bin/build.sh +0 -0
  45. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/latest-mt-debug-howso.yml +0 -0
  46. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/latest-mt-howso.yml +0 -0
  47. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/latest-mt-noavx-traces-howso.yml +0 -0
  48. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/latest-mt-traces-howso.yml +0 -0
  49. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/latest-st-debug-howso.yml +0 -0
  50. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/latest-st-howso.yml +0 -0
  51. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/latest-st-traces-howso.yml +0 -0
  52. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/powershell/Download-Tzdata.ps1 +0 -0
  53. {howso_engine-68.2.0 → howso_engine-69.0.0}/config/powershell/Helper-Functions.ps1 +0 -0
  54. {howso_engine-68.2.0 → howso_engine-69.0.0}/hatch.toml +0 -0
  55. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/__main__.py +0 -0
  56. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/__init__.py +0 -0
  57. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/api.py +0 -0
  58. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/cache.py +0 -0
  59. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/client.py +0 -0
  60. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/configuration.py +0 -0
  61. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/exceptions.py +0 -0
  62. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/feature_flags.py +0 -0
  63. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/pandas/__init__.py +0 -0
  64. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/pandas/client.py +0 -0
  65. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/protocols.py +0 -0
  66. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/__init__.py +0 -0
  67. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/aggregate_reaction.py +0 -0
  68. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/base.py +0 -0
  69. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/project.py +0 -0
  70. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/reaction.py +0 -0
  71. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/session.py +0 -0
  72. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/trainee.py +0 -0
  73. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/schemas/version.py +0 -0
  74. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/client/typing.py +0 -0
  75. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/direct/__init__.py +0 -0
  76. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/direct/_utilities.py +0 -0
  77. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/direct/schemas/__init__.py +0 -0
  78. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/direct/schemas/trainee.py +0 -0
  79. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/engine/__init__.py +0 -0
  80. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/engine/client.py +0 -0
  81. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/engine/project.py +0 -0
  82. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/engine/session.py +0 -0
  83. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/scikit/__init__.py +0 -0
  84. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/__init__.py +0 -0
  85. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/decorators.py +0 -0
  86. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/fanout_features.py +0 -0
  87. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/__init__.py +0 -0
  88. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/abstract_data.py +0 -0
  89. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/base.py +0 -0
  90. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/infer_feature_attributes.py +0 -0
  91. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/pandas.py +0 -0
  92. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/protocols.py +0 -0
  93. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/relational.py +0 -0
  94. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/serializers.py +0 -0
  95. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/suggestions.py +0 -0
  96. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/time_series.py +0 -0
  97. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/feature_attributes/warnings.py +0 -0
  98. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/features.py +0 -0
  99. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/__init__.py +0 -0
  100. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/__main__.py +0 -0
  101. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/_constants.py +0 -0
  102. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/_helpers.py +0 -0
  103. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/_output.py +0 -0
  104. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/_probes.py +0 -0
  105. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/_types.py +0 -0
  106. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/checks_cpu.py +0 -0
  107. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/checks_engine.py +0 -0
  108. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/checks_environment.py +0 -0
  109. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/checks_optional.py +0 -0
  110. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/main.py +0 -0
  111. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/installation_verification/registry.py +0 -0
  112. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/internals.py +0 -0
  113. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/json_wrapper.py +0 -0
  114. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/locale.py +0 -0
  115. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/monitors.py +0 -0
  116. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/posix.py +0 -0
  117. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/random.py +0 -0
  118. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/reaction.py +0 -0
  119. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/testing.py +0 -0
  120. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/tokenizing.py +0 -0
  121. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso/utilities/utilities.py +0 -0
  122. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso_engine.egg-info/SOURCES.txt +0 -0
  123. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso_engine.egg-info/dependency_links.txt +0 -0
  124. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso_engine.egg-info/entry_points.txt +0 -0
  125. {howso_engine-68.2.0 → howso_engine-69.0.0}/howso_engine.egg-info/top_level.txt +0 -0
  126. {howso_engine-68.2.0 → howso_engine-69.0.0}/pyrightconfig.json +0 -0
  127. {howso_engine-68.2.0 → howso_engine-69.0.0}/ruff.toml +0 -0
  128. {howso_engine-68.2.0 → howso_engine-69.0.0}/setup.cfg +0 -0
@@ -4,7 +4,7 @@ MIT License
4
4
  joke2k
5
5
  https://github.com/joke2k/faker
6
6
  Faker is a Python package that generates fake data for you.
7
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/faker-40.43.0.dist-info/licenses/LICENSE.txt
7
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/faker-40.43.0.dist-info/licenses/LICENSE.txt
8
8
  Copyright (c) 2012 Daniele Faraglia
9
9
 
10
10
  Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -32,7 +32,7 @@ MIT License
32
32
  Kirill Simonov
33
33
  https://pyyaml.org/
34
34
  YAML parser and emitter for Python
35
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/pyyaml-6.0.3.dist-info/licenses/LICENSE
35
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pyyaml-6.0.3.dist-info/licenses/LICENSE
36
36
  Copyright (c) 2017-2021 Ingy döt Net
37
37
  Copyright (c) 2006-2016 Kirill Simonov
38
38
 
@@ -61,7 +61,7 @@ BSD-2-Clause
61
61
  Georg Brandl <georg@python.org>
62
62
  https://pygments.org
63
63
  Pygments is a syntax highlighting package written in Python.
64
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/pygments-2.21.0.dist-info/licenses/LICENSE
64
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pygments-2.21.0.dist-info/licenses/LICENSE
65
65
  Copyright (c) 2006-2022 by the respective authors (see AUTHORS file).
66
66
  All rights reserved.
67
67
 
@@ -95,7 +95,7 @@ MIT
95
95
  Filipe Laíns <lains@riseup.net>, Bernát Gábor <gaborjbernat@gmail.com>, layday <layday@protonmail.com>, Henry Schreiner <henryschreineriii@gmail.com>
96
96
  https://build.pypa.io
97
97
  A simple, correct Python build frontend
98
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/build-1.6.1.dist-info/licenses/LICENSE
98
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/build-1.6.1.dist-info/licenses/LICENSE
99
99
  Copyright © 2019 Filipe Laíns <filipe.lains@gmail.com>
100
100
 
101
101
  Permission is hereby granted, free of charge, to any person obtaining a
@@ -119,12 +119,12 @@ DEALINGS IN THE SOFTWARE.
119
119
 
120
120
 
121
121
  certifi
122
- 2026.10.18
122
+ 2026.10.23
123
123
  Mozilla Public License 2.0 (MPL 2.0)
124
124
  Kenneth Reitz
125
125
  https://github.com/certifi/python-certifi
126
126
  Python package for providing Mozilla's CA Bundle.
127
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/certifi-2026.10.18.dist-info/licenses/LICENSE
127
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/certifi-2026.10.23.dist-info/licenses/LICENSE
128
128
  This package contains a modified version of ca-bundle.crt:
129
129
 
130
130
  ca-bundle.crt -- Bundle of CA Root Certificates
@@ -153,7 +153,7 @@ MIT
153
153
  "Ahmed R. TAHRI" <tahri.ahmed@proton.me>
154
154
  https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md
155
155
  The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.
156
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/charset_normalizer-3.5.2.dist-info/licenses/LICENSE
156
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/charset_normalizer-3.5.2.dist-info/licenses/LICENSE
157
157
  MIT License
158
158
 
159
159
  Copyright (c) 2025 TAHRI Ahmed R.
@@ -183,7 +183,7 @@ BSD-3-Clause
183
183
  UNKNOWN
184
184
  https://github.com/pallets/click/
185
185
  Composable command line interface toolkit
186
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/click-8.5.0.dist-info/licenses/LICENSE.txt
186
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/click-8.5.0.dist-info/licenses/LICENSE.txt
187
187
  Copyright 2014 Pallets
188
188
 
189
189
  Redistribution and use in source and binary forms, with or without
@@ -220,7 +220,7 @@ BSD License
220
220
  The cloudpickle developer team
221
221
  https://github.com/cloudpipe/cloudpickle
222
222
  Pickler class to extend the standard pickle.Pickler functionality
223
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/cloudpickle-3.1.2.dist-info/licenses/LICENSE
223
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/cloudpickle-3.1.2.dist-info/licenses/LICENSE
224
224
  This module was extracted from the `cloud` package, developed by
225
225
  PiCloud, Inc.
226
226
 
@@ -261,7 +261,7 @@ MIT
261
261
  Jason Moiron <jmoiron@jmoiron.net>
262
262
  https://github.com/python-humanize/humanize
263
263
  Python humanize utilities
264
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/humanize-4.16.0.dist-info/licenses/LICENCE
264
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/humanize-4.16.0.dist-info/licenses/LICENCE
265
265
  Copyright (c) 2010-2020 Jason Moiron and Contributors
266
266
 
267
267
  Permission is hereby granted, free of charge, to any person obtaining
@@ -290,7 +290,7 @@ BSD-3-Clause
290
290
  Kim Davies <kim+pypi@gumleaf.org>
291
291
  https://github.com/kjd/idna
292
292
  Internationalized Domain Names in Applications (IDNA)
293
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/idna-3.20.dist-info/licenses/LICENSE.md
293
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/idna-3.20.dist-info/licenses/LICENSE.md
294
294
  BSD 3-Clause License
295
295
 
296
296
  Copyright (c) 2013-2026, Kim Davies and contributors.
@@ -330,7 +330,7 @@ BSD-3-Clause
330
330
  Gael Varoquaux <gael.varoquaux@normalesup.org>
331
331
  https://joblib.readthedocs.io
332
332
  Lightweight pipelining with Python functions
333
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/joblib-1.6.0.dist-info/licenses/LICENSE.txt
333
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/joblib-1.6.0.dist-info/licenses/LICENSE.txt
334
334
  BSD 3-Clause License
335
335
 
336
336
  Copyright (c) 2008-2021, The joblib developers.
@@ -368,7 +368,7 @@ MIT License
368
368
  Chris Sewell <chrisj_sewell@hotmail.com>
369
369
  https://github.com/executablebooks/markdown-it-py
370
370
  Python port of markdown-it. Markdown parsing, done right!
371
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/markdown_it_py-4.2.0.dist-info/licenses/LICENSE
371
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/markdown_it_py-4.2.0.dist-info/licenses/LICENSE
372
372
  MIT License
373
373
 
374
374
  Copyright (c) 2020 ExecutableBookProject
@@ -398,7 +398,7 @@ MIT License
398
398
  Taneli Hukkinen <hukkin@users.noreply.github.com>
399
399
  https://github.com/executablebooks/mdurl
400
400
  Markdown URL utilities
401
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/mdurl-0.1.2.dist-info/LICENSE
401
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/mdurl-0.1.2.dist-info/LICENSE
402
402
  Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin.
403
403
  Copyright (c) 2021 Taneli Hukkinen
404
404
 
@@ -453,7 +453,7 @@ MIT License
453
453
  Hajime Senuma <hajime.senuma@gmail.com>
454
454
  https://pypi.org/project/mmh3/
455
455
  Python extension for MurmurHash (MurmurHash3), a set of fast and robust hash functions.
456
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/mmh3-5.3.1.dist-info/licenses/LICENSE
456
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/mmh3-5.3.1.dist-info/licenses/LICENSE
457
457
  MIT License
458
458
 
459
459
  Copyright (c) 2011-2026 Hajime Senuma
@@ -482,7 +482,7 @@ BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0
482
482
  Travis E. Oliphant et al.
483
483
  https://numpy.org
484
484
  Fundamental package for array computing in Python
485
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/numpy-2.4.6.dist-info/licenses/LICENSE.txt
485
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/numpy-2.4.6.dist-info/licenses/LICENSE.txt
486
486
  Copyright (c) 2005-2025, NumPy Developers.
487
487
  All rights reserved.
488
488
 
@@ -1426,7 +1426,7 @@ Apache-2.0 OR BSD-2-Clause
1426
1426
  Donald Stufft <donald@stufft.io>
1427
1427
  https://github.com/pypa/packaging
1428
1428
  Core utilities for Python packages
1429
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/packaging-26.3.dist-info/licenses/LICENSE
1429
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/packaging-26.3.dist-info/licenses/LICENSE
1430
1430
  This software is made available under the terms of *either* of the licenses
1431
1431
  found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made
1432
1432
  under the terms of *both* these licenses.
@@ -1438,7 +1438,7 @@ BSD License
1438
1438
  The Pandas Development Team <pandas-dev@python.org>
1439
1439
  https://pandas.pydata.org
1440
1440
  Powerful data structures for data analysis, time series, and statistics
1441
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/pandas-2.3.3.dist-info/LICENSE
1441
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pandas-2.3.3.dist-info/LICENSE
1442
1442
  BSD 3-Clause License
1443
1443
 
1444
1444
  Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
@@ -2696,7 +2696,7 @@ BSD License
2696
2696
  Vincent Driessen <me@nvie.com>
2697
2697
  https://github.com/jazzband/pip-tools/
2698
2698
  pip-tools keeps your pinned dependencies fresh.
2699
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/pip_tools-7.4.1.dist-info/LICENSE
2699
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pip_tools-7.4.1.dist-info/LICENSE
2700
2700
  BSD 3-Clause License
2701
2701
 
2702
2702
  Copyright (c). All rights reserved.
@@ -2733,7 +2733,7 @@ BSD-3-Clause
2733
2733
  Giampaolo Rodola
2734
2734
  https://github.com/giampaolo/psutil
2735
2735
  Cross-platform lib for process and system monitoring.
2736
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/psutil-7.2.2.dist-info/LICENSE
2736
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/psutil-7.2.2.dist-info/LICENSE
2737
2737
  BSD 3-Clause License
2738
2738
 
2739
2739
  Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola
@@ -2771,7 +2771,7 @@ MIT
2771
2771
  Thomas Kluyver <thomas@kluyver.me.uk>
2772
2772
  https://github.com/pypa/pyproject-hooks
2773
2773
  Wrappers to call pyproject.toml-based build backend hooks.
2774
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/pyproject_hooks-1.3.3.dist-info/licenses/LICENSE
2774
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pyproject_hooks-1.3.3.dist-info/licenses/LICENSE
2775
2775
  The MIT License (MIT)
2776
2776
 
2777
2777
  Copyright (c) 2017 Thomas Kluyver
@@ -2796,12 +2796,12 @@ THE SOFTWARE.
2796
2796
 
2797
2797
 
2798
2798
  python-dateutil
2799
- 2.9.0.post0
2799
+ 3.0.0
2800
2800
  Apache Software License; BSD License
2801
2801
  Gustavo Niemeyer
2802
2802
  https://github.com/dateutil/dateutil
2803
2803
  Extensions to the standard Python datetime module
2804
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/python_dateutil-2.9.0.post0.dist-info/LICENSE
2804
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/python_dateutil-3.0.0.dist-info/licenses/LICENSE
2805
2805
  Copyright 2017- Paul Ganssle <paul@ganssle.io>
2806
2806
  Copyright 2017- dateutil contributors (see AUTHORS file)
2807
2807
 
@@ -2863,7 +2863,7 @@ MIT License
2863
2863
  Stuart Bishop
2864
2864
  http://pythonhosted.org/pytz
2865
2865
  World timezone definitions, modern and historical
2866
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/pytz-2026.5.dist-info/LICENSE.txt
2866
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pytz-2026.5.dist-info/LICENSE.txt
2867
2867
  Copyright (c) 2003-2019 Stuart Bishop <stuart@stuartbishop.net>
2868
2868
 
2869
2869
  Permission is hereby granted, free of charge, to any person obtaining a
@@ -2891,7 +2891,7 @@ Apache-2.0 AND CNRI-Python
2891
2891
  Matthew Barnett <regex@mrabarnett.plus.com>
2892
2892
  https://github.com/mrabarnett/mrab-regex
2893
2893
  Alternative regular expression module, to replace re.
2894
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/regex-2026.9.29.dist-info/licenses/LICENSE.txt
2894
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/regex-2026.9.29.dist-info/licenses/LICENSE.txt
2895
2895
  This work was derived from the 're' module of CPython 2.6 and CPython 3.1,
2896
2896
  copyright (c) 1998-2001 by Secret Labs AB and licensed under CNRI's Python 1.6
2897
2897
  license.
@@ -3108,7 +3108,7 @@ Apache Software License
3108
3108
  Kenneth Reitz <me@kennethreitz.org>
3109
3109
  https://github.com/psf/requests
3110
3110
  Python HTTP for Humans.
3111
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/requests-2.34.2.dist-info/licenses/LICENSE
3111
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/requests-2.34.2.dist-info/licenses/LICENSE
3112
3112
 
3113
3113
  Apache License
3114
3114
  Version 2.0, January 2004
@@ -3292,7 +3292,7 @@ MIT License
3292
3292
  Will McGugan
3293
3293
  https://github.com/Textualize/rich
3294
3294
  Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal
3295
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/rich-15.0.0.dist-info/licenses/LICENSE
3295
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/rich-15.0.0.dist-info/licenses/LICENSE
3296
3296
  Copyright (c) 2020 Will McGugan
3297
3297
 
3298
3298
  Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -3320,7 +3320,7 @@ MIT License
3320
3320
  UNKNOWN
3321
3321
  https://github.com/hplt-project/sacremoses
3322
3322
  SacreMoses
3323
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/sacremoses-0.2.0.dist-info/licenses/LICENSE
3323
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/sacremoses-0.2.0.dist-info/licenses/LICENSE
3324
3324
  MIT License
3325
3325
 
3326
3326
  Copyright (c) 2020 alvations
@@ -3350,7 +3350,7 @@ BSD License
3350
3350
  Raphaël Barrois
3351
3351
  https://github.com/rbarrois/python-semanticversion
3352
3352
  A library implementing the 'SemVer' scheme.
3353
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/semantic_version-2.10.0.dist-info/LICENSE
3353
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/semantic_version-2.10.0.dist-info/LICENSE
3354
3354
  Copyright (c) The python-semanticversion project
3355
3355
  All rights reserved.
3356
3356
 
@@ -3381,7 +3381,7 @@ MIT License
3381
3381
  Benjamin Peterson
3382
3382
  https://github.com/benjaminp/six
3383
3383
  Python 2 and 3 compatibility utilities
3384
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/six-1.17.0.dist-info/LICENSE
3384
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/six-1.17.0.dist-info/LICENSE
3385
3385
  Copyright (c) 2010-2024 Benjamin Peterson
3386
3386
 
3387
3387
  Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -3408,7 +3408,7 @@ MPL-2.0 AND MIT
3408
3408
  UNKNOWN
3409
3409
  https://tqdm.github.io
3410
3410
  Fast, Extensible Progress Meter
3411
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/tqdm-4.70.1.dist-info/licenses/LICENCE
3411
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/tqdm-4.70.1.dist-info/licenses/LICENCE
3412
3412
  `tqdm` is a product of collaborative work.
3413
3413
  Unless otherwise stated, all authors (see commit logs) retain copyright
3414
3414
  for their respective work, and release the work under the MIT licence
@@ -3466,7 +3466,7 @@ PSF-2.0
3466
3466
  "Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee" <levkivskyi@gmail.com>
3467
3467
  https://github.com/python/typing_extensions
3468
3468
  Backported and Experimental Type Hints for Python 3.9+
3469
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/typing_extensions-4.16.0.dist-info/licenses/LICENSE
3469
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/typing_extensions-4.16.0.dist-info/licenses/LICENSE
3470
3470
  A. HISTORY OF THE SOFTWARE
3471
3471
  ==========================
3472
3472
 
@@ -3754,7 +3754,7 @@ Apache-2.0
3754
3754
  Python Software Foundation
3755
3755
  https://github.com/python/tzdata
3756
3756
  Provider of IANA time zone data
3757
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/tzdata-2026.5.dist-info/licenses/LICENSE
3757
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/tzdata-2026.5.dist-info/licenses/LICENSE
3758
3758
  Apache Software License 2.0
3759
3759
 
3760
3760
  Copyright (c) 2020, Paul Ganssle (Google)
@@ -3779,7 +3779,7 @@ MIT
3779
3779
  Andrey Petrov <andrey.petrov@shazow.net>
3780
3780
  https://github.com/urllib3/urllib3/blob/main/CHANGES.rst
3781
3781
  HTTP library with thread-safe connection pooling, file post, and more.
3782
- /home/runner/.pyenv/versions/3.14.8/lib/python3.14/site-packages/urllib3-2.8.0.dist-info/licenses/LICENSE.txt
3782
+ /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/urllib3-2.8.0.dist-info/licenses/LICENSE.txt
3783
3783
  MIT License
3784
3784
 
3785
3785
  Copyright (c) 2008-2020 Andrey Petrov and contributors.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howso-engine
3
- Version: 68.2.0
3
+ Version: 69.0.0
4
4
  Summary: The Howso Engine™ is a natively and fully explainable ML engine, serving as an alternative to black box AI neural networks.
5
5
  Author: Howso Incorporated
6
6
  Author-email: support@howso.com
@@ -705,7 +705,7 @@ Requires-Dist: sacremoses
705
705
  Requires-Dist: semantic-version~=2.0
706
706
  Requires-Dist: typing-extensions~=4.9
707
707
  Requires-Dist: urllib3>=2.6.3
708
- Requires-Dist: amalgam-lang==36.0.1
708
+ Requires-Dist: amalgam-lang==37.0.0
709
709
  Provides-Extra: dev
710
710
  Requires-Dist: dill~=0.0; extra == "dev"
711
711
  Requires-Dist: flake8-docstrings; extra == "dev"
@@ -73,6 +73,13 @@ if TYPE_CHECKING:
73
73
  from .configuration import HowsoConfiguration
74
74
 
75
75
 
76
+ def _is_multithreaded_library_type(library_type: str | None) -> bool:
77
+ """Report whether a Trainee runtime ``library_type`` names a multi-threaded build."""
78
+ if not isinstance(library_type, str):
79
+ return False
80
+ return "mt" in library_type.strip().split("-")
81
+
82
+
76
83
  class AbstractHowsoClient(ABC):
77
84
  """The base definition of the Howso client interface."""
78
85
 
@@ -464,6 +471,37 @@ class AbstractHowsoClient(ABC):
464
471
  """
465
472
  return None
466
473
 
474
+ def is_multithreaded(self, trainee_id: str) -> bool:
475
+ """
476
+ Report whether a Trainee's engine runs on a multi-threaded Amalgam build.
477
+
478
+ A multi-threaded build tolerates concurrent calls into one engine: it
479
+ can be polled for progress while it works and can serve requests from
480
+ several threads at once. A single-threaded build, including the OpenMP
481
+ build, does neither safely.
482
+
483
+ The answer is a snapshot. A client whose Trainees can change library
484
+ type may answer differently on a later call.
485
+
486
+ This implementation reads ``library_type`` from
487
+ :meth:`get_trainee_runtime` and reports True only for the ``mt``
488
+ library type. Clients that can identify their build more directly
489
+ override it.
490
+
491
+ Parameters
492
+ ----------
493
+ trainee_id : str
494
+ The identifier of the Trainee.
495
+
496
+ Returns
497
+ -------
498
+ bool
499
+ True when the build is confirmed multi-threaded; False for a
500
+ single-threaded build or an unrecognized library type.
501
+ """
502
+ runtime = self.get_trainee_runtime(trainee_id)
503
+ return _is_multithreaded_library_type(runtime.get("library_type"))
504
+
467
505
  @abstractmethod
468
506
  def query_trainees(self, search_terms: str | None = None) -> list[dict]:
469
507
  """Query accessible Trainees."""
@@ -2227,6 +2265,12 @@ class AbstractHowsoClient(ABC):
2227
2265
  'num_most_similar_cases' is not specified) relevant number of
2228
2266
  similar cases, which will first include the influential cases.
2229
2267
  Uses only the context features of the reacted case.
2268
+ - most_similar_cases_features : list of str, optional
2269
+ A list of feature names to output values for when outputting
2270
+ most similar, influential, or boundary cases. If an empty list,
2271
+ only the distance and session information of each case is
2272
+ output. If unspecified, outputs all context and action
2273
+ features.
2230
2274
  - num_boundary_cases : int, optional
2231
2275
  Outputs this manually specified number of boundary cases.
2232
2276
  - num_most_similar_cases : int, optional
@@ -4433,6 +4477,7 @@ class AbstractHowsoClient(ABC):
4433
4477
  features: Collection[str] | None = None,
4434
4478
  filter_fanout_values: bool = False,
4435
4479
  group_id_features: Collection[str] | None = None,
4480
+ isolation_distance_contributions: bool = False,
4436
4481
  kl_divergence_addition: bool = False,
4437
4482
  kl_divergence_removal: bool = False,
4438
4483
  new_cases: TabularData3D | None = None,
@@ -4455,7 +4500,7 @@ class AbstractHowsoClient(ABC):
4455
4500
  action_features : list of str, optional
4456
4501
  A list of features whose values should be predicted for
4457
4502
  each group. Each group of cases gets a single action value for each
4458
- feature.
4503
+ feature. Predictions are made holding out the rest of the group.
4459
4504
  case_indices : list of lists of lists of tuples of {str, int}, optional
4460
4505
  A list of lists of case indices tuples containing the session ID and
4461
4506
  the session training indices that uniquely identify trained cases.
@@ -4504,7 +4549,8 @@ class AbstractHowsoClient(ABC):
4504
4549
  predicted for each group.
4505
4550
  distance_contributions : bool, default False
4506
4551
  Calculate and output the average distance contribution for each group
4507
- holding out rest of the group.
4552
+ without holding out the rest of the group. Each case is only held out
4553
+ of its own query.
4508
4554
  familiarity_conviction_addition : bool, default False
4509
4555
  Calculate and output familiarity conviction of adding the
4510
4556
  specified cases.
@@ -4518,11 +4564,18 @@ class AbstractHowsoClient(ABC):
4518
4564
  holding out other cases that have the same fanned out values
4519
4565
  duplicated. Only used when predicting the given ``action_features``.
4520
4566
  group_id_features : Collection of str, optional
4521
- List of feature names whose values in the specified cases identify
4522
- trained cases that should be held out of queries. This parameter is ignored if
4523
- ``new_cases`` is not specified. It is assumed that all groups of
4524
- cases have a singular value for each feature in
4525
- ``group_id_features``.
4567
+ List of feature names whose values identify trained cases that
4568
+ belong to the same group as the given ``new_cases``. These trained
4569
+ cases are held out along with the group, but only in computations
4570
+ that hold out the group: ``isolation_distance_contributions``,
4571
+ ``residual_contributions``, ``similarity_conviction``, and
4572
+ predictions of ``action_features``. They are not held out for
4573
+ ``distance_contributions``. Each group is assumed to have a single
4574
+ value for each of these features. Ignored if ``new_cases`` is not
4575
+ specified.
4576
+ isolation_distance_contributions : bool, default False
4577
+ Calculate and output the average distance contribution for each group
4578
+ holding out the rest of the group.
4526
4579
  kl_divergence_addition : bool, default False
4527
4580
  Calculate and output KL divergence of adding the
4528
4581
  specified cases.
@@ -4548,10 +4601,11 @@ class AbstractHowsoClient(ABC):
4548
4601
  p_value_of_removal : bool, default False
4549
4602
  If true will output p value of removal.
4550
4603
  residual_contributions : bool, default False
4551
- Calculate and output mean residual contribution for each group's cases.
4604
+ Calculate and output mean residual contribution for each group's cases
4605
+ holding out the rest of the group.
4552
4606
  similarity_conviction : bool, default False
4553
4607
  If true will output the mean similarity conviction of the group's
4554
- cases.
4608
+ cases holding out the rest of the group.
4555
4609
  task_id : str, optional
4556
4610
  If provided, should be a short, unique identifier that can be used
4557
4611
  with ``get_progress`` if concurrent progress updates are desired.
@@ -4611,6 +4665,7 @@ class AbstractHowsoClient(ABC):
4611
4665
  "features": features,
4612
4666
  "filter_fanout_values": filter_fanout_values,
4613
4667
  "group_id_features": group_id_features,
4668
+ "isolation_distance_contributions": isolation_distance_contributions,
4614
4669
  "kl_divergence_addition": kl_divergence_addition,
4615
4670
  "kl_divergence_removal": kl_divergence_removal,
4616
4671
  "new_cases": serialized_cases,
@@ -26,6 +26,7 @@ GroupMetric: TypeAlias = Literal[
26
26
  "familiarity_conviction_addition",
27
27
  "familiarity_conviction_removal",
28
28
  "distance_contribution",
29
+ "isolation_distance_contribution",
29
30
  "residual_contribution",
30
31
  "kl_divergence_addition",
31
32
  "kl_divergence_removal",
@@ -22,6 +22,7 @@ import warnings
22
22
  from amalgam.api import Amalgam
23
23
  import certifi
24
24
  from packaging.version import parse as parse_version
25
+ from typing_extensions import override
25
26
  import urllib3
26
27
  from urllib3.util import Retry, Timeout
27
28
 
@@ -85,6 +86,13 @@ def squelch_logs(log_level: int) -> Generator[None, None, None]:
85
86
  logging.disable(_old_level)
86
87
 
87
88
 
89
+ def _is_multithreaded_concurrency(concurrency: bytes | str) -> bool:
90
+ """Report whether an Amalgam concurrency type string names a multi-threaded build."""
91
+ if isinstance(concurrency, bytes):
92
+ concurrency = concurrency.decode("utf-8", errors="replace")
93
+ return concurrency.strip().startswith("MultiThreaded")
94
+
95
+
88
96
  class HowsoDirectClient(AbstractHowsoClient):
89
97
  """
90
98
  The direct Howso client.
@@ -254,6 +262,7 @@ class HowsoDirectClient(AbstractHowsoClient):
254
262
  UnsupportedArgumentWarning, stacklevel=2)
255
263
  amlg_params = {k: v for k, v in amlg_params.items() if k in allowed_amlg_params}
256
264
  self.amlg = Amalgam(**amlg_params) # pyright: ignore[reportArgumentType]
265
+ self._multithreaded = _is_multithreaded_concurrency(self.amlg.get_concurrency_type_string())
257
266
  if gc_params:
258
267
  self.set_garbage_collection_params(gc_params)
259
268
 
@@ -1437,6 +1446,30 @@ class HowsoDirectClient(AbstractHowsoClient):
1437
1446
  versions=TraineeVersion(trainee=trainee_version, amalgam=amlg_version)
1438
1447
  )
1439
1448
 
1449
+ @override
1450
+ def is_multithreaded(self, trainee_id: str) -> bool:
1451
+ """
1452
+ Report whether this client's Amalgam library is a multi-threaded build.
1453
+
1454
+ The in-process library reports its own concurrency type, which this
1455
+ client reads once when it loads the library. That is a property of the
1456
+ process, so every Trainee on this client gets the same answer and
1457
+ ``trainee_id`` is not consulted. ``library_type`` from
1458
+ :meth:`get_trainee_runtime` is derived from the library filename and
1459
+ reports ``mt`` for a path carrying no postfix, so it is not used here.
1460
+
1461
+ Parameters
1462
+ ----------
1463
+ trainee_id : str
1464
+ The identifier of the Trainee. Not consulted.
1465
+
1466
+ Returns
1467
+ -------
1468
+ bool
1469
+ True when the loaded library is a multi-threaded build.
1470
+ """
1471
+ return self._multithreaded
1472
+
1440
1473
  def query_trainees(self, search_terms: str | None = None) -> list[dict[str, str]]:
1441
1474
  """
1442
1475
  Query accessible Trainees.
@@ -149,8 +149,6 @@ class Trainee(BaseTrainee):
149
149
  self._created: bool = False
150
150
  self._updating: bool = False
151
151
  self._was_saved: bool = False
152
- # Must precede the client assignment that follows.
153
- self._supports_engine_progress: bool | None = None # lazy loaded
154
152
  # NOTE: self.client is a accessor property see setter and getter below.
155
153
  self.client = client or get_client()
156
154
 
@@ -220,9 +218,6 @@ class Trainee(BaseTrainee):
220
218
  if not isinstance(client, HowsoPandasClientMixin):
221
219
  raise HowsoError("``client`` must be a HowsoPandasClient")
222
220
  self._client = client
223
- # Engine progress support is a property of the client and the Trainee
224
- # it serves, so a new client invalidates the cached answer.
225
- self._supports_engine_progress = None
226
221
 
227
222
  @property
228
223
  def supports_engine_progress(self) -> bool:
@@ -231,21 +226,21 @@ class Trainee(BaseTrainee):
231
226
 
232
227
  Polling a single-threaded engine while it works terminates the
233
228
  process, so :func:`~howso.utilities.engine_polling_supported` reports
234
- support only for Trainees it can confirm are multi-threaded. The
235
- library type is fixed when the Trainee is created, so the answer is
236
- resolved once and cached for the life of this instance.
229
+ support only for Trainees whose client confirms a multi-threaded build.
230
+
231
+ The answer is a snapshot taken on each access. A direct client's
232
+ library type is fixed for the life of the process and is read from the
233
+ in-process library; other clients may answer differently over the
234
+ life of a Trainee.
237
235
 
238
236
  Returns
239
237
  -------
240
238
  bool
241
239
  True only when engine progress polling is confirmed safe.
242
240
  """
243
- if self._supports_engine_progress is None:
244
- # Lazy load: requires a created Trainee to ask the runtime about.
245
- if not self._created:
246
- return False
247
- self._supports_engine_progress = engine_polling_supported(self.client, self.id)
248
- return self._supports_engine_progress
241
+ if not self._created:
242
+ return False
243
+ return engine_polling_supported(self.client, self.id)
249
244
 
250
245
  @property
251
246
  def project(self) -> Project | None:
@@ -1759,6 +1754,12 @@ class Trainee(BaseTrainee):
1759
1754
  'num_most_similar_cases' is not specified) relevant number of
1760
1755
  similar cases, which will first include the influential cases.
1761
1756
  Uses only the context features of the reacted case.
1757
+ - most_similar_cases_features : list of str, optional
1758
+ A list of feature names to output values for when outputting
1759
+ most similar, influential, or boundary cases. If an empty list,
1760
+ only the distance and session information of each case is
1761
+ output. If unspecified, outputs all context and action
1762
+ features.
1762
1763
  - num_boundary_cases : int, optional
1763
1764
  Outputs this manually specified number of boundary cases.
1764
1765
  - num_most_similar_cases : int, optional
@@ -3415,6 +3416,7 @@ class Trainee(BaseTrainee):
3415
3416
  features: Collection[str] | None = None,
3416
3417
  filter_fanout_values: bool = False,
3417
3418
  group_id_features: Collection[str] | None = None,
3419
+ isolation_distance_contributions: bool = False,
3418
3420
  kl_divergence_addition: bool = False,
3419
3421
  kl_divergence_removal: bool = False,
3420
3422
  new_cases: TabularData3D | None = None,
@@ -3437,7 +3439,7 @@ class Trainee(BaseTrainee):
3437
3439
  action_features : list of str, optional
3438
3440
  A list of features whose values should be predicted for
3439
3441
  each group. Each group of cases gets a single action value for each
3440
- feature.
3442
+ feature. Predictions are made holding out the rest of the group.
3441
3443
  case_indices : list of lists of lists of tuples of {str, int}, optional
3442
3444
  A list of lists of case indices tuples containing the session ID and
3443
3445
  the session training indices that uniquely identify trained cases.
@@ -3486,7 +3488,8 @@ class Trainee(BaseTrainee):
3486
3488
  predicted for each group.
3487
3489
  distance_contributions : bool, default False
3488
3490
  Calculate and output the average distance contribution for each group
3489
- holding out rest of the group.
3491
+ without holding out the rest of the group. Each case is only held out
3492
+ of its own query.
3490
3493
  familiarity_conviction_addition : bool, default False
3491
3494
  Calculate and output familiarity conviction of adding the
3492
3495
  specified cases.
@@ -3500,11 +3503,18 @@ class Trainee(BaseTrainee):
3500
3503
  holding out other cases that have the same fanned out values
3501
3504
  duplicated. Only used when predicting the given ``action_features``.
3502
3505
  group_id_features : Collection of str, optional
3503
- List of feature names whose values in the specified cases identify
3504
- trained cases that should be held out of queries. This parameter is ignored if
3505
- ``new_cases`` is not specified. It is assumed that all groups of
3506
- cases have a singular value for each feature in
3507
- ``group_id_features``.
3506
+ List of feature names whose values identify trained cases that
3507
+ belong to the same group as the given ``new_cases``. These trained
3508
+ cases are held out along with the group, but only in computations
3509
+ that hold out the group: ``isolation_distance_contributions``,
3510
+ ``residual_contributions``, ``similarity_conviction``, and
3511
+ predictions of ``action_features``. They are not held out for
3512
+ ``distance_contributions``. Each group is assumed to have a single
3513
+ value for each of these features. Ignored if ``new_cases`` is not
3514
+ specified.
3515
+ isolation_distance_contributions : bool, default False
3516
+ Calculate and output the average distance contribution for each group
3517
+ holding out the rest of the group.
3508
3518
  kl_divergence_addition : bool, default False
3509
3519
  Calculate and output KL divergence of adding the
3510
3520
  specified cases.
@@ -3535,10 +3545,11 @@ class Trainee(BaseTrainee):
3535
3545
  p_value_of_removal : bool, default False
3536
3546
  If true will output :math:`p` value of removal.
3537
3547
  residual_contributions : bool, default False
3538
- Calculate and output mean residual contribution for each group's cases.
3548
+ Calculate and output mean residual contribution for each group's cases
3549
+ holding out the rest of the group.
3539
3550
  similarity_conviction : bool, default False
3540
3551
  If true will output the mean similarity conviction of the group's
3541
- cases.
3552
+ cases holding out the rest of the group.
3542
3553
  task_id : str, optional
3543
3554
  If provided, should be a short, unique identifier that can be used
3544
3555
  with ``get_progress`` if concurrent progress updates are desired.
@@ -3566,6 +3577,7 @@ class Trainee(BaseTrainee):
3566
3577
  features=features,
3567
3578
  filter_fanout_values=filter_fanout_values,
3568
3579
  group_id_features=group_id_features,
3580
+ isolation_distance_contributions=isolation_distance_contributions,
3569
3581
  distance_contributions=distance_contributions,
3570
3582
  familiarity_conviction_addition=familiarity_conviction_addition,
3571
3583
  familiarity_conviction_removal=familiarity_conviction_removal,