SearchLibrium 0.0.148__tar.gz → 0.0.149__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.148/src/SearchLibrium.egg-info → searchlibrium-0.0.149}/PKG-INFO +1 -1
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/pyproject.toml +1 -1
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/mixedrrm.py +5 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/ordered_logit.py +34 -8
- searchlibrium-0.0.149/src/SearchLibrium/version.txt +1 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149/src/SearchLibrium.egg-info}/PKG-INFO +1 -1
- searchlibrium-0.0.148/src/SearchLibrium/version.txt +0 -1
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/MANIFEST.in +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/README.md +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/setup.cfg +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/BEHier.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/Halton.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/MixedLogit.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/Mode_Activity_Nested.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/RandomP.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/SEARCH_SM_MARIO.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/Two_Level_Nest.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/__init__.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/__main__.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/_choice_model.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/_device.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/banditsa.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/bhhh/minimize.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/boxcox_functions.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/call_meta.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/constraints_builder.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/data/Swissmetro_final.csv +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/data/TravelMode.csv +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/data/electricity.csv +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/harmony.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/hspbil.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/latent_class.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/main.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/main_debug.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/mdcev.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/misc.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/mixed_logit.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/mixed_nested.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/multinomial_logit.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/multinomial_nested.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/multinomial_probit.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/ordered_logit_mixed.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/predict.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/rrm.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/sample_data.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/sapbil.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/search.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/selection_models.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/setup.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/siman.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/test_lc_de.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/test_mario_searches.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/test_sapbil_vs_banditsa.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/threshold.py +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/SOURCES.txt +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/dependency_links.txt +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/entry_points.txt +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/requires.txt +0 -0
- {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: SearchLibrium
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.149
|
|
4
4
|
Summary: A Python package for econometric models driven by search
|
|
5
5
|
Author: Mario Fernando Taco Morales, Alexander Paz, Prithvi Beeramole, Robert Burdett
|
|
6
6
|
Author-email: Zeke Ahern <z.ahern@qut.edu.au>
|
|
@@ -82,7 +82,7 @@ Documentation = "https://pypi.org/project/SearchLibrium/"
|
|
|
82
82
|
realpython = "SearchLibrium.__main__:main"
|
|
83
83
|
|
|
84
84
|
[tool.bumpver]
|
|
85
|
-
current_version = "0.0.
|
|
85
|
+
current_version = "0.0.149"
|
|
86
86
|
version_pattern = "MAJOR.MINOR.PATCH"
|
|
87
87
|
commit_message = "[skip ci] Bump version {old_version} -> {new_version}"
|
|
88
88
|
commit = true
|
|
@@ -10,6 +10,11 @@ class MixedRandomRegret(RandomRegret, MixedLogit):
|
|
|
10
10
|
def __init__(self, halton_opts=None, distributions=['n', 'ln', 't', 'tn', 'u'], **kwargs):
|
|
11
11
|
RandomRegret.__init__(self, **kwargs)
|
|
12
12
|
MixedLogit.__init__(self, halton_opts=halton_opts, distributions=distributions)
|
|
13
|
+
# RandomRegret's setup()/setup_long()/setup_short() never call
|
|
14
|
+
# MixedLogit.setup(), so fn_generate_draws (normally assigned there,
|
|
15
|
+
# defaulting to Halton draws) is never set -- generate_draws() then
|
|
16
|
+
# crashes with AttributeError the first time fit() is called.
|
|
17
|
+
self.fn_generate_draws = self.generate_draws_halton
|
|
13
18
|
|
|
14
19
|
|
|
15
20
|
|
|
@@ -328,7 +328,9 @@ class OrderedLogit():
|
|
|
328
328
|
# Note: [1:] => Ignore first element
|
|
329
329
|
# Note: |cut[:-1]| = |cut[1:]| = self.J and |low| = |high| = self.N x self.J
|
|
330
330
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
331
|
-
|
|
331
|
+
# jax.numpy.concatenate (self.np when _jax=True) requires actual
|
|
332
|
+
# ndarrays, unlike regular numpy which auto-converts bare lists.
|
|
333
|
+
cut = self.np.concatenate((self.np.array([-self.np.inf]), thresholds, self.np.array([self.np.inf])))
|
|
332
334
|
y_latent = self.y_latent[:, None] # Add a second dimension => |y_latent| = (self.N, 1)
|
|
333
335
|
low = cut[:-1] - y_latent # Compute: cut[j] - y_latent[n] for j in range(0, self.J - 1)
|
|
334
336
|
high = cut[1:] - y_latent # Compute: cut[j + 1] - y_latent[n] for j in range(1, self.J - 1)
|
|
@@ -464,9 +466,14 @@ class OrderedLogit():
|
|
|
464
466
|
def get_hessian(self, eps=1e-6):
|
|
465
467
|
# {
|
|
466
468
|
N = self.nparams # Cardinality of hessian matrix
|
|
467
|
-
|
|
469
|
+
# This manual finite-difference scheme mutates `params`/`hessian`
|
|
470
|
+
# in-place throughout (params[i] = ..., hessian[i, :] = ...), which
|
|
471
|
+
# jax arrays (self.np.zeros/self.np.copy when _jax=True) don't
|
|
472
|
+
# support -- it isn't JAX-traced anyway, so use plain, mutable numpy
|
|
473
|
+
# regardless of self._jax.
|
|
474
|
+
hessian = np.zeros((N, N)) # Initialise hessian matrix
|
|
468
475
|
delta = [eps] * N
|
|
469
|
-
params =
|
|
476
|
+
params = np.array(self.params)
|
|
470
477
|
df_0 = self.compute_gradient_central(params, delta)
|
|
471
478
|
for i in range(N): # i.e., for i = 0, 1, ..., N-1
|
|
472
479
|
# {
|
|
@@ -553,8 +560,9 @@ class OrderedLogit():
|
|
|
553
560
|
hessian = self.get_hessian(tol)
|
|
554
561
|
inverse = self.np.linalg.pinv(hessian) # Conventional approach
|
|
555
562
|
diag = self.np.diagonal(inverse)
|
|
556
|
-
|
|
557
|
-
|
|
563
|
+
# jax arrays (self.np when _jax=True) don't support boolean-mask
|
|
564
|
+
# in-place assignment; clip() returns a new array either way.
|
|
565
|
+
diag_copy = self.np.clip(self.np.copy(diag), minval, None)
|
|
558
566
|
|
|
559
567
|
# DEBUG:
|
|
560
568
|
#for i, value in enumerate(diag_copy):
|
|
@@ -706,7 +714,10 @@ class OrderedLogit():
|
|
|
706
714
|
delta = self.np.ones(self.nparams) * tol
|
|
707
715
|
bounds_beta = [(-self.np.inf, self.np.inf)] * (self.K + 1+int(self.fit_intercept)) # K+1 betas + 1 threshold. [-inf, inf]
|
|
708
716
|
bounds_delta = [(minval, self.np.inf)] * (self.J - 2) # These are deltas. [0, inf]
|
|
709
|
-
|
|
717
|
+
# bounds_beta/bounds_delta are plain Python lists of tuples; jax.numpy
|
|
718
|
+
# (self.np when _jax=True) requires actual ndarrays for concatenate,
|
|
719
|
+
# unlike regular numpy which auto-converts -- convert explicitly.
|
|
720
|
+
bounds = self.np.concatenate((self.np.array(bounds_beta), self.np.array(bounds_delta)))
|
|
710
721
|
args = (delta,) # Make sure this is a tuple by adding a comma
|
|
711
722
|
optimize_result = minimize(fun=self.get_loglike_gradient, x0=start, args=args,
|
|
712
723
|
method='L-BFGS-B', tol=tol, jac=True, options=options, bounds=bounds)
|
|
@@ -723,7 +734,21 @@ class OrderedLogitLong(OrderedLogit):
|
|
|
723
734
|
''' ---------------------------------------------------------- '''
|
|
724
735
|
|
|
725
736
|
def __init__(self, **kwargs):
|
|
726
|
-
|
|
737
|
+
# NOTE: intentionally NOT calling OrderedLogit.__init__ (which would
|
|
738
|
+
# invoke self.setup(**kwargs) via its own body, before this class's
|
|
739
|
+
# own setup() override runs again below). But `super(OrderedLogit,
|
|
740
|
+
# self).__init__()` skips OrderedLogit entirely in the MRO and calls
|
|
741
|
+
# object.__init__() instead, so self._jax/self.np (normally set in
|
|
742
|
+
# OrderedLogit.__init__) were never initialized -- replicate that
|
|
743
|
+
# minimal setup here directly.
|
|
744
|
+
_jax = kwargs.get('_jax', True)
|
|
745
|
+
self._jax = _jax
|
|
746
|
+
if _jax:
|
|
747
|
+
import jax.numpy as jnp
|
|
748
|
+
self.np = jnp
|
|
749
|
+
else:
|
|
750
|
+
import numpy as np
|
|
751
|
+
self.np = np
|
|
727
752
|
self.delta_transform = True
|
|
728
753
|
self.setup(**kwargs)
|
|
729
754
|
|
|
@@ -779,7 +804,8 @@ class OrderedLogitLong(OrderedLogit):
|
|
|
779
804
|
try:
|
|
780
805
|
self.X = kwargs.get('X').reshape(self.N, self.J, self.K)
|
|
781
806
|
except:
|
|
782
|
-
|
|
807
|
+
# true division produces a float, which .reshape() rejects
|
|
808
|
+
self.X = kwargs.get('X').reshape(self.N_obs // self.J, self.J, self.K)
|
|
783
809
|
self.y = kwargs.get('y').reshape(self.N, self.J)
|
|
784
810
|
# Validate inputs
|
|
785
811
|
if self.J <= 1:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.0.149
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: SearchLibrium
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.149
|
|
4
4
|
Summary: A Python package for econometric models driven by search
|
|
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.148
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/test_sapbil_vs_banditsa.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|