brainstate 0.1.0.post20250217__py2.py3-none-any.whl → 0.1.0.post20250222__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.
brainstate/_state.py CHANGED
@@ -44,7 +44,12 @@ from brainstate.util import DictManager, PrettyObject
44
44
  from brainstate.util.filter import Nothing
45
45
 
46
46
  __all__ = [
47
- 'State', 'ShortTermState', 'LongTermState', 'HiddenState', 'ParamState', 'TreefyState',
47
+ 'State',
48
+ 'ShortTermState',
49
+ 'LongTermState',
50
+ 'HiddenState',
51
+ 'ParamState',
52
+ 'TreefyState',
48
53
  'FakeState',
49
54
 
50
55
  'StateDictManager',
@@ -956,21 +961,18 @@ class BatchState(LongTermState):
956
961
 
957
962
  class HiddenState(ShortTermState):
958
963
  """
959
- The hidden state, which is used to store the hidden data in a dynamic model.
964
+ Represents hidden state variables in neurons or synapses.
960
965
 
961
966
  This class extends :class:`ShortTermState` and is specifically designed to represent
962
967
  and manage hidden states within dynamic models, such as recurrent neural networks.
963
968
  It provides a way to encapsulate hidden state values and associated metadata,
964
969
  facilitating operations like state updates during model execution.
965
970
 
966
- Attributes:
967
- Inherits all attributes from :class:`ShortTermState`.
968
-
969
971
  Note:
970
- This class does not introduce new methods or attributes beyond those
971
- inherited from :class:`ShortTermState`. Its primary purpose is to semantically
972
- distinguish hidden states from other types of short-term states
973
- in dynamic models.
972
+ :class:`HiddenState` and :class:`ParamState` are two most important state types
973
+ in brainstate. The former is used to store the hidden states in neurons, synapses,
974
+ or networks. The latter is used to store the trainable parameters in the model,
975
+ such as synaptic weights.
974
976
 
975
977
  Example:
976
978
  >>> lstm_hidden = HiddenState(np.zeros(128), name="lstm_hidden_state")
@@ -989,14 +991,11 @@ class ParamState(LongTermState):
989
991
  It provides a way to encapsulate parameter values and associated metadata,
990
992
  facilitating operations like parameter updates during training.
991
993
 
992
- Attributes:
993
- Inherits all attributes from :class:`LongTermState`.
994
-
995
994
  Note:
996
- This class does not introduce new methods or attributes beyond those
997
- inherited from :class:`LongTermState`. Its primary purpose is to semantically
998
- distinguish parameter states from other types of long-term states
999
- in the model.
995
+ :class:`HiddenState` and :class:`ParamState` are two most important state types
996
+ in brainstate. The former is used to store the hidden states in neurons, synapses,
997
+ or networks. The latter is used to store the trainable parameters in the model,
998
+ such as synaptic weights.
1000
999
 
1001
1000
  Example:
1002
1001
  >>> weight = ParamState(np.random.randn(10, 10), name="layer1_weights")
@@ -29,11 +29,12 @@ The wrapped gradient transformations here are made possible by using the followi
29
29
 
30
30
  from __future__ import annotations
31
31
 
32
- import brainunit as u
33
- import jax
34
32
  from functools import wraps, partial
35
33
  from typing import Union, Callable, Dict, Sequence, Optional, Any, Tuple, TypeVar, Iterator
36
34
 
35
+ import brainunit as u
36
+ import jax
37
+
37
38
  from brainstate._state import State
38
39
  from brainstate._utils import set_module_as
39
40
  from brainstate.compile._make_jaxpr import StatefulFunction
@@ -195,6 +196,7 @@ class GradientTransform(PrettyRepr):
195
196
  grad_states = {k: v for k, v in grad_states.items()}
196
197
  self._grad_states, self._grad_tree = jax.tree.flatten(grad_states)
197
198
  self._grad_state_ids = [id(v) for v in self._grad_states]
199
+ self._grad_id_to_state = {id(v): v for v in self._grad_states}
198
200
  if any(not isinstance(v, State) for v in self._grad_states):
199
201
  raise TypeError("All grad_states must be State instances.")
200
202
 
@@ -250,12 +252,20 @@ class GradientTransform(PrettyRepr):
250
252
  """
251
253
  grad_vals = dict()
252
254
  other_vals = dict()
255
+ all_ids = set(self._grad_state_ids)
253
256
  for st in state_trace.states:
254
257
  id_ = id(st)
255
- if id_ in self._grad_state_ids:
258
+ if id_ in all_ids:
256
259
  grad_vals[id_] = st.value
260
+ all_ids.remove(id_)
257
261
  else:
258
262
  other_vals[id_] = st.value
263
+ if len(all_ids):
264
+ err = f"Some states are not found in the state trace when performing gradient transformations.\n "
265
+ for i, id_ in enumerate(all_ids):
266
+ st = self._grad_id_to_state[id_]
267
+ st.raise_error_with_source_info(ValueError(err + str(st)))
268
+
259
269
  return grad_vals, other_vals
260
270
 
261
271
  def _merge_state_vals(self, grad_vals: Dict, other_vals: Dict, state_trace):
@@ -16,8 +16,6 @@
16
16
  from __future__ import annotations
17
17
 
18
18
  import functools
19
- import jax
20
- from jax.interpreters.batching import BatchTracer
21
19
  from typing import (
22
20
  Any,
23
21
  TypeVar,
@@ -32,6 +30,9 @@ from typing import (
32
30
  List
33
31
  )
34
32
 
33
+ import jax
34
+ from jax.interpreters.batching import BatchTracer
35
+
35
36
  from brainstate._state import State, catch_new_states
36
37
  from brainstate.compile import scan, StatefulFunction
37
38
  from brainstate.random import RandomState, DEFAULT
@@ -378,8 +379,15 @@ def _vmap_transform(
378
379
  # call the function
379
380
  return f(*args)
380
381
 
382
+ def _set_axis_env(batch_size):
383
+ axis_env = None if axis_name is None else [(axis_name, batch_size)]
384
+ stateful_fn.axis_env = axis_env
385
+
381
386
  # stateful function
382
- stateful_fn = StatefulFunction(_vmap_fn_for_compilation, name='vmap')
387
+ stateful_fn = StatefulFunction(
388
+ _vmap_fn_for_compilation,
389
+ name='vmap',
390
+ )
383
391
 
384
392
  @functools.wraps(f)
385
393
  def new_fn_for_vmap(
@@ -506,6 +514,10 @@ def _vmap_transform(
506
514
  st_in_axes = 0
507
515
 
508
516
  # compile stateful function
517
+ batch_size = None
518
+ if axis_name is not None:
519
+ batch_size = _get_batch_size(args, in_axes, axis_to_in_states, axis_size)
520
+ _set_axis_env(batch_size)
509
521
  cache_key = _compile_stateful_function(
510
522
  stateful_fn,
511
523
  (st_in_axes, in_axes),
@@ -518,7 +530,8 @@ def _vmap_transform(
518
530
  rng_sets = set(rngs)
519
531
  if len(rngs):
520
532
  # batch size
521
- batch_size = _get_batch_size(args, in_axes, axis_to_in_states, axis_size)
533
+ if batch_size is None:
534
+ batch_size = _get_batch_size(args, in_axes, axis_to_in_states, axis_size)
522
535
  rng_keys = tuple(rng.split_key(batch_size) for rng in rngs)
523
536
  rng_backup = tuple(rng.split_key() for rng in rngs)
524
537
  else:
@@ -936,10 +949,8 @@ def _vmap_new_states_transform(
936
949
  state_tag: str | None = None,
937
950
  state_to_exclude: Filter | None = None,
938
951
  ):
939
-
940
952
  # TODO: How about nested call ``vmap_new_states``?
941
953
 
942
-
943
954
  @vmap(
944
955
  in_axes=in_axes,
945
956
  out_axes=out_axes,
@@ -21,6 +21,7 @@ import numpy as np
21
21
  import unittest
22
22
 
23
23
  import brainstate as bst
24
+ import brainstate.augment
24
25
  from brainstate.augment._mapping import BatchAxisError
25
26
  from brainstate.augment._mapping import _remove_axis
26
27
 
@@ -264,6 +265,17 @@ class TestVmap(unittest.TestCase):
264
265
  res2 = jax.vmap(f, axis_size=10)()
265
266
  self.assertTrue(jnp.all((res2[0] == res2[1:])))
266
267
 
268
+ def test_axis(self):
269
+ def f(x):
270
+ return x - jax.lax.pmean(x, 'i')
271
+ r = jax.vmap(f, axis_name='i')(jnp.arange(10))
272
+ print(r)
273
+
274
+ r2 = brainstate.augment.vmap(f, axis_name='i')(jnp.arange(10))
275
+ print(r2)
276
+ self.assertTrue(jnp.allclose(r, r2))
277
+
278
+
267
279
 
268
280
  class TestMap(unittest.TestCase):
269
281
  def test_map(self):
@@ -753,8 +753,8 @@ def _make_jaxpr(
753
753
  if jax.__version_info__ < (0, 5, 0):
754
754
  debug_info = pe.debug_info(fun, in_tree, out_tree, True, 'make_jaxpr')
755
755
  with ExitStack() as stack:
756
- for axis_name, size in axis_env or []:
757
- stack.enter_context(jax.core.extend_axis_env(axis_name, size, None))
756
+ if axis_env is not None:
757
+ stack.enter_context(jax.core.extend_axis_env_nd(axis_env))
758
758
  if jax.__version_info__ < (0, 5, 0):
759
759
  jaxpr, out_type, consts = pe.trace_to_jaxpr_dynamic2(f, debug_info=debug_info)
760
760
  else:
@@ -159,7 +159,7 @@ def spike_bitwise_ixor(x, y):
159
159
 
160
160
 
161
161
  def spike_bitwise(x, y, op: str):
162
- """
162
+ r"""
163
163
  Perform bitwise operations on spike tensors.
164
164
 
165
165
  This function applies various bitwise operations on spike tensors based on the specified operation.
@@ -201,9 +201,11 @@ class SGD(_WeightDecayOptimizer):
201
201
  def update(self, grads: dict):
202
202
  lr = self.lr()
203
203
  weight_values, grad_values = to_same_dict_tree(self.param_states, grads)
204
- updates = jax.tree.map(functools.partial(_sgd, lr=lr, weight_decay=self.weight_decay),
205
- weight_values,
206
- grad_values)
204
+ updates = jax.tree.map(
205
+ functools.partial(_sgd, lr=lr, weight_decay=self.weight_decay),
206
+ weight_values,
207
+ grad_values
208
+ )
207
209
  self.param_states.assign_values(updates)
208
210
  self.lr.step_call()
209
211
 
@@ -324,12 +326,16 @@ class MomentumNesterov(_WeightDecayOptimizer):
324
326
  def update(self, grads: dict):
325
327
  lr = self.lr()
326
328
  states_values, grad_values, momentum_values = to_same_dict_tree(self.param_states, grads, self.momentum_states)
327
- momentum_values = jax.tree.map(lambda mv, gv: self.momentum * mv - lr * gv,
328
- momentum_values,
329
- grad_values)
330
- weight_values = jax.tree.map(functools.partial(_sgd, lr=lr, weight_decay=self.weight_decay),
331
- states_values,
332
- momentum_values)
329
+ momentum_values = jax.tree.map(
330
+ lambda mv, gv: self.momentum * mv - lr * gv,
331
+ momentum_values,
332
+ grad_values
333
+ )
334
+ weight_values = jax.tree.map(
335
+ functools.partial(_sgd, lr=lr, weight_decay=self.weight_decay),
336
+ states_values,
337
+ momentum_values
338
+ )
333
339
  self.param_states.assign_values(weight_values)
334
340
  self.momentum_states.assign_values(momentum_values)
335
341
  self.lr.step_call()
@@ -388,11 +394,21 @@ class Adagrad(_WeightDecayOptimizer):
388
394
  def update(self, grads: dict):
389
395
  lr = self.lr()
390
396
  cache_values, grad_values, weight_values = to_same_dict_tree(self.cache_states, grads, self.param_states)
391
- cache_values = jax.tree.map(lambda cv, gv: cv + gv ** 2, cache_values, grad_values)
392
- updates = jax.tree.map(lambda cv, gv: lr * gv / jnp.sqrt(cv + self.epsilon), cache_values, grad_values)
393
- weight_values = jax.tree.map(functools.partial(_sgd, weight_decay=self.weight_decay),
394
- weight_values,
395
- updates)
397
+ cache_values = jax.tree.map(
398
+ lambda cv, gv: cv + gv ** 2,
399
+ cache_values,
400
+ grad_values
401
+ )
402
+ updates = jax.tree.map(
403
+ lambda cv, gv: lr * gv / jnp.sqrt(cv + self.epsilon),
404
+ cache_values,
405
+ grad_values
406
+ )
407
+ weight_values = jax.tree.map(
408
+ functools.partial(_sgd, weight_decay=self.weight_decay),
409
+ weight_values,
410
+ updates
411
+ )
396
412
  self.cache_states.assign_values(cache_values)
397
413
  self.param_states.assign_values(weight_values)
398
414
  self.lr.step_call()
@@ -605,13 +621,28 @@ class Adam(_WeightDecayOptimizer):
605
621
  lr = lr / (1 - self.beta1 ** (self.lr.last_epoch.value + 2))
606
622
  lr = lr * jnp.sqrt(1 - self.beta2 ** (self.lr.last_epoch.value + 2))
607
623
  weight_values, grad_values, m1_values, m2_values = to_same_dict_tree(
608
- self.param_states, grads, self.m1_states, self.m2_states)
609
- m1_values = jax.tree.map(lambda m1, gv: self.beta1 * m1 + (1 - self.beta1) * gv, m1_values, grad_values)
610
- m2_values = jax.tree.map(lambda m2, gv: self.beta2 * m2 + (1 - self.beta2) * gv ** 2, m2_values, grad_values)
611
- update = jax.tree.map(lambda m1, m2: lr * m1 / (jnp.sqrt(m2) + self.eps), m1_values, m2_values)
612
- weight_values = jax.tree.map(functools.partial(_sgd, weight_decay=self.weight_decay),
613
- weight_values,
614
- update)
624
+ self.param_states, grads, self.m1_states, self.m2_states
625
+ )
626
+ m1_values = jax.tree.map(
627
+ lambda m1, gv: self.beta1 * m1 + (1 - self.beta1) * gv,
628
+ m1_values,
629
+ grad_values
630
+ )
631
+ m2_values = jax.tree.map(
632
+ lambda m2, gv: self.beta2 * m2 + (1 - self.beta2) * gv ** 2,
633
+ m2_values,
634
+ grad_values
635
+ )
636
+ update = jax.tree.map(
637
+ lambda m1, m2: lr * m1 / (jnp.sqrt(m2) + self.eps),
638
+ m1_values,
639
+ m2_values
640
+ )
641
+ weight_values = jax.tree.map(
642
+ functools.partial(_sgd, weight_decay=self.weight_decay),
643
+ weight_values,
644
+ update
645
+ )
615
646
  self.param_states.assign_values(weight_values)
616
647
  self.m1_states.assign_values(m1_values)
617
648
  self.m2_states.assign_values(m2_values)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: brainstate
3
- Version: 0.1.0.post20250217
3
+ Version: 0.1.0.post20250222
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
@@ -1,5 +1,5 @@
1
1
  brainstate/__init__.py,sha256=AkZyyFkn4fB8g2aT6Rc2MO1xICPpUZuDtdze-eUQNc0,1496
2
- brainstate/_state.py,sha256=5Oc-QPyQbfwUSAiTTa9BYh64QKI3xL54nvGwQr2KHBs,60827
2
+ brainstate/_state.py,sha256=KJclcHKGrIt8K_rDW3E2dO8g_f_UMcZwGID4UUb9MBE,60751
3
3
  brainstate/_state_test.py,sha256=UBbbGJ8cb9dJ3NeySf-TNs_nNP47Ax8CP7QL_b32MAA,1636
4
4
  brainstate/_utils.py,sha256=uJ6WWKq3yb05ZdktCQGLWOXsOJveL1H9pR7eev70Jes,1693
5
5
  brainstate/environ.py,sha256=PllYYZKqany3G7NzIwoUPplLAePbyza6kJGXTPgJK-c,17698
@@ -10,12 +10,12 @@ brainstate/surrogate.py,sha256=wWYw-TxaFxHVneXuHjWD1UtTcOTk3XRSnhRtUkt_Hb8,53580
10
10
  brainstate/transform.py,sha256=vZWzO4F7qTsXL_SiVQPlTz0l9b_hRo9D-igETfgCTy0,758
11
11
  brainstate/typing.py,sha256=988gX1tvwtyYnYjmej90OaRxoMoBIPO0-DSrXXGxojM,10523
12
12
  brainstate/augment/__init__.py,sha256=Q9-JIwQ1FNn8VLS1MA9MrSylbvUjWSw98whrI3NIuKo,1229
13
- brainstate/augment/_autograd.py,sha256=eAXdFPOEei2yTHtrhMXQBpC-36fmc6YZu3YWw4q_Wmk,29682
13
+ brainstate/augment/_autograd.py,sha256=hfDoa2HbkRn-InOS0yOcb6gEZ2DLNqtWA133P8-hvIo,30138
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=XqKRM88yAvvhWzSUqwq67sX49xV8oYtUdcmQ0KO9hVs,42532
18
- brainstate/augment/_mapping_test.py,sha256=V9NOpiZydDDUUYnLLCJVU9KJ-2IRNuVbL-ziuW-pU1I,12033
17
+ brainstate/augment/_mapping.py,sha256=X6C7IcYYXqDkYlWRXE_pdZIcCXvnltyNdESBoEm2fms,42940
18
+ brainstate/augment/_mapping_test.py,sha256=M7pcXnRwBe2LyJh7VsWROGLR3N2bRfMUU1wj0ivbjNQ,12368
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
@@ -30,7 +30,7 @@ brainstate/compile/_loop_collect_return.py,sha256=-LsP7fkHmAyGnDOKa3BxxYOEWe8M2J
30
30
  brainstate/compile/_loop_collect_return_test.py,sha256=D9RQ5RyQHkqBr4nmSK-yM_uge3EC6uVm_Dzy42g3vtg,1802
31
31
  brainstate/compile/_loop_no_collection.py,sha256=2OEVtv5XztOx-e0focZ1UnWkXmFzmDskjHJXuVXmuhA,7587
32
32
  brainstate/compile/_loop_no_collection_test.py,sha256=oStB1CSG_iLp9sHdXd1hJNFvlxbzjck9Iy4sABoJDj4,1419
33
- brainstate/compile/_make_jaxpr.py,sha256=QGbVU_Y6pEfFgr61v_gmsRS3HXcHp7ILV_JZk_e3J4o,33213
33
+ brainstate/compile/_make_jaxpr.py,sha256=8iV8XyvkMH3n3wbEWZAgZtbrUxryljwQJD6o5DMW9Lc,33189
34
34
  brainstate/compile/_make_jaxpr_test.py,sha256=fZe3K4RHFLmMAeXZoFZ5RyxgXvncTcuMQdjmOROJtKU,4365
35
35
  brainstate/compile/_progress_bar.py,sha256=3Z3OVcc5sl9FK9Fkt813l20MNzEfa6UZ9lJrvSgXTCU,7522
36
36
  brainstate/compile/_unvmap.py,sha256=uCvQjvb8J7kT0kalX576mrAPvQuCh_W76EPdgZ53kTM,4230
@@ -40,7 +40,7 @@ brainstate/functional/_activations.py,sha256=VmCU9HOKWbysxuJFBN-JsShS4loNMG_E6IX
40
40
  brainstate/functional/_activations_test.py,sha256=-bCijTvo4Wo_P283RYKYMPcTLsjhu5i2X9ySdf1ayEY,13034
41
41
  brainstate/functional/_normalization.py,sha256=L3S4DIF1EztrlE4_KHX7j_m6Mw0mpAwnx5UTAX6YYBU,2603
42
42
  brainstate/functional/_others.py,sha256=eBV43WqQsDvHkkwX0xbqCRoIoJlngMFLSUKgleH2dt0,1735
43
- brainstate/functional/_spikes.py,sha256=EZqwJctEElHhxaC9tsm8WKkXTQJJzo901Db0I3QS3iM,7086
43
+ brainstate/functional/_spikes.py,sha256=7FTfCfEN1mjlY-EULzCisk7_NOmxZPj-mp-ODncW7R0,7087
44
44
  brainstate/graph/__init__.py,sha256=noo4TjBg6iEhjjwk0sAGUhR7Ge-z8Vnc2rLYUvnqttw,1295
45
45
  brainstate/graph/_graph_node.py,sha256=JE1Tc0mK3nJFWUFzXE53MWWiEYiXJO5VdqZEYKbXlw0,6872
46
46
  brainstate/graph/_graph_node_test.py,sha256=BFGfdzZFDHI0XK7hHotSVWKt3em1taGvn8FHF9NCXx8,2702
@@ -102,7 +102,7 @@ brainstate/optim/_lr_scheduler.py,sha256=Ua_H3VWUt9QZ0pHtGpnq2wrqsTOUidXJ3VDz9s-
102
102
  brainstate/optim/_lr_scheduler_test.py,sha256=W0F1eHb9S4seE468c26owcJIWTtgNhZYrOi2GrysVNI,1774
103
103
  brainstate/optim/_optax_optimizer.py,sha256=SuXV_xUBfhOw1_C2J5TIpy3dXDtI9VJFaSMLy8hLcXE,5312
104
104
  brainstate/optim/_optax_optimizer_test.py,sha256=J7zvmeSaWmTlfbpjx1ILb9cSC5qlj1wn4H2QMw9jUY0,1760
105
- brainstate/optim/_sgd_optimizer.py,sha256=oOFUEqCFX-WfhMnB614AjScbgFYP8y-zIwb94FZ_olA,46006
105
+ brainstate/optim/_sgd_optimizer.py,sha256=RDQLrWsJFeEpTc93toDbf4hXnHmfY0hpTs38z1AZYPY,46144
106
106
  brainstate/random/__init__.py,sha256=c5q-RC3grRIjx-HBb2IhKZpi_xzbFmUUxzRAzqfREic,1045
107
107
  brainstate/random/_rand_funs.py,sha256=fmyaBTl_P7M63RRp5V2dOR_ttXQ0vB2qU2C8RqfkjY0,137680
108
108
  brainstate/random/_rand_funs_test.py,sha256=Nhy5gXuJ2ld9u8CTCqU1V94FPm0TvYQ-oMy2bP_CZ7I,19436
@@ -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.post20250217.dist-info/LICENSE,sha256=VZe9u1jgUL2eCY6ZPOYgdb8KCblCHt8ECdbtJid6e1s,11550
125
- brainstate-0.1.0.post20250217.dist-info/METADATA,sha256=eBHppB4DxysakCjcinzG4vVSxI_eS08l7LkSepmGGXI,3585
126
- brainstate-0.1.0.post20250217.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
127
- brainstate-0.1.0.post20250217.dist-info/top_level.txt,sha256=eQbGgKn0ptx7FDWuua0V0wr4K1VHi2iOUCYo3fUQBRA,11
128
- brainstate-0.1.0.post20250217.dist-info/RECORD,,
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,,