SearchLibrium 0.0.231__tar.gz → 0.0.232__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 (75) hide show
  1. {searchlibrium-0.0.231/src/SearchLibrium.egg-info → searchlibrium-0.0.232}/PKG-INFO +1 -1
  2. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/pyproject.toml +1 -1
  3. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/sparseea_agds.py +65 -2
  4. searchlibrium-0.0.232/src/SearchLibrium/version.txt +1 -0
  5. {searchlibrium-0.0.231 → searchlibrium-0.0.232/src/SearchLibrium.egg-info}/PKG-INFO +1 -1
  6. searchlibrium-0.0.231/src/SearchLibrium/version.txt +0 -1
  7. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/LICENSE +0 -0
  8. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/MANIFEST.in +0 -0
  9. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/README.md +0 -0
  10. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/setup.cfg +0 -0
  11. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/BEHier.py +0 -0
  12. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/Halton.py +0 -0
  13. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/MixedLogit.py +0 -0
  14. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/MixedLogitGSE.py +0 -0
  15. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/Mode_Activity_Nested.py +0 -0
  16. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/RandomP.py +0 -0
  17. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/SEARCH_SM_MARIO.py +0 -0
  18. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/Two_Level_Nest.py +0 -0
  19. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/__init__.py +0 -0
  20. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/__main__.py +0 -0
  21. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/_choice_model.py +0 -0
  22. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/_device.py +0 -0
  23. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/abm.py +0 -0
  24. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/accessibility.py +0 -0
  25. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/banditsa.py +0 -0
  26. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/boxcox_functions.py +0 -0
  27. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/call_meta.py +0 -0
  28. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/constraints_builder.py +0 -0
  29. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/data/Swissmetro_final.csv +0 -0
  30. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/data/TravelMode.csv +0 -0
  31. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/data/electricity.csv +0 -0
  32. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/harmony.py +0 -0
  33. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/hspbil.py +0 -0
  34. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/jax_utils.py +0 -0
  35. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/larch_compat.py +0 -0
  36. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/larch_models.py +0 -0
  37. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/latent_class.py +0 -0
  38. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/logistic_regression.py +0 -0
  39. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/main.py +0 -0
  40. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/main_debug.py +0 -0
  41. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/mdcev.py +0 -0
  42. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/misc.py +0 -0
  43. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/mixed_logit.py +0 -0
  44. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/mixed_nested.py +0 -0
  45. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/mixedrrm.py +0 -0
  46. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/multinomial_logit.py +0 -0
  47. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/multinomial_nested.py +0 -0
  48. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/multinomial_probit.py +0 -0
  49. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/ordered_logit.py +0 -0
  50. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/ordered_logit_mixed.py +0 -0
  51. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/predict.py +0 -0
  52. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/regularization.py +0 -0
  53. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/rrm.py +0 -0
  54. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/sample_data.py +0 -0
  55. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/sapbil.py +0 -0
  56. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/search.py +0 -0
  57. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/selection_models.py +0 -0
  58. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/setup.py +0 -0
  59. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/siman.py +0 -0
  60. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/skims.py +0 -0
  61. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/test_lc_de.py +0 -0
  62. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/test_mario_searches.py +0 -0
  63. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/test_sapbil_vs_banditsa.py +0 -0
  64. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/threshold.py +0 -0
  65. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium/zero_inflated_ordered_probit.py +0 -0
  66. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium.egg-info/SOURCES.txt +0 -0
  67. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium.egg-info/dependency_links.txt +0 -0
  68. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium.egg-info/entry_points.txt +0 -0
  69. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium.egg-info/requires.txt +0 -0
  70. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/src/SearchLibrium.egg-info/top_level.txt +0 -0
  71. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/tests/test_jax_mask_equivalence.py +0 -0
  72. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/tests/test_larch_integration.py +0 -0
  73. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/tests/test_lc_smart_init.py +0 -0
  74. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/tests/test_per_alternative_random.py +0 -0
  75. {searchlibrium-0.0.231 → searchlibrium-0.0.232}/tests/test_zero_inflated_ordered_probit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SearchLibrium
3
- Version: 0.0.231
3
+ Version: 0.0.232
4
4
  Summary: Automated specification search for discrete choice models (logit, mixed logit, nested logit, RRM and more) using metaheuristic optimisation
5
5
  Author: Mario Fernando Taco Morales, Alexander Paz, Prithvi Beeramole, Robert Burdett
6
6
  Author-email: Zeke Ahern <z.ahern@qut.edu.au>
@@ -124,7 +124,7 @@ Documentation = "https://pypi.org/project/SearchLibrium/"
124
124
  realpython = "SearchLibrium.__main__:main"
125
125
 
126
126
  [tool.bumpver]
127
- current_version = "0.0.231"
127
+ current_version = "0.0.232"
128
128
  version_pattern = "MAJOR.MINOR.PATCH"
