brainstate 0.1.0.post20250222__py2.py3-none-any.whl → 0.1.0.post20250322__py2.py3-none-any.whl

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.
@@ -918,11 +918,11 @@ def map(
918
918
  g = lambda _, x: ((), vmap(f)(*x))
919
919
  _, scan_ys = scan(g, (), scan_xs)
920
920
  if remainder_xs is None:
921
- ys = jax.tree.map(lambda x: flatten_(x), scan_ys)
921
+ ys = jax.tree.map(lambda x: _flatten(x), scan_ys)
922
922
  else:
923
923
  remainder_ys = vmap(f)(*remainder_xs)
924
924
  ys = jax.tree.map(
925
- lambda x, y: jax.lax.concatenate([flatten_(x), y], dimension=0),
925
+ lambda x, y: jax.lax.concatenate([_flatten(x), y], dimension=0),
926
926
  scan_ys,
927
927
  remainder_ys,
928
928
  )
@@ -932,7 +932,7 @@ def map(
932
932
  return ys
933
933
 
934
934
 
935
- def flatten_(x):
935
+ def _flatten(x):
936
936
  return x.reshape(-1, *x.shape[2:])
937
937
 
938
938
 
@@ -948,8 +948,13 @@ def _vmap_new_states_transform(
948
948
  # -- brainstate specific arguments -- #
949
949
  state_tag: str | None = None,
950
950
  state_to_exclude: Filter | None = None,
951
+ in_states: Dict[int, Dict] | Any | None = None,
952
+ out_states: Dict[int, Dict] | Any | None = None,
951
953
  ):
952
954
  # TODO: How about nested call ``vmap_new_states``?
955
+ if isinstance(axis_size, int) and axis_size <= 0:
956
+ raise ValueError(f"axis_size must be greater than 0, got {axis_size}.")
957
+
953
958
 
954
959
  @vmap(
955
960
  in_axes=in_axes,
@@ -957,6 +962,8 @@ def _vmap_new_states_transform(
957
962
  axis_name=axis_name,
958
963
  axis_size=axis_size,
959
964
  spmd_axis_name=spmd_axis_name,
965
+ in_states=in_states,
966
+ out_states=out_states,
960
967
  )
961
968
  def new_fun(args):
962
969
  # call the function
@@ -999,6 +1006,8 @@ def vmap_new_states(
999
1006
  # -- brainstate specific arguments -- #
1000
1007
  state_tag: str | None = None,
1001
1008
  state_to_exclude: Filter = None,
1009
+ in_states: Dict[int, Dict] | Any | None = None,
1010
+ out_states: Dict[int, Dict] | Any | None = None,
1002
1011
  ):
1003
1012
  """
1004
1013
  Vectorize a function over new states created within it.
@@ -1030,6 +1039,8 @@ def vmap_new_states(
1030
1039
  spmd_axis_name=spmd_axis_name,
1031
1040
  state_tag=state_tag,
1032
1041
  state_to_exclude=state_to_exclude,
1042
+ in_states=in_states,
1043
+ out_states=out_states,
1033
1044
  )
1034
1045
  else:
1035
1046
  return _vmap_new_states_transform(
@@ -1041,4 +1052,6 @@ def vmap_new_states(
1041
1052
  spmd_axis_name=spmd_axis_name,
1042
1053
  state_tag=state_tag,
1043
1054
  state_to_exclude=state_to_exclude,
1055
+ in_states=in_states,
1056
+ out_states=out_states,
1044
1057
  )
@@ -15,10 +15,11 @@
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
+ import unittest
19
+
18
20
  import jax
19
21
  import jax.numpy as jnp
20
22
  import numpy as np
21
- import unittest
22
23
 
23
24
  import brainstate as bst
24
25
  import brainstate.augment
@@ -268,6 +269,7 @@ class TestVmap(unittest.TestCase):
268
269
  def test_axis(self):
269
270
  def f(x):
270
271
  return x - jax.lax.pmean(x, 'i')
272
+
271
273
  r = jax.vmap(f, axis_name='i')(jnp.arange(10))
272
274
  print(r)
273
275
 
@@ -275,6 +277,42 @@ class TestVmap(unittest.TestCase):
275
277
  print(r2)
276
278
  self.assertTrue(jnp.allclose(r, r2))
277
279
 
280
+ def test_vmap_init(self):
281
+ class Foo(bst.nn.Module):
282
+ def __init__(self):
283
+ super().__init__()
284
+ self.a = bst.ParamState(jnp.arange(4))
285
+ self.b = bst.ShortTermState(jnp.arange(4))
286
+
287
+ def init_state_v1(self, *args, **kwargs):
288
+ self.c = bst.State(jnp.arange(4))
289
+
290
+ def init_state_v2(self):
291
+ self.d = bst.State(self.c.value * 2.)
292
+
293
+ foo = Foo()
294
+
295
+ @brainstate.augment.vmap_new_states(state_tag='new1', axis_size=5)
296
+ def init1():
297
+ foo.init_state_v1()
298
+
299
+ init1()
300
+ print(foo.c.value)
301
+
302
+ @brainstate.augment.vmap_new_states(state_tag='new2', axis_size=5, in_states=foo.states('new1'))
303
+ def init2():
304
+ foo.init_state_v2()
305
+
306
+ init2()
307
+ print(foo.c.value)
308
+ print(foo.d.value)
309
+
310
+ self.assertTrue(
311
+ jnp.allclose(
312
+ foo.d.value,
313
+ foo.c.value * 2.
314
+ )
315
+ )
278
316
 
279
317
 
280
318
  class TestMap(unittest.TestCase):
@@ -360,3 +398,38 @@ class TestRemoveAxis:
360
398
  complex_array = jnp.array([[1 + 1j, 2 + 2j], [3 + 3j, 4 + 4j]])
361
399
  complex_result = _remove_axis(complex_array, 0)
362
400
  assert jnp.allclose(complex_result, jnp.array([1 + 1j, 2 + 2j]))
401
+
402
+
403
+ class TestVMAPNewStatesEdgeCases(unittest.TestCase):
404
+
405
+ def test_axis_size_zero(self):
406
+ foo = brainstate.nn.LIF(3)
407
+ # Testing that axis_size of 0 raises an error.
408
+ with self.assertRaises(ValueError):
409
+ @bst.augment.vmap_new_states(state_tag='new1', axis_size=0)
410
+ def faulty_init():
411
+ foo.init_state()
412
+
413
+ # Call the decorated function to trigger validation
414
+ faulty_init()
415
+
416
+ def test_axis_size_negative(self):
417
+ foo = brainstate.nn.LIF(3)
418
+ # Testing that a negative axis_size raises an error.
419
+ with self.assertRaises(ValueError):
420
+ @bst.augment.vmap_new_states(state_tag='new1', axis_size=-3)
421
+ def faulty_init():
422
+ foo.init_state()
423
+
424
+ faulty_init()
425
+
426
+ def test_incompatible_shapes(self):
427
+ foo = brainstate.nn.LIF(3)
428
+ # Simulate an incompatible shapes scenario:
429
+ # We intentionally assign a state with a different shape than expected.
430
+ @bst.augment.vmap_new_states(state_tag='new1', axis_size=5)
431
+ def faulty_init():
432
+ # Modify state to produce an incompatible shape
433
+ foo.c = bst.State(jnp.arange(3)) # Original expected shape is (4,)
434
+
435
+ faulty_init()
@@ -18,9 +18,7 @@ from __future__ import annotations
18
18
  from collections import namedtuple
19
19
 
20
20
  import jax
21
- from typing import (
22
- Callable, TypeVar, Tuple, Any, Dict
23
- )
21
+ from typing import Callable, TypeVar, Tuple, Any, Dict
24
22
 
25
23
  from brainstate._state import catch_new_states
26
24
  from brainstate._utils import set_module_as
@@ -103,7 +101,7 @@ def call_all_functions(
103
101
  on each node. It respects the call order of functions if defined, and provides options for
104
102
  handling cases where the specified function does not exist on a node.
105
103
 
106
- Parameters:
104
+ Parameters
107
105
  -----------
108
106
  target : T
109
107
  The target module on which to call functions.
@@ -121,12 +119,12 @@ def call_all_functions(
121
119
  - 'raise': Raise an exception (default)
122
120
  - 'pass' or 'none': Skip the node and continue
123
121
 
124
- Returns:
122
+ Returns
125
123
  --------
126
124
  T
127
125
  The target module after calling the specified function on all applicable nodes.
128
126
 
129
- Raises:
127
+ Raises
130
128
  -------
131
129
  AssertionError
132
130
  If fun_name is not a string or kwargs is not a dictionary.
@@ -186,7 +184,7 @@ def vmap_call_all_functions(
186
184
  This function vectorizes the process of calling a specified function across multiple instances
187
185
  of the target module, effectively batching the operation.
188
186
 
189
- Parameters:
187
+ Parameters
190
188
  -----------
191
189
  target : T
192
190
  The target module on which to call functions.
@@ -208,12 +206,12 @@ def vmap_call_all_functions(
208
206
  - 'raise': Raise an exception (default)
209
207
  - 'pass' or 'none': Skip the node and continue
210
208
 
211
- Returns:
209
+ Returns
212
210
  --------
213
211
  T
214
212
  The target module after applying the vectorized function call on all applicable nodes.
215
213
 
216
- Raises:
214
+ Raises
217
215
  -------
218
216
  AssertionError
219
217
  If axis_size is not specified or is not a positive integer.
@@ -252,9 +250,9 @@ def vmap_call_all_functions(
252
250
  @set_module_as('brainstate.nn')
253
251
  def init_all_states(
254
252
  target: T,
255
- init_args: Tuple[Any, ...] | Any = (),
256
- init_kwargs: Dict[str, Any] | None = None,
253
+ *init_args,
257
254
  node_to_exclude: Filter = None,
255
+ **init_kwargs,
258
256
  ) -> T:
259
257
  """
260
258
  Initialize all states for the given target module and its submodules.
@@ -304,7 +302,7 @@ def vmap_init_all_states(
304
302
  This function applies vectorized mapping (vmap) to initialize states across multiple
305
303
  instances of the target module, effectively batching the initialization process.
306
304
 
307
- Parameters:
305
+ Parameters
308
306
  -----------
309
307
  target : T
310
308
  The target module whose states are to be initialized.
@@ -319,12 +317,12 @@ def vmap_init_all_states(
319
317
  state_tag : str | None, optional
320
318
  A tag to be used for catching new states.
321
319
 
322
- Returns:
320
+ Returns
323
321
  --------
324
322
  T
325
323
  The target module with initialized states.
326
324
 
327
- Raises:
325
+ Raises
328
326
  -------
329
327
  AssertionError
330
328
  If axis_size is not specified or is not greater than 0.
@@ -413,7 +411,7 @@ def vmap_reset_all_states(
413
411
  This function applies vectorized mapping (vmap) to reset states across multiple
414
412
  instances of the target module, effectively batching the reset process.
415
413
 
416
- Parameters:
414
+ Parameters
417
415
  -----------
418
416
  target : T
419
417
  The target module whose states are to be reset.
@@ -428,12 +426,12 @@ def vmap_reset_all_states(
428
426
  tag : str | None, optional
429
427
  A tag to be used for catching new states.
430
428
 
431
- Returns:
429
+ Returns
432
430
  --------
433
431
  T
434
432
  The target module with reset states.
435
433
 
436
- Raises:
434
+ Raises
437
435
  -------
438
436
  AssertionError
439
437
  If axis_size is not specified or is not greater than 0.
@@ -486,7 +484,7 @@ def save_all_states(target: Module, **kwargs) -> Dict:
486
484
  Args:
487
485
  target: Module. The node to save its states.
488
486
 
489
- Returns:
487
+ Returns
490
488
  Dict. The state dict for serialization.
491
489
  """
492
490
  return {key: node.save_state(**kwargs) for key, node in target.nodes().items()}
@@ -34,3 +34,14 @@ class Test_vmap_init_all_states:
34
34
  print(gru)
35
35
 
36
36
  init()
37
+
38
+
39
+ class Test_init_all_states:
40
+ def test_init_all_states(self):
41
+ gru = bst.nn.GRUCell(1, 2)
42
+ bst.nn.init_all_states(gru, batch_size=10)
43
+ print(gru)
44
+
45
+
46
+
47
+
@@ -17,8 +17,9 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
+ from typing import Optional, Callable
21
+
20
22
  import brainunit as u
21
- from typing import Optional
22
23
 
23
24
  from brainstate import init, environ
24
25
  from brainstate._state import ShortTermState, HiddenState
@@ -54,7 +55,7 @@ class Expon(Synapse, AlignPost):
54
55
  in_size: Size,
55
56
  name: Optional[str] = None,
56
57
  tau: ArrayLike = 8.0 * u.ms,
57
- g_initializer: ArrayLike = init.ZeroInit(unit=u.mS),
58
+ g_initializer: ArrayLike | Callable = init.ZeroInit(unit=u.mS),
58
59
  ):
59
60
  super().__init__(name=name, in_size=in_size)
60
61
 
@@ -85,7 +86,7 @@ class DualExpon(Synapse, AlignPost):
85
86
  tau_decay: ArrayLike = 10.0 * u.ms,
86
87
  tau_rise: ArrayLike = 1.0 * u.ms,
87
88
  A: Optional[ArrayLike] = None,
88
- g_initializer: ArrayLike = init.ZeroInit(unit=u.mS),
89
+ g_initializer: ArrayLike | Callable = init.ZeroInit(unit=u.mS),
89
90
  ):
90
91
  super().__init__(name=name, in_size=in_size)
91
92
 
@@ -133,7 +134,7 @@ class Alpha(Synapse):
133
134
  in_size: Size,
134
135
  name: Optional[str] = None,
135
136
  tau: ArrayLike = 8.0 * u.ms,
136
- g_initializer: ArrayLike = init.ZeroInit(unit=u.mS),
137
+ g_initializer: ArrayLike | Callable = init.ZeroInit(unit=u.mS),
137
138
  ):
138
139
  super().__init__(name=name, in_size=in_size)
139
140
 
@@ -321,7 +322,7 @@ class AMPA(Synapse):
321
322
  beta: ArrayLike = 0.18 / u.ms,
322
323
  T: ArrayLike = 0.5 * u.mM,
323
324
  T_dur: ArrayLike = 0.5 * u.ms,
324
- g_initializer: ArrayLike = init.ZeroInit(),
325
+ g_initializer: ArrayLike | Callable = init.ZeroInit(),
325
326
  ):
326
327
  super().__init__(name=name, in_size=in_size)
327
328
 
@@ -394,5 +395,14 @@ class GABAa(AMPA):
394
395
  beta: ArrayLike = 0.18 / u.ms,
395
396
  T: ArrayLike = 1.0 * u.mM,
396
397
  T_dur: ArrayLike = 1.0 * u.ms,
398
+ g_initializer: ArrayLike | Callable = init.ZeroInit(),
397
399
  ):
398
- super().__init__(alpha=alpha, beta=beta, T=T, T_dur=T_dur, name=name, in_size=in_size)
400
+ super().__init__(
401
+ alpha=alpha,
402
+ beta=beta,
403
+ T=T,
404
+ T_dur=T_dur,
405
+ name=name,
406
+ in_size=in_size,
407
+ g_initializer=g_initializer
408
+ )
@@ -49,13 +49,13 @@ def exp_euler_step(
49
49
  should have units of ( [X]/\sqrt{[T]} ).
50
50
 
51
51
  Args:
52
- fun: Callable. The function to be solved.
53
- diffusion: Callable. The diffusion function.
54
- *args: The input arguments.
55
- drift: Callable. The drift function.
52
+ fun: Callable. The function to be solved.
53
+ diffusion: Callable. The diffusion function.
54
+ *args: The input arguments.
55
+ drift: Callable. The drift function.
56
56
 
57
57
  Returns:
58
- The one-step solution of the ODE.
58
+ The one-step solution of the ODE.
59
59
  """
60
60
  assert callable(fn), 'The input function should be callable.'
61
61
  assert len(args) > 0, 'The input arguments should not be empty.'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: brainstate
3
- Version: 0.1.0.post20250222
3
+ Version: 0.1.0.post20250322
4
4
  Summary: A ``State``-based Transformation System for Program Compilation and Augmentation.
5
5
  Home-page: https://github.com/chaobrain/brainstate
6
6
  Author: BrainState Developers
@@ -62,6 +62,7 @@ Requires-Dist: jaxlib[tpu] ; extra == 'tpu'
62
62
  <a href="https://badge.fury.io/py/brainstate"><img alt="PyPI version" src="https://badge.fury.io/py/brainstate.svg"></a>
63
63
  <a href="https://github.com/chaobrain/brainstate/actions/workflows/CI.yml"><img alt="Continuous Integration" src="https://github.com/chaobrain/brainstate/actions/workflows/CI.yml/badge.svg"></a>
64
64
  <a href="https://pepy.tech/projects/brainstate"><img src="https://static.pepy.tech/badge/brainstate" alt="PyPI Downloads"></a>
65
+ <a href="https://doi.org/10.5281/zenodo.14970015"><img src="https://zenodo.org/badge/811300394.svg" alt="DOI"></a>
65
66
  </p>
66
67
 
67
68
 
@@ -81,8 +82,8 @@ The official documentation is hosted on Read the Docs: [https://brainstate.readt
81
82
 
82
83
 
83
84
 
84
- ## See also the BDP ecosystem
85
+ ## See also the brain modeling ecosystem
85
86
 
86
- We are building the Brain Dynamics Programming ecosystem: https://ecosystem-for-brain-dynamics.readthedocs.io/
87
+ We are building the brain modeling ecosystem: https://brainmodeling.readthedocs.io/
87
88
 
88
89
 
@@ -14,8 +14,8 @@ brainstate/augment/_autograd.py,sha256=hfDoa2HbkRn-InOS0yOcb6gEZ2DLNqtWA133P8-hv
14
14
  brainstate/augment/_autograd_test.py,sha256=2wCC8aUcDp2IHgF7wr1GK5HwWfELXni5PpA-082azuU,44058
15
15
  brainstate/augment/_eval_shape.py,sha256=jgsS197Nizehr9A2nGaQPE7NuNujhFhmR3J96hTicX8,3890
16
16
  brainstate/augment/_eval_shape_test.py,sha256=LFOJx7CWltmRLXdGY175UebLwtEMz2CzJ_gLqMZsJTw,1393
17
- brainstate/augment/_mapping.py,sha256=X6C7IcYYXqDkYlWRXE_pdZIcCXvnltyNdESBoEm2fms,42940
18
- brainstate/augment/_mapping_test.py,sha256=M7pcXnRwBe2LyJh7VsWROGLR3N2bRfMUU1wj0ivbjNQ,12368
17
+ brainstate/augment/_mapping.py,sha256=ru4byvHCtEvmSBTC-DckgKqyJEbKxstPdJcz3uE5AZ8,43494
18
+ brainstate/augment/_mapping_test.py,sha256=Ax9-NjnCHPrvO_fPN24mOtl0NZugWg3AcNyxUYnHS1E,14709
19
19
  brainstate/augment/_random.py,sha256=ikRzNoDDE2BkARajDsBhNlngCUrghzGSZUDmEGvVors,5386
20
20
  brainstate/compile/__init__.py,sha256=fQtG316MLkeeu1Ssp54Kghw1PwbGK5gNq9yRVJu0wjA,1474
21
21
  brainstate/compile/_ad_checkpoint.py,sha256=3wv-f89oo94XeWwRV5LcRot0Nz7xTk5_PdjEDyUMsoo,9394
@@ -54,10 +54,10 @@ brainstate/init/_random_inits_test.py,sha256=lBL2RQdBSZ88Zqz4IMdbHJMvDi7ooZq6caC
54
54
  brainstate/init/_regular_inits.py,sha256=DmVMajugfyYFNUMzgFdDKMvbBu9hMWxkfDd-50uhoLg,3187
55
55
  brainstate/init/_regular_inits_test.py,sha256=tJl4aOkclllJIfKzJTbc0cfYCw2SoBsx8_G123RnqbU,1842
56
56
  brainstate/nn/__init__.py,sha256=ar1hDUYbSO6oadMpbuS9FWZvZB_iyFzM8CwMK-RNDzM,1823
57
- brainstate/nn/_collective_ops.py,sha256=yQNBnh-XVEFnTg-Ga14mHOCGtGxiTkL9MYKdNjJF1BI,17535
58
- brainstate/nn/_collective_ops_test.py,sha256=yW7NNYsGFglFRFkqVlpGSY6WLnU-h8GlK6wCmG5jtRc,1189
57
+ brainstate/nn/_collective_ops.py,sha256=Hb8ruvqlhSA-XWJ66ReItyaIhxyWlSKGFZ9-EYMQ-mk,17457
58
+ brainstate/nn/_collective_ops_test.py,sha256=nloqrlf6M7H-mgvHmIARrKzMotp8khxEuYSMPvXM5J0,1375
59
59
  brainstate/nn/_common.py,sha256=XQw0i0sH3Y_qUwHSMC7G9VQnDj-RuuTh1Ul-xRIPxxc,7136
60
- brainstate/nn/_exp_euler.py,sha256=cRgPNcjMs2C9x_8JabtYz5hm_FwqbiJ_U1VfRHYIlrE,3519
60
+ brainstate/nn/_exp_euler.py,sha256=s-Z_cT_oYvCvE-OaXuUidIxQs3KOy1pzkx1lwtfPo00,3529
61
61
  brainstate/nn/_exp_euler_test.py,sha256=kvPf009DMYtla2uedKVKrPTHDyMTBepjlfsk5vDHqhI,1240
62
62
  brainstate/nn/_module.py,sha256=vrukVI0ylbymzilh9BZtb-d9dnsBsykqanUNTx9Eb6Y,12844
63
63
  brainstate/nn/_module_test.py,sha256=UrVA85fo0KVFN9ApPkxkRcvtXEskWOXPzZIBa4JSFo0,8891
@@ -66,7 +66,7 @@ brainstate/nn/metrics.py,sha256=p7eVwd5y8r0N5rMws-zOS_KaZCLOMdrXyQvLnoJeq1w,1473
66
66
  brainstate/nn/_dyn_impl/__init__.py,sha256=Oazar7h89dp1WA2Vx4Tj7gCBhxJKH4LAUEABkBEG7vU,1462
67
67
  brainstate/nn/_dyn_impl/_dynamics_neuron.py,sha256=mcDxVZlk56NAEkR6xcE74hOZ9up8Rua4SvKEeAhJKU4,10925
68
68
  brainstate/nn/_dyn_impl/_dynamics_neuron_test.py,sha256=_wPp6UvWVZI9EYba-DWL_JZXyMxm0-SHDkZHI8lKp8w,6315
69
- brainstate/nn/_dyn_impl/_dynamics_synapse.py,sha256=Nk_c62nCJjjjhihQV_xqYeT-x_34xzc6OhdScO19ffw,15267
69
+ brainstate/nn/_dyn_impl/_dynamics_synapse.py,sha256=xXMNlDWX0tQ9N0zORfT4DFKoEXtrsRbeetqOq-bYovs,15518
70
70
  brainstate/nn/_dyn_impl/_dynamics_synapse_test.py,sha256=VUDMlHNcyeqHrBd1eAXg_VD0HCSg5C-eqMmcJVzYcJA,4979
71
71
  brainstate/nn/_dyn_impl/_inputs.py,sha256=ubM5Z2q0gXpJ2M5Das3A5MJpFOorVomfW6-079mqJ9k,12935
72
72
  brainstate/nn/_dyn_impl/_projection_alignpost.py,sha256=PNC1Tzx_SF2DHAHeJCufXzO_Q4qLoBpWABI45B3GRuc,876
@@ -121,8 +121,8 @@ brainstate/util/_pretty_table.py,sha256=NM_6VAW6oL9jojsK0-RkQGHnDzLy_fn_hgzl5R8o
121
121
  brainstate/util/_scaling.py,sha256=pc_eM_SZVwkY65I4tJh1ODiHNCoEhsfFXl2zBK0PLAg,7562
122
122
  brainstate/util/_struct.py,sha256=F5GfFURITAIYTwf17_xypkZU1wvoL4dUCviPnr_eCtw,17515
123
123
  brainstate/util/filter.py,sha256=Zw0H42NwAi2P7dBr3ISv2VpkB5jqoWnV4Kpd61gq66o,14126
124
- brainstate-0.1.0.post20250222.dist-info/LICENSE,sha256=VZe9u1jgUL2eCY6ZPOYgdb8KCblCHt8ECdbtJid6e1s,11550
125
- brainstate-0.1.0.post20250222.dist-info/METADATA,sha256=Rzs6V20AVpOxQhtd8EJLidBkF7UJriVF4g2zkr0S92M,3585
126
- brainstate-0.1.0.post20250222.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
127
- brainstate-0.1.0.post20250222.dist-info/top_level.txt,sha256=eQbGgKn0ptx7FDWuua0V0wr4K1VHi2iOUCYo3fUQBRA,11
128
- brainstate-0.1.0.post20250222.dist-info/RECORD,,
124
+ brainstate-0.1.0.post20250322.dist-info/LICENSE,sha256=VZe9u1jgUL2eCY6ZPOYgdb8KCblCHt8ECdbtJid6e1s,11550
125
+ brainstate-0.1.0.post20250322.dist-info/METADATA,sha256=ixPeEJ2tz1Dti9D7RFHS-bDLCj1a5VtVnbo7GS82xaE,3689
126
+ brainstate-0.1.0.post20250322.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
127
+ brainstate-0.1.0.post20250322.dist-info/top_level.txt,sha256=eQbGgKn0ptx7FDWuua0V0wr4K1VHi2iOUCYo3fUQBRA,11
128
+ brainstate-0.1.0.post20250322.dist-info/RECORD,,