SearchLibrium 0.0.263__tar.gz → 0.0.265__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.
- {searchlibrium-0.0.263/src/SearchLibrium.egg-info → searchlibrium-0.0.265}/PKG-INFO +1 -1
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/pyproject.toml +1 -1
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/Halton.py +21 -13
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/MixedLogit.py +269 -83
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/__init__.py +104 -107
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/larch_compat.py +5 -0
- searchlibrium-0.0.265/src/SearchLibrium/larch_models.py +938 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/latent_class.py +9 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/latent_spec.py +12 -1
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/numba_mxl.py +2 -2
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/search.py +177 -12
- searchlibrium-0.0.265/src/SearchLibrium/version.txt +1 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265/src/SearchLibrium.egg-info}/PKG-INFO +1 -1
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/tests/test_larch_integration.py +72 -2
- searchlibrium-0.0.263/src/SearchLibrium/larch_models.py +0 -413
- searchlibrium-0.0.263/src/SearchLibrium/version.txt +0 -1
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/LICENSE +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/MANIFEST.in +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/README.md +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/setup.cfg +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/BEHier.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/MixedLogitGSE.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/Mode_Activity_Nested.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/RandomP.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/SEARCH_SM_MARIO.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/Two_Level_Nest.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/__main__.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/_choice_model.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/_device.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/abm.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/accessibility.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/banditsa.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/boxcox_functions.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/call_meta.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/constraints_builder.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/coupled_solver.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/data/Swissmetro_final.csv +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/data/TravelMode.csv +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/data/electricity.csv +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/destination_distances.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/harmony.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/hspbil.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/jax_utils.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/logistic_regression.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/main.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/main_debug.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/mdcev.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/mh_choice_estimator.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/misc.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/mixed_logit.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/mixed_nested.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/mixedrrm.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/multinomial_logit.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/multinomial_nested.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/multinomial_probit.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/numba_engine.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/numba_rrm.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/ordered_logit.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/ordered_logit_mixed.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/predict.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/regularization.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/rrm.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/sample_data.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/sapbil.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/selection_models.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/setup.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/siman.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/skims.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/sparseea_agds.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/test_lc_de.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/test_mario_searches.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/test_sapbil_vs_banditsa.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/threshold.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium/zero_inflated_ordered_probit.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium.egg-info/SOURCES.txt +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium.egg-info/dependency_links.txt +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium.egg-info/entry_points.txt +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium.egg-info/requires.txt +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/src/SearchLibrium.egg-info/top_level.txt +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/tests/test_destination_distances.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/tests/test_jax_mask_equivalence.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/tests/test_lc_smart_init.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/tests/test_mh_choice_estimator.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/tests/test_mxl_random_starts.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/tests/test_per_alternative_random.py +0 -0
- {searchlibrium-0.0.263 → searchlibrium-0.0.265}/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.
|
|
3
|
+
Version: 0.0.265
|
|
4
4
|
Summary: Automated specification search for discrete choice models (logit, mixed logit, nested logit, RRM and more) using metaheuristic optimisation
|
|
5
5
|
Author: Zeke Ahern, Mario Fernando Taco Morales, Alexander Paz, Prithvi Beeramole, Robert Burdett
|
|
6
6
|
Maintainer-email: Zeke Ahern <z.ahern@qut.edu.au>
|
|
@@ -132,7 +132,7 @@ Documentation = "https://pypi.org/project/SearchLibrium/"
|
|
|
132
132
|
realpython = "SearchLibrium.__main__:main"
|
|
133
133
|
|
|
134
134
|
[tool.bumpver]
|
|
135
|
-
current_version = "0.0.
|
|
135
|
+
current_version = "0.0.265"
|
|
136
136
|
version_pattern = "MAJOR.MINOR.PATCH"
|
|
137
137
|
commit_message = "[skip ci] Bump version {old_version} -> {new_version}"
|
|
138
138
|
commit = true
|
|
@@ -45,8 +45,9 @@ class HaltonSequence:
|
|
|
45
45
|
self.drop = drop
|
|
46
46
|
self.shuffled = shuffled
|
|
47
47
|
|
|
48
|
-
def generate(self, sample_size, n_draws, n_vars):
|
|
49
|
-
return _sobol_generate(sample_size, n_draws, n_vars,
|
|
48
|
+
def generate(self, sample_size, n_draws, n_vars, offset=0):
|
|
49
|
+
return _sobol_generate(sample_size, n_draws, n_vars,
|
|
50
|
+
shuffled=self.shuffled, offset=offset)
|
|
50
51
|
|
|
51
52
|
|
|
52
53
|
class Halton:
|
|
@@ -74,7 +75,7 @@ class Halton:
|
|
|
74
75
|
239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293,
|
|
75
76
|
307, 311]
|
|
76
77
|
|
|
77
|
-
def generate_draws(self, sample_size, n_draws, n_vars):
|
|
78
|
+
def generate_draws(self, sample_size, n_draws, n_vars, offset=0):
|
|
78
79
|
"""Generate random draws for multiple variables.
|
|
79
80
|
|
|
80
81
|
When ``antithetic=True``, draws of size ``n_draws // 2`` are generated
|
|
@@ -85,36 +86,38 @@ class Halton:
|
|
|
85
86
|
base = n_draws // 2 if self.antithetic else n_draws
|
|
86
87
|
draws = _sobol_generate(
|
|
87
88
|
sample_size, base, n_vars, shuffled=self.shuffled,
|
|
88
|
-
seed=self.seed)
|
|
89
|
+
seed=self.seed, offset=offset)
|
|
89
90
|
if self.antithetic:
|
|
90
91
|
draws = np.concatenate([draws, 1.0 - draws], axis=2)
|
|
91
92
|
else:
|
|
92
93
|
# Use traditional Halton sequence (compatible with searchlogit)
|
|
93
|
-
draws = self._generate_halton_draws(
|
|
94
|
+
draws = self._generate_halton_draws(
|
|
95
|
+
sample_size, n_draws, n_vars, offset=offset)
|
|
94
96
|
if self.antithetic:
|
|
95
97
|
draws_half = draws[:, :, : n_draws // 2]
|
|
96
98
|
draws = np.concatenate([draws_half, 1.0 - draws_half], axis=2)
|
|
97
99
|
|
|
98
100
|
return draws
|
|
99
101
|
|
|
100
|
-
def _generate_halton_draws(self, sample_size, n_draws, n_vars):
|
|
102
|
+
def _generate_halton_draws(self, sample_size, n_draws, n_vars, offset=0):
|
|
101
103
|
"""Generate traditional Halton draws using different primes for each variable."""
|
|
102
104
|
draws_list = []
|
|
103
105
|
for i in range(n_vars):
|
|
104
106
|
prime = self.primes[i % len(self.primes)]
|
|
105
107
|
halton_seq = _halton_seq_traditional(
|
|
106
|
-
sample_size * n_draws,
|
|
108
|
+
offset * n_draws + sample_size * n_draws,
|
|
107
109
|
prime=prime,
|
|
108
110
|
drop=self.drop,
|
|
109
111
|
shuffled=self.shuffled
|
|
110
|
-
)
|
|
112
|
+
)[offset * n_draws:]
|
|
111
113
|
draws_list.append(halton_seq.reshape(sample_size, n_draws))
|
|
112
114
|
|
|
113
115
|
draws = np.stack(draws_list, axis=1) # (sample_size, n_vars, n_draws)
|
|
114
116
|
return draws
|
|
115
117
|
|
|
116
118
|
|
|
117
|
-
def _sobol_generate(sample_size, n_draws, n_vars, shuffled=False, seed=None
|
|
119
|
+
def _sobol_generate(sample_size, n_draws, n_vars, shuffled=False, seed=None,
|
|
120
|
+
offset=0):
|
|
118
121
|
"""Generate scrambled Sobol (0,1) draws.
|
|
119
122
|
|
|
120
123
|
Returns
|
|
@@ -128,6 +131,8 @@ def _sobol_generate(sample_size, n_draws, n_vars, shuffled=False, seed=None):
|
|
|
128
131
|
while p2 < total:
|
|
129
132
|
p2 <<= 1
|
|
130
133
|
sobol = Sobol(d=n_vars, scramble=True, seed=seed)
|
|
134
|
+
if offset:
|
|
135
|
+
sobol.fast_forward(offset * n_draws)
|
|
131
136
|
flat = sobol.random(p2)[:total] # (total, n_vars)
|
|
132
137
|
draws = flat.reshape(sample_size, n_draws, n_vars).transpose(0, 2, 1)
|
|
133
138
|
else:
|
|
@@ -163,10 +168,11 @@ class Draws:
|
|
|
163
168
|
self.rvdist = rvdist or ['n'] * k
|
|
164
169
|
self.rvtransdist = rvtransdist or ['n'] * k
|
|
165
170
|
|
|
166
|
-
def generate_draws(self, sample_size, n_draws, halton=True):
|
|
171
|
+
def generate_draws(self, sample_size, n_draws, halton=True, offset=0):
|
|
167
172
|
"""Generate draws based on the chosen method."""
|
|
168
173
|
if halton:
|
|
169
|
-
draws = self.fn_generate_draws(
|
|
174
|
+
draws = self.fn_generate_draws(
|
|
175
|
+
sample_size, n_draws, self.k, offset=offset)
|
|
170
176
|
else:
|
|
171
177
|
draws = np.random.uniform(size=(sample_size, self.k, n_draws))
|
|
172
178
|
draws = self.evaluate_distribution(self.rvdist, draws)
|
|
@@ -193,9 +199,11 @@ class Draws:
|
|
|
193
199
|
index = index if index is not None else self.rvdist
|
|
194
200
|
for k, distr in enumerate(index):
|
|
195
201
|
if distr == 'ln':
|
|
196
|
-
betas_random[:, k, :] = np.exp(
|
|
202
|
+
betas_random[:, k, :] = np.exp(
|
|
203
|
+
np.clip(betas_random[:, k, :], -50.0, 50.0))
|
|
197
204
|
elif distr == 'nln': # negative log-normal
|
|
198
|
-
betas_random[:, k, :] = -np.exp(
|
|
205
|
+
betas_random[:, k, :] = -np.exp(
|
|
206
|
+
np.clip(betas_random[:, k, :], -50.0, 50.0))
|
|
199
207
|
elif distr == 'tn':
|
|
200
208
|
betas_random[:, k, :] = np.maximum(betas_random[:, k, :], 0)
|
|
201
209
|
return betas_random
|