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.
Files changed (59) hide show
  1. {searchlibrium-0.0.148/src/SearchLibrium.egg-info → searchlibrium-0.0.149}/PKG-INFO +1 -1
  2. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/pyproject.toml +1 -1
  3. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/mixedrrm.py +5 -0
  4. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/ordered_logit.py +34 -8
  5. searchlibrium-0.0.149/src/SearchLibrium/version.txt +1 -0
  6. {searchlibrium-0.0.148 → searchlibrium-0.0.149/src/SearchLibrium.egg-info}/PKG-INFO +1 -1
  7. searchlibrium-0.0.148/src/SearchLibrium/version.txt +0 -1
  8. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/MANIFEST.in +0 -0
  9. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/README.md +0 -0
  10. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/setup.cfg +0 -0
  11. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/BEHier.py +0 -0
  12. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/Halton.py +0 -0
  13. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/MixedLogit.py +0 -0
  14. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/Mode_Activity_Nested.py +0 -0
  15. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/RandomP.py +0 -0
  16. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/SEARCH_SM_MARIO.py +0 -0
  17. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/Two_Level_Nest.py +0 -0
  18. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/__init__.py +0 -0
  19. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/__main__.py +0 -0
  20. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/_choice_model.py +0 -0
  21. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/_device.py +0 -0
  22. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/banditsa.py +0 -0
  23. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/bhhh/minimize.py +0 -0
  24. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/boxcox_functions.py +0 -0
  25. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/call_meta.py +0 -0
  26. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/constraints_builder.py +0 -0
  27. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/data/Swissmetro_final.csv +0 -0
  28. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/data/TravelMode.csv +0 -0
  29. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/data/electricity.csv +0 -0
  30. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/harmony.py +0 -0
  31. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/hspbil.py +0 -0
  32. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/latent_class.py +0 -0
  33. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/main.py +0 -0
  34. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/main_debug.py +0 -0
  35. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/mdcev.py +0 -0
  36. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/misc.py +0 -0
  37. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/mixed_logit.py +0 -0
  38. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/mixed_nested.py +0 -0
  39. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/multinomial_logit.py +0 -0
  40. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/multinomial_nested.py +0 -0
  41. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/multinomial_probit.py +0 -0
  42. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/ordered_logit_mixed.py +0 -0
  43. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/predict.py +0 -0
  44. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/rrm.py +0 -0
  45. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/sample_data.py +0 -0
  46. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/sapbil.py +0 -0
  47. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/search.py +0 -0
  48. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/selection_models.py +0 -0
  49. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/setup.py +0 -0
  50. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/siman.py +0 -0
  51. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/test_lc_de.py +0 -0
  52. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/test_mario_searches.py +0 -0
  53. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/test_sapbil_vs_banditsa.py +0 -0
  54. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium/threshold.py +0 -0
  55. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/SOURCES.txt +0 -0
  56. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/dependency_links.txt +0 -0
  57. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/entry_points.txt +0 -0
  58. {searchlibrium-0.0.148 → searchlibrium-0.0.149}/src/SearchLibrium.egg-info/requires.txt +0 -0
  59. {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.148
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.148"
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
- cut = self.np.concatenate(([-self.np.inf], thresholds, [self.np.inf]))
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
- hessian = self.np.zeros((N, N)) # Initialise hessian matrix
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 = self.np.copy(self.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
- diag_copy = self.np.copy(diag)
557
- diag_copy[diag_copy < minval] = minval
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
- bounds = self.np.concatenate((bounds_beta, bounds_delta))
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
- super(OrderedLogit,self).__init__()
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
- self.X = kwargs.get('X').reshape(self.N_obs/self.J, self.J, self.K)
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.148
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