129
129
  commit_message = "[skip ci] Bump version {old_version} -> {new_version}"
130
130
  commit = true
@@ -49,6 +49,62 @@ except ImportError: # running as a top-level module
49
49
  logger = logging.getLogger(__name__)
50
50
 
51
51
 
52
+ # ---------------------------------------------------------------------- #
53
+ # Specification-based de-duplication #
54
+ # ---------------------------------------------------------------------- #
55
+ def _agds_spec_key(sol):
56
+ """Hashable key identifying a solution's model *specification*.
57
+
58
+ Used to de-duplicate populations by spec instead of by objective value.
59
+ (The old ``get_unique(mem, 0)`` dropped every solution sharing an
60
+ objective value; with ``nsig`` as crit 0 that collapses the whole
61
+ population to a handful of distinct integers and stalls the search.)
62
+ """
63
+ try:
64
+ _get = sol.get if hasattr(sol, 'get') else (
65
+ lambda k, d=None: getattr(sol, k, d))
66
+
67
+ def _norm(v):
68
+ try:
69
+ if isinstance(v, np.ndarray):
70
+ v = v.tolist()
71
+ except Exception:
72
+ pass
73
+ if isinstance(v, dict):
74
+ return tuple(sorted((str(k), str(x)) for k, x in v.items()))
75
+ if isinstance(v, (list, tuple, set, frozenset)):
76
+ return tuple(sorted(str(x) for x in v))
77
+ return str(v)
78
+
79
+ return tuple((k, _norm(_get(k))) for k in (
80
+ 'model_n', 'asvars', 'isvars', 'randvars', 'corvars',
81
+ 'bcvars', 'transvars', 'trans_asvars', 'asc_ind',
82
+ 'class_params_spec', 'member_params_spec'))
83
+ except Exception:
84
+ try:
85
+ return ('__tuple__', tuple(sol.values()))
86
+ except Exception:
87
+ return ('__repr__', repr(sol))
88
+
89
+
90
+ def get_unique_spec(solutions, key=0):
91
+ """Like ``get_unique`` but de-duplicates by specification, not objective.
92
+
93
+ Keeps ``get_unique``'s ordering (sorted by objective ``key``) so callers
94
+ see the same ranking with duplicates-by-spec removed.
95
+ """
96
+ if not solutions:
97
+ return []
98
+ ordered = sorted(solutions, key=lambda sol: sol.obj(key))
99
+ seen, out = set(), []
100
+ for sol in ordered:
101
+ k = _agds_spec_key(sol)
102
+ if k not in seen:
103
+ seen.add(k)
104
+ out.append(sol)
105
+ return out
106
+
107
+
52
108
  # ---------------------------------------------------------------------- #
53
109
  # NSGA-III reference-point helpers (numpy, self-contained) #
54
110
  # ---------------------------------------------------------------------- #
@@ -273,7 +329,10 @@ class SparseEAAGDS(Search):
273
329
  return [float(sol.obj(k)) for k in range(self.nb_crit)]
274
330
 
275
331
  def _environmental_selection(self, combined, n_select):
276
- combined = get_unique(combined, 0)
332
+ # De-duplicate by *specification*: the old get_unique(combined, 0)
333
+ # collapsed everything sharing an obj(0) value (nsig integers),
334
+ # destroying population diversity every generation.
335
+ combined = get_unique_spec(combined, 0)
277
336
  if len(combined) <= n_select:
278
337
  return combined
279
338
  if self.nb_crit <= 1:
@@ -341,7 +400,11 @@ class SparseEAAGDS(Search):
341
400
  sol, converged = self.evaluate_solution(sol)
342
401
  if converged and abs(sol.obj(0)) < BOUND:
343
402
  mem.append(sol)
344
- mem = get_unique(mem, 0)
403
+ # De-duplicate by *specification*, not obj(0): nsig takes only a
404
+ # handful of integer values, so get_unique(mem, 0) caps the
405
+ # initial population at ~distinct-nsig members and _initialize
406
+ # spins through all 30000 attempts without filling pop_size.
407
+ mem = get_unique_spec(mem, 0)
345
408
  if not mem:
346
409
  raise RuntimeError(
347
410
  "AGDS initial population is empty: none of the candidate "
@@ -0,0 +1 @@
1
+ 0.0.232
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SearchLibrium
3
- Version: 0.0.231
3
+ Version: 0.0.232
4
4
  Summary: Automated specification search for discrete choice models (logit, mixed logit, nested logit, RRM and more) using metaheuristic optimisation
5
5
  Author: Mario Fernando Taco Morales, Alexander Paz, Prithvi Beeramole, Robert Burdett
6
6
  Author-email: Zeke Ahern <z.ahern@qut.edu.au>
@@ -1 +0,0 @@
1
- 0.0.231
File without changes