From 4b7ed563e87adaa77c385eed14c326ac51ba7913 Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Sat, 7 Jun 2025 15:38:07 -0400 Subject: [PATCH 01/15] minor edit to math in hh-lesson doc --- docs/tutorials/neurocog/hodgkin_huxley_cell.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/neurocog/hodgkin_huxley_cell.md b/docs/tutorials/neurocog/hodgkin_huxley_cell.md index 44e3b0a7..d47f23bf 100755 --- a/docs/tutorials/neurocog/hodgkin_huxley_cell.md +++ b/docs/tutorials/neurocog/hodgkin_huxley_cell.md @@ -82,7 +82,7 @@ neurons and muscle cells. It is a continuous-time dynamical system. Formally, the core dynamics of the H-H cell can be written out as follows: $$ -\tau_v \frac{\partial \mathbf{v}_t}{\partial t} &= \mathbf{j}_t - g_Na * \mathbf{m}^3_t * \mathbf{h}_t * (\mathbf{v}_t - v_Na) - g_K * \mathbf{n}^4_t * (\mathbf{v}_t - v_K) - g_L * (\mathbf{v}_t - v_L) \\ +\tau_v \frac{\partial \mathbf{v}_t}{\partial t} &= \mathbf{j}_t - g_{Na} * \mathbf{m}^3_t * \mathbf{h}_t * (\mathbf{v}_t - v_{Na}) - g_K * \mathbf{n}^4_t * (\mathbf{v}_t - v_K) - g_L * (\mathbf{v}_t - v_L) \\ \frac{\partial \mathbf{n}_t}{\partial t} &= \alpha_n(\mathbf{v}_t) * (1 - \mathbf{n}_t) - \beta_n(\mathbf{v}_t) * \mathbf{n}_t \\ \frac{\partial \mathbf{m}_t}{\partial t} &= \alpha_m(\mathbf{v}_t) * (1 - \mathbf{m}_t) - \beta_m(\mathbf{v}_t) * \mathbf{m}_t \\ \frac{\partial \mathbf{h}_t}{\partial t} &= \alpha_h(\mathbf{v}_t) * (1 - \mathbf{h}_t) - \beta_h(\mathbf{v}_t) * \mathbf{h}_t From d85f040a6db570a45e3ccc7faf2070ffe45c0635 Mon Sep 17 00:00:00 2001 From: Viet Dung Nguyen <60036798+rxng8@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:30:30 -0400 Subject: [PATCH 02/15] Fix workflow, numpy install, and pytest bug in github action workflows (#117) * Update pyproject.toml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml --- .github/workflows/python-package-conda.yml | 32 +++++++++------------- pyproject.toml | 8 ++++-- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/.github/workflows/python-package-conda.yml b/.github/workflows/python-package-conda.yml index 404cbaec..5bfec32e 100644 --- a/.github/workflows/python-package-conda.yml +++ b/.github/workflows/python-package-conda.yml @@ -10,25 +10,19 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Python 3.10 - uses: actions/setup-python@v3 + + - name: Install Miniconda + uses: conda-incubator/setup-miniconda@v2 with: - python-version: '3.10' - - name: Add conda to system path + auto-update-conda: true + python-version: 3.11 + environment-name: test + + - name: Install dependencies run: | - # $CONDA is an environment variable pointing to the root of the miniconda directory - echo $CONDA/bin >> $GITHUB_PATH - - name: Install current library and dependencies - run: | - pip install -e . - # - name: Lint with flake8 - # run: | - # conda install flake8 - # # stop the build if there are Python syntax errors or undefined names - # flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - # flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Test with pytest + conda install -n test numpy=1.26 pytest pip + conda run -n test pip install -e . + + - name: Run tests run: | - conda install pytest - pytest + conda run -n test pytest diff --git a/pyproject.toml b/pyproject.toml index 012f7e41..a0d8edae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,10 @@ [build-system] -requires = ["setuptools>=61.0"] -build-backend = "setuptools.build_meta" +requires = [ + "setuptools>=61.0", # default + "wheel", # also often needed + "numpy>=1.19.5" # add numpy here for build-time use +] +build-backend = "setuptools.build_meta" # using setuptool building engine [project] name = "ngclearn" From d8e52c828cd40515d66d667802b5f7904e8a323c Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Tue, 29 Jul 2025 17:35:48 -0400 Subject: [PATCH 03/15] minor nudge/cleanup to minor patched version 2.0.1 --- README.md | 8 ++++---- docs/installation.md | 2 +- docs/requirements.txt | 2 +- history.txt | 5 +++++ ngclearn/utils/model_utils.py | 7 +++++-- pyproject.toml | 2 +- requirements.txt | 2 +- 7 files changed, 18 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 7355b0bb..26d37e56 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ ngc-learn requires: 1) Python (>=3.10) 2) NumPy (>=1.22.0) 3) SciPy (>=1.7.0) -4) ngcsimlib (>=1.0.0), (visit official page here) +4) ngcsimlib (>=1.0.1), (visit official page here) 5) JAX (>=0.4.28) (to enable GPU use, make sure to install one of the CUDA variants) --- -ngc-learn 2.0.0 and later require Python 3.10 or newer as well as ngcsimlib >=1.0.0. +ngc-learn 2.0.3 and later require Python 3.10 or newer as well as ngcsimlib >=1.0.1. ngc-learn's plotting capabilities (routines within `ngclearn.utils.viz`) require Matplotlib (>=3.8.0) and imageio (>=2.31.5) and both plotting and density estimation tools (routines within ``ngclearn.utils.density``) will require Scikit-learn (>=0.24.2). @@ -75,7 +75,7 @@ Python 3.11.4 (main, MONTH DAY YEAR, TIME) [GCC XX.X.X] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import ngclearn >>> ngclearn.__version__ -'2.0.0' +'2.0.3' ``` Note: For access to the previous Tensorflow-2 version of ngc-learn (of @@ -122,7 +122,7 @@ $ python install -e . **Version:**
-2.0.2 +2.0.3 Author: Alexander G. Ororbia II
diff --git a/docs/installation.md b/docs/installation.md index 03bbe8a2..ce35db23 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -9,7 +9,7 @@ requires that you ensure that you have installed the following base dependencies your system. Note that this library was developed and tested on Ubuntu 22.04 (and earlier versions on 18.04/20.04). Specifically, ngc-learn requires: * Python (>=3.10) -* ngcsimlib (>=1.0.0), (official page) +* ngcsimlib (>=1.0.1), (official page) * NumPy (>=1.22.0) * SciPy (>=1.7.0) * JAX (>= 0.4.28; and jaxlib>=0.4.28) diff --git a/docs/requirements.txt b/docs/requirements.txt index 8fb2158c..0ebb3dc3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -8,4 +8,4 @@ matplotlib>=3.8.0 jax>=0.4.28 jaxlib>=0.4.28 imageio>=2.31.5 -ngcsimlib>=1.0.0 +ngcsimlib>=1.0.1 diff --git a/history.txt b/history.txt index 108b82d6..0e195519 100644 --- a/history.txt +++ b/history.txt @@ -80,3 +80,8 @@ History * integration of reinforce-synapse, block/partitioned synapse component ("patched-synapse") * basic unit-tests (pytest framework) integrated to support dev * includes support for Intel's lava-nc emulator (several spiking/stdp components that play with ngc-lava) + +2.0.1 +— — — — — — — — - + * Minor patch to point / depend on minor-patched ngcsimlib 1.0.1 (nudge to minor patched release) + * Added wrapper `inverse_sigmoid` for original `inverse_logistic` routine in model_utils (for convenience) diff --git a/ngclearn/utils/model_utils.py b/ngclearn/utils/model_utils.py index a7b9f141..facad87e 100755 --- a/ngclearn/utils/model_utils.py +++ b/ngclearn/utils/model_utils.py @@ -508,10 +508,13 @@ def d_sigmoid(x): sigm_x = nn.sigmoid(x) ## pre-compute once return sigm_x * (1. - sigm_x) +def inverse_sigmoid(x, clip_bound=0.03): ## wrapper call for naming convention ease + return inverse_logistic(x, clip_bound=clip_bound) + @jit -def inverse_logistic(x, clip_bound=0.03): # 0.03 +def inverse_logistic(x, clip_bound=0.03): """ - The inverse logistic link - logit function. + The inverse logistic link - the logit function. Args: x: data to transform via inverse logistic function diff --git a/pyproject.toml b/pyproject.toml index a0d8edae..71681a99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta" # using setuptool building engine [project] name = "ngclearn" -version = "2.0.2" +version = "2.0.3" description = "Simulation software for building and analyzing arbitrary predictive coding, spiking network, and biomimetic neural systems." authors = [ {name = "Alexander Ororbia", email = "ago@cs.rit.edu"}, diff --git a/requirements.txt b/requirements.txt index e689ce87..36285e9d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,6 +5,6 @@ matplotlib>=3.8.0 patchify jax>=0.4.28 jaxlib>=0.4.28 -ngcsimlib>=1.0.0 +ngcsimlib>=1.0.1 imageio>=2.31.5 pandas>=2.2.3 From d7485708558f84470f0d39466e8b7c1620834bdb Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Tue, 29 Jul 2025 17:37:43 -0400 Subject: [PATCH 04/15] minor nudge/cleanup to minor patched version 2.0.3 --- docs/installation.md | 2 +- history.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index ce35db23..64bcc5c1 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -78,7 +78,7 @@ Python 3.11.4 (main, MONTH DAY YEAR, TIME) [GCC XX.X.X] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import ngclearn >>> ngclearn.__version__ -'2.0.2' +'2.0.3' ``` Note: If you do not have a JSON configuration file in place (see tutorials diff --git a/history.txt b/history.txt index 0e195519..4ee30278 100644 --- a/history.txt +++ b/history.txt @@ -81,7 +81,7 @@ History * basic unit-tests (pytest framework) integrated to support dev * includes support for Intel's lava-nc emulator (several spiking/stdp components that play with ngc-lava) -2.0.1 +2.0.3 — — — — — — — — - * Minor patch to point / depend on minor-patched ngcsimlib 1.0.1 (nudge to minor patched release) * Added wrapper `inverse_sigmoid` for original `inverse_logistic` routine in model_utils (for convenience) From 09be2fe53fd5bc5838f98690cd1d91741954f494 Mon Sep 17 00:00:00 2001 From: Alex Ororbia Date: Wed, 30 Jul 2025 14:54:08 -0400 Subject: [PATCH 05/15] Merged back minor doc fix back to main (for syncing purposes) (#119) * Nudge of release to minor patched version 2.0.3 (#118) * nudge of doc to 2.0.2 (#115) Co-authored-by: Alexander Ororbia * minor edit to math in hh-lesson doc * Fix workflow, numpy install, and pytest bug in github action workflows (#117) * Update pyproject.toml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * Update python-package-conda.yml * minor nudge/cleanup to minor patched version 2.0.1 * minor nudge/cleanup to minor patched version 2.0.3 --------- Co-authored-by: Alexander Ororbia Co-authored-by: Viet Dung Nguyen <60036798+rxng8@users.noreply.github.com> * fixed typo/error in doc evolving_synapses.md --------- Co-authored-by: Alexander Ororbia Co-authored-by: Viet Dung Nguyen <60036798+rxng8@users.noreply.github.com> --- docs/tutorials/model_basics/evolving_synapses.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/model_basics/evolving_synapses.md b/docs/tutorials/model_basics/evolving_synapses.md index 7b194bb1..19f253ae 100755 --- a/docs/tutorials/model_basics/evolving_synapses.md +++ b/docs/tutorials/model_basics/evolving_synapses.md @@ -50,7 +50,7 @@ with Context("Circuit") as circuit: ## create and compile core simulation commands evolve_process = (JaxProcess() - >> a.evolve) + >> Wab.evolve) circuit.wrap_and_add_command(jit(evolve_process.pure), name="evolve") advance_process = (JaxProcess() From f72bee8babdd7d36ea535aa7baa9a8d4a546e0ba Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Wed, 30 Jul 2025 14:58:34 -0400 Subject: [PATCH 06/15] minor clean-up in model_basics docs --- docs/tutorials/model_basics/evolving_synapses.md | 15 +++++++-------- docs/tutorials/model_basics/model_building.md | 11 +++++------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/docs/tutorials/model_basics/evolving_synapses.md b/docs/tutorials/model_basics/evolving_synapses.md index 19f253ae..8cf92f8b 100755 --- a/docs/tutorials/model_basics/evolving_synapses.md +++ b/docs/tutorials/model_basics/evolving_synapses.md @@ -29,14 +29,13 @@ dkey, *subkeys = random.split(dkey, 6) ## create simple system with only one F-N cell with Context("Circuit") as circuit: - a = RateCell(name="a", n_units=1, tau_m=0., - act_fx="identity", key=subkeys[0]) - b = RateCell(name="b", n_units=1, tau_m=0., - act_fx="identity", key=subkeys[1]) - - Wab = HebbianSynapse(name="Wab", shape=(1, 1), eta=1., - sign_value=-1., weight_init=dist.constant(value=1.), - w_bound=0., key=subkeys[3]) + a = RateCell(name="a", n_units=1, tau_m=0., act_fx="identity", key=subkeys[0]) + b = RateCell(name="b", n_units=1, tau_m=0., act_fx="identity", key=subkeys[1]) + + Wab = HebbianSynapse( + name="Wab", shape=(1, 1), eta=1., sign_value=-1., weight_init=dist.constant(value=1.), + w_bound=0., key=subkeys[3] + ) # wire output compartment (rate-coded output zF) of RateCell `a` to input compartment of HebbianSynapse `Wab` Wab.inputs << a.zF diff --git a/docs/tutorials/model_basics/model_building.md b/docs/tutorials/model_basics/model_building.md index 88707aa9..e5cff8e6 100755 --- a/docs/tutorials/model_basics/model_building.md +++ b/docs/tutorials/model_basics/model_building.md @@ -21,12 +21,11 @@ dkey, *subkeys = random.split(dkey, 4) ## create simple dynamical system: a --> w_ab --> b with Context("model") as model: - a = RateCell(name="a", n_units=1, tau_m=0., - act_fx="identity", key=subkeys[0]) - b = RateCell(name="b", n_units=1, tau_m=20., - act_fx="identity", key=subkeys[1]) - Wab = HebbianSynapse(name="Wab", shape=(1, 1), - weight_init=dist.constant(value=1.), key=subkeys[2]) + a = RateCell(name="a", n_units=1, tau_m=0., act_fx="identity", key=subkeys[0]) + b = RateCell(name="b", n_units=1, tau_m=20., act_fx="identity", key=subkeys[1]) + Wab = HebbianSynapse( + name="Wab", shape=(1, 1), weight_init=dist.constant(value=1.), key=subkeys[2] + ) ``` Next, we will want to wire together the three components we have embedded into From 4ddc60d11ce15ba970c8905ea27c0729b951b242 Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Wed, 30 Jul 2025 15:11:53 -0400 Subject: [PATCH 07/15] minor fixes/cleanup of docs --- docs/tutorials/neurocog/hodgkin_huxley_cell.md | 2 -- docs/tutorials/neurocog/simple_leaky_integrator.md | 10 +++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/tutorials/neurocog/hodgkin_huxley_cell.md b/docs/tutorials/neurocog/hodgkin_huxley_cell.md index d47f23bf..e055b5c5 100755 --- a/docs/tutorials/neurocog/hodgkin_huxley_cell.md +++ b/docs/tutorials/neurocog/hodgkin_huxley_cell.md @@ -77,8 +77,6 @@ essentially probability values: `m` ($\mathbf{m}_t$) for the probability of sodium channel subunit activation, and `h` ($\mathbf{h}_t$) for the probability of sodium channel subunit inactivation. -neurons and muscle cells. It is a continuous-time dynamical system. - Formally, the core dynamics of the H-H cell can be written out as follows: $$ diff --git a/docs/tutorials/neurocog/simple_leaky_integrator.md b/docs/tutorials/neurocog/simple_leaky_integrator.md index 73068a73..ec8d485e 100644 --- a/docs/tutorials/neurocog/simple_leaky_integrator.md +++ b/docs/tutorials/neurocog/simple_leaky_integrator.md @@ -10,7 +10,7 @@ integrator components, the simplified leaky integrate-and-fire (SLIF). With our JSON configuration in place, go ahead and create a Python script, i.e., `run_slif.py`, to write your code for this part of the tutorial. -Now let's go ahead and set up the controller for this lesson's simulation, +Now let's go ahead and set up the controller/context for this lesson's simulation, where we will a dynamical system with only a single component, specifically the simplified LIF (sLIF), like so: @@ -55,14 +55,14 @@ with Context("Model") as model: ``` This node has quite a few compartments and constants but only a handful are important -for understanding how this model governs spiking/firing rates during -a controller's simulation window. Specifically, in this lesson, we will focus on +for understanding how this model governs spiking/firing rates within its simulation window. +Specifically, in this lesson, we will focus on its electrical current `j` (formally labeled here as $\mathbf{j}_t$), its voltage `v` (formally labeled: $\mathbf{v}_t$), its spike emission (or action potential) `s` (formally $\mathbf{s}_t$), and its refractory variable/marker (formally $\mathbf{r}_t$). The subscript $t$ indicates that this compartment variable takes on a certain value at a certain time step -$t$ and we will refer to the ngc-learn controller's integration time constant, +$t$ and we will refer to the ngc-learn context's integration time constant, the amount of time we move forward by, as $\Delta t$. The constants or hyper-parameters we will be most interested in are the cell's membrane resistance `R_m` (formally $R$ with its capacitance $C$ implied), its membrane time @@ -198,7 +198,7 @@ its synaptic current over time - we will not, however, cover this functionality in this walkthrough.)--> In effect, given the above, every time the `sLIF`'s `.advanceState()` function is -called within a simulation controller (`Controller()`), the above Euler integration of +called within a simulation controller context (`Context()`), the above Euler integration of the membrane potential differential equation is happening each time step. Knowing this, the last item required to understand ngc-learn's `sLIF` node's computation is related to its spike $\mathbf{s}_t$. The spike reading is computed simply by From 420e336934827608e9d9ffa0bda28c9f544bf230 Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Wed, 30 Jul 2025 15:24:31 -0400 Subject: [PATCH 08/15] fixed typo in integration tutorial doc --- docs/tutorials/neurocog/integration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/neurocog/integration.md b/docs/tutorials/neurocog/integration.md index a42dea7c..db3fa1ca 100644 --- a/docs/tutorials/neurocog/integration.md +++ b/docs/tutorials/neurocog/integration.md @@ -194,7 +194,7 @@ which should yield you a plot like the one below: -As you might observe, RK-4 give the best approximation of the solution. In addition, +As you might observe, RK-4 gives the best approximation of the solution. In addition, when the integration step size is held constant, Euler integration does quite poorly over just a few steps while RK-2 and Heun's method do much better at approximating the analytical equation. In the end, the type of numerical integration method employed can From 9ce44f82f823ec0f207b83d7460fe09bd4a4a98c Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Fri, 1 Aug 2025 12:38:41 -0400 Subject: [PATCH 09/15] updated papers/talk page for ngclearn --- docs/ngclearn_papers.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/docs/ngclearn_papers.md b/docs/ngclearn_papers.md index 09998a81..637f8a76 100644 --- a/docs/ngclearn_papers.md +++ b/docs/ngclearn_papers.md @@ -1,28 +1,31 @@ -# List of Papers/Publications +# List of Talks Related to NGC-Learn/Sim-Lib + +The following is a list of talks, including conference/symposium tech-talks, +given about NGC-Learn and/or NGC-Sim-Lib: + +1. Gebhardt, W. "An introduction to ngc-learn: A computational neuroscience library." 4th Applied Active Inference Symposium (2023). URL: https://www.youtube.com/watch?v=ynekj8F4zeY + +# List of Papers and Publications The following is a list of current papers that use ngc-learn (this list will be actively updated as we discover others that use ngc-learn): -1. Ororbia, A., and Kifer, D. The neural coding framework for learning -generative models. Nature Communications 13, 2064 (2022). +1. Ororbia, A., and Kifer, D. "The neural coding framework for learning generative models". Nature Communications 13, 2064 (2022). -2. Ororbia, A., and Mali, A. Backprop-free reinforcement learning with active -neural generative coding. Proceedings of the AAAI Conference on Artificial -intelligence (2022). +2. Ororbia, A., and Mali, A. "Backprop-free reinforcement learning with active neural generative coding". Proceedings of the AAAI Conference on Artificial intelligence (2022). -3. Ororbia, A. "Spiking neural predictive coding for continual learning -from data streams." arXiv preprint arXiv:1908.08655 (2019). +3. Ororbia, A. "Spiking neural predictive coding for continual learning from data streams." arXiv preprint arXiv:1908.08655 (2019). -4. Ororbia, A, and Kelly, M. Alex. "CogNGen: constructing the kernel of -a hyperdimensional predictive processing cognitive architecture." +4. Ororbia, A, and Kelly, M. Alex. "CogNGen: Constructing the kernel of a hyperdimensional predictive processing cognitive architecture." Proceedings of the Annual Meeting of the Cognitive Science Society (CogSci), Volume 44 (2022). -5. Ororbia, A., and Kelly, M. Alex. "“Learning using a Hyperdimensional Predictive Processing Cognitive -Architecture." 15th International Conference on Artificial General Intelligence (AGI) (2022). +5. Ororbia, A., and Kelly, M. Alex. "“Learning using a hyperdimensional predictive processing cognitive architecture." 15th International Conference on Artificial General Intelligence (AGI) (2022). -6. Ororbia, A., Mali, A., Kifer, D., & Giles, C. L. "Lifelong neural predictive coding: Learning cumulatively online without +6. Ororbia, A., Mali, A., Kifer, D., and Giles, C. L. "Lifelong neural predictive coding: Learning cumulatively online without forgetting." Thirty-sixth Conference on Neural Information Processing Systems (NeurIPS) (2022). +7. Gebhardt, W., and Ororbia, A. "Time-integrated spike-timing-dependent-plasticity." arXiv preprint arXiv:2407.10028 (2024). + Note: Please let us know if your work uses ngc-learn so we can update this page to accurately track ngc-learn's use and include your work in the accumulating body of work in predictive processing and/or brain-inspired computational modeling. From f658e4bf0e333ec225a824586f67ff93cdb1487b Mon Sep 17 00:00:00 2001 From: Alex Ororbia Date: Fri, 5 Dec 2025 19:27:44 -0500 Subject: [PATCH 10/15] Merging over v3 to main (for roll-out of v3 upgrade) (#125) * Working v3 * Undid fixed compartemts Undid the fixed compartments to work with new global constant tracking * Fixed an execution bug * ported over quad-lif to v3 - needs testing * ported over IF/quadLIF cells, minor revision to LIF cell * Start util cleanup * refactored/ported RAFCell to v3 * ported over/refactored WTASCell for v3 * wrote successful unit-test of WTASCell * put back in init-structure/pointers * fixed minor error in LIFCell, got unit-test for LIFCell to run * quad-lif test sketched * sketch of ifcell test * fixed minor bugs and tests locally pass for if, quad-lif, and lif-cells now, with minor patches to help fun and doc-strings * refactored raf-cell and test passed * refactored adex/test passed; minor cleanup in lif, raf, and wtas cells * refactored fn-cell and test passed * cleaned up lif, raf, wtas, fn, and quad-lif cells repr method * refactored and tests passed for izh and h-h cells * JaxProcess update * cleaned up dunder repr method, moved to JaxComponent parent; fixed __init__ pointer to tensorstats * refactored alpha and exp-synapses, tests passed; minor edit to __init__ for synapses * refactored short-term syn, tests passed - including stp-dense-syn and minor cleanup/edit to synapse __init__ * refactored bcm-syn and test passed * refactored exp-stdp-syn and passed tests for exp-stdp-syn and trace-stdp-syn * refactored event-stdp-syn and test passed * refactored mstdpet-syn and test passed * refactored stdp-conv-syn/conv-syn and test passed * refactored and passed test for deconv/stdp-deconv-syn and other minor cleanup for conv/deconv support * Refactoring neuronal and synaptic components (#123) - merge from fork to v3 * refactoring graded cells * update refactored models * update sLIF cell --------- Co-authored-by: Alex Ororbia * commented out deprecator in hebb-syn and exp-kernel * update hebbian synapse * update hebbian synapse * working reinforce synapse * minor edits to exp-kernel/wtas-cell * update requirements * refactored conv/deconv-hebb-syn and tests passed * update hebbian synapse reset bug * update reset methods * update patched synapse reset * add `not self.inputs.targeted and ` to required components. Fixing general `__repr__` bug in `jaxcomponent` * minor edit to lif/modulated-syn init file * fixed some minor bugs in rate-coded cells/hebb-syn * update code * minor patches to components, including hebb-syn/conv/deconv and reward-cell * minor patches to components, including hebb-syn/conv/deconv and reward-cell * update testing for graded neurons and input encoders * update phasor cell * update test bernoulli cell and poisson cell * update components and their related test cases * fixed monitor bugs from v2, tweaked unit-tests for input-encoders/latency-cell * update test case for test_sLIFCell.py * some cleanup * made revisions to components/clean-up; added back in deprecators * removed lava sub-module, and removed monitor/base-monitor legacy components * minor cleanup of inits * refactored regression module to be compliant with v3 * adjusted sphinx-docs w.r.t. new v3 refactoring * minor revision to double-exp syn pointing, mods to modeling docs * updated adex tutorial doc to v3 * revised adex and error-cell neurocog tutorials * fixed minor issues in input-encoders, further revisions to docs for v3 * revised dyn/chem-syn neurocog doc, cleaned up dynamic syn * revised fn and hh-cell neurocog docs, added some refs to distribution generator * revised integration and izh-cell neurocog docs * revised izh-cell, cleaned-up fn-cell, and revised lif neurocog docs * revised metrics/plotting neurocog docs * revised mod/reward-stdp neurocog doc * revised stp-syn neurocog doc and updated stp-syn to use proper initializer * revised elements of utils to comply with docs * revised stdp neurocog doc to v3 * revised traces neurocog tutorial to v3 * cleaned up utils.optim and wrote compliant NAG optim * cleaned up utils.optim and wrote compliant NAG optim * cleanup of components, added leaky-noise-cell, minor edits * revised leaky-noise-cell, wrote its unit test, test-passed * some revisions/updates to toc/pointer/general tutorial docs * minor revisions to pyproject/req files * update reinforce synapse * update test cases * implemented in-house gmm, in-built to ngclearn; tested on gaussian mode data * wrote gmm density estimator tutorial * patched some tests/syn/neuron components, added sketch of bmm density * fixed test_laplacianErrorCell and laplace-cell bug * fixed test_laplacianErrorCell and laplace-cell bug * made patches to bmm * updated density tutorial/neurocog doc * minor edit to gmm/bmm docs * minor edit to gmm/bmm docs * cleaned up density structure, use parent mixture class to organize model variations * cleaned up density structure, use parent mixture class to organize model variations * added basic exp-mixture to utils.density * minor edits to emm * cleaned up mixtures and finished debugging EMM/works on example * removed old weight_distribution.py, other cleanup/revisions throughout * minor edit to data-loader * revised tests to no longer use weight_distribution/revisions throughout * minor edit to emm doc * added bic calculation to metric_utils * fix ratecell ug of passing unrelated kwargs to parent class * added calc_update() co-routine to hebbian-syn component * fix weight init * integrated rbm/harmonium model-exhibit * Update __init__.py Added the config/logging back to the init * placed pointer to rao-ballard1999 exhibit; updates to docs * updates to docs/revisions * removed flag from bernoulli/latency-cells for now; minor edit to doc * updates to theory doc * updated history log * minor clean-up of ngclearn.utils.viz.dim_reduce * Update jaxComponent.py Added support for turning off autosave * update hebbian synapse saving * update saving and loading utils, making hebbian synapse use these utils for custom optimizer params saving and loading * minor revisions/polish * modded docs to include v3 foundations * updates to init for logging * Updates to lessons * final cleanup/polish/update to docs for v3 nudge * updates to museum doc for v3 * nudged citation file * minor nudge to docs/files to point to v3 --------- Co-authored-by: Will Gebhardt Co-authored-by: Alexander Ororbia Co-authored-by: Viet Dung Nguyen <60036798+rxng8@users.noreply.github.com> Co-authored-by: Viet Nguyen Co-authored-by: Viet Dung Nguyen --- CITATION.cff | 4 +- README.md | 8 +- docs/images/museum/harmonium/rbm_arch.jpg | Bin 0 -> 31474 bytes docs/images/museum/harmonium/rbm_recon.jpg | Bin 0 -> 120969 bytes .../museum/harmonium/receptive_fields.jpg | Bin 0 -> 307653 bytes docs/images/museum/harmonium/samples_0.jpg | Bin 0 -> 102083 bytes docs/images/museum/harmonium/samples_1.jpg | Bin 0 -> 112003 bytes docs/images/museum/harmonium/samples_2.jpg | Bin 0 -> 113008 bytes docs/images/tutorials/neurocog/gmm_fit.jpg | Bin 0 -> 72196 bytes .../images/tutorials/neurocog/gmm_samples.jpg | Bin 0 -> 68946 bytes docs/index.rst | 9 +- docs/installation.md | 57 +-- docs/modeling/neurons.md | 50 ++- docs/modeling/synapses.md | 28 +- docs/museum/event_stdp_patches.md | 13 + docs/museum/harmonium.md | 361 +++++++++++++++++ docs/museum/index.rst | 21 +- docs/museum/model_museum.md | 17 +- docs/museum/pc_rao_ballard1999.md | 12 + docs/museum/pcn_discrim.md | 2 +- docs/museum/rl_snn.md | 26 +- docs/museum/sindy.md | 12 +- docs/museum/snn_bfa.md | 4 +- docs/museum/snn_dc.md | 28 +- docs/museum/sparse_coding.md | 268 +++++------- docs/ngclearn_papers.md | 30 +- docs/ngclearn_talks.md | 13 + docs/source/ngclearn.commands.rst | 10 - .../ngclearn.components.lava.neurons.rst | 21 - docs/source/ngclearn.components.lava.rst | 31 -- .../ngclearn.components.lava.synapses.rst | 37 -- .../ngclearn.components.lava.traces.rst | 21 - .../ngclearn.components.neurons.graded.rst | 8 + docs/source/ngclearn.components.rst | 17 - docs/source/ngclearn.rst | 1 - docs/source/ngclearn.utils.density.rst | 30 +- .../ngclearn.utils.feature_dictionaries.rst | 21 + docs/source/ngclearn.utils.masks.rst | 21 + docs/source/ngclearn.utils.optim.rst | 8 + docs/source/ngclearn.utils.rst | 38 +- docs/source/ngclearn.utils.viz.rst | 16 + docs/tutorials/configuration/compartments.md | 44 ++ docs/tutorials/configuration/compiling.md | 98 +++++ docs/tutorials/configuration/components.md | 32 ++ docs/tutorials/configuration/context.md | 67 +++ docs/tutorials/configuration/global_state.md | 52 +++ docs/tutorials/configuration/index.rst | 28 ++ docs/tutorials/configuration/processes.md | 90 ++++ docs/tutorials/foundations.md | 18 - docs/tutorials/foundations/commands.md | 137 ------- docs/tutorials/foundations/contexts.md | 70 ---- docs/tutorials/foundations/monitors.md | 72 ---- docs/tutorials/foundations/operations.md | 60 --- docs/tutorials/index.rst | 36 +- docs/tutorials/intro.md | 70 +--- docs/tutorials/lava/hebbian_learning.md | 312 -------------- docs/tutorials/lava/introduction.md | 37 -- docs/tutorials/lava/lava_components.md | 29 -- docs/tutorials/lava/lava_context.md | 103 ----- docs/tutorials/lava/monitors.md | 17 - docs/tutorials/lava/setup.md | 26 -- docs/tutorials/model_basics/configuration.md | 52 ++- .../model_basics/evolving_synapses.md | 123 +++--- docs/tutorials/model_basics/json_modules.md | 154 ------- docs/tutorials/model_basics/model_building.md | 150 +++---- docs/tutorials/neurocog/adex_cell.md | 69 +--- docs/tutorials/neurocog/density_modeling.md | 164 ++++++++ docs/tutorials/neurocog/dynamic_synapses.md | 108 +++-- docs/tutorials/neurocog/error_cell.md | 35 +- .../neurocog/fitzhugh_nagumo_cell.md | 110 ++--- docs/tutorials/neurocog/hebbian.md | 21 +- .../tutorials/neurocog/hodgkin_huxley_cell.md | 94 ++--- docs/tutorials/neurocog/index.rst | 38 +- docs/tutorials/neurocog/input_cells.md | 34 +- docs/tutorials/neurocog/integration.md | 69 +--- docs/tutorials/neurocog/izhikevich_cell.md | 124 ++---- docs/tutorials/neurocog/lif.md | 97 ++--- docs/tutorials/neurocog/metrics.md | 42 +- docs/tutorials/neurocog/mod_stdp.md | 274 ++++--------- docs/tutorials/neurocog/plotting.md | 24 +- docs/tutorials/neurocog/rate_cell.md | 97 ++--- .../neurocog/short_term_plasticity.md | 171 +++----- .../neurocog/simple_leaky_integrator.md | 205 +++------- docs/tutorials/neurocog/stdp.md | 152 +++---- docs/tutorials/neurocog/traces.md | 79 ++-- docs/tutorials/theory.md | 51 +-- history.txt | 19 +- ngclearn/__init__.py | 35 +- ngclearn/commands/__init__.py | 1 - ngclearn/components/__init__.py | 8 +- ngclearn/components/base_monitor.py | 330 --------------- .../components/input_encoders/__init__.py | 1 + .../input_encoders/bernoulliCell.py | 86 ++-- .../components/input_encoders/latencyCell.py | 150 +++---- .../components/input_encoders/phasorCell.py | 86 ++-- .../components/input_encoders/poissonCell.py | 100 ++--- ngclearn/components/jaxComponent.py | 63 ++- ngclearn/components/lava/__init__.py | 11 - ngclearn/components/lava/monitor.py | 32 -- ngclearn/components/lava/neurons/LIFCell.py | 177 -------- ngclearn/components/lava/neurons/__init__.py | 1 - ngclearn/components/lava/synapses/__init__.py | 3 - .../lava/synapses/hebbianSynapse.py | 159 -------- .../components/lava/synapses/staticSynapse.py | 122 ------ .../lava/synapses/traceSTDPSynapse.py | 181 --------- ngclearn/components/lava/traces/__init__.py | 1 - ngclearn/components/lava/traces/gatedTrace.py | 69 ---- ngclearn/components/monitor.py | 31 -- ngclearn/components/neurons/__init__.py | 2 + .../components/neurons/graded/__init__.py | 4 +- .../neurons/graded/bernoulliErrorCell.py | 74 ++-- .../neurons/graded/gaussianErrorCell.py | 66 +-- .../neurons/graded/laplacianErrorCell.py | 65 +-- .../neurons/graded/leakyNoiseCell.py | 157 +++++++ .../components/neurons/graded/rateCell.py | 143 ++++--- .../neurons/graded/rewardErrorCell.py | 82 ++-- ngclearn/components/neurons/spiking/IFCell.py | 134 ++---- .../components/neurons/spiking/LIFCell.py | 242 ++++------- .../components/neurons/spiking/RAFCell.py | 111 +++-- .../components/neurons/spiking/WTASCell.py | 93 ++--- .../components/neurons/spiking/__init__.py | 1 + .../components/neurons/spiking/adExCell.py | 92 ++--- .../neurons/spiking/fitzhughNagumoCell.py | 104 ++--- .../neurons/spiking/hodgkinHuxleyCell.py | 136 +++---- .../neurons/spiking/izhikevichCell.py | 95 ++--- .../components/neurons/spiking/quadLIFCell.py | 211 ++++------ .../components/neurons/spiking/sLIFCell.py | 104 ++--- ngclearn/components/other/expKernel.py | 45 +- ngclearn/components/other/varTrace.py | 87 ++-- .../components/synapses/STPDenseSynapse.py | 137 +++---- ngclearn/components/synapses/__init__.py | 9 +- ngclearn/components/synapses/alphaSynapse.py | 101 ++--- .../synapses/convolution/__init__.py | 1 + .../synapses/convolution/convSynapse.py | 107 +++-- .../synapses/convolution/deconvSynapse.py | 109 +++-- .../convolution/hebbianConvSynapse.py | 143 +++---- .../convolution/hebbianDeconvSynapse.py | 124 +++--- .../convolution/traceSTDPConvSynapse.py | 111 +++-- .../convolution/traceSTDPDeconvSynapse.py | 118 +++--- ngclearn/components/synapses/denseSynapse.py | 98 ++--- .../components/synapses/doubleExpSynapse.py | 104 ++--- .../components/synapses/exponentialSynapse.py | 94 ++--- .../components/synapses/hebbian/BCMSynapse.py | 106 ++--- .../synapses/hebbian/eventSTDPSynapse.py | 104 ++--- .../synapses/hebbian/expSTDPSynapse.py | 126 +++--- .../synapses/hebbian/hebbianSynapse.py | 140 ++++--- .../synapses/hebbian/traceSTDPSynapse.py | 163 +++----- .../synapses/modulated/MSTDPETSynapse.py | 109 ++--- .../synapses/modulated/REINFORCESynapse.py | 207 ++++++---- .../synapses/patched/hebbianPatchedSynapse.py | 132 +++--- .../synapses/patched/patchedSynapse.py | 173 ++++---- ngclearn/modules/__init__.py | 4 - ngclearn/modules/regression/__init__.py | 5 - ngclearn/modules/regression/elastic_net.py | 97 ++--- ngclearn/modules/regression/lasso.py | 116 +++--- ngclearn/modules/regression/ridge.py | 109 ++--- ngclearn/utils/JaxProcessesMixin.py | 41 ++ ngclearn/utils/__init__.py | 12 +- ngclearn/utils/analysis/linear_probe.py | 6 +- ngclearn/utils/data_loader.py | 28 +- ngclearn/utils/density/__init__.py | 6 + ngclearn/utils/density/bernoulliMixture.py | 221 ++++++++++ ngclearn/utils/density/exponentialMixture.py | 216 ++++++++++ ngclearn/utils/density/gaussianMixture.py | 277 +++++++++++++ ngclearn/utils/density/gmm.py | 82 ---- ngclearn/utils/density/mixture.py | 33 ++ ngclearn/utils/diffeq/ode_utils.py | 13 +- ngclearn/utils/diffeq/odes.py | 13 + ngclearn/utils/distribution_generator.py | 383 ++++++++++++++++++ .../utils/feature_dictionaries/__init__.py | 1 + .../feature_dictionaries/polynomialLibrary.py | 23 +- ngclearn/utils/io_utils.py | 17 +- ngclearn/utils/jaxProcess.py | 171 -------- ngclearn/utils/masks/__init__.py | 1 + ngclearn/utils/masks/multiblock2d.py | 276 +++++++------ ngclearn/utils/metric_utils.py | 200 +++++++-- ngclearn/utils/model_utils.py | 89 ++-- ngclearn/utils/optim/adam.py | 23 +- ngclearn/utils/optim/nag.py | 84 ++++ ngclearn/utils/optim/optim_utils.py | 5 +- ngclearn/utils/optim/sgd.py | 21 +- ngclearn/utils/patch.py | 101 +++++ ngclearn/utils/patch_utils.py | 16 +- ngclearn/utils/viz/compartment_plot.py | 38 ++ ngclearn/utils/viz/compartment_raster.py | 49 +++ ngclearn/utils/viz/dim_reduce.py | 32 +- ngclearn/utils/weight_distribution.py | 269 ------------ pyproject.toml | 4 +- requirements.txt | 12 +- .../input_encoders/test_bernoulliCell.py | 23 +- .../input_encoders/test_latencyCell.py | 36 +- .../input_encoders/test_phasorCell.py | 24 +- .../input_encoders/test_poissonCell.py | 25 +- .../neurons/graded/test_RateCell.py | 35 +- .../neurons/graded/test_bernoulliErrorCell.py | 34 +- .../neurons/graded/test_gaussianErrorCell.py | 36 +- .../neurons/graded/test_laplacianErrorCell.py | 55 +-- .../neurons/graded/test_leakyNoiseCell.py | 47 +++ .../neurons/graded/test_rewardErrorCell.py | 44 +- .../components/neurons/spiking/test_IFCell.py | 55 +-- .../neurons/spiking/test_LIFCell.py | 50 +-- .../neurons/spiking/test_RAFCell.py | 51 +-- .../neurons/spiking/test_WTASCell.py | 48 +-- .../neurons/spiking/test_adExCell.py | 56 ++- .../spiking/test_fitzhughNagumoCell.py | 56 ++- .../neurons/spiking/test_hodgkinHuxleyCell.py | 49 +-- .../neurons/spiking/test_izhikevichCell.py | 58 ++- .../neurons/spiking/test_quadLIFCell.py | 54 +-- .../neurons/spiking/test_sLIFCell.py | 35 +- tests/components/other/test_expKernel.py | 28 +- tests/components/other/test_varTrace.py | 28 +- .../convolution/test_hebbianConvSynapse.py | 63 +-- .../convolution/test_hebbianDeconvSynapse.py | 69 ++-- .../convolution/test_traceSTDPConvSynapse.py | 65 ++- .../test_traceSTDPDeconvSynapse.py | 68 ++-- .../synapses/hebbian/test_BCMSynapse.py | 47 +-- .../synapses/hebbian/test_eventSTDPSynapse.py | 58 +-- .../synapses/hebbian/test_expSTDPSynapse.py | 61 ++- .../synapses/hebbian/test_hebbianSynapse.py | 54 +-- .../synapses/hebbian/test_traceSTDPSynapse.py | 60 ++- .../synapses/modulated/test_MSTDPETSynapse.py | 62 +-- .../modulated/test_REINFORCESynapse.py | 73 ++-- .../patched/test_hebbianPatchedSynapse.py | 55 +-- .../synapses/patched/test_patchedSynapse.py | 43 +- .../synapses/test_STPDenseSynapse.py | 39 +- .../synapses/test_exponentialSynapse.py | 30 +- 226 files changed, 7109 insertions(+), 9167 deletions(-) create mode 100755 docs/images/museum/harmonium/rbm_arch.jpg create mode 100644 docs/images/museum/harmonium/rbm_recon.jpg create mode 100644 docs/images/museum/harmonium/receptive_fields.jpg create mode 100755 docs/images/museum/harmonium/samples_0.jpg create mode 100755 docs/images/museum/harmonium/samples_1.jpg create mode 100755 docs/images/museum/harmonium/samples_2.jpg create mode 100644 docs/images/tutorials/neurocog/gmm_fit.jpg create mode 100644 docs/images/tutorials/neurocog/gmm_samples.jpg create mode 100644 docs/museum/event_stdp_patches.md create mode 100644 docs/museum/harmonium.md create mode 100644 docs/museum/pc_rao_ballard1999.md create mode 100644 docs/ngclearn_talks.md delete mode 100644 docs/source/ngclearn.commands.rst delete mode 100644 docs/source/ngclearn.components.lava.neurons.rst delete mode 100644 docs/source/ngclearn.components.lava.rst delete mode 100644 docs/source/ngclearn.components.lava.synapses.rst delete mode 100644 docs/source/ngclearn.components.lava.traces.rst create mode 100644 docs/source/ngclearn.utils.feature_dictionaries.rst create mode 100644 docs/source/ngclearn.utils.masks.rst create mode 100644 docs/tutorials/configuration/compartments.md create mode 100644 docs/tutorials/configuration/compiling.md create mode 100644 docs/tutorials/configuration/components.md create mode 100644 docs/tutorials/configuration/context.md create mode 100644 docs/tutorials/configuration/global_state.md create mode 100644 docs/tutorials/configuration/index.rst create mode 100644 docs/tutorials/configuration/processes.md delete mode 100644 docs/tutorials/foundations.md delete mode 100755 docs/tutorials/foundations/commands.md delete mode 100644 docs/tutorials/foundations/contexts.md delete mode 100644 docs/tutorials/foundations/monitors.md delete mode 100755 docs/tutorials/foundations/operations.md delete mode 100644 docs/tutorials/lava/hebbian_learning.md delete mode 100644 docs/tutorials/lava/introduction.md delete mode 100644 docs/tutorials/lava/lava_components.md delete mode 100644 docs/tutorials/lava/lava_context.md delete mode 100644 docs/tutorials/lava/monitors.md delete mode 100644 docs/tutorials/lava/setup.md delete mode 100644 docs/tutorials/model_basics/json_modules.md create mode 100644 docs/tutorials/neurocog/density_modeling.md delete mode 100644 ngclearn/commands/__init__.py delete mode 100644 ngclearn/components/base_monitor.py delete mode 100644 ngclearn/components/lava/__init__.py delete mode 100644 ngclearn/components/lava/monitor.py delete mode 100644 ngclearn/components/lava/neurons/LIFCell.py delete mode 100644 ngclearn/components/lava/neurons/__init__.py delete mode 100644 ngclearn/components/lava/synapses/__init__.py delete mode 100644 ngclearn/components/lava/synapses/hebbianSynapse.py delete mode 100755 ngclearn/components/lava/synapses/staticSynapse.py delete mode 100755 ngclearn/components/lava/synapses/traceSTDPSynapse.py delete mode 100755 ngclearn/components/lava/traces/__init__.py delete mode 100755 ngclearn/components/lava/traces/gatedTrace.py delete mode 100644 ngclearn/components/monitor.py create mode 100755 ngclearn/components/neurons/graded/leakyNoiseCell.py create mode 100644 ngclearn/utils/JaxProcessesMixin.py mode change 100755 => 100644 ngclearn/utils/__init__.py create mode 100644 ngclearn/utils/density/bernoulliMixture.py create mode 100644 ngclearn/utils/density/exponentialMixture.py create mode 100644 ngclearn/utils/density/gaussianMixture.py delete mode 100644 ngclearn/utils/density/gmm.py create mode 100644 ngclearn/utils/density/mixture.py create mode 100644 ngclearn/utils/distribution_generator.py create mode 100644 ngclearn/utils/feature_dictionaries/__init__.py delete mode 100644 ngclearn/utils/jaxProcess.py create mode 100644 ngclearn/utils/masks/__init__.py create mode 100644 ngclearn/utils/optim/nag.py create mode 100644 ngclearn/utils/patch.py create mode 100644 ngclearn/utils/viz/compartment_plot.py create mode 100755 ngclearn/utils/viz/compartment_raster.py delete mode 100755 ngclearn/utils/weight_distribution.py create mode 100644 tests/components/neurons/graded/test_leakyNoiseCell.py diff --git a/CITATION.cff b/CITATION.cff index e7243de9..ee939cc7 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,10 +6,12 @@ authors: orcid: https://orcid.org/0000-0002-2590-1310 - family-names: Gebhardt given-names: William + orcid: https://orcid.org/0009-0008-7456-6556 - family-names: Mali given-names: Ankur + orcid: https://orcid.org/0000-0001-5813-3584 title: "ngc-learn" -version: 1.0.0 +version: 3.0.0 identifiers: - type: doi value: 10.5281/zenodo.6605728 diff --git a/README.md b/README.md index 26d37e56..accc2543 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ ngc-learn requires: 1) Python (>=3.10) 2) NumPy (>=1.22.0) 3) SciPy (>=1.7.0) -4) ngcsimlib (>=1.0.1), (visit official page here) +4) ngcsimlib (>=3.0.0), (visit official page here) 5) JAX (>=0.4.28) (to enable GPU use, make sure to install one of the CUDA variants) --- -ngc-learn 2.0.3 and later require Python 3.10 or newer as well as ngcsimlib >=1.0.1. +ngc-learn 3.0.0 and later require Python 3.10 or newer as well as ngcsimlib >=3.0.0. ngc-learn's plotting capabilities (routines within `ngclearn.utils.viz`) require Matplotlib (>=3.8.0) and imageio (>=2.31.5) and both plotting and density estimation tools (routines within ``ngclearn.utils.density``) will require Scikit-learn (>=0.24.2). @@ -75,7 +75,7 @@ Python 3.11.4 (main, MONTH DAY YEAR, TIME) [GCC XX.X.X] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import ngclearn >>> ngclearn.__version__ -'2.0.3' +'3.0.0' ``` Note: For access to the previous Tensorflow-2 version of ngc-learn (of @@ -122,7 +122,7 @@ $ python install -e . **Version:**
-2.0.3 +3.0.0 Author: Alexander G. Ororbia II
diff --git a/docs/images/museum/harmonium/rbm_arch.jpg b/docs/images/museum/harmonium/rbm_arch.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9da2f79cd7ce717219a1ec2e6a0ec981efcaba61 GIT binary patch literal 31474 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 G=YIh@Mo!-V literal 0 HcmV?d00001 diff --git a/docs/images/museum/harmonium/rbm_recon.jpg b/docs/images/museum/harmonium/rbm_recon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bbce8837931de9feb0d2a41628929d0f1f8e32e GIT binary patch literal 120969 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�Ifh!?WWZ@* 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≷1$;Prn@)9fJFUI4Acc$h|(d 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

P4jAI`6C05b4^ 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

+O1eEP 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 literal 0 HcmV?d00001 diff --git a/docs/images/museum/harmonium/samples_0.jpg b/docs/images/museum/harmonium/samples_0.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0055fd0b0b85dcc9eabb5175c67ecb3108dccf32 GIT binary patch literal 102083 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 literal 0 HcmV?d00001 diff --git a/docs/images/museum/harmonium/samples_1.jpg b/docs/images/museum/harmonium/samples_1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f9310647ad8e246d06ab7c9f29a1fe44b5879184 GIT binary patch literal 112003 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 Z-*(AT0phV$@ZwRBk=Fma57m$1e*h0#Gm`)S literal 0 HcmV?d00001 diff --git a/docs/images/museum/harmonium/samples_2.jpg b/docs/images/museum/harmonium/samples_2.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0f1323741fb094f567357cacb86b7168cb8cdbea GIT binary patch literal 113008 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äq5kVg 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 Tp4fw`&;z7q|L;EZKL`E=Zq)xR literal 0 HcmV?d00001 diff --git a/docs/images/tutorials/neurocog/gmm_fit.jpg b/docs/images/tutorials/neurocog/gmm_fit.jpg new file mode 100644 index 0000000000000000000000000000000000000000..64a51715990f384c2824a502bf5ac2128b229082 GIT binary patch literal 72196 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%0Df}gRtP{6_BKC6X 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 and is distributed under the 3-Clause BSD license. +**ngc-learn** is a Python library for building, simulating, and analyzing biomimetic and NeuroAI computational models, arbitrary predictive processing/coding models, spiking neural networks, and general dynamical systems. This toolkit is built on top of `JAX `_ and is distributed under the 3-Clause BSD license. .. toctree:: :maxdepth: 1 @@ -23,6 +20,7 @@ and spiking neural networks. This toolkit is built on top of tutorials/intro tutorials/theory + tutorials/configuration/index tutorials/index tutorials/neurocog/index @@ -52,9 +50,10 @@ and spiking neural networks. This toolkit is built on top of .. toctree:: :maxdepth: 1 - :caption: Papers that use NGC-Learn + :caption: NGC-Learn Papers & Media ngclearn_papers + ngclearn_talks Indices and tables ================== diff --git a/docs/installation.md b/docs/installation.md index 64bcc5c1..01474aa1 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,65 +1,41 @@ # Installation -**ngc-learn** officially supports Linux on Python 3. It can be run with or -without a GPU. +**ngc-learn** officially supports Linux on Python 3. It can be run with or without a GPU. -Setup: ngc-learn, -in its entirety (including its supporting utilities), -requires that you ensure that you have installed the following base dependencies in -your system. Note that this library was developed and tested on Ubuntu 22.04 (and earlier versions on 18.04/20.04). -Specifically, ngc-learn requires: +Setup: NGC-Learn, in its entirety (including its supporting utility sub-packages), requires that you ensure that you have installed the following base dependencies in your system. Note that this library was developed and tested on Ubuntu 22.04 (with much earlier versions on Ubuntu 18.04/20.04). +Specifically, NGC-Learn requires: * Python (>=3.10) -* ngcsimlib (>=1.0.1), (official page) +* ngcsimlib (>=3.0.0), (official page) * NumPy (>=1.22.0) * SciPy (>=1.7.0) * JAX (>= 0.4.28; and jaxlib>=0.4.28) * Matplotlib (>=3.8.0), (for `ngclearn.utils.viz`) * Scikit-learn (>=1.6.1), (for `ngclearn.utils.patch_utils` and `ngclearn.utils.density`) -Note that the above requirements are taken care of if one installs ngc-learn -through either `pip`. One can either install the CPU version of ngc-learn (if no JAX is -pre-installed or only the CPU version of JAX is installed currently) via +Note that the above requirements are taken care of if one installs NGC-Learn through either `pip`. One can either install the CPU version of NGC-Learn (if no JAX is pre-installed or only the CPU version of JAX is currently installed) via: ```console $ pip install ngclearn ``` -or install the GPU version of ngc-learn by first installing the -CUDA 12 -version of JAX before running the above pip command. +or install the GPU version of NGC-Learn by first installing the CUDA 12 version of JAX before running the above pip command. -Alternatively, one may locally, step-by-step (see below), install and setup -ngc-learn from source after pulling from the repo. +Alternatively, one may locally, step-by-step (see below), install and setup NGC-Learn from source after pulling from the repo. -Note that installing the official pip package without any form of JAX installed -on your system will default to downloading the CPU version of ngc-learn (see -below for installing the GPU version). +Note that installing the official pip package without any form of JAX installed on your system will default to downloading the CPU version of NGC-Learn (see below for installing the GPU version). ## Install from Source -0. Install ngc-sim-lib first (as an editable install); visit the repo -https://github.com/NACLab/ngc-sim-lib for details. +1. Install NGC-Sim-Lib first (as an editable install); visit the repo https://github.com/NACLab/ngc-sim-lib for details. -1. Clone the ngc-learn repository: +2. Clone the NGC-Learn repository: ```console $ git clone https://github.com/NACLab/ngc-learn.git $ cd ngc-learn ``` -2. (Optional; only for GPU version) Install JAX for either CUDA 12 , depending - on your system setup. Follow the - installation instructions - on the official JAX page to properly install the CUDA 11 or 12 version. +3. (Optional; only for GPU version) Install JAX for either CUDA 12 , depending on your system setup. Follow the installation instructions on the official JAX page to properly install the CUDA 11 or 12 version. - - -3. Install the ngc-learn package via: +4. Install the NGC-Learn package via: ```console $ pip install . ``` @@ -68,22 +44,21 @@ or, to install as an editable install for development, run: $ pip install -e . ``` -If the installation was successful, you should see the following if you test -it against your Python interpreter, i.e., run the $ python command -and complete the following sequence of steps as depicted in the screenshot below:
- +If the installation was successful, you should see the following if you test it against your Python interpreter, i.e., run the $ python command and complete the following sequence of steps as depicted in the screenshot below:
```console Python 3.11.4 (main, MONTH DAY YEAR, TIME) [GCC XX.X.X] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import ngclearn >>> ngclearn.__version__ -'2.0.3' +'3.0.0' ``` + diff --git a/docs/modeling/neurons.md b/docs/modeling/neurons.md index 4babf8f7..36f7c2b1 100644 --- a/docs/modeling/neurons.md +++ b/docs/modeling/neurons.md @@ -86,6 +86,22 @@ and `dmu` is the first derivative with respect to the mean parameter. :noindex: ``` +#### Bernoulli Error Cell + +This cell is (currently) fixed to be a (factorized) multivariate Bernoulli cell. +Concretely, this cell implements compartments/mechanics to facilitate Bernoulli +log likelihood error calculations. + +```{eval-rst} +.. autoclass:: ngclearn.components.BernoulliErrorCell + :noindex: + + .. automethod:: advance_state + :noindex: + .. automethod:: reset + :noindex: +``` + ## Spiking Neurons These neuronal cells exhibit dynamics that involve emission of discrete action @@ -117,10 +133,42 @@ negative pressure on the membrane potential values at `t`). :noindex: ``` +### The IF (Integrate-and-Fire) Cell + +This cell (the simple "integrator") models dynamics over the voltage `v`. Note that `thr` is used as the membrane potential threshold and no adaptive threshold mechanics are implemented for this cell model. +(This cell is primarily a faster, convenience formulation that omits the leak element of the LIF.) + +```{eval-rst} +.. autoclass:: ngclearn.components.IFCell + :noindex: + + .. automethod:: advance_state + :noindex: + .. automethod:: reset + :noindex: +``` + +### The Winner-Take-All (WTAS) Cell + +This cell models dynamics over the voltage `v` as a simple instantaneous +softmax function of the electrical current input, where only a single +spike, which wins the competition across the group of neuronal units +within this component, emits a pulse/spike. + +```{eval-rst} +.. autoclass:: ngclearn.components.WTASCell + :noindex: + + .. automethod:: advance_state + :noindex: + .. automethod:: reset + :noindex: +``` + ### The LIF (Leaky Integrate-and-Fire) Cell This cell (the "leaky integrator") models dynamics over the voltage `v` -and threshold shift `thrTheta` (a homeostatic variable). Note that `thr` +and threshold shift `thr_theta` (a homeostatic variable). Note that `thr` is used as a baseline level for the membrane potential threshold while `thrTheta` is treated as a form of short-term plasticity (full threshold is: `thr + thrTheta(t)`). diff --git a/docs/modeling/synapses.md b/docs/modeling/synapses.md index 470446e9..6b881f0c 100644 --- a/docs/modeling/synapses.md +++ b/docs/modeling/synapses.md @@ -1,17 +1,7 @@ # Synapses -The synapse is a key building block for connecting/wiring together the various -component cells that one would use for characterizing a biomimetic neural system. -These particular objects are meant to perform, per simulated time step, a -specific type of transformation -- such as a linear transform or a -convolution -- utilizing their underlying synaptic parameters. -Most times, a synaptic cable will be represented by a set of matrices (or filters) -that are used to conduct a projection of an input signal (a value presented to a -pre-synaptic/input compartment) resulting in an output signal (a value that -appears within one of its post-synaptic compartments). Notably, a synapse component is -typically associated with a local plasticity rule, e.g., a Hebbian-type -update, that either is triggered online, i.e., at some or all simulation time -steps, or by integrating a differential equation, e.g., via eligibility traces. +The synapse is a key building block for connecting/wiring together the various component cells that one would use for characterizing a biomimetic neural system. These particular objects are meant to perform, per simulated time step, a specific type of transformation -- such as a linear transform or a convolution -- utilizing their underlying synaptic parameters. Most times, a synaptic cable will be represented by a set of matrices (or filters) that are used to conduct a projection of an input signal (a value presented to a pre-synaptic/input compartment) resulting in an output signal (a value that appears within one of its post-synaptic compartments). There are three general groupings of synaptic components in ngc-learn: 1) non-plastic static synapses (only perform fixed transformations of input signals); 2) non-plastic dynamic synapses (perform time-varying, input-dependent transformations on input signals); and 3) plastic synapses that carry out long-term evolution. +Notably, plastic synapse components are typically associated with a local plasticity rule, e.g., a Hebbian-type update, that either is triggered online, i.e., at some or all simulation time steps, or by integrating a differential equation, e.g., via eligibility traces. ## Non-Plastic Synapse Types @@ -74,6 +64,20 @@ This (chemical) synapse performs a linear transform of its input signals. Note t :noindex: ``` +### Double-Exponential Synapse + +This (chemical) synapse performs a linear transform of its input signals. Note that this synapse is "dynamic" in the sense that its efficacies are a function of their pre-synaptic inputs; there is no inherent form of long-term plasticity in this base implementation. Synaptic strength values can be viewed as being filtered/smoothened through a doubleexpoential / difference of two exponentials kernel. + +```{eval-rst} +.. autoclass:: ngclearn.components.DoubleExpSynapse + :noindex: + + .. automethod:: advance_state + :noindex: + .. automethod:: reset + :noindex: +``` + ### Alpha Synapse This (chemical) synapse performs a linear transform of its input signals. Note that this synapse is "dynamic" in the sense that its efficacies are a function of their pre-synaptic inputs; there is no inherent form of long-term plasticity in this base implementation. Synaptic strength values can be viewed as being filtered/smoothened through a kernel that models more realistic rise and fall times of synaptic conductance.. diff --git a/docs/museum/event_stdp_patches.md b/docs/museum/event_stdp_patches.md new file mode 100644 index 00000000..f0759e27 --- /dev/null +++ b/docs/museum/event_stdp_patches.md @@ -0,0 +1,13 @@ +# Event-based Spike-Timing-Dependent Plasticity (Tavanaei et al.; 2018) + +In this exhibit, we create, simulate, and visualize the internally acquired receptive fields of the spiking neural +network (SNN) trained via event-based spike-timing-dependent plasticity (EV-STDP) over image patches. This +reproduces the SNN model originally proposed in (Tavanaei et al., 2018) [1]. + +The model code for this exhibit can be found +[here](https://github.com/NACLab/ngc-museum/tree/main/exhibits/evstdp_patches). + + +## References +[1] Tavanaei, Amirhossein, Timothée Masquelier, and Anthony Maida. "Representation learning using event-based +STDP." Neural Networks 105 (2018): 294-303. \ No newline at end of file diff --git a/docs/museum/harmonium.md b/docs/museum/harmonium.md new file mode 100644 index 00000000..a197d409 --- /dev/null +++ b/docs/museum/harmonium.md @@ -0,0 +1,361 @@ +# Harmoniums and Contrastive Divergence (Hinton; 1999) + +In NGC-Learn, it is possible to construct other forms of learning from the very base learning/plasticity components +already in-built into the base library. Notably, a class of learning and inference systems that adapt through a process +known as contrastive Hebbian learning (CHL) can be constructed and simulated with ngc-learn. + +In this walkthrough, we will design a simple Harmonium, also known as the restricted Boltzmann machine (RBM). We will +specifically focus on learning its synaptic connections with an algorithmic recipe known as contrastive divergence (CD), +which can be considered to be a stochastic form of CHL. After going through this exhibit, you will: + +1. Learn how to construct an `NGCGraph` that emulates the structure of an RBM and adapt the NGC settling process to + calculate approximate synaptic weight gradients in accordance to contrastive divergence. +2. Simulate fantasized image samples using the block Gibbs sampler implicitly defined by the negative phase graph. + +Note that the folders of interest to this walkthrough are: ++ `ngc-museum/exhibits/harmonium/`: this contains the necessary simulation scripts (which can be found + [here](https://github.com/NACLab/ngc-museum/tree/main/exhibits/harmonium)); ++ `ngc-museum/data/mnist/`: this contains the zipped copy of the MNIST digit image arrays + +## On the Harmonium Probabilistic Graphical Model + +A harmonium is a generative model implemented as a stochastic, two-layer neural system (a type of probabilistic graphic +model; PGM) that attempts to learn a probability distribution over sensory input $\mathbf{x}$, i.e., the goal of a +harmonium is to learn $p(\mathbf{x})$, the underlying probability/likelihood of a given (training) dataset. +Fundamentally, the approach to estimating $p(\mathbf{x})$ that carried out by a harmonium is through the optimization +of an energy function $E(\mathbf{x})$ (a concept motivated by statistical mechanics), where the system searches for an +internal configuration, i.e., the values of its synapses, that assigns low energy (values) to sample patterns that come +from the true data distribution $p(\mathbf{x})$ and high energy (values) to patterns that do not (or those that do not +come from the training dataset). + +```{eval-rst} +.. table:: + :align: center + + +-----------------------------------------------------------------+ + | .. image:: ../images/museum/harmonium/rbm_arch.jpg | + | :scale: 65% | + | :align: center | + +-----------------------------------------------------------------+ +``` + +The most common, simplest harmonium is one where input nodes (one per dimension of the data observation space) are +modeled as binary/Boolean sensors -- or "visible units" $\mathbf{z}^0$ (observed variables) that are clamped to actual +data patterns -- connected to a layer of (stochastic) binary latent feature detectors -- or "hidden units" +$\mathbf{z}^1$ (unobserved or latent variables). Notably, the synaptic connections between the latent and visible units +are symmetric. Furthermore, as a result of a key restriction imposed on the harmonium's network structure, i.e., no +lateral connections between the neurons/units within $\mathbf{z}^0$ as well as those within $\mathbf{z}^1$, computing +the latent and visible states is as straightforward as the following: + +$$ +p(\mathbf{z}^1 | \mathbf{z}^0) &= sigmoid(\mathbf{W} \cdot \mathbf{z}^0 + \mathbf{b}), +\; \mathbf{z}^1 \sim p(\mathbf{z}^1 | \mathbf{z}^0) \\ +p(\mathbf{z}^0 | \mathbf{z}^1) &= sigmoid(\mathbf{W}^T \cdot \mathbf{z}^1 + \mathbf{c}), +\; \mathbf{z}^0 \sim p(\mathbf{z}^0 | \mathbf{z}^1) +$$ + +where $\mathbf{c}$ is the visible bias vector, $\mathbf{b}$ is the latent bias vector, +and $\mathbf{W}$ is the synaptic weight matrix that connects $\mathbf{z}^0$ to $\mathbf{z}^1$ (and its transpose +$\mathbf{W}^T$ is used to make predictions of the input itself). Note that $\cdot$ means matrix/vector multiplication +and $\sim$ denotes that we would sample from a probability (vector). In the above harmonium's case, samples will be +drawn treating the conditionals such as $p(\mathbf{z}^1 | \mathbf{z}^0)$ as multivariate Bernoulli distributions. +$\mathbf{z}^0$ would typically be clamped/set to the actual sensory input data $\mathbf{x}$. + +The energy function of the harmonium's joint configuration $(\mathbf{z}^0,\mathbf{z}^1)$ (similar to that of a Hopfield +network) is specified as follows: + +$$ +E(\mathbf{z}^0,\mathbf{z}^1) = -\sum_i \mathbf{c}_i \mathbf{z}^0_i - +\sum_j \mathbf{b}_j \mathbf{z}^1_j - \sum_i \sum_j \mathbf{z}^0_i \mathbf{W}_{ij} \mathbf{z}^1_j . +$$ + +Notice that, in the equation above, we sum over vector dimension indices, e.g., $\mathbf{z}^0_i$ retrieves the $i$th +scalar element of (vector) $\mathbf{z}^0$ while $\mathbf{W}_{ij}$ retrieves the scalar element at position $(i,j)$ +within matrix $\mathbf{W}$. With this energy function, one can write out the probability that a harmonium PGM assigns +to a data point as: + +$$ +p(\mathbf{z}^0 = \mathbf{x}) = \frac{1}{Z} \exp( -E(\mathbf{z}^0,\mathbf{z}^1) ) +$$ + +where $Z$ is the normalizing constant (or, in statistical mechanics, the partition function) needed to obtain +proper probability values[^1]. +When one works through the derivation of the gradient of the log probability $\log p(\mathbf{x})$ with respect to the +synapses such as $\mathbf{W}$, they get a (contrastive) Hebbian-like update rule as follows: + +$$ +\Delta \mathbf{W}_{ij} = <\mathbf{z}^0_i \mathbf{z}^1_j>_{data} - <\mathbf{z}^0_i \mathbf{z}^1_j>_{model} +$$ + +where the angle brackets $< >$ tell us that we need to take the expectation of the values within the brackets under a +certain distribution (such as the data distribution denoted by the subscript $data$). The above rule can also be +considered to be a stochastic form of a general recipe known as contrastive Hebbian learning (CHL) [4]. + +Technically, to compute the update above, obtaining the first term +$<\mathbf{z}^0_i \mathbf{z}^1_j>_{data}$ is easy since we only need to take the product of a data point and its +corresponding latent state under the harmonium. However, obtaining the second term +$<\mathbf{z}^0_i \mathbf{z}^1_j>_{model}$ is very costly, since we would need to +initialize the value of $\mathbf{z}^0$ to a random initial state and then run a (block) Gibbs sampler for many +iterations to accurately approximate the second term. Fortunately, it was shown in work such as [3], that learning a +harmonium is still possible by replacing the term $<\mathbf{z}^0_i \mathbf{z}^1_j>_{model}$ with +$<\mathbf{z}^0_i \mathbf{z}^1_j>_{recon}$, which is simply computed by using the first term's latent state +$\mathbf{z}^1$ to reconstruct the input and then using this reconstruction once more in order to obtain its +corresponding binary latent state. This is known as "contrastive divergence" (CD-1), and, although this approximation +has been shown to not actual follow the gradient of any known objective function, it works well in practice when +learning a harmonium-based generative model. Finally, the vectorized form of the CD-1 update is: + +$$ +\Delta \mathbf{W} = \Big[ (\mathbf{z}^0_{pos})^T \cdot \mathbf{z}^1_{pos} \Big] - \Big[ (\mathbf{z}^0_{neg})^T \cdot \mathbf{z}^1_{neg} \Big] +$$ + +where the first term (in brackets) is labeled as the "positive phase" (or the positive, data-dependent statistics -- +where $\mathbf{z}^0_{pos}$ denotes the positive phase sample of $\mathbf{z}^0$) while the second term is labeled as the +"negative phase" (or the negative, data-independent statistics -- where $\mathbf{z}^0_{neg}$ denotes the negative phase +sample of $\mathbf{z}^0$). Note that simpler rules of a similar form can be worked out for the latent/visible bias +vectors as well. + +In NGC-Learn, to simulate the above harmonium PGM and its CD-1 update, we will model the positive and negative phases +as simulated co-models, each responsible for producing the relevant statistics that we will require in order to adjust +synapses. Additionally, we will find that we can further re-purpose the created co-models to construct a block Gibbs +sampler for confabulating "fantasized" +data patterns from a harmonium that has been fit to data. + + +## Boltzmann Machines: Positive and Negative Co-Models + +We begin by first specifying the structure of the harmonium system that we would like to simulate. In NGC shorthand, +the above positive and negative phase graphs would simply be (under one complete generative model): + +``` +z0 -(z0-z1)-> z1 +z1 -(z1-z0) -> z0 +Note: z1-z0 = (z0-z1)^T (transpose-tied synapses) +``` + +In order to construct the desired harmonium, particularly the structure needed to implement CD-1, we will need to break +up the model into its key "phases", i.e., a positive phase and a negative phase. We will model each phase as its own +simulated nodes-and-cables structure within one single model context, allowing us to craft a general approach that +permits a CD-based learning. Notably, we will use the negative-phase co-model to emulate the crucial MCMC sampling step +to synthesize data from the trained RBM. + +Building the positive phase of our harmonium can be done as follows: + +```python +with Context("Circuit") as self.circuit: + ## set up positive-phase graph + self.z0 = BernoulliStochasticCell("z0", n_units=obs_dim, is_stoch=False) + self.z1 = BernoulliStochasticCell("z1", n_units=hid_dim, key=subkeys[0]) + + self.W1 = HebbianSynapse( + "W1", shape=(obs_dim, hid_dim), eta=0., weight_init=dist.gaussian(mean=0., std=sigma), + bias_init=dist.constant(value=0.), w_bound=0., optim_type="sgd", sign_value=1., key=subkeys[1] + ) + ## wire up z0 to z1 via synaptic project W1 + self.z0.s >> self.W1.inputs + self.W1.outputs >> self.z1.inputs +``` + +To gather the rest of the statistics that we require, we will need to build the negative phase of our model (which is +responsible for "dreaming up" or "confabulating" data samples from its internal model of the world). Constructing the +negative-phase co-model, under the same model `Context` above can be done as follows: + +```python + ## set up negative-phase graph + self.z0neg = BernoulliStochasticCell("z0neg", n_units=obs_dim, key=subkeys[3]) + self.z1neg = BernoulliStochasticCell("z1neg", n_units=hid_dim, key=subkeys[4]) + + self.E1 = DenseSynapse( ## E1 = W1.T + "E1", shape=(hid_dim, obs_dim), weight_init=dist.gaussian(mean=0., std=sigma), + bias_init=dist.constant(value=0.), resist_scale=1., key=subkeys[2] + ) + self.E1.weights.set(self.W1.weights.get().T) + self.V1 = HebbianSynapse( ## V1 = W1 + "V1", shape=(obs_dim, hid_dim), eta=0., weight_init=dist.gaussian(mean=0., std=sigma), + bias_init=None, w_bound=0., optim_type="sgd", sign_value=1., key=subkeys[1] + ) + self.V1.weights.set(self.W1.weights.get()) + self.V1.biases.set(self.W1.biases.get()) + + ## wire up z1 to z0(neg) via E1=(W1)^T, and z0(neg) to z1(neg) via V1=W1 + self.z1.s >> self.E1.inputs + self.E1.outputs >> self.z0neg.inputs + self.z0neg.p >> self.V1.inputs ## drive hiddens by probs of visibles + self.V1.outputs >> self.z1neg.inputs +``` + +The above chunk of code effectively sets up the propagation of information from the latent neurons `z1` back down to +`z0` (obtaining the negative phase values of `z0`, i.e., `z0neg`) and then the propagation of the reconstructed values +back up to `z1` one last time (obtaining the negative phase values of `z1`, i.e., `z0neg`). + +To build a CHL-based form of plasticity, allowing us to build the CD-1 learning process, we will then need to wire up a +set of 2-factor Hebbian rules like so: + +```python + ## set up contrastive Hebbian learning rule (pos-stats - neg-stats) + self.z0.s >> self.W1.pre ## positive-phase pre-synaptic term + self.z1.p >> self.W1.post ## positive-phase post-synaptic term + self.z0neg.p >> self.V1.pre ## negative-phase pre-synaptic term + self.z1neg.p >> self.V1.post ## negative-phase pre-synaptic term +``` + +the results of these two Hebbian rules are then used in an exhibit-specific function (`_update_via_CHL()`) written in +the [`Harmonium` class](https://github.com/NACLab/ngc-museum/blob/v3/exhibits/harmonium/harmonium.py). +While we observe that our "negative phase" co-model allows us to emulate the CD learning recipe[^2], technically, the +negative phase of a harmonium should be run for a very high value of steps (approaching infinity) in order to obtain a +proper sample from the PGM's equilibrium/steady state distribution. However, this would be extremely costly to simulate +and, as early studies [3] observed, often only a few or even a single step of this Markov chain proved to work quite +well, approximating the contrastive divergence objective (the learning algorithm's namesake) instead of direct +maximum likelihood. + +Note that the full code, containing the snippets above, can be found in the Model Museum `Harmonium` model structure +class. One could further generalize our CD-1 framework to variations, such as "persistent" CD (where we, instead of +running `z1` back down through `E1` synapses, we inject random noise instead (to sample the harmonium's latent prior), +or even an algorithm known as parallel tempering, where we would maintain multiple co-models and draw samples from +all of them to obtain negative-phase statistics. + +Finally, within the `Harmonium` class, we have written a routine for drawing samples from the model directly, i.e., we +implement a block Gibbs sampler in order synthesize data from the RBM's current set of parameters. + +## Using the Harmonium to Dream Up Handwritten Digits + +We finally take the harmonium that we have constructed above and fit it to some MNIST digits. Specifically, we will +leverage the [Harmonium](https://github.com/NACLab/ngc-museum/blob/v3/exhibits/harmonium/harmonium.py), model in the Model Museum since it implements all of the above core mechanisms (and +more) internally. In the script `sim_harmonium.py`, you will find a general training that will fit our harmonium to +the MNIST database (unzip the file `mnist.zip` in the `ngc-museum/exhibits/data/` directory if you have not already) +by cycling through it several times, saving the final +(best) resulting to disk within the `exp/` sub-directory. Go ahead and execute the training process as follows: + +```console +$ python sim_harmonium.py +``` + +which will fit/adapt your harmonium to MNIST. This should produce per-training iteration output, printed to I/O, +similar to the following: + +```console +--- Initial RBM Synaptic Stats --- +W1: min -0.0494 ; max 0.0445 mu -0.0000 ; norm 4.4734 +b1: min -4.0000 ; max -4.0000 mu -4.0000 ; norm 64.0000 +c0: min -11.6114 ; max 0.0635 mu -3.8398 ; norm 135.2238 +-1| Test: err(X) = 54.3889 +0| Test: |d.E(X)| = 16.8070 err(X) = 46.8236; Train: err(X) = 52.7418 +1| Test: |d.E(X)| = 27.1183 err(X) = 36.8690; Train: err(X) = 41.3630 +2| Test: |d.E(X)| = 13.7855 err(X) = 31.8582; Train: err(X) = 34.5511 +3| Test: |d.E(X)| = 9.0927 err(X) = 28.6253; Train: err(X) = 30.4615 +4| Test: |d.E(X)| = 5.8375 err(X) = 26.2317; Train: err(X) = 27.6882 +5| Test: |d.E(X)| = 5.3187 err(X) = 24.3207; Train: err(X) = 25.5485 +6| Test: |d.E(X)| = 3.7614 err(X) = 22.8012; Train: err(X) = 23.8361 +7| Test: |d.E(X)| = 2.2589 err(X) = 21.6163; Train: err(X) = 22.4523 +8| Test: |d.E(X)| = 3.2040 err(X) = 20.5934; Train: err(X) = 21.3355 +9| Test: |d.E(X)| = 2.4215 err(X) = 19.7679; Train: err(X) = 20.4297 +10| Test: |d.E(X)| = 1.5725 err(X) = 19.0672; Train: err(X) = 19.6835 +11| Test: |d.E(X)| = 0.5418 err(X) = 18.4881; Train: err(X) = 19.0372 +... + +... +91| Test: |d.E(X)| = 0.4870 err(X) = 11.0443; Train: err(X) = 10.9832 +92| Test: |d.E(X)| = 0.0390 err(X) = 11.0118; Train: err(X) = 10.9820 +93| Test: |d.E(X)| = 0.5127 err(X) = 11.0013; Train: err(X) = 10.9586 +94| Test: |d.E(X)| = 1.9180 err(X) = 10.9874; Train: err(X) = 10.9312 +95| Test: |d.E(X)| = 0.0258 err(X) = 10.9906; Train: err(X) = 10.9274 +96| Test: |d.E(X)| = 0.4760 err(X) = 10.9712; Train: err(X) = 10.8940 +97| Test: |d.E(X)| = 0.6038 err(X) = 10.9589; Train: err(X) = 10.8960 +98| Test: |d.E(X)| = 0.2870 err(X) = 10.9563; Train: err(X) = 10.8727 +99| Test: |d.E(X)| = 1.6622 err(X) = 10.9347; Train: err(X) = 10.8671 +--- Final RBM Synaptic Stats --- +W1: min -1.8648 ; max 1.3757 mu -0.0012 ; norm 70.6230 +b1: min -7.5815 ; max 0.2337 mu -2.3395 ; norm 53.3993 +c0: min -11.6316 ; max -2.4227 mu -5.3259 ; norm 161.5646 +``` + +You will find, after the training script has finished executing, several outputs in the `exp/filters/` model +sub-directory that is created for you. Concretely, you will find a grid-plot of the (first `100` of the) harmonium's +acquired filters (or "receptive fields"), much as we did for the sparse coding exhibit, that will look similar to +the following: + + + +Interestingly enough, we see that our harmonium/RBM has extracted what appears to be rough stroke features, which is +what it uses when sampling its binary latent feature detectors to compose final synthesized image patterns (each +binary feature detector serves as Boolean function that emits a decision of `1` if the filter is to be used and a `0` +if not). In particular, we remark notice that the filters that our harmonium has acquired are a bit more prominent due +to the fact our exhibit employs some weight decay (specifically, Gaussian/L2 decay -- with intensity +`l2_lambda=0.01` -- to the `W1` synaptic matrix of our RBM). +Weight decay of this form is particularly useful to not only mitigate against the harmonium overfitting to its training +data but also to ensure that the Markov chain inherent to its negative-phase mixes more effectively [5] (which ensures +better-quality samples from the block Gibbs sampler, which we will use next). + +Finally, you will also find in the `exp/filters/` model sub-folder another grid-plot containing some (about `100`) of +the RBM's reconstructions of held-out development data. This plot should look similar to the one below: + + + +### Sampling the Harmonium + +Once the training process has completed, you can then run the following to sample from trained model using block Gibbs +sampling: + +```console +$ python sample_harmonium.py +``` + +which will take your trained harmonium's negative-phase co-model and use it to synthesize some digit patterns. You +should see inside the `exp/samples/` sub-directory three sample-image grids (i.e., `samples_0.jpg`, `samples_1.jpg`, +and `samples_2.jpg`) similar to what is shown below: + +```{eval-rst} +.. image:: ../images/museum/harmonium/samples_0.jpg + :width: 30% +.. image:: ../images/museum/harmonium/samples_1.jpg + :width: 30% +.. image:: ../images/museum/harmonium/samples_2.jpg + :width: 30% +``` + +Furthermore, you will see three corresponding GIFs that have been generated for you that visualize how each of the +three simulated sampling Markov chains change with time (i.e., these are the files: `markov_chain_0.gif`, +`markov_chain_1.gif`, and `markov_chain_2.gif`). + + + +It is important to understand that the three grids of samples shown above come from particular points in the block +Gibbs sampling process. +(Note that one reads these sample grid plots left-column to right-column, and top-row to bottom-row; this way of +reading the plot follows the ordering of samples extracted from the specific Markov chain sequence.) +Note that, although each chain is run for many total steps, the `sample_harmonium.py` script "thins" out each Markov +chain by only pulling out a fantasized pattern every `20` steps (further "burning" in each chain before collecting +samples). Each chain is merely initialized with random Bernoulli noise. Note that higher-quality samples can be +obtained if one modifies the earlier harmonium to learn with persistent CD or parallel tempering. + +### Final Notes + +The harmonium that we have built in this exhibit is a classical Bernoulli harmonium/RBM, which is a neural PGM that +assumes that the input data features are binary in nature. If one wants to model data that is continuous/real-valued, +then the harmonium model above would need to be extended to utilize visible units that follow a continuous +distribution; for instance, if one modeled a multivariate Gaussian distribution, this would yield a Gaussian restricted +Boltzmann machine (GRBM). + + +## References +[1] Smolensky, P. "Information Processing in Dynamical Systems: Foundations of Harmony Theory" (Chapter 6). Parallel +distributed processing: explorations in the microstructure of cognition 1 (1986).
+[2] Hinton, Geoffrey. Products of Experts. International conference on artificial neural networks (1999).
+[3] Hinton, Geoffrey E. "Training products of experts by maximizing contrastive likelihood." Technical Report, Gatsby +computational neuroscience unit (1999).
+[4] Movellan, Javier R. "Contrastive Hebbian learning in the continuous Hopfield model." Connectionist models. Morgan +Kaufmann, 1991. 10-17.
+[5] Hinton, Geoffrey E. "A practical guide to training restricted Boltzmann machines." Neural networks: Tricks of the +trade. Springer, Berlin, Heidelberg, 2012. 599-619. + + +[^1]: In fact, it is intractable to compute the partition function $Z$ for any reasonably-sized harmonium; fortunately, +we will not need to calculate $Z$ in order to learn and sample from a Harmonium. +[^2]: In general, CD-1 means contrastive divergence where the negative phase is only run for one single step, i.e., +`K=1`. The more general form of CD is known as CD-K, the K-step CD algorithm where `K > 1`. (Sometimes, CD-1 is just +referred to as just "CD".) diff --git a/docs/museum/index.rst b/docs/museum/index.rst index 25f75dfc..a0b58557 100644 --- a/docs/museum/index.rst +++ b/docs/museum/index.rst @@ -5,17 +5,26 @@ Model Exhibits ============== -Models are presented in ngc-learn's model museum in the form of "exhibits", -which are effectively model-specific walkthroughs and analyses, based on the -relevant, referenced publicly available ngc-learn simulation code. +Models are presented in ngc-learn's model museum in the form of "exhibits", which are effectively model-specific +walkthroughs and analyses, based on the relevant, referenced publicly available ngc-learn simulation code. (Note that +there are more model exhibits in the actual `museum repository `_ than the number +of detailed walkthroughs presented in the table of contents below.) .. toctree:: :maxdepth: 1 - :caption: Neuromimetic Models + :caption: Neuroscience Models - pcn_discrim sparse_coding + pc_rao_ballard1999 snn_dc + event_stdp_patches + rl_snn + +.. toctree:: + :maxdepth: 1 + :caption: NeuroAI / Neuro-mimetic Models + + pcn_discrim snn_bfa + harmonium sindy - rl_snn diff --git a/docs/museum/model_museum.md b/docs/museum/model_museum.md index bd154524..c03cb2d8 100644 --- a/docs/museum/model_museum.md +++ b/docs/museum/model_museum.md @@ -1,20 +1,9 @@ # The Model Museum -There is an ever-growing galaxy of neurobiological models and credit assignment -processes [1, 2]. One of ngc-learn's aims, in the spirit of scientific -reproducibility, is to capture a snapshot of as many of these -biomimetic/neuro-mimetic models as possible, in the form of a digital "museum". -This museum is further designed with the notion of exhibits and exhibitors, -aiding to facilitate credit assignment and respectful citation to the ideas and -the work of those that have helped to lay the foundations for the progress -observed today. Recently, we have separated out the model museum into its own -particular maintained repository called -[ngc-museum](https://github.com/NACLab/ngc-museum), where you can find and -access/run historical models and agents built with ngc-learn to perform -different experimental tasks. +There is an ever-growing galaxy of neurobiological models and credit assignment processes [1, 2]. One of ngc-learn's aims, in the spirit of scientific reproducibility, is to capture a snapshot of as many of these biomimetic/neuro-mimetic models as possible, in the form of a digital "museum". +This museum is further designed with the notion of exhibits and exhibitors, aiding to facilitate credit assignment and respectful citation to the ideas and the work of those that have helped to lay the foundations for the progress observed today. Recently, we have separated out the model museum into its own particular maintained repository called [ngc-museum](https://github.com/NACLab/ngc-museum), where you can find and access/run historical models and agents built with ngc-learn to perform different experimental tasks. -Please refer to the [table of contents](../museum/index.rst) for walkthroughs on -using and running various historical models in the museum. +Please refer to the [table of contents](../museum/index.rst) for walkthroughs and guidance on using and running various historical model exhibits in the museum. ## References [1] Ororbia, Alexander G. "Brain-inspired machine intelligence: A survey diff --git a/docs/museum/pc_rao_ballard1999.md b/docs/museum/pc_rao_ballard1999.md new file mode 100644 index 00000000..cfa6b921 --- /dev/null +++ b/docs/museum/pc_rao_ballard1999.md @@ -0,0 +1,12 @@ +# Hierarchical Predictive Coding (Rao & Ballard; 1999) + +In this exhibit, we create, simulate, and visualize the internally acquired receptive fields of the predictive coding +model originally proposed in (Rao & Ballard, 1999) [1]. + +The model code for this exhibit can be found +[here](https://github.com/NACLab/ngc-museum/tree/main/exhibits/pc_recon). + + +## References +[1] Rao, Rajesh PN, and Dana H. Ballard. "Predictive coding in the visual cortex: a functional interpretation of +some extra-classical receptive-field effects." Nature neuroscience 2.1 (1999): 79-87. \ No newline at end of file diff --git a/docs/museum/pcn_discrim.md b/docs/museum/pcn_discrim.md index 85cc3756..66d9642b 100644 --- a/docs/museum/pcn_discrim.md +++ b/docs/museum/pcn_discrim.md @@ -1,4 +1,4 @@ -# Discriminative Predictive Coding +# Discriminative Predictive Coding (Whittington & Bogacz; 2017) In this exhibit, we will see how a classifier can be created based on predictive coding. This exhibit model effectively reproduces some of the results diff --git a/docs/museum/rl_snn.md b/docs/museum/rl_snn.md index 24d11412..6e1c2876 100644 --- a/docs/museum/rl_snn.md +++ b/docs/museum/rl_snn.md @@ -1,13 +1,10 @@ -# Reinforcement Learning through a Spiking Controller +# Reinforcement Learning through a Spiking Controller (Chevtchenko et al.; 2020) -In this exhibit, we will see how to construct a simple biophysical model for -reinforcement learning with a spiking neural network and modulated -spike-timing-dependent plasticity. -This model incorporates a mechanisms from several different models, including -the constrained RL-centric SNN of [1] as well as the simplifications -made with respect to the model of [2]. The model code for this -exhibit can be found -[here](https://github.com/NACLab/ngc-museum/tree/main/exhibits/rl_snn). +In this exhibit, we will see how to construct a simple biophysical model for reinforcement learning with a spiking +neural network and modulated spike-timing-dependent plasticity. +This model incorporates a mechanisms from several different models, including the constrained RL-centric SNN of +[1] as well as some simplifications of the structures used within the SNN of [2]. The model code for this +exhibit can be found [here](https://github.com/NACLab/ngc-museum/tree/main/exhibits/rl_snn). ## Modeling Operant Conditioning through Modulation @@ -123,10 +120,7 @@ RL-SNN model: ## References -[1] Chevtchenko, Sérgio F., and Teresa B. Ludermir. "Learning from sparse -and delayed rewards with a multilayer spiking neural network." 2020 International -Joint Conference on Neural Networks (IJCNN). IEEE, 2020.
-[2] Diehl, Peter U., and Matthew Cook. "Unsupervised learning of digit -recognition using spike-timing-dependent plasticity." Frontiers in computational -neuroscience 9 (2015): 99. - +[1] Chevtchenko, Sérgio F., and Teresa B. Ludermir. "Learning from sparse and delayed rewards with a multilayer +spiking neural network." 2020 International Joint Conference on Neural Networks (IJCNN). IEEE, 2020.
+[2] Diehl, Peter U., and Matthew Cook. "Unsupervised learning of digit recognition using spike-timing-dependent +plasticity." Frontiers in computational neuroscience 9 (2015): 99. diff --git a/docs/museum/sindy.md b/docs/museum/sindy.md index 04426d70..9245382d 100644 --- a/docs/museum/sindy.md +++ b/docs/museum/sindy.md @@ -1,14 +1,4 @@ - - -# Sparse Identification of Non-linear Dynamical Systems (SINDy) +# Sparse Identification of Non-linear Dynamical Systems (SINDy; Brunton et al.; 2016) In this section, we will study, create, simulate, and visualize a model known as the sparse identification of non-linear dynamical systems (SINDy) [1], implementing it in NGC-Learn and JAX. After going through this demonstration, you will: diff --git a/docs/museum/snn_bfa.md b/docs/museum/snn_bfa.md index 3e62dec1..2a83795b 100644 --- a/docs/museum/snn_bfa.md +++ b/docs/museum/snn_bfa.md @@ -1,8 +1,8 @@ -# Spiking Neural Networks: Learning with Broadcast Feedback Alignment +# Spiking Neural Networks: Learning with Broadcast Feedback Alignment (Samadi et al.; 2017) In this exhibit, we will see how one can train a spiking neural network model using surrogate functions and a credit assignment scheme called broadcast -feedback alignment (BFA) [1]. +feedback alignment (BFA) [1]. This exhibit model effectively reproduces some of the results reported (Samadi et al., 2017) [1]. The model code for this exhibit can be found diff --git a/docs/museum/snn_dc.md b/docs/museum/snn_dc.md index c42c1a45..4bb3b32a 100755 --- a/docs/museum/snn_dc.md +++ b/docs/museum/snn_dc.md @@ -1,4 +1,4 @@ -# The Diehl and Cook Spiking Neuronal Network +# The Diehl and Cook Spiking Neuronal Network (Diehl & Cook; 2015) In this exhibit, we will see how a spiking neural network model that adapts its synaptic efficacies via spike-timing-dependent plasticity can be created. @@ -313,24 +313,8 @@ neuroscience 9 (2015): 99. [^1]: Note that the `LIFCell` is not the same as ngc-learn's -[sLIFCell](ngclearn.components.neurons.spiking.sLIFCell), which is a particular -cell that simplifies the spiking dynamics greatly and is not meant to operate -in the negative milliVolt range like the `LIFCell` does. -[^2]: While both forms of modeling electrical current are easily doable in - ngc-learn, the `DC_SNN` exhibit model opts for the second approach for simplicity - and additional simulation speed. -[^3]: Trace components have also been used in the `DC_SNN` exhibit model, specifically -those built with the [variable trace](ngclearn.components.other.varTrace) component. -Note that the variable trace effectively applies a low-pass filter iteratively -to the spikes produced by a spike train. -[^4]: In the NAC group's -experience, observing the mean and Frobenius norm of synaptic values can be a -useful starting point for determining unhealthy behavior or some degenerate cases -in the context of spiking neural network credit assignment. -[^5]: To load in the exact synaptic efficacies we obtained to get the images -above, you can unzip the folder `dcsnn_syn.zip`, which contains all of the -model's numpy array values, and simply copy all of the compressed numpy arrays -into your `exp/snn_stdp/custom/` folder, which is where ngc-learn/ngc-sim-lib -look for pre-trained value arrays when loading in a previously constructed model. -Once you do this, running `analyze_dcsnn.py` with the same arguments as above -should produce plots/images much like those in this walkthrough. +[sLIFCell](ngclearn.components.neurons.spiking.sLIFCell), which is a particular cell that simplifies the spiking dynamics greatly and is not meant to operate in the negative milliVolt range like the `LIFCell` does. +[^2]: While both forms of modeling electrical current are easily doable in NGC-Learn, the `DC_SNN` exhibit model opts for the second approach for simplicity and additional simulation speed. +[^3]: Trace components have also been used in the `DC_SNN` exhibit model, specifically those built with the [variable trace](ngclearn.components.other.varTrace) component. Note that the variable trace effectively applies a low-pass filter iteratively to the spikes produced by a spike train. +[^4]: In the NAC group's experience, observing the mean and Frobenius norm of synaptic values can be a useful starting point for determining unhealthy behavior or some degenerate cases in the context of spiking neural network credit assignment. +[^5]: To load in the exact synaptic efficacies we obtained to get the images above, you can unzip the folder `dcsnn_syn.zip`, which contains all of the model's numpy array values, and simply copy all of the compressed numpy arrays into your `exp/snn_stdp/custom/` folder, which is where ngc-learn/ngc-sim-lib look for pre-trained value arrays when loading in a previously constructed model. Once you do this, running `analyze_dcsnn.py` with the same arguments as above should produce plots/images much like those in this walkthrough. diff --git a/docs/museum/sparse_coding.md b/docs/museum/sparse_coding.md index d36dbf50..3802a713 100755 --- a/docs/museum/sparse_coding.md +++ b/docs/museum/sparse_coding.md @@ -1,86 +1,59 @@ -# Sparse Coding and Iterative Thresholding +# Sparse Coding and Iterative Thresholding (Olshausen & Field; 1996) -In this exhibit, we create, simulate, and visualize the -internally acquired filters/atoms of variants of a sparse coding system based -on the classical model proposed by (Olshausen & Field, 1996) [1]. +In this exhibit, we create, simulate, and visualize the internally acquired filters/atoms of variants of a sparse coding system based on the classical model proposed by (Olshausen & Field, 1996) [1]. After going through this demonstration, you will: -1. Learn how to build a 2-layer sparse coding model of natural image patterns, -using the original dataset used in [1]. -2. Visualize the acquired filters of the learned dictionary models and examine -the results of imposing a kurtotic prior as well as a thresholding function -over latent codes. +1. Learn how to build a 2-layer sparse coding model of natural image patterns, using the original dataset used in [1]. +2. Visualize the acquired filters of the learned dictionary models and examine the results of imposing a kurtotic prior as well as a thresholding function over latent codes. -The model code for this -exhibit can be found -[here](https://github.com/NACLab/ngc-museum/tree/main/exhibits/olshausen_sc). +The model code for this exhibit can be found [here](https://github.com/NACLab/ngc-museum/tree/main/exhibits/olshausen_sc). -Note: You will need to unzip the data arrays in `exhibits/data/natural_scenes.zip` -to the folder `exhibits/data/` to work through this exhibit. +Note: You will need to unzip the data arrays in `exhibits/data/natural_scenes.zip` to the folder `exhibits/data/` to work through this exhibit. ## On Dictionary Learning -Dictionary learning poses a very interesting question for statistical learning: -can we extract "feature detectors" from a given database (or collection of patterns) -such that only a few of these detectors play a role in reconstructing any given, -original pattern/data point? -The aim of dictionary learning is to acquire or learn a matrix, also called the -"dictionary", which is meant to contain "atoms" or basic elements inside this dictionary -(such as simple fundamental features such as the basic strokes/curves/edges -that compose handwritten digits or characters). Several atoms (or rows of this -matrix) inside the dictionary can then be linearly combined to reconstruct a -given input signal or pattern. A sparse dictionary model is able to reconstruct -input patterns with as few of these atoms as possible. Typical sparse dictionary -or coding models work with an over-complete spanning set, or, in other words, -a latent dimensionality (which one could think of as the number of neurons -in a single latent state node of an ngc-learn system) that is greater than the -dimensionality of the input itself. - -From a neurobiological standpoint, sparse coding emulates a fundamental property -of neural populations -- the activities among a neural population are sparse where, -within a period of time, the number of total active neurons (those that are firing) -is smaller than the total number of neurons in the population itself. When sensory -inputs are encoded within this population, different subsets (which might overlap) of -neurons activate to represent different inputs (one way to view this is that they -"fight" or compete for the right to activate in response to different stimuli). -Classically, it was shown in [1] that a sparse coding model trained on natural -image patches learned within its dictionary non-orthogonal filters that resembled -receptive fields of simple-cells (found in the visual cortex). +Dictionary learning poses a very interesting question for statistical learning: can we extract "feature detectors" from a given database (or collection of patterns) such that only a few of these detectors play a role in reconstructing any given, original pattern/data point? +The aim of dictionary learning is to acquire or learn a matrix, also called the "dictionary", which is meant to contain "atoms" or basic elements inside this dictionary (such as simple fundamental features such as the basic strokes/curves/edges that compose handwritten digits or characters). Several atoms (or rows of this matrix) inside the dictionary can then be linearly combined to reconstruct a given input signal or pattern. A sparse dictionary model is able to reconstruct input patterns with as few of these atoms as possible. Typical sparse dictionary or coding models work with an over-complete spanning set, or, in other words, a latent dimensionality (which one could think of as the number of neurons in a single latent state node of an ngc-learn system) that is greater than the dimensionality of the input itself. + +From a neurobiological standpoint, sparse coding emulates a fundamental property of neural populations -- the activities among a neural population are sparse where, within a period of time, the number of total active neurons (those that are firing) is smaller than the total number of neurons in the population itself. When sensory inputs are encoded within this population, different subsets (which might overlap) of neurons activate to represent different inputs (one way to view this is that they "fight" or compete for the right to activate in response to different stimuli). +Classically, it was shown in [1] that a sparse coding model trained on natural image patches learned within its dictionary non-orthogonal filters that resembled receptive fields of simple-cells (found in the visual cortex). ## Constructing a Sparse Coding System -To build a sparse coding model, we can manually craft a model using ngc-learn's -nodes-and-cables system. First, we specify the underlying generative model we -aim to emulate. Formally, we seek to optimize a set of latent codes according -to the following differential equation: +To build a sparse coding model, we can manually craft a model using ngc-learn's nodes-and-cables system. First, we specify the underlying generative model we aim to emulate. Formally, we seek to optimize a set of latent codes according to the following differential equation: $$ \tau_m \frac{\partial \mathbf{z}_t}{\partial t} = \big(\mathbf{W}^T \cdot \mathbf{e}(t) \big) + \lambda \Omega\big(\mathbf{z}(t)\big) $$ -where $\tau_m$ is the latent code time constant and the error neurons $\mathbf{e}(t)$ -at the sensory input layer made at time $t$ are specified as: +where the above is also referred to as the E-step (since the optimization carried out for most sparse coding models is done within the framework of expectation-maximization -- E-step refers to updates to the latent variables whereas M-step refers to updates to synaptic/dictionary parameters) and $\tau_m$ is the latent code time constant and the error neurons $\mathbf{e}(t)$ at the sensory input layer made at time $t$ are specified as: $$ \mathbf{e}(t) = -\big(\mathbf{o}_t - (\mathbf{W} \cdot \mathbf{z}(t)) \big) $$ -where we see that we aim to learn a two-layer generative system that specifically -imposes a prior distribution `p(z)` over the latent feature detectors (via the -constraint function $ \Omega\big(\mathbf{z}(t)\big) $ ) that we hope -to extract in node `z`. Note that this two-layer model (or single latent-variable layer -model) could either be the linear generative model from [1] or one similar to the -model learned through ISTA [2] if a (soft) thresholding function is used instead. +where we see that we aim to learn a two-layer generative system that specifically imposes a prior distribution `p(z)` over the latent feature detectors (via the constraint function $ \Omega\big(\mathbf{z}(t)\big) $ ) that we hope to extract in node `z`. Note that this two-layer model (or single latent-variable layer model) could either be the linear generative model from [1] or one similar to the model learned through ISTA [2] if a (soft) thresholding function is used instead. + +Furthermore, the synaptic weight updates (the M-step) to our sparse coding model generally adhere to the following differential equation: + +$$ +\tau_m \frac{\partial \mathbf{W}}{\partial t} = -\mathbf{W} + \big(\mathbf{e}(t) \cdot (\mathbf{z}(t))^T \big) +$$ -Constructing the above system for (Olshausen & Field, 1996) is done, much -like we do in the `SparseCoding` agent constructor in the model museum exhibit -code, as follows: +Constructing the above system for (Olshausen & Field, 1996) is done, much like we do in the `SparseCoding` agent constructor in the model museum exhibit code, as follows: ```python -from ngcsimlib.context import Context -from ngclearn.components import GaussianErrorCell as ErrorCell, RateCell, HebbianSynapse, StaticSynapse +from ngclearn.utils.io_utils import makedir +from ngclearn.utils.viz.synapse_plot import visualize +from jax import numpy as jnp, random, jit +from ngclearn import Context, MethodProcess, JointProcess +from ngclearn.components.neurons.graded.rateCell import RateCell +from ngclearn.components.synapses.denseSynapse import DenseSynapse +from ngclearn.components.synapses.hebbian.hebbianSynapse import HebbianSynapse +from ngclearn.components.neurons.graded.gaussianErrorCell import GaussianErrorCell as ErrorCell from ngclearn.utils.model_utils import normalize_matrix +from ngclearn.utils.distribution_generator import DistributionGenerator as dist in_dim = # ... dimension of patch data ... hid_dim = # ... number of atoms in the dictionary matrix @@ -88,174 +61,127 @@ dt = 1. # ms T = 300 # ms # (OR) number of E-steps to take during inference # ---- build a sparse coding linear generative model with a Cauchy prior ---- with Context("Circuit") as circuit: - z1 = RateCell("z1", n_units=hid_dim, tau_m=20., act_fx="identity", - prior=("cauchy", 0.14), integration_type="euler") + z1 = RateCell( + "z1", n_units=hid_dim, tau_m=20, act_fx="identity", prior=("cauchy", 0.14), integration_type="euler" + ) e0 = ErrorCell("e0", n_units=in_dim) - W1 = HebbianSynapse("W1", shape=(hid_dim, in_dim), - eta=1e-2, wInit=("fan_in_gaussian", 0., 1.), - bInit=None, w_bound=0., optim_type="sgd", signVal=-1.) - E1 = StaticSynapse("E1", shape=(in_dim, hid_dim), - wInit=("uniform", -0.2, 0.2), Rscale=1.) + W1 = HebbianSynapse( + "W1", shape=(hid_dim, in_dim), eta=1e-2, weight_init=dist.fan_in_gaussian(), bias_init=None, w_bound=0., optim_type="sgd", sign_value=-1. + ) + E1 = DenseSynapse( ## E1 = (W1)^T + "E1", shape=(in_dim, hid_dim), weight_init=dist.uniform(-0.2, 0.2), + resist_scale=1. + ) + E1.weights.set(W1.weights.get().T) + ## wire z1.zF to e0.mu via W1 - W1.inputs << z1.zF - e0.mu << W1.outputs - ## wire e0.dmu to z1.j - E1.inputs << e0.dmu - z1.j << E1.outputs - ## Setup W1 for its 2-factor Hebbian update - W1.pre << z1.zF - W1.post << e0.dmu - - reset_cmd, reset_args = circuit.compile_by_key( - W1, E1, z1, e0, - compile_key="reset") - advance_cmd, advance_args = circuit.compile_by_key( - W1, E1, z1, e0, - compile_key="advance_state") - evolve_cmd, evolve_args = circuit.compile_by_key(W1, compile_key="evolve") + z1.zF >> W1.inputs + W1.outputs >> e0.mu + ## wire e0.dmu back up to z1.j via E1 (for E-step) + e0.dmu >> E1.inputs + E1.outputs >> z1.j + + ## Setup W1 for its 2-factor Hebbian update (for M-step) + z1.zF >> W1.pre + e0.dmu >> W1.post + + ## Inference process + advance = (MethodProcess(name="advance") + >> W1.advance_state + >> E1.advance_state + >> z1.advance_state + >> e0.advance_state) + ## Reset-to-baseline process + reset = (MethodProcess(name="reset") + >> W1.reset + >> E1.reset + >> z1.reset + >> e0.reset) + ## Learning process + evolve = (MethodProcess(name="evolve") + >> W1.evolve) ``` -Notice that, in our model `circuit`, we have taken care to set the `.param_axis` -variable to be equal to `1` -- this will, whenever we call `apply_constraints()`, -tell the NGC system to normalize the Euclidean norm of the columns -of the dictionary matrix to be equal to a value of one. This is a particularly -important constraint to apply to sparse coding models as this prevents the -trivial solution of simply growing out -the magnitude of the dictionary synapses to solve the underlying constrained -optimization problem (and, in general, constraining the rows or -columns of generative models helps to facilitate a more stable training process). -This norm constraint is configured in the agent constructor's dynamic -compile function, specifically in the snippet below: +There is one important co-routine we also need to make sure we include for our sparse coding `circuit` that needs to happen after each update to the synapses -- synaptic weight normalization. Specifically, we want to normalize the Euclidean norm of the columns of the dictionary matrix to be equal to a value of one. + +This is a particularly important constraint to apply to sparse coding models as this prevents the trivial solution of simply growing out the magnitude of the dictionary synapses to solve the underlying constrained optimization problem (and, in general, constraining the rows or columns of generative models helps to facilitate a more stable training process). This norm constraint can be simply written as below: ```python -@Context.dynamicCommand def norm(): - W1.weights.set(normalize_matrix(W1.weights.value, 1., order=2, axis=1)) + W1.weights.set(normalize_matrix(W1.weights.get(), 1., order=2, axis=1)) ``` -To build the version of our model (the ISTA model) using a thresholding function, -instead of using a factorial prior over the latents, we can write the following: +To build the version of our model (the ISTA model) using a thresholding function, instead of using a factorial prior over the latents, we can write the following: ```python # ---- build a sparse coding generative model w/ a thresholding function ---- with Context("Circuit") as circuit: - z1 = RateCell("z1", n_units=hid_dim, tau_m=20., act_fx="identity", - threshold=("soft_threshold", 5e-3), integration_type="euler") + z1 = RateCell( + "z1", n_units=hid_dim, tau_m=20, act_fx="identity", threshold=("soft_threshold", 5e-3), integration_type="euler" + ) e0 = ErrorCell("e0", n_units=in_dim) - W1 = HebbianSynapse("W1", shape=(hid_dim, in_dim), - eta=1e-2, wInit=("fan_in_gaussian", 0., 1.), - bInit=None, w_bound=0., optim_type="sgd", signVal=-1.) - E1 = StaticSynapse("E1", shape=(in_dim, hid_dim), - wInit=("uniform", -0.2, 0.2), Rscale=1.) + W1 = HebbianSynapse( + "W1", shape=(hid_dim, in_dim), eta=1e-2, weight_init=dist.fan_in_gaussian(), bias_init=None, w_bound=0., optim_type="sgd", sign_value=-1. + ) + E1 = DenseSynapse( + "E1", shape=(in_dim, hid_dim), weight_init=dist.uniform(-0.2, 0.2), + resist_scale=1. + ) + E1.weights.set(W1.weights.get().T) ## ...rest of the code is the same as the Cauchy prior model... ``` -Note that the above two models are built and configured for you in the -Model Museum, in the `museum/exhibits/olshausen_sc/sparse_coding.py` -agent constructor, which internally implements the model contexts depicted above -as well as the necessary task-specific functions needed to reproduce the -correct experimental setup (these get compiled in the constructor's -`dynamic()` method. For both the Cauchy prior model of [1] -and the iterative thresholding model of [2], we track, in the -training script `train_patch_sc.py`, various dictionary synaptic -statistics and a measurement of the model reconstruction loss. The -reconstruction loss is a key part of the objective that both models -optimize, i.e., both SC models effectively optimize an -energy function that is a sum of its reconstruction error of its sensory -input and the sparsity of its single latent state layer `z1`). +Note that the above two models are built and configured for you in the Model Museum, in the `museum/exhibits/olshausen_sc/sparse_coding.py` agent constructor, which internally implements the model contexts depicted above as well as the necessary task-specific functions needed to reproduce the correct experimental setup (these get compiled in the constructor's `dynamic()` method. For both the Cauchy prior model of [1] and the iterative thresholding model of [2], we track, in the training script `train_patch_sc.py`, various dictionary synaptic statistics and a measurement of the model reconstruction loss. The reconstruction loss is a key part of the objective that both models optimize, i.e., both SC models effectively optimize an energy function that is a sum of its reconstruction error of its sensory input and the sparsity of its single latent state layer `z1`). ## Learning Latent Feature Detectors -We will now simulate the learning of feature detectors using the two -sparse coding models specified above. The code provided in -`train_patch_sc.py` will execute a simulation of the above -two models on the natural images found in `exhibits/data/natural_scenes.zip`), -which is a dataset composed of several images of the American Northwest. - -First, navigate to the `exhibits/` directory to access the example/demonstration -code and further enter the `exhibits/data/` sub-folder. Unzip the file -`natural_scenes.zip` to create one more sub-folder that contains two numpy arrays, -the first labeled `natural_scenes/raw_dataX.npy` and another labeled as -`natural_scenes/dataX.npy`. The first one contains the original, `512 x 512` raw pixel -image arrays (flattened) while the second contains the pre-processed, whitened/normalized -(and flattened) image data arrays (these are the pre-processed image patterns used -in [1]). You will, in this demonstration, only be working with `natural_scenes/dataX.npy`. +We will now simulate the learning of feature detectors using the two sparse coding models specified above. The code provided in `train_patch_sc.py` will execute a simulation of the above two models on the natural images found in `exhibits/data/natural_scenes.zip`), which is a dataset composed of several images of the American Northwest. + +First, navigate to the `exhibits/` directory to access the example/demonstration code and further enter the `exhibits/data/` sub-folder. Unzip the file `natural_scenes.zip` to create one more sub-folder that contains two numpy arrays, the first labeled `natural_scenes/raw_dataX.npy` and another labeled as `natural_scenes/dataX.npy`. The first one contains the original, `512 x 512` raw pixel image arrays (flattened) while the second contains the pre-processed, whitened/normalized (and flattened) image data arrays (these are the pre-processed image patterns used in [1]). You will, in this demonstration, only be working with `natural_scenes/dataX.npy`. Two (raw) images sampled from the original dataset (`raw_dataX.npy`) are shown below: | | | |---|---| | ![](../images/museum/data_img1.png) | ![](../images/museum/data_img2.png) | -With the data unpacked and ready, we can now run the training process in -the model exhibit by either executing its Python simulation script like so: +With the data unpacked and ready, we can now run the training process in the model exhibit by either executing its Python simulation script like so: ```console $ python train_patch_sc.py --dataX="$DATA_DIR/dataX.npy" \ --n_iter=200 --model_type="sc_cauchy" ``` -or simply running the convenience Bash script `$ ./sim.sh` (which cleans up the model -experimental output folder each time you call the training script in order -to reduce memory clutter on your system). Running either the Python or Bash -script will then train a sparse coding model with a Cauchy prior on `16 x 16` -pixel patches from the natural image dataset in [1].[^1] After the simulation -terminates, i.e., once `200` iterations/passes through the data have been made, -you will notice in the `exp/filters/` sub-directory a visual plot -of your trained model's filters which should look like the one below: +or simply running the convenience Bash script `$ ./sim.sh` (which cleans up the model experimental output folder each time you call the training script in order to reduce memory clutter on your system). Running either the Python or Bash script will then train a sparse coding model with a Cauchy prior on `16 x 16` pixel patches from the natural image dataset in [1].[^1] After the simulation terminates, i.e., once `200` iterations/passes through the data have been made, you will notice in the `exp/filters/` sub-directory a visual plot of your trained model's filters which should look like the one below: -If you modify either the Bash script or Python script call to use -with a different model argument like so: +If you modify either the Bash script or Python script call to use with a different model argument like so: ```console $ python train_patch_sc.py --dataX="$DATA_DIR/dataX.npy" \ --n_iter=200 --model_type="sc_ista" ``` -you will now train your sparse coding using a latent soft-thresholding function -(emulating ISTA). After this simulated training process ends, you should see -in your `exp/filters/` sub-directory a filter plot like the one below: +you will now train your sparse coding using a latent soft-thresholding function (emulating ISTA). After this simulated training process ends, you should see in your `exp/filters/` sub-directory a filter plot like the one below: -The filter plots, notably, visually indicate that the dictionary atoms in both -sparse coding systems learned to function as edge detectors, each tuned to -a particular position, orientation, and frequency. These learned feature detectors, -as discussed in [1], appear to behave similar to the primary visual area (V1) -neurons of the cerebral cortex in the brain. In the end, even though the edge -detectors learned by both our models qualitatively appear to be similar, -we should note that the latent codes (when inferring them given sensory input) -for the model that used the thresholding function will ultimately sparser -(given the direct clamping to zero values it imposes mathematically). -Furthermore, the filters for the model with thresholding appear to smoother -and with fewer occurrences of less-than-useful slots than the Cauchy model -(or filters that did not appear to extract any particularly interpretable -features). +The filter plots, notably, visually indicate that the dictionary atoms in both sparse coding systems learned to function as edge detectors, each tuned to a particular position, orientation, and frequency. These learned feature detectors, as discussed in [1], appear to behave similar to the primary visual area (V1) neurons of the cerebral cortex in the brain. In the end, even though the edge detectors learned by both our models qualitatively appear to be similar, we should note that the latent codes (when inferring them given sensory input) for the model that used the thresholding function will ultimately sparser (given the direct clamping to zero values it imposes mathematically). +Furthermore, the filters for the model with thresholding appear to smoother and with fewer occurrences of less-than-useful slots than the Cauchy model (or filters that did not appear to extract any particularly interpretable features). ### Computing Hardware Note: -This tutorial was tested and run on an `Ubuntu 22.04.2 LTS` operating system -using an `NVIDIA GeForce RTX 2070` GPU with `CUDA Version: 12.1` -(`Driver Version: 530.41.03`). Note that the times reported in any tutorial -screenshot/console snippets were produced on this system. +This tutorial was tested and run on an `Ubuntu 22.04.2 LTS` operating system using an `NVIDIA GeForce RTX 2070` GPU with `CUDA Version: 12.1` (`Driver Version: 530.41.03`). Note that the times reported in any tutorial screenshot/console snippets were produced on this system. ## References [1] Olshausen, B., Field, D. Emergence of simple-cell receptive field properties diff --git a/docs/ngclearn_papers.md b/docs/ngclearn_papers.md index 637f8a76..04460db5 100644 --- a/docs/ngclearn_papers.md +++ b/docs/ngclearn_papers.md @@ -1,31 +1,19 @@ -# List of Talks Related to NGC-Learn/Sim-Lib - -The following is a list of talks, including conference/symposium tech-talks, -given about NGC-Learn and/or NGC-Sim-Lib: - -1. Gebhardt, W. "An introduction to ngc-learn: A computational neuroscience library." 4th Applied Active Inference Symposium (2023). URL: https://www.youtube.com/watch?v=ynekj8F4zeY - # List of Papers and Publications -The following is a list of current papers that use ngc-learn (this list will be -actively updated as we discover others that use ngc-learn): +The following is a list of current papers that use NGC-Learn (this list will be actively updated as we discover others that use NGC-Learn): -1. Ororbia, A., and Kifer, D. "The neural coding framework for learning generative models". Nature Communications 13, 2064 (2022). +1. Ororbia, A., and Kifer, D. The neural coding framework for learning generative models. Nature Communications 13, 2064 (2022). -2. Ororbia, A., and Mali, A. "Backprop-free reinforcement learning with active neural generative coding". Proceedings of the AAAI Conference on Artificial intelligence (2022). +2. Ororbia, A., and Mali, A. Backprop-free reinforcement learning with active neural generative coding. Proceedings of the AAAI Conference on Artificial intelligence (2022). -3. Ororbia, A. "Spiking neural predictive coding for continual learning from data streams." arXiv preprint arXiv:1908.08655 (2019). +3. Ororbia, A. "Spiking neural predictive coding for continual learning from data streams." Neurocomputing 544: 126292 (2022). -4. Ororbia, A, and Kelly, M. Alex. "CogNGen: Constructing the kernel of a hyperdimensional predictive processing cognitive architecture." -Proceedings of the Annual Meeting of the Cognitive Science Society (CogSci), Volume 44 (2022). +4. Ororbia, A, and Kelly, M. Alex. "CogNGen: constructing the kernel of a hyperdimensional predictive processing cognitive architecture." Proceedings of the Annual Meeting of the Cognitive Science Society (CogSci), Volume 44 (2022). -5. Ororbia, A., and Kelly, M. Alex. "“Learning using a hyperdimensional predictive processing cognitive architecture." 15th International Conference on Artificial General Intelligence (AGI) (2022). +5. Ororbia, A., and Kelly, M. Alex. "Learning using a hyperdimensional predictive processing cognitive architecture." 15th International Conference on Artificial General Intelligence (AGI) (2022). -6. Ororbia, A., Mali, A., Kifer, D., and Giles, C. L. "Lifelong neural predictive coding: Learning cumulatively online without -forgetting." Thirty-sixth Conference on Neural Information Processing Systems (NeurIPS) (2022). +6. Ororbia, A., Mali, A., Kifer, D., & Giles, C. L. "Lifelong neural predictive coding: Learning cumulatively online without forgetting." Thirty-sixth Conference on Neural Information Processing Systems (NeurIPS) (2022). -7. Gebhardt, W., and Ororbia, A. "Time-integrated spike-timing-dependent-plasticity." arXiv preprint arXiv:2407.10028 (2024). +7. Ororbia, A., Friston, K., Rao, Rajesh P. N. "Meta-representational predictive coding: Biomimetic self-supervised learning." arXiv preprint arXiv:2503.21796 (2025). -Note: Please let us know if your work uses ngc-learn so we can update this page to accurately track -ngc-learn's use and include your work in the accumulating body of work in predictive processing -and/or brain-inspired computational modeling. +Note: Please let us know if your work uses NGC-Learn so we can update this page to accurately track NGC-Learn's use and include your work in the space of computational neuroscience, NeuroAI, and/or brain-inspired computational modeling. diff --git a/docs/ngclearn_talks.md b/docs/ngclearn_talks.md new file mode 100644 index 00000000..421da729 --- /dev/null +++ b/docs/ngclearn_talks.md @@ -0,0 +1,13 @@ +# Talks and Media Related to NGC-Learn + +The following is a list of talks and any media related to NGC-Learn: + +1. "NGC-Learn V3: A Fast, Modular, Computational Neuroscience Library". William Gebhardt (NAC Lab). Link (Youtube Video) (2025) + +2. "An Introduction to NGC-Learn: A Computational Neuroscience Library". William Gebhardt (NAC Lab). Link (Youtube Video) (2024)[^1] + +Keep an eye out on the [NAC Lab Youtube channel](https://www.youtube.com/@TheNACLab/featured) for additional future videos related to tutorials, educational material, and research related to NGC-Learn. + +Note: Please let us know if you give any tutorials/talks on work related that makes use of NGC-Learn so we can update this page to make these useful educational materials available to a wider audience. + +[^1]: Note that this talk is related to NGC-Learn (v2)/NGC-Sim-Lib (v1). \ No newline at end of file diff --git a/docs/source/ngclearn.commands.rst b/docs/source/ngclearn.commands.rst deleted file mode 100644 index 7b0c40c1..00000000 --- a/docs/source/ngclearn.commands.rst +++ /dev/null @@ -1,10 +0,0 @@ -ngclearn.commands package -========================= - -Module contents ---------------- - -.. automodule:: ngclearn.commands - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/ngclearn.components.lava.neurons.rst b/docs/source/ngclearn.components.lava.neurons.rst deleted file mode 100644 index 9126f5e4..00000000 --- a/docs/source/ngclearn.components.lava.neurons.rst +++ /dev/null @@ -1,21 +0,0 @@ -ngclearn.components.lava.neurons package -======================================== - -Submodules ----------- - -ngclearn.components.lava.neurons.LIFCell module ------------------------------------------------ - -.. automodule:: ngclearn.components.lava.neurons.LIFCell - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: ngclearn.components.lava.neurons - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/ngclearn.components.lava.rst b/docs/source/ngclearn.components.lava.rst deleted file mode 100644 index 6b8be426..00000000 --- a/docs/source/ngclearn.components.lava.rst +++ /dev/null @@ -1,31 +0,0 @@ -ngclearn.components.lava package -================================ - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - ngclearn.components.lava.neurons - ngclearn.components.lava.synapses - ngclearn.components.lava.traces - -Submodules ----------- - -ngclearn.components.lava.monitor module ---------------------------------------- - -.. automodule:: ngclearn.components.lava.monitor - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: ngclearn.components.lava - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/ngclearn.components.lava.synapses.rst b/docs/source/ngclearn.components.lava.synapses.rst deleted file mode 100644 index 2babbb40..00000000 --- a/docs/source/ngclearn.components.lava.synapses.rst +++ /dev/null @@ -1,37 +0,0 @@ -ngclearn.components.lava.synapses package -========================================= - -Submodules ----------- - -ngclearn.components.lava.synapses.hebbianSynapse module -------------------------------------------------------- - -.. automodule:: ngclearn.components.lava.synapses.hebbianSynapse - :members: - :undoc-members: - :show-inheritance: - -ngclearn.components.lava.synapses.staticSynapse module ------------------------------------------------------- - -.. automodule:: ngclearn.components.lava.synapses.staticSynapse - :members: - :undoc-members: - :show-inheritance: - -ngclearn.components.lava.synapses.traceSTDPSynapse module ---------------------------------------------------------- - -.. automodule:: ngclearn.components.lava.synapses.traceSTDPSynapse - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: ngclearn.components.lava.synapses - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/ngclearn.components.lava.traces.rst b/docs/source/ngclearn.components.lava.traces.rst deleted file mode 100644 index e2dbe697..00000000 --- a/docs/source/ngclearn.components.lava.traces.rst +++ /dev/null @@ -1,21 +0,0 @@ -ngclearn.components.lava.traces package -======================================= - -Submodules ----------- - -ngclearn.components.lava.traces.gatedTrace module -------------------------------------------------- - -.. automodule:: ngclearn.components.lava.traces.gatedTrace - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: ngclearn.components.lava.traces - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/ngclearn.components.neurons.graded.rst b/docs/source/ngclearn.components.neurons.graded.rst index d62a5b7e..9eb532c8 100644 --- a/docs/source/ngclearn.components.neurons.graded.rst +++ b/docs/source/ngclearn.components.neurons.graded.rst @@ -28,6 +28,14 @@ ngclearn.components.neurons.graded.laplacianErrorCell module :undoc-members: :show-inheritance: +ngclearn.components.neurons.graded.leakyNoiseCell module +-------------------------------------------------------- + +.. automodule:: ngclearn.components.neurons.graded.leakyNoiseCell + :members: + :undoc-members: + :show-inheritance: + ngclearn.components.neurons.graded.rateCell module -------------------------------------------------- diff --git a/docs/source/ngclearn.components.rst b/docs/source/ngclearn.components.rst index e3209782..c822f3bf 100644 --- a/docs/source/ngclearn.components.rst +++ b/docs/source/ngclearn.components.rst @@ -8,7 +8,6 @@ Subpackages :maxdepth: 4 ngclearn.components.input_encoders - ngclearn.components.lava ngclearn.components.neurons ngclearn.components.other ngclearn.components.synapses @@ -16,14 +15,6 @@ Subpackages Submodules ---------- -ngclearn.components.base\_monitor module ----------------------------------------- - -.. automodule:: ngclearn.components.base_monitor - :members: - :undoc-members: - :show-inheritance: - ngclearn.components.jaxComponent module --------------------------------------- @@ -32,14 +23,6 @@ ngclearn.components.jaxComponent module :undoc-members: :show-inheritance: -ngclearn.components.monitor module ----------------------------------- - -.. automodule:: ngclearn.components.monitor - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/docs/source/ngclearn.rst b/docs/source/ngclearn.rst index 814817bb..15e44840 100644 --- a/docs/source/ngclearn.rst +++ b/docs/source/ngclearn.rst @@ -7,7 +7,6 @@ Subpackages .. toctree:: :maxdepth: 4 - ngclearn.commands ngclearn.components ngclearn.modules ngclearn.operations diff --git a/docs/source/ngclearn.utils.density.rst b/docs/source/ngclearn.utils.density.rst index 40134e2a..09f8a461 100644 --- a/docs/source/ngclearn.utils.density.rst +++ b/docs/source/ngclearn.utils.density.rst @@ -4,10 +4,34 @@ ngclearn.utils.density package Submodules ---------- -ngclearn.utils.density.gmm module ---------------------------------- +ngclearn.utils.density.bernoulliMixture module +---------------------------------------------- -.. automodule:: ngclearn.utils.density.gmm +.. automodule:: ngclearn.utils.density.bernoulliMixture + :members: + :undoc-members: + :show-inheritance: + +ngclearn.utils.density.exponentialMixture module +------------------------------------------------ + +.. automodule:: ngclearn.utils.density.exponentialMixture + :members: + :undoc-members: + :show-inheritance: + +ngclearn.utils.density.gaussianMixture module +--------------------------------------------- + +.. automodule:: ngclearn.utils.density.gaussianMixture + :members: + :undoc-members: + :show-inheritance: + +ngclearn.utils.density.mixture module +------------------------------------- + +.. automodule:: ngclearn.utils.density.mixture :members: :undoc-members: :show-inheritance: diff --git a/docs/source/ngclearn.utils.feature_dictionaries.rst b/docs/source/ngclearn.utils.feature_dictionaries.rst new file mode 100644 index 00000000..bc9daa64 --- /dev/null +++ b/docs/source/ngclearn.utils.feature_dictionaries.rst @@ -0,0 +1,21 @@ +ngclearn.utils.feature\_dictionaries package +============================================ + +Submodules +---------- + +ngclearn.utils.feature\_dictionaries.polynomialLibrary module +------------------------------------------------------------- + +.. automodule:: ngclearn.utils.feature_dictionaries.polynomialLibrary + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: ngclearn.utils.feature_dictionaries + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/ngclearn.utils.masks.rst b/docs/source/ngclearn.utils.masks.rst new file mode 100644 index 00000000..17721150 --- /dev/null +++ b/docs/source/ngclearn.utils.masks.rst @@ -0,0 +1,21 @@ +ngclearn.utils.masks package +============================ + +Submodules +---------- + +ngclearn.utils.masks.multiblock2d module +---------------------------------------- + +.. automodule:: ngclearn.utils.masks.multiblock2d + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: ngclearn.utils.masks + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/ngclearn.utils.optim.rst b/docs/source/ngclearn.utils.optim.rst index 20145f98..547b6209 100644 --- a/docs/source/ngclearn.utils.optim.rst +++ b/docs/source/ngclearn.utils.optim.rst @@ -12,6 +12,14 @@ ngclearn.utils.optim.adam module :undoc-members: :show-inheritance: +ngclearn.utils.optim.nag module +------------------------------- + +.. automodule:: ngclearn.utils.optim.nag + :members: + :undoc-members: + :show-inheritance: + ngclearn.utils.optim.optim\_utils module ---------------------------------------- diff --git a/docs/source/ngclearn.utils.rst b/docs/source/ngclearn.utils.rst index b442e626..9f4e4809 100644 --- a/docs/source/ngclearn.utils.rst +++ b/docs/source/ngclearn.utils.rst @@ -10,12 +10,22 @@ Subpackages ngclearn.utils.analysis ngclearn.utils.density ngclearn.utils.diffeq + ngclearn.utils.feature_dictionaries + ngclearn.utils.masks ngclearn.utils.optim ngclearn.utils.viz Submodules ---------- +ngclearn.utils.JaxProcessesMixin module +--------------------------------------- + +.. automodule:: ngclearn.utils.JaxProcessesMixin + :members: + :undoc-members: + :show-inheritance: + ngclearn.utils.data\_loader module ---------------------------------- @@ -24,18 +34,18 @@ ngclearn.utils.data\_loader module :undoc-members: :show-inheritance: -ngclearn.utils.io\_utils module -------------------------------- +ngclearn.utils.distribution\_generator module +--------------------------------------------- -.. automodule:: ngclearn.utils.io_utils +.. automodule:: ngclearn.utils.distribution_generator :members: :undoc-members: :show-inheritance: -ngclearn.utils.jaxProcess module --------------------------------- +ngclearn.utils.io\_utils module +------------------------------- -.. automodule:: ngclearn.utils.jaxProcess +.. automodule:: ngclearn.utils.io_utils :members: :undoc-members: :show-inheritance: @@ -56,6 +66,14 @@ ngclearn.utils.model\_utils module :undoc-members: :show-inheritance: +ngclearn.utils.patch module +--------------------------- + +.. automodule:: ngclearn.utils.patch + :members: + :undoc-members: + :show-inheritance: + ngclearn.utils.patch\_utils module ---------------------------------- @@ -72,14 +90,6 @@ ngclearn.utils.surrogate\_fx module :undoc-members: :show-inheritance: -ngclearn.utils.weight\_distribution module ------------------------------------------- - -.. automodule:: ngclearn.utils.weight_distribution - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/docs/source/ngclearn.utils.viz.rst b/docs/source/ngclearn.utils.viz.rst index 0a48f7a8..4c926118 100644 --- a/docs/source/ngclearn.utils.viz.rst +++ b/docs/source/ngclearn.utils.viz.rst @@ -4,6 +4,22 @@ ngclearn.utils.viz package Submodules ---------- +ngclearn.utils.viz.compartment\_plot module +------------------------------------------- + +.. automodule:: ngclearn.utils.viz.compartment_plot + :members: + :undoc-members: + :show-inheritance: + +ngclearn.utils.viz.compartment\_raster module +--------------------------------------------- + +.. automodule:: ngclearn.utils.viz.compartment_raster + :members: + :undoc-members: + :show-inheritance: + ngclearn.utils.viz.dim\_reduce module ------------------------------------- diff --git a/docs/tutorials/configuration/compartments.md b/docs/tutorials/configuration/compartments.md new file mode 100644 index 00000000..d2dfed25 --- /dev/null +++ b/docs/tutorials/configuration/compartments.md @@ -0,0 +1,44 @@ +# Compartments + +Within NGC-Sim-Lib, the global state serves as the backbone of any given model. +This global state is essentially the culmination of all of the dynamic or changing parts of the model itself. Each +value that builds this state is stored within a special "container" that helps track these changes over time -- this +is referred to as a `Compartment`. + +## Practical Information + +Practically, when working with compartments, there are a few simple things to keep in mind despite the fact that most +of NGC-Sim-Lib's primary operation is behind-the-scenes bookkeeping. The two main points to note are: +1. Each compartment holds a value and, thus, setting a compartment with `myCompartment = newValue` will not function as + intended since this will overwrite the Python object, i.e., the compartment with `newValue`. Instead, it is + important to make use of the `.set()` method to update the value stored inside a compartment so + `myCompartment = newValue` becomes `myCompartment.set(newValue)`. +2. In order to retrieve a value from a compartment, use `myCompartment.get()`. These methods of getting and setting + data inside a compartment are important to use when both working with and designing a multi-compartment component + (i.e., `Component`). + +## Technical Information + +The follow sections are devoted to explication of more technical information regarding how a compartment functions +with in the broader scope of NGC-Sim-Lib and, furthermore, to explain how to leverage this information. + +### How Data is Stored (Within a Model Context) + +The data stored inside of a compartment is not actually physically stored within a compartment. Instead, it is stored +inside of the global state and each compartment effectively holds the path or `key` to the right spot in the global +state, allowing it to pull out a specific piece of information. As such, it is technically possible to manipulate the +value of a compartment without actually touching the compartment object itself within any given component. By default, +compartments have in-built safeguards in order to prevent this from happening accidentally; however, directly addressing +the compartment within the global state directly has no such safeguards. + +### What is "Targeting"? + +As discussed in the model building section, there is notion of "wiring" together different compartments of different +components -- this is at the core of NGC-Learn's and NGC-Sim-Lib's "nodes-and-cables system". These wires are created +through the concept of "targeting,", which is, in essence, just the updating of the path stored within a compartment +using the path of a different compartment. This means that, if the targeted compartment goes to retrieve the value +stored within it, it will actually retrieve the value of a different compartment (as dictated by the target). When a +compartment is in this state -- where it is targeting another compartment -- it is set to read-only, which only means that +it cannot modify a different compartment. + + diff --git a/docs/tutorials/configuration/compiling.md b/docs/tutorials/configuration/compiling.md new file mode 100644 index 00000000..7f4aad06 --- /dev/null +++ b/docs/tutorials/configuration/compiling.md @@ -0,0 +1,98 @@ +# Compiling + +The term "compiling" for NGC-Sim-Lib refers to automatic step that happens +inside of a context that produces a transformed method for all of its +components. This step is the most complicated part of the library and, in +general, does not need to be touched or interacted with. Nevertheless, this +section will cover most of the steps that the NGC-Sim-Lib compilation process +does at a high level. This section contains advanced technical/developer-level +information: there is an expectation that the reader has an understanding of +Python abstract syntax trees (ASTs), Python namespaces, and how to +dynamically compile Python code and execute it. + +## The Decorator + +In NGC-Sim-Lib, there is a decorator marked as `@compilable` which is used to +add a flag to methods that the user wants to compile. On its own, this will not +do anything; however, this decorator lets the parser distinguish between methods +that should be compiled and methods that should be ignored. + +## The Step-by-Step NGC-Sim-Lib Parsing Process + +The process starts by telling the parser to compile a specific object. + +### Step 1: Compile Children + +The first step to compile any object is to make sure that all of the +"compilable" objects of the top level object are compiled. As a +result, NGC-Sim-Lib will loop through all of the whole object and will compile +each part that it finds that is flagged as compilable (via the decorators +mentioned above) and is, furthermore, an instance of a class. + +### Step 2: Extract Methods to Compile + +While the parser is looping through all of the parts of the top-level object, it +is also extracting the methods on/embedded to the object that are flagged as +compilable (with the decorator above). NGC-Sim-Lib stores them for later; +however, this lets the parser only loop over the object once. + +### Step 3: Parse Each Method + +As each method is its own entry-point into the transformer, this step will run +for each method in the top-level object. + +### Step 3a: Set up a Transformer + +This step sets up a `ContextTransformer`, which further makes use of a +`ast.NodeTransformer`, and will convert methods from class methods (with the use +of `self`), as well as other methods that need to be removed / ignored, into +their more context-friendly counterparts. + +### Step 3b: Transform the Function + +There are quite a few pieces of common Python that need to be transformed. This +step happens with the overall goal of replacing all object-focused parts with a +more global view. This means that a compartment's `.get` and `.set` calls are +replaced with direct setting and getting from the global state, based on the +compartment's target. This also means that all temporally constant values -- +such as `batch_size` -- are moved into the globals space for that specific file +and ultimately replaced with the naming convention of `object_path_constant`. +One more key step that is performed is to ensure that there is no branching in +the code. Specifically, if there is a branch, i.e., an if-statement, NGC-Sim-Lib +will evaluate it and only keep the branch it will traverse down. This means that +there cannot be any branch logic based on inputs or computed values (this is a +common restriction for just-in-time compiling). + +### Step 3c: Parse Sub-Methods + +Since it is possible to have other class methods that are not marked as +entry-points for compilation but still need to be compiled, as step 3b happens, +NGC-Sim-Lib tracks all of the sub-methods required. Notably, this step goes +through and repeats steps 3a and 3b for each of the (sub-)methods with a naming +convention similar to the temporally constant values for each method. + +### Step 3d: Compile the Abstract Syntax Tree (AST) + +Once we have all of the namespace and globals needed to execute the +properly-transformed method, the method is compiled with Python and finally +executed. + +### Step 3e: Binding + +The final step per method is to bind each to their original method; this +replaces each method with an object which, when called, will act like the +normal, uncompiled version but has the addition of the `.compiled` attribute. +This attribute contains all of the compiled information to be used later (for +model / system simulation). This crucially allows for the end user to +call `myComponent.myMethod.compiled()` and have it run. The exact type for +a `compiled` value can be found +in `ngcsimlib._src.parser.utils:CompiledMethod`. + +### Step 4: Finishing Up / Final Processing + +Some objects, such as the processes, entail additional steps to modify +themselves or their compiled methods in order to align themselves with needed +functionality. However, this operation/functionality is found within each +class's expanded `compile` method and should be referred to by looking at those +methods specifically. + diff --git a/docs/tutorials/configuration/components.md b/docs/tutorials/configuration/components.md new file mode 100644 index 00000000..c72f149d --- /dev/null +++ b/docs/tutorials/configuration/components.md @@ -0,0 +1,32 @@ +# Components + +Living one step above compartments in the NGC-Learn dynamical systems hierachy rests the component. +A component (`ngcsimlib.Component`) holds a collection of both temporally constant values as well as dynamic (time-evolving) +compartments. In addition, they are the core place where logic governing the dynamics of a system are +defined. Generally, components serve as the building blocks that are to be reused multiple times +when constructing a complete model of a dynmical system. + +## Temporally Constant versus Dynamic Compartments + +One important distinction that needs to be highlighted within a component is the +difference between a temporally constant value and a dynamic (time-varying) compartment. +Compartments themselves house values that change over time and, generally, they will have the +type `ngcsimlib.Compartment`; note that compartments are to be used to track the internal values +of a component. These internal values can be ones such inputs, decaying values, counters, etc. +The second kind of values found within a component are known as temporally constant values; these +are values (e.g., hyper-parameters, structural parameters, etc.) that will remain fixed +within constructed model dynamical system. These types of values tend to include common configuration +and meta-parameter settings, such as matrix shapes and coefficients. + +## Defining Compilable Methods + +Inside of a component, it is expected that there will be methods defined that govern the +temporal dynamics of the system component. These compilable methods are decorated +with `@compilable` and are defined like any other regular (Python) method. Within a compilable +method, there will be access to `self`, which means that, to reference a compartment's +value, one must write out such a call as: `self.myCompartment.get()`. The only requirement is +that any method that is decorated cannot have a return value; values should be stored +inside their respective compartments (by making an appeal to their respective set routine, i.e., +`self.myCompartment.set(value)`). In an external (compilation) step, outside of the developer's +definition of a component, an NGC-Sim-Lib transformer will change/convert all of these (decorated) +methods into ones that function with the rest of the NGC-Sim-Lib back-end. diff --git a/docs/tutorials/configuration/context.md b/docs/tutorials/configuration/context.md new file mode 100644 index 00000000..1e8e06b2 --- /dev/null +++ b/docs/tutorials/configuration/context.md @@ -0,0 +1,67 @@ +# Contexts + +Contexts, in NGC-Sim-Lib, are the top-level containers that hold everything used to +define a model / dynamical system. On their own, contexts have no runtime logic; +they rely on their internal processes and components to build a complete, working model. + +## Defining a Context + +To define a context (`ngcsimlib.Context`), NGC-Sim-Lib leverages the `with` block; this +means that to create a new context, simply start with the statement +`with Context("myContext") as ctx:` and a new context will be created. +(Important Note: names are unique; if a context is created with the same name, +they will be the same context and, thus, there might be conflicts). +A defined context does not do anything on its own. + +## Adding Components + +To add components to a context, simply initialize components while inside +the `with` block of the context. Any component defined while inside this block +will automatically be added and tacked-on to the context object. + +## Wiring Components + +Inside of a model / dynamical system, components will need to pass data to one +another; this is configured within the context. To connect the compartments of +two components, follow the pattern: `mySource.output >> myDestination.input`, +where `output` and `input` are compartments inside their respective components. +This format will ensure that, when processes are being run, the value will +flow properly from component to component. + +### Operators + +There is a special type of wire called an operator; this performs a simple +operation on the compartment values as the data flows from one component to +another. Generally, these are use for simple mathematical operations, such as +negation `Negate(mySource.output) >> myDestination.input` or the summation of +multiple compartments into +one `Summation(mySource1.output, mySource2.output, ...) >> myDestination.input`. +Note that operators can be chained, so it would be possible to negate one or +more of the inputs that flow into the summation. + +## Adding Processes + +To add processes to a context, simply initialize the process and add all of its +steps while inside the `with`-block of the process. + +## Exiting the `with` block + +When the context exits the `with`-block, it will re-compile the entire model. +Behind the scenes, this is calling `recompile` on the context +itself; it is possible to manually trigger the recompile step, but doing so can +break certain connections (between components/compartments), so use this +functionality sparingly. + +## Saving and Loading + +The context's one unique job is the handling of the "saving" (serialization) and +"loading" (de-serialization) of models to disk. By default, calling +`save_to_json(...)` will create the correct file structure as well as the core files +needed and load the context in the future. To load / de-serialize a model, +calling `Context.load(...)` will load the context in from a directory; something +important to note is that loading in a context entails effectively +recreating the components with their initial values using their arguments as well as +keywords arguments (excluding those that cannot be serialized). This means that, +if you have a trained model, ensure that your components have a save method +defined that will handle the saving and loading of all values within their compartments. + diff --git a/docs/tutorials/configuration/global_state.md b/docs/tutorials/configuration/global_state.md new file mode 100644 index 00000000..1f78ac6e --- /dev/null +++ b/docs/tutorials/configuration/global_state.md @@ -0,0 +1,52 @@ +# The Global State + +Since NGC-Sim-Lib is a simulation library focused on temporal models and dynamical +systems, or models that change over time there, it is foundational that all models +(and their respective elements) have some concept of a "state". These states +might be comprised of a single value that changes/evolves or of a complex set of values +that, when combined all together, make up the full dynamical system that underwrites the +final model. In both cases, these sets of values are stored in what is known as the +global state. + +## Interacting with the Global State + +Since the global state will contain a large amount of information describing a given +model, there will be a need to facilitate interaction with and modification of the values +contained within the global state. In most use-cases, this is not done directly. The +most common way to interact with the global state is through the use of the state-manager. +The state-manager exists to provide a set of helper methods for interacting with the +global state itself. Note that, although the manager is there to assist you, it will not stop +you from changing the state (or "breaking" the state). When changing the state -- beyond +setting it through the specificaiton of processes -- be careful to not add or remove +anything that is needed for your actual model. + +### Adding New Fields to the Global State + +If you are new to using NGC-Sim-Lib and looking for a way to add values to the +global state directly and explicitly, stop for a moment and reconsider. Unless +you know exactly what you are doing (i.e., doing core development), it is strongly +advised to not manually add values to the global state; instead, work through the +mechanisms afforded by compartments and/or components, as these are built to afford you the +most common ways for adding fields to the global state itself. The dynamical systems +semantics inherent to compartments and components is meant to ensure carefully-constrained +design and simulation of flexible models. + +If you actually intend to manually and directly add values to the global state itself, it +is done through the use of the `add_key` method. This will create the appropriate key in +the global state for the given path and name; furthermore, its value can be retrieved +with `from_key` calls. This value, however, is not linked to a compartment and, therefore, +will be hard to get working properly in the compiled methods without some specific references. +Please take extra care when working directly and explicitly with the global state. + +### Getting the Current State + +To get the current state, simply call `global_state_manager.state`; this will give +you a (shallow) copy of the current state, which means that any modifications made to it will +not be reflected in the global state. + +### Updating the Global State + +To manually update the global state after modifying a local copy; please write an overriding +call command: `global_state_manager.state = new_state`. This will update the state with the +`.update` call to its underlying dictionaries, which means that a partial state will still update correctly. + diff --git a/docs/tutorials/configuration/index.rst b/docs/tutorials/configuration/index.rst new file mode 100644 index 00000000..e9ccc8ca --- /dev/null +++ b/docs/tutorials/configuration/index.rst @@ -0,0 +1,28 @@ +.. ngc-learn documentation master file, created by + sphinx-quickstart on Wed Apr 20 02:52:17 2022. + Note - This file needs to at least contain a root `toctree` directive. + +Configuration Basics +==================== + +This set of guides provide information about the fundamental building blocks that characterize the NGC-Learn as well +as the operation of NGC-Learn's back-end, NGC-Sim-Lib. +For end-users (experimentalists, engineers), the sections under "Building Blocks" will be most informative. For +developers, the sections under "Development Information" are recommended, particularly for advanced use-cases and +low-level development. + +.. toctree:: + :maxdepth: 2 + :caption: Building Blocks + + context + components + compartments + processes + +.. toctree:: + :maxdepth: 2 + :caption: Development Information + + global_state + compiling \ No newline at end of file diff --git a/docs/tutorials/configuration/processes.md b/docs/tutorials/configuration/processes.md new file mode 100644 index 00000000..a7b9b8f5 --- /dev/null +++ b/docs/tutorials/configuration/processes.md @@ -0,0 +1,90 @@ +# Processes + +Processes in NGC-Sim-Lib offer a central way of defining a specific transition to be +taken within a given model (this effectively sets up the behavior of the state-machine +that defines the desired dynamical system one wants to simulate). In effect, processes +take in as many compilable methods as possible across any number of +components; they work to produce a single top-level method and a varying number of +sub-methods needed to execute the entire chain of compilable methods in one (single) step. +This is ultimately done to interface nicely with just-in-time (JIT) compilers, such as +the one inherent to JAX, and to minimize the amount of read and write calls done across +a chain of methods. + +## Building the (Command) Chain + +Building the chain that a process will use is done through an iterative process. Once +the process object is created, steps are added using either `.then()` or `>>`. +As an example: + +``` +myProcess.then(myCompA.forward).then(myCompB.forward).then(myCompA.evolve).then(myCompB.evolve) +``` + +or + +``` +myProcess >> myCompA.forward >> myCompB.forward >> myCompA.evolve >> myCompB.evolve +``` + +In both cases, this process will chain the four methods together into a single +step, only updating the final state after all steps are complete. + +## Types of Processes + +There are two types of processes: the above example would be with what is +referred to as a `MethodProcess` -- these are used to chain together any +compilable methods from any number of different components. The other second +type of process, called a `JointProcess` in NGC-Sim-Lib, is used to chain +together entire processes. +JointProcesses are especially useful if there are multiple method processes that +need to be called but different orders of the processes are needed at different +times. These allow for the specification of complex events / behaviors in a +dynamical system that one will simulate. + +## Extra Elements + +There are a few extra methods that come standard with each process type which can +be useful for both regular operation as well as debugging. + +### Viewing the Compiled Method + +Behind the scenes, a process is transforming and compiling down all of the steps +used to build it; this means that the exact code it is running to do its +set of calculations will ultimately not be what the user wrote. To allow for +the end user to view and make sure that the two pieces of code -- theirs and +the compiled version -- are equivalent (and yielding expected behavior), every +process has a `view_compiled_method()` call which can be used after the (final) model +is compiled. This call will return the code (block) that it will be running as a +string. There will be some stark differences between the produced/generated code and +the code in the (Python) components used to build the steps. Please refer to the +compiling page for a more in-depth guide to comparing the outputs between these +two stages of code. + +### Needed Keywords + +Since some methods will require external values such as `t` (for time) or `dt` +(for integration time / the temporal delta) for a given execution, a process +will also track all the keyword arguments that are needed to run their compiled +process. To view which keywords a given process is expecting, one may use the +command: `get_keywords()`. +This is mostly used for debugging and/or as a sanity check. + +### Packing Keywords + +To add onto the needed keywords, the process also provides an interface to +produce the keywords needed to run in the form of two methods. The first method +is `pack_keywords(...)`; this method packs together a single row of values that +are needed to run a single execution (step) of the process. The arguments are +the `row_seed`, which is a seed that is to be passed to all of the keyword +generators (only needed if generators are being used). +The second set of arguments are keyword arguments that are either constant, +such as `dt=0.1`, or generators, such as `lambda row_seed: 0.1 * row_seed`. +The second method for generating the keywords for a process is with `pack_rows(...)`. +This method will create many sets of keywords that are needed to run multiple +iterations of the process. Note that the arguments are slightly different: first, +it now utilizes a `length` argument to indicate the number of rows being produced and, +second, it features a `seed_generator` that is used to generate the seed of each row +(for instance, to have only even seed values: `seed_generator = lambda x: 2 * x`); if +the generator is `None`, then `seed_generator = lamda x: x` is used. +After this, the same keyword arguments to define the needed parameters are used as in `pack_keywords`. + diff --git a/docs/tutorials/foundations.md b/docs/tutorials/foundations.md deleted file mode 100644 index 15887da3..00000000 --- a/docs/tutorials/foundations.md +++ /dev/null @@ -1,18 +0,0 @@ -# Foundational Elements - -In this set of tutorials/walkthroughs, we go through the some of the core elements -and mechanisms underlying ngc-learn in order understand how its simulation -scheme (and the nodes-and-cables system) works and to help in writing your -own custom elements. - -The foundational walkthroughs are organized as follows: -1. [Using Model Contexts](../tutorials/foundations/contexts.md): This lesson goes - the fundamentals of the primary simulation construct you need to set up models, the - (simulation) context. -2. [Understanding Commands](../tutorials/foundations/commands.md): This lesson will - walk you through the basics of a command -- an essential part of building a - simulation controller in ngc-learn and ngcsimlib -- and offer some useful - points for designing new ones. -3. [Operations](../tutorials/foundations/operations.md): Here, the basics - of bundle rules, a commonly use mechanism for crafting complex biophysical - systems, will be presented. diff --git a/docs/tutorials/foundations/commands.md b/docs/tutorials/foundations/commands.md deleted file mode 100755 index e3fff8f8..00000000 --- a/docs/tutorials/foundations/commands.md +++ /dev/null @@ -1,137 +0,0 @@ -# Understanding Commands - -## Overview -Commands are one of the central pillars of -ngcsimlib, the dependency -library that drives ngc-learn's simulation backend. -In general, commands provide the instructions and logic for what each component -should be doing at any given time. In addition, they are the normal way that an -outside user would interact with ngc-learn models. Commands live inside a model's -controller and are generally made with the `add_command` method. - -## Abstract Command -Contained within ngcsimlib is an abstract class for every command included in -ngcsimlib. It is strongly recommended that custom commands are built using this -base class (but there is nothing enforcing this inside of ngcsimlib). - -At its base the abstract command forces two things: firstly, the constructor -for the base class requires a list of components, and a list of attributes that -each component should have. Secondly, all commands must implement their -`__call__` command, taking in only `*args` and `**kwargs`. - -## Constructing Commands -It is common that commands will need to have values passed into them to control -their internal behavior, such as a value to clamp, or a flag for freezing -synaptic weight values. -To do this, we introduce the notion of binding keywords to commands. -Specifically, commands will take strings in during their construction and then -look for those strings when called inside the list of keyword arguments in order -to get their arguments. - -## Calling Commands -When commands are called, they will take in only `*args` and `**kwargs`. -While custom commands can break this by adding in additional arguments -without any problem, it is not recommended to do this as multiple instances -of a command with different parameters will then use the same keyword for their -call. - -## Creating Custom Commands -It is recommended that all custom commands inherit from the base class -provided within ngcsimlib. This provides a good starting point for designing a -component that will seamlessly interact with ngcsimlib's internal simulation mechanics. -These mechanics, which characterize the core operation of a simulation controller, -entail that, for each command supplied to a controller, a command will call the -same function with the same parameters on each component provided -to that very command. It is also expected that there is error handling within the -constructor to catch as many runtime errors as possible. Note that base -command class provides a list to check required calls such as `reset` or `evolve`. - -It is important to note that, if commands are going to be constructed via a -controller, they should have keyword arguments with default values that -error out on bad input instead of positional arguments. - -## Example Command (reset) - -Below, we present the key bits of source code that characterize a reset command --- a very commonly used, built-in command for models designed in ngc-learn -- and -its internal operation: - -```python -from ngcsimlib.commands import Command -from ngcsimlib.utils import extract_args -from ngcsimlib.logger import warn, error - -class Reset(Command): - def __init__(self, components=None, reset_name=None, command_name=None, - **kwargs): - super().__init__(components=components, command_name=command_name, - required_calls=['reset']) - if reset_name is None: - error(self.name, "requires a \'reset_name\' to bind to for construction") - self.reset_name = reset_name - - def __call__(self, *args, **kwargs): - try: - vals = extract_args([self.reset_name], *args, **kwargs) - except RuntimeError: - warn(self.name, ",", self.reset_name, - "is missing from keyword arguments and no positional arguments were provided") - return - - if vals[self.reset_name]: - for component in self.components: - self.components[component].reset() -``` - -## Custom Command Template - -Here, we show the generic command template which shows how one would go about -designing the key operational bits that make up a useful command. - -```python -from ngcsimlib.commands.command import Command -from ngcsimlib.utils import extract_args -from ngcsimlib.logger import error - - -class CustomCommand(Command): - def __init__(self, components=None, BINDING_VALUE=None, ADDITIONAL_INPUT=None, command_name=None, - **kwargs): - super().__init__(components=components, command_name=None, required_calls=['CUSTOM_CALL']) - # Make sure additional input is passed in - if ADDITIONAL_INPUT is None: - error(self.name, "requires a \'ADDITIONAL_INPUT\' for construction") - - # Make sure command is bound to a value - if BINDING_VALUE is None: - error(self.name, "requires a \'BINDING_VALUE\' to bind to for construction") - - self.BOUND_VALUE = BINDING_VALUE - self.ADDITION_VALUE = ADDITIONAL_INPUT - - def __call__(self, *args, **kwargs): - # Extract the bound value from the arguments - try: - vals = extract_args([self.BOUND_VALUE], *args, **kwargs) - except RuntimeError: - error(self.name, ",", str(self.BOUND_VALUE), "is missing from keyword arguments or a positional " - "arguments can be provided") - - #Use extracted value to call a method on each component - for component in self.components: - self.components[component].CUSTOM_CALL(self.ADDITION_VALUE, vals[self.BOUND_VALUE]) -``` - -## Notes -All components added to commands must have a `name` attribute and the word -`name` is automatically appended to any provided list of required attributes -to the base class constructor. - -As all built-in commands use `extract_args` when called with a controller via -`myController.COMMAND(ARGUMENT)`, there is no need to use keywords as it will -use `args` if there are no keyword arguments. (Keywords will still work, however.) - -When commands are constructed via a controller, they are also provided with the -keyword arguments `controller` and `command_name`. It is not recommended to -use these for any core logic (just use them for error messages), unless -it using them is absolutely essential in achieving the desired functionality. diff --git a/docs/tutorials/foundations/contexts.md b/docs/tutorials/foundations/contexts.md deleted file mode 100644 index b025cd8d..00000000 --- a/docs/tutorials/foundations/contexts.md +++ /dev/null @@ -1,70 +0,0 @@ -# What are Contexts - -A context in ngclearn is a container that holds all the information for your model and can be used as an access point to -reference different models in a multi-model system. Some of the information that contexts hold is all the components -defined in the context, all the wiring information for each of the components, as well as all the commands defined on -the context through various means. - -## How to make a Context - -To make a context first import it from ngclearn with `from ngclearn import Context`. This will give you access to not -only the constructor for new contexts but also the ability to get previously defined contexts. The general use case for -this is - -```python -from ngclearn import Context - -with Context("Model1") as model1: - pass -``` - -This will make a context named "Model1" and also drops you into a with block where you can define the various parts of -the model. The call `Context("Model1")` will always return the same context. So if there is already a model with that -name defined earlier in the code this instance of `model1` will have all the same object defined previously. - -## Adding Components - -The best way to add components to a context is by using components that have implemented the `MetaComponent` metaclass. -In ngclearn the base `Component` class does this. If using these components all that is needed to have them added to -the context is calling their constructors inside a with block of the context. For example - -```python -from ngclearn import Context -from ngclearn.components import LIFCell - -with Context("Model1") as model1: - z1 = LIFCell("z1", n_units=10, tau_m=100) -``` - -## Creating Cables - -To add connections between components and their compartments in a model we do that also in a context. Just like with -components there are no special actions that need to be taken to add them beyond doing so in a with block. To connect -to compartments the `<<` operator is used following the outline of `destination << source`. For example - -```python -with model1: - w1.inputs << z1.s -``` - -## Dynamic Commands - -When building models it can be desirable to use the same training and testing scrips while having commands do different -actions. For example if two different models had different clamp procedures to set inputs and labels it is possible to -dynamically add a generic clamp command to each model and call them the same way despite them doing different things. -As an example -```python -with model1: - @model1.dynamicCommand - def clamp(inputs, labels): - z0.inputs.clamp(inputs) - z2.labels.clamp(labels) - -with model2: - @model2.dynamicCommand - def clamp(inputs, labels): - z0.inputs.clamp(inputs) - z0_p.inputs.clamp(inputs) - z2.labels.clamp(labels) -``` -In both these cases later we can just call clamp and each one will call their own version of the clamp command. diff --git a/docs/tutorials/foundations/monitors.md b/docs/tutorials/foundations/monitors.md deleted file mode 100644 index f835a59d..00000000 --- a/docs/tutorials/foundations/monitors.md +++ /dev/null @@ -1,72 +0,0 @@ -# NGC Monitors - -NGC-monitors are a way of storing a rolling window of compartment values -automatically. Their intended purpose is not to be used "inside" of a model but -just as an auxiliary way to view the internal state of the model even when it is -compiled. A monitor will track the last `n` values it has observed within the -compartment with the oldest value being at `index=0` and the newest being at -`index=n-1`. - -## Building a Monitor - -Monitors are constructed exactly like regular components are for general models. -To use one, simply import the monitor `from ngclearn.components import Monitor`. Now, -inside of your model, build it like a regular component: - -```python -with Context("model") as model: - M = Monitor("M", default_window_length=100) -``` - -## Watching compartments - -There are then two key ways of watching compartments, the first way looks similar -to the wiring paradigm found in connecting standard ngclearn components -together. The primary difference is that connecting compartments to the monitor -does not require a compartment, they are wired directly into the `Monitor` -following the pattern below: - -```python - M << z0.s -``` - -This will wire the spike output of `z0` into the monitor with a view window -length of the `default_window_length`. In the event that you want a view window -that is not the default viewing length, you can use the `watch()` method -instead as in below: - -```python - M.watch(z0.s, customWindowLength) -``` - -There is no limit to the number of compartments that a monitor can watch or the -length of the window that it can store. However, as it is constantly shifting -values, tracking large matrices, such as those containing synapse values -over many timesteps, may get expensive. - -For the monitor to run during your `advance_state` and `reset` calls, make sure -to add to the monitor to the list of components to compile. Currently, -monitors do not work with non-compiled methods -(This is a planned feature for future developments of ngc-learn). - -## Extracting Values - -To look at the currently stored window of any compartment being tracked, there -are two methods available to you. The first method requires that you have -access to the compartment that the monitor is watching. To read out the -monitors values, you can call: - -```python -M.view(z0.s) -``` - -In the event that you do not have access to the compartment, all of the stored -values can be found via the path using the following: - -```python -M.get_store("path/to/compartment") -``` - -The stored windows are kept in a tree of dictionaries, where each node is a part -of the path and the leaves are compartment objects holding the -tracked value windows. \ No newline at end of file diff --git a/docs/tutorials/foundations/operations.md b/docs/tutorials/foundations/operations.md deleted file mode 100755 index 7584d2d2..00000000 --- a/docs/tutorials/foundations/operations.md +++ /dev/null @@ -1,60 +0,0 @@ -# The Basics of Operations - -## What are Operations? - -The underlying method for passing data/signals from component to component inside of -contexts is through the use of cables. A large amount of the time compartments will have a single cable being passed -connected to it that overwrites the previous value in that compartment. However, there are times when this is not the -case and then cable operations must be used. - -## Built-in operations - -By default, ngclearn comes with four operations defined, `overwrite`, `negate`, `summation` and `add`. Of these four -operations the default one used by all cables is the overwrite operation. This operations will take the value of its -source compartment and place it into the destination compartment overwriting the value currently there. The negate -operation has a similar effect as the overwrite operation with the added functionality of applying the `-` operation to -the value being transmitted. The summation operation takes in any number of source compartments and sums together all -their values and overwrites the previous value with the sum. Finally, the add operation does the same thing as the -summation operation but instead adds the sum to the previous value instead of overwriting it. - -## Building Custom Operation - -At its core, an operation is a static method that does all the runtime logic of the operation with the source -compartments, and a resolver that does clean up and assignment of the output of the operation to the destination -compartment. - -> General Form of an Operation: -> ```python -> class operationName(BaseOp): -> @staticmethod -> def operation(*sources): -> #Runtime Logic -> return computed_value -> ``` - -> Example Operation (Summation) -> ```python -> class summation(BaseOp): -> @staticmethod -> def operation(*sources): -> s = None -> for source in sources: -> if s is None: -> s = source -> else: -> s += source -> return s -> ``` - -## Notes - -- Every cable coming into or out of a compartment can have a different operation. - -- The order of these operations should be the order they are wired in, but this is not guaranteed. - -- Only the logic that exists in the static method `operation` is used for a compiled operation, all logic existing in an overwritten resolve method is not captured. - -- Some operations have a flag of `is_compilable` set to false. This is checked during compile to flag if the model can be compiled. - -- Operations can be nested so `summaion(negate(c1), c2)` would be a valid operation and will work while compiled - diff --git a/docs/tutorials/index.rst b/docs/tutorials/index.rst index f1640834..5f02878c 100644 --- a/docs/tutorials/index.rst +++ b/docs/tutorials/index.rst @@ -2,41 +2,15 @@ sphinx-quickstart on Wed Apr 20 02:52:17 2022. Note - This file needs to at least contain a root `toctree` directive. -Tutorial Contents -================= +Modeling Basics +=============== -Lessons/tutorials go through the very basics of constructing a dynamical system in -ngc-learn, core elements and tools of neurocognitive modeling using ngc-learn's -in-built components and simulation tools, and finally providing foundational insights -into how ngc-learn and its backend, ngc-sim-lib, work (particularly with respect -to configuration). +Lessons/tutorials go through the very basics of constructing a dynamical system in NGC-Learn, core elements and tools of neurocognitive modeling using NGC-Learn's in-built components and simulation tools, and finally providing foundational insights into how NGC-Learn and its backend, NGC-Sim-Lib, work (particularly with respect to configuration). .. toctree:: - :maxdepth: 1 - :caption: I. Modeling Basics + :maxdepth: 2 + :caption: Table of Contents model_basics/configuration - model_basics/json_modules model_basics/model_building model_basics/evolving_synapses - -.. toctree:: - :maxdepth: 1 - :caption: II. NGC-Learn/Sim-Lib Foundations - - foundations - foundations/contexts - foundations/commands - foundations/operations - foundations/monitors - -.. toctree:: - :maxdepth: 1 - :caption: III. NGC-Lava: Support for Loihi 2 Transfer - - lava/introduction - lava/setup - lava/lava_components - lava/lava_context - lava/hebbian_learning - lava/monitors diff --git a/docs/tutorials/intro.md b/docs/tutorials/intro.md index 5651a453..e835819c 100755 --- a/docs/tutorials/intro.md +++ b/docs/tutorials/intro.md @@ -1,55 +1,27 @@ # Introduction -ngc-learn is a general-purpose library for modeling biomimetic/neuro-mimetic -complex systems. While the library is designed to provide flexibility on the -experimenter/designer side -- allowing one to design their own dynamics and -evolutionary processes -- at its foundation are a few standard components, the -basic modeling nodes for simulating some common biophysical systems computationally, -that useful to know in getting started and quickly building some classical/historical -models. If you are interested in knowing some of the neurophysiological theory -behind ngc-learn's design philosophy, [this section](../tutorials/theory) might -be of interest. +NGC-Learn is a general-purpose library for modeling complex dynamical systems, particularly those that are useful for +computational neuroscience, neuroscience-motivated artificial intelligence (NeuroAI), and brain-inspired computing. + +While the library is designed to provide flexibility on the experimenter/designer side -- allowing one to develop their +own dynamics and evolutionary processes -- at its foundation are a few standard components. These are basic modeling +nodes for simulating some common biophysical systems computationally, which are useful to know when getting started and +for quickly building some classical/historical models. If you are interested in knowing some of the neurophysiological +theory behind NGC-Learn's design philosophy, [this section](../tutorials/theory) might be of interest. -Specifically, to make best use of ngc-learn, it is important to get the -hang of its "nodes-and-cables system" (as it was historically referred to) in -order to build simulation objects. This set of tutorials will walk through, -step-by-step, the key aspects of the library you need to know so you can build -and run simulations of computational biophysical models. In addition, we -provide walkthroughs of some of the central mechanisms underlying -ngcsimlib, the simulation -dependency library that drives ngc-learn; these are particularly useful for not -only understanding why and how things are done by ngc-learn's simulation -backend but also for those who want to design new, custom extensions of ngc-learn -either for their own research or to contribute to the development of the main library. +Specifically, to make best use of NGC-Learn, it is important to get the hang of its "nodes-and-cables system" (the +historical name for its backend engine) in order to build simulation objects. This set of tutorials will walk you +through, step-by-step, the key aspects of the library that you will need to know so that you can build +and run simulations of computational biophysical models. In addition, we provide walkthroughs of some of the central +mechanisms underlying NGC-Sim-Lib, the simulation dependency +library that drives NGC-Learn; these lessons are particularly useful for not only understanding why and how things are +done by NGC-Learn's simulation backend engine but also for those who want to design new, custom extensions of NGC-Learn +either for their own research or to help contribute to the development of the main library. ## Organization of Tutorials -The core tutorials and lessons for using ngc-learn can be found [here, in the -tutorial table of contents](../tutorials/index.rst) and go through: the basic -configuration and use of ngc-learn and ngc-sim-lib to construct simulations -of dynamical systems, the essentials of neurocognitive modeling (such as -building and analyzing neuronal dynamics and synaptic plasticity), as well -as the coverage of some key foundational ideas/tools worth knowing about -ngc-learn (and its backend, ngc-sim-lib) particularly to facilitate easier -debugging, experimental configuration, and advanced model tools like `bundle rules`. - - +The core tutorials and usage lessons for using NGC-Learn can be found [here, in the modeling basics table of contents](../tutorials/index.rst) which essentially go through: the basic configuration and use of NGC-Learn (and NGC-Sim-Lib) to +construct simulations of basic dynamical systems. +More advanced tutorials related to the essentials of neurocognitive modeling -- such as building and analyzing +neuroscience models of neuronal dynamics and synaptic plasticity -- can be found [here, in the neurocognitive modeling +table of contents](../tutorials/neurocog/index.rst). diff --git a/docs/tutorials/lava/hebbian_learning.md b/docs/tutorials/lava/hebbian_learning.md deleted file mode 100644 index c45a01b6..00000000 --- a/docs/tutorials/lava/hebbian_learning.md +++ /dev/null @@ -1,312 +0,0 @@ -# Training a Spiking Network On-chip - -In this tutorial we will build generate a simple dataset (consisting of binary -patterns of X's, O's, and T's) and train a model in the Loihi simulator -using Hebbian learning in the form of trace-based spike-timing-dependent -plasticity. - -## Setting up ngc-learn - -The first step of this project consist of setting up the configuration file for -ngc-learn. Create a folder in your project directory root called `json_files` -and -then create a `config.json` configuration inside of that folder. - -Now for this project we will not be loading anything dynamically, so we can -simply add: - -```json -{ - "modules": { - "module_path": null - } -} -``` - -The above configuration will skip the dynamic loading of modules, which is -important for Lava-based model transference and simulation. - -Next, in order to run code with the Loihi simulator, the base version of numpy -needs to be used instead of JAX's wrapped numpy (which is what ngc-learn resorts -to by default). To change all of ngc-learn over to using the base version of -numpy, simply add the following to your configuration: - -```json -"packages": { - "use_base_numpy": true -} -``` - -Now your project is configured for ngc-lava and Lava usage and we can move on -to data generation. - -## Generating Data - -For this project we will be using three different patterns to train a simple -biophysical spiking neural network; the data will simply consist of binary -image patterns of either an `X`, `O`, and a `T`. To create the file needed to -generate these patterns, create a Python script named `data_generator.py` in -your project root. Next, we will import `numpy` and `random` and -define the following three generator methods: - -```python -from ngclearn import numpy as np - - -def make_X(size): - X = np.zeros((size, size)) - for i in range(0, size): - X[i, i] = np.random.uniform(0.75, 1) - X[i, size - 1 - i] = np.random.uniform(0.75, 1) - return X - - -def make_O(size): - O = np.zeros((size, size)) - for i in range(0, (size // 2) - 1): - O[1 + i, (size // 2) - 1 - i] = np.random.uniform(0.75, 1) - O[1 + i, (size // 2) + i] = np.random.uniform(0.75, 1) - O[(size // 2) + i, 1 + i] = np.random.uniform(0.75, 1) - O[(size // 2) + i, size - 2 - i] = np.random.uniform(0.75, 1) - return O - - -def make_T(size): - T = np.zeros((size, size)) - T[1, 1:size - 1] = np.random.uniform(0.75, 1, (1, size - 2)) - for i in range(2, size - 1): - T[i, (size // 2) - 1: (size // 2) + 1] = np.random.uniform(0.75, 1, - (1, 2)) - return T -``` - -Each of these methods will create a pattern of the desired size and shape. - -## Building the Model - -Found below is all of the imports that will be needed to run the model we desire -in Lava: - -```python -from ngclava import LavaContext -from ngclearn import numpy as np -from ngclearn.components.lava import LIFCell, GatedTrace, TraceSTDPSynapse, StaticSynapse, Monitor -import ngclearn.utils.viz as viz_utils -import ngclearn.utils.weight_distribution as dist -from data_generator import make_X, make_O, make_T -``` - -To start off building this model, we will define all of the hyperparameters -needed to create the necessary model components: - -```python -# Training Params -epochs = 35 -view_length = 200 -rest_length = 1000 - -# Model Params -n_in = 64 # Input layer size -n_hid = 25 # Hidden layer size -dt = 1. # ms # integration time constant -np.random.seed(42) ## seed the internal numpy calls -``` - -After this we will create the lava context, the components, as well as the -wiring: - -```python -with LavaContext("Model") as model: - z0 = LIFCell("z0", n_units=n_in, thr_theta_init=dist.constant(0.), dt=dt, - tau_m=50., v_decay=0., tau_theta=500., - refract_T=0.) ## IF cell - z1e = LIFCell("z1e", n_units=n_hid, - thr_theta_init=dist.uniform(amin=-2, amax=2.), - dt=dt, tau_m=100., tau_theta=500.) ## excitatory LIF cell - z1i = LIFCell("z1i", n_units=n_hid, - thr_theta_init=dist.uniform(amin=-2, amax=2.), - dt=dt, tau_m=100., thr=-40., v_rest=-60., v_reset=-45., - theta_plus=0.) ## inhibitory LIF cell - - tr0 = GatedTrace("tr0", n_units=n_in, dt=dt, tau_tr=20.) - tr1 = GatedTrace("tr1", n_units=n_hid, dt=dt, tau_tr=20.) - - W1 = TraceSTDPSynapse("W1", weight_init=dist.uniform(amin=0, amax=0.3), - shape=(n_in, n_hid), dt=dt, Aplus=0.011, - Aminus=0.0011, - preTrace_target=0.055) - W1ie = StaticSynapse("W1ie", weight_init=dist.hollow(120.), - shape=(n_hid, n_hid), dt=dt) - W1ei = StaticSynapse("W1ei", weight_init=dist.eye(22.5), - shape=(n_hid, n_hid), dt=dt) - - M = Monitor("M", default_window_length=view_length) - - ## wire z0 to z1e via W1 and z1i to z1e via W1ie - W1.inputs << z0.s - W1ie.inputs << z1i.s - - z1e.j_exc << W1.outputs - z1e.j_inh << W1ie.outputs - - # wire z1e to z1i via W1ie - W1ei.inputs << z1e.s - z1i.j_exc << W1ei.outputs - - # wire cells z0 and z1e to their respective traces - tr0.inputs << z0.s - tr1.inputs << z1e.s - - # wire relevant compartment statistics to synaptic cable W1 (for STDP update) - W1.x_pre << tr0.trace - W1.pre << z0.s - W1.x_post << tr1.trace - W1.post << z1e.s - - # set up monitoring of z1e's spike output - M << z1e.s -``` - -After the components have been set up, we have to "lag out" the synapses that -will cause recurrent (locking) problems when running on the Loihi2. This will -cause each of these synapses to run one time-step behind and fixes many -recurrency -issues (as described [here](lava_context.md)). - -```python - model.set_lag('W1') - model.set_lag('W1ie') - model.set_lag('W1ei') -``` - -Now that the model is all set up, we have to tell the Lava compiler to actually -build all the Lava objects with the following: - -```python - model.rebuild_lava() -``` - -This line will stop the automatic build of components when leaving this -with-block and provides access to all of the Lava components inside of this -with-block. - -Next, we set up two methods, a `clamp` method to set the input data and -`viz` to visualize all of the different receptive fields of our model: - -```python - lz0, lW1 = model.get_lava_components('z0', 'W1') - - - @model.dynamicCommand - def clamp(x): - model.pause() - lz0.j_exc.set(x) - - - @model.dynamicCommand - def viz(): - viz_utils.synapse_plot.visualize([lW1.weights.get()], [(8, 8)], "lava_fields") -``` - -## Running The Model - -Now that everything is set up to build the runtime and start training the model -inside of the Loihi simulator. To set up the runtime we call the following: - -```python - model.set_up_runtime("z0", rest_image=np.zeros((1, 64))) -``` - -This will set up a runtime with `z0` as the root node and also uses a resting -image of all zeros to allow the system to return to its resting state. - -Now the training loop will be as follows: - -```python -with model.runtime: - for i in range(epochs): - print(f"\rStarting Epoch: {i}", end="") - X = np.reshape(make_X(8), (1, 64)) - O = np.reshape(make_O(8), (1, 64)) - T = np.reshape(make_T(8), (1, 64)) - - model.view(X, view_length) - model.rest(rest_length) - - model.view(O, view_length) - model.rest(rest_length) - - model.view(T, view_length) - model.rest(rest_length) - print("\nDone Training") - -``` - -## Evaluating the On-Chip Trained Model - -The code above will work to train the model on a Loihi neuromorphic chip, but, -currently, we do not have a way of viewing how effective the model learned -really is. To set up this evaluation, we can call -the `viz` method defined above to view the receptive fields that our spiking -model has acquired: - -```python - model.viz() -``` - -Running this should produce a set of receptive fields that look like the -following: - -
- -While viewing the receptive fields qualitatively tells us that our spiking -model has trained, we may also want to view the -[raster plots](ngclearn.utils.viz.raster) -- visual depictions of the -underlying spike patterns acquired in the hidden layer of our model -- for each -of our three image patterns (as they are fed into our trained model). To do -this, we will make use of the monitor we defined above in the following manner: - -```python - ## Turning off learning - lW1.eta.set(np.array([0])) - - model.view(np.reshape(make_T(8), (1, 64)), view_length) - model.write_to_ngc() - spikes = M.view(z1e.s) - viz_utils.raster.create_raster_plot(spikes, tag="T", plot_fname="raster_T") - model.rest(rest_length) - print("Done T") - - model.view(np.reshape(make_X(8), (1, 64)), view_length) - model.write_to_ngc() - spikes = M.view(z1e.s) - viz_utils.raster.create_raster_plot(spikes, tag="X", plot_fname="raster_X") - model.rest(rest_length) - print("Done X") - - model.view(np.reshape(make_O(8), (1, 64)), view_length) - model.write_to_ngc() - spikes = M.view(z1e.s) - viz_utils.raster.create_raster_plot(spikes, tag="O", plot_fname="raster_O") - model.rest(rest_length) - print("Done O") -``` - -The above should result in raster plots where the spikes correspond to the -receptive fields of each trained letter pattern. Specifically, you should see -that the top left field is `N0` and the bottom right is `N24`. Your raster plots -should look like the ones below: - -
-
-
- -Finally to save the model to disk, you can call the following: - -```python - model.save_to_json(".", model_name="trained") -``` - -which will save your on-chip trained Loihi model to disk for later use. - - diff --git a/docs/tutorials/lava/introduction.md b/docs/tutorials/lava/introduction.md deleted file mode 100644 index 994e3809..00000000 --- a/docs/tutorials/lava/introduction.md +++ /dev/null @@ -1,37 +0,0 @@ -# Blending ngc-learn and lava-nc - -The subpackage of ngclearn known as ngc-lava is an interfacing layer between -ngclearn's components and contexts and lava-nc's models and processes. In this -package, there is the introduction of the `LavaContext`, a subclass of the default -ngclearn `Context`. This context has all the same functionality as the base -ngclearn context but adds the ability to convert lava compatible components into -their Lava process and model automatically and on-the-fly. This allows for the -development and testing of models inside ngclearn prior to their deployment onto -a Loihi neuromorphic chip without needing to translate between the two models -written across the two different Python libraries. - -## Some Cautionary Notes - -- For the best experience in training models in ngclearn, Python version `>=3.10` - should be used. However, much of lava is written to be used in Python `3.8` and, - because of this, there are some flags and functionality that cannot be used in Lava - components directly. It is for this reason that ngc-learn has several - in-built "lava components", i.e., those in `ngclearn.components.lava` that - are meant to directly interact with ngc-lava; other components (such as those - (`ngclearn.components.neurons` or `ngclearn.components.synapses`) are not likely - to work and, when writing your own custom ngc-lava components, we recommend - that you use those in the `ngclearn.components.lava` subpackage as starting - points to see what design patterns will work with Lava. -- As of right now, all of ngc-lava is built using the Loihi2 configuration and - Loihi1 is not actively supported. Loihi1 might still work but nothing is - guaranteed nor has been tested by the ngc-learn dev team. - -## Table of Contents -1. [Setting up ngc-lava](setup.md): A brief overview of how to set up - ngc-lava -2. [Lava components](lava_components.md): An overview of lava components in ngclearn and - how to make custom ones -3. [Lava Context](lava_context.md): An overview of the Lava context and building - models for Lava -4. [On-Chip Hebbian Learning](hebbian_learning.md): A walkthrough for getting a simple - hebbian learning model setup diff --git a/docs/tutorials/lava/lava_components.md b/docs/tutorials/lava/lava_components.md deleted file mode 100644 index 79411db1..00000000 --- a/docs/tutorials/lava/lava_components.md +++ /dev/null @@ -1,29 +0,0 @@ -# Lava Components - -Inside ngc-learn, there is a wide variety of components with which biophysical -models can be built. Unfortunately, many of those components are not compatible -with Lava and the loihi2. Therefore, ngc-learn supports several in-built -components that are Lava-compliant; many of the components that are compatible -to you can be found in `ngclearn.components.lava`. - -## What Makes an ngc-learn Component Compatible - -For components to be compatible with Lava, there are a few key rules that must -be followed: -- Lava Components can not make use of JAX's random or JAX's `nn` libraries -- Lava Components must import numpy from ngclearn and not JAX (there is a flag - in the configuration file to control JAX's numpy versus base numpy) -- Lava Components cannot take in any runtime arguments to their `advance_state` method -- Lava Components cannot take in any runtime arguments or compartments to their - `reset` method(s) - -## Mapping Methods -- Going from ngc-learn to Lava - -There are two methods that are mapped to their lava processes; these include the -`reset` method and the `advance_state` method. The reset method is just mapped -to the lava components and can be called on them without any issue. The -`advance_state` method is mapped to the `run_spk` method and is called during -the runtime loops in Lava. It is important to note that the methods that are -actually mapped are the pure methods passed into the resolvers that -decorate the ngc-learn `reset` and `advance_state` methods, not the -`reset` and `advance_state` methods themselves. \ No newline at end of file diff --git a/docs/tutorials/lava/lava_context.md b/docs/tutorials/lava/lava_context.md deleted file mode 100644 index cb7888ff..00000000 --- a/docs/tutorials/lava/lava_context.md +++ /dev/null @@ -1,103 +0,0 @@ -# The Lava Context - -The lava context, i.e, the `LavaContext`, serves as the core to ngc-lava as well -as the main workhorse of all of its features. Since it is a subclass of the -default ngc-learn context, we will only be covering the new Lava-specific -features here. - -## Building Lava Components - -The Lava context generally keeps track of two sets of components -- the ngclearn -components and the Lava components. However, due to the nature of the lava -components themselves, they must be built once the model is fixed and cannot be -built on-the-fly. Due to this fact, the building of the lava components must -be triggered before they can be used. Nevertheless, there are a few ways to trigger the -building of the Lava components. It is important to note that only the latest set -of components can be used for methods like clamping and running. This will -affect all dynamically compiled methods. - -### Events that Trigger a Rebuild - -- When a `LavaContext` is first constructed via: `with LavaContext("model") as model:` - leaving the context block will trigger a rebuild -- Calling `with model.updater:` will rebuild the lava components upon leaving the - with-block -- Calling `model.rebuild_lava()` will rebuild the lava components even if it is - still inside a with-block. However, by default, it will stop the with-block - from recompiling upon exiting as doing so would overwrite the previously built - model components. - -### Events That Will Not Trigger a Rebuild - -Simply calling `with model` will not trigger a rebuild upon exiting since this is -where additional dynamic method can be defined as well as reference sub-models -while not triggering a complete rebuild of the Lava components each time. - -## The Runtime - -Inside of Lava, there is an internal runtime that is controlling the simulator -for the loihi2. This runtime must be started in order to act upon Lava components, -such as clamping values to their compartments as well as probing information -about the model. To help simplify this, the `LavaContext` comes with a built-in -runtime manager. To gain access to the ngc-lava runtime manager, first call -`model.set_up_runtime()`. Note that the `set_up_runtime` method takes two -arguments. The first is the root Lava component name to be used to start the -runtime -- this is how Lava knows what component it will need to simulate. The -second argument is the "rest" image -- the "rest" image is used to allow the -dynamical system that is your model to return to its reset state while -receiving no input (this is akin to allowing a biophysical neural system to relax -to its resting potential state). This can be left as `None` and doing so will -skip this functionality. Note that this method does not actually start -the runtime, it just configures everything. It is important to observe that a -clamp method fitting the signature `clamp(x) -> None` needs to be defined in -order to use certain runtime methods as defined below. - -### Runtime Methods - -- `with model.runtime`: The lava runtime will exist for the duration of this - with block. -- `model.start_runtime()`: This starts the runtime without the management of - automatically stopping it later. -- `model.pause()`: Pauses the runtime, allowing for values to be read and set. -- `model.stop()`: Stops the runtime, runtimes can not be restarted once they are - stopped. -- `model.run(t)`: Runs the runtime, for `t` time steps. Will automatically pause - upon completion. -- `model.view(x, t)`: First calls `model.clamp(x)` and then runs the runtime for - `t` steps. Will automatically pause upon completion. -- `model.rest(t)`: First calls `model.clamp(rest_image)` and then runs the - runtime for `t` steps. Will automatically pause upon completion. If a reset - image was not supplied, this runtime method will not be available. - -## Additional Utility Methods - -### Using Lags with: `set_lag(component_name, status=True)` - -In Lava, it is easy to lock your system if there is recurrence in your model. -The Lava context allows for you to temporally "lag" the values emitted by -specific components, delaying their executation with respect to the previous -time-step. - -By default, the process pattern for a mapped Lava component is: -`Receive values -> Process values -> Emit values` - -A lagged Lava component will follow the pattern: -`Emit values -> Receive values -> Process Values` - -Example: -> There is a model that has the wiring pattern of `Z0 -> W1 -> Z1 -> W1` -> Here we can see that in order for Z1 to emit values it relies on the values -> emitted by W1. But W1 also relies on values emitted from Z1. So if we lag -> W1 it will emit last timesteps value at the start of the loop and then wait -> for the new values meaning that the value emitted by W1 will be delayed by a -> timestep, but it will no longer lock Z1 from running. - -### `write_to_ngc()` - -This method is designed to copy the current state of the Lava model into the -ngc-learn model. This will do a one-to-one mapping of all of thecomponents and -their values from Lava to ngclearn. It is important to point out that this must -be done inside of a runtime. This is critical for saving since, in order to save -an on-chip-trained model, it must first be written back to ngc-lava/learn -and then to disk. By default, this is called by `model.save_to_json` if called -inside a runtime. diff --git a/docs/tutorials/lava/monitors.md b/docs/tutorials/lava/monitors.md deleted file mode 100644 index b5d82243..00000000 --- a/docs/tutorials/lava/monitors.md +++ /dev/null @@ -1,17 +0,0 @@ -# Monitors - -While lava does have its own version of monitors, ngclearn offers an -in-built version for convenience. It is -recommended that you use the ngclearn monitors as they have expanded -functionality and are designed to interact with the Lava components well. For an -overview of/details on how monitors work please see -[this](../foundations/monitors.md). The -only difference is that Lava has its own monitor found -in `ngclearn.components.lava`. - -## Sharp Edges and Bits - -- Due to the fact that a Lava component of the monitor must be built, it has to - be defined inside the `LavaContext`. -- To view the values found within the monitor via the `view()` and `get_path()` - methods, `model.write_to_ngc()` must be called to refresh the values. \ No newline at end of file diff --git a/docs/tutorials/lava/setup.md b/docs/tutorials/lava/setup.md deleted file mode 100644 index 542b479e..00000000 --- a/docs/tutorials/lava/setup.md +++ /dev/null @@ -1,26 +0,0 @@ -# Setting Up ngc-lava - -Setting up ngc-lava is fairly straightforward. The only part that takes some -time is the setting up of the lava environment itself. - -## Installation and Setup Steps - -1. To set up and use ngc-lava, first download lava-nc - found [here](https://lava-nc.org/lava/notebooks/in_depth/tutorial01_installing_lava.html). -2. Install ngc-learn via pip `pip install ngc-learn` -3. Clone ngc-lava and add it as a project source - ```bash - git clone https://github.com/NACLab/ngc-lava.git - pip install -e ngc-lava - ``` -4. To compile for lava, Jax must be turned off; to do this, set the flag - `packages/use_base_numpy` to `true` in the ngc-learn - `config.json` file. If you do not have a `config.json` file written, the - script below will make one for you and add the needed Lava configuration flag: - - ```bash - mkdir json_files - touch json_files/config.json - echo "{\n \"packages\": {\n \"use_base_numpy\": true \n }\n}" > json_files/config.json - ``` -5. You are now set up and ready to use ngc-lava. \ No newline at end of file diff --git a/docs/tutorials/model_basics/configuration.md b/docs/tutorials/model_basics/configuration.md index 480fea98..37de90b0 100644 --- a/docs/tutorials/model_basics/configuration.md +++ b/docs/tutorials/model_basics/configuration.md @@ -1,39 +1,29 @@ -# Lesson 1: Configuring ngcsimlib +# Lesson 1: Configuring NGC-Sim-Lib ## Basics -There are various global configurations that can be made to ngcsimlib, the systems simulation backend for ngc-learn. These include the ability to point to custom locations for the `json_modules` files as well as setting up the logger. In both of these cases, the configuration will generally persist between different models that might be loaded and, thus, it will need to exist outside of the scope of the model's files. To solve this problem, ngcsimlib provides `config.json` as well as the `--config` flag mechanisms. +There are various global configurations that can be made to NGC-Sim-Lib, the systems simulation backend for NGC-Learn. +The primary use-case for a configuration file is to modify the library's built-in logger. Generally to control the +configuration, run any script (that uses NGC-Learn) with the flag `--config="path/to/your/config.json`. -The `config.json` file contains one large json object with sections set up for different parts of the configuration, broke up into sub-objects. There is no limit to the size or the number of these objects, meaning that the user is free to define and use them as they so choose. However, there are some general design principals that govern ngcsimlib that are worth knowing about. Specifically, this mechanism will not configure any parts of individual models. `config.json` configurations should be used to select/generally set up experiments and control global level flags and not to set hyperparameters for models. - -## Built-in Configurations - -There are a couple configurations that ngcsimlib will look for while it is initializing. Specifically `modules` and `logging`. While neither of these is needed to get up and running some aspects of ngcsimlib, useful debugging tools such as logging to files and more verbosity are locked behind flags set up here. - -### Modules - -The modules configuration only contains one value, `module_path`. This value is the location of the `modules.json`, the model-level/experiments-level configuration file one should be setting up when building their experiments. For additional information for configuring this file please -see modules.json. - -> Example Modules -> -> ```json -> { -> "modules": { -> "module_path": "custom/path/to/json/files/modules.json" -> } -> } -> ``` +The `config.json` file contains one large JSON object with sections set up for different parts of the configuration, +broken up into sub-objects. There is no limit to the size or to the number of these objects; this means that the user +is free to define and use them as they so choose. ### Logging -The logging configuration mechanism sets up and controls the instance of the python logger built into ngcsimlib. This mechanism (or JSON section) has three values found within it. Specifically, `logging_level`, `logging_file`, and `hide_console`. The logging levels are the same ones built into the python logger and the value words used are either the standard Python string representation of the level or the numeric equivalent. The `logging file`, if defined, is a file that the logger will append all logging messages to for a more permanent history of all messages. Finally, `hide console`, if set to true, will hide all logging output to the console. +The logging configuration mechanism sets up and controls the instance of the Python logger built into ngcsimlib. This +mechanism (or JSON section) has three values found within it. Specifically, `logging_level`, `logging_file`, and +`hide_console`. The logging levels are the same ones built into the Python logger and the value words used are either +the standard Python string representation of the level (or the numeric equivalent). The `logging file`, if defined, is +a file that the logger will append all logging messages to in order to facilitate a more permanent history of all +messages. Finally, `hide console`, if set to true, will hide all the logging output to the console. > Default Config > ```json > { > "logging": { -> "logging_level": "WARNING", +> "logging_level": "ERROR", > "hide_console": false > } > } @@ -52,21 +42,27 @@ The logging configuration mechanism sets up and controls the instance of the pyt ## Using a Configuration -To use a configuration, there are a few options. The first option is to simply use the configuration as a python dictionary. This is done by importing the `get_config` method from `ngcsimlib.configManager` and providing the name of the configuration section to the method. +To use a configuration, there are a few options. The first option is to simply use the configuration as a Python +dictionary. This is done by importing the `get_config` method from `ngclearn` and providing the name of the +configuration section to the method. > Example get_config >```python ->from ngcsimlib.configManager import get_config +>from ngclearn import get_config > >loggerConfig = get_config("logger") >level = loggerConfig['logging_level'] >``` -The other way you can access a configuration is through a provided namespace. This makes use of python's `SimpleNamespace` to map all the dictionary's key values to properties of an object to be used. One important note about namespaces is that, unlike a python dictionary where the `get` method can be provided a default value for missing keys, namespaces do not have this functionality. Therefore, if keys are missing it has the potential to cause errors. Below is an example of how one could use the namespace for logging configuration. +The other way you can access a configuration is through a provided namespace. This makes use of Python's +`SimpleNamespace` to map all the dictionary's key values to properties of an object that is to be used. One +important note about namespaces is that, unlike a Python dictionary where the `get` method can be provided a default +value for missing keys, namespaces do not have this functionality. Therefore, missing keys create the potential +to cause errors. Below is an example of how one could use the namespace for a logging configuration. > Example provide_namespace > ```python -> from ngcsimlib.configManager import provide_namespace +> from ngclearn import provide_namespace > > loggerConfig = provide_namespace("logger") > level = loggerConfig.logging_level diff --git a/docs/tutorials/model_basics/evolving_synapses.md b/docs/tutorials/model_basics/evolving_synapses.md index 8cf92f8b..e68ef1de 100755 --- a/docs/tutorials/model_basics/evolving_synapses.md +++ b/docs/tutorials/model_basics/evolving_synapses.md @@ -1,27 +1,24 @@ -# Lesson 4: Evolving Synaptic Efficacies +# Lesson 3: Evolving Synaptic Efficacies -In this tutorial, we will extend a controller with three components, -two cell components connected with a synaptic cable component, to incorporate a -basic a two-factor Hebbian adjustment process. +In this tutorial, we will extend a model context/controller with three components, two cell components connected with a +synaptic cable component, to incorporate a basic a two-factor Hebbian adjustment process. ## Adding a Learnable Synapse to a Multi-Component System -Let us start by building a controller similar to previous lessons with the one -exception that now we will trigger the synaptic connection between `a` and `b` -to adapt via a simple 2-factor Hebbian rule. This Hebbian rule will require us -to wire the output compartment of `a` to the pre-synaptic compartment of the -synapse `Wab` and the output compartment of `b` to the post-synaptic -compartment of `Wab`. This will wire in the two relevant factors needed to +Create a Python script/file named `run_lesson3.py` to place/write your Python code below into. +Let us start by building a controller/model-context similar to previous lessons with the one exception that now we will +trigger the synaptic connection between `a` and `b` to adapt via a simple 2-factor Hebbian rule. This Hebbian rule will +require us to wire the output compartment of `a` to the pre-synaptic compartment of the synapse `Wab` and the output +compartment of `b` to the post-synaptic compartment of `Wab`. This will wire in the two relevant factors needed to compute a simple Hebbian adjustment. We do this specifically as follows: ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess +from ngclearn import Context, MethodProcess from ngclearn.components import HebbianSynapse, RateCell -import ngclearn.utils.weight_distribution as dist +from ngclearn.utils.distribution_generator import DistributionGenerator as dist ## create seeding keys dkey = random.PRNGKey(1234) @@ -29,62 +26,57 @@ dkey, *subkeys = random.split(dkey, 6) ## create simple system with only one F-N cell with Context("Circuit") as circuit: - a = RateCell(name="a", n_units=1, tau_m=0., act_fx="identity", key=subkeys[0]) - b = RateCell(name="b", n_units=1, tau_m=0., act_fx="identity", key=subkeys[1]) - - Wab = HebbianSynapse( - name="Wab", shape=(1, 1), eta=1., sign_value=-1., weight_init=dist.constant(value=1.), - w_bound=0., key=subkeys[3] - ) - - # wire output compartment (rate-coded output zF) of RateCell `a` to input compartment of HebbianSynapse `Wab` - Wab.inputs << a.zF - # wire output compartment of HebbianSynapse `Wab` to input compartment (electrical current j) RateCell `b` - b.j << Wab.outputs - - # wire output compartment (rate-coded output zF) of RateCell `a` to presynaptic compartment of HebbianSynapse `Wab` - Wab.pre << a.zF - # wire output compartment (rate-coded output zF) of RateCell `b` to postsynaptic compartment of HebbianSynapse `Wab` - Wab.post << b.zF - - ## create and compile core simulation commands - evolve_process = (JaxProcess() - >> Wab.evolve) - circuit.wrap_and_add_command(jit(evolve_process.pure), name="evolve") - - advance_process = (JaxProcess() - >> a.advance_state) - circuit.wrap_and_add_command(jit(advance_process.pure), name="advance") - - reset_process = (JaxProcess() - >> a.reset) - circuit.wrap_and_add_command(jit(reset_process.pure), name="reset") - - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): + a = RateCell(name="a", n_units=1, tau_m=0., act_fx="identity", key=subkeys[0]) + b = RateCell(name="b", n_units=1, tau_m=0., act_fx="identity", key=subkeys[1]) + + Wab = HebbianSynapse( + name="Wab", shape=(1, 1), eta=1., sign_value=-1., weight_init=dist.constant(value=1.), + w_bound=0., key=subkeys[3] + ) + + # wire output compartment (rate-coded output zF) of RateCell `a` to input compartment of HebbianSynapse `Wab` + a.zF >> Wab.inputs + # wire output compartment of HebbianSynapse `Wab` to input compartment (electrical current j) RateCell `b` + Wab.outputs >> b.j + + # wire output compartment (rate-coded output zF) of RateCell `a` to presynaptic compartment of HebbianSynapse `Wab` + a.zF >> Wab.pre + # wire output compartment (rate-coded output zF) of RateCell `b` to postsynaptic compartment of HebbianSynapse `Wab` + b.zF >> Wab.post + + ## create and compile core simulation commands + evolve = (MethodProcess("evolve") + >> a.evolve) + + advance = (MethodProcess("advance") + >> a.advance_state) + + reset = (MethodProcess("reset") + >> a.reset) + +## set up non-compiled utility commands +def clamp(x): a.j.set(x) ``` -Now with our simple system above created, we will now run a simple sequence -of one-dimensional "spike" data through it and evolve the synapse every time -step like so: +Now with our simple system above created, we will now run a simple sequence of one-dimensional "spike" data through it +and evolve the synapse every time step like so: ```python ## run some data through the dynamical system x_seq = jnp.asarray([[1, 1, 0, 0, 1]], dtype=jnp.float32) -circuit.reset() +reset.run() print("{}: Wab = {}".format(-1, Wab.weights.value)) for ts in range(x_seq.shape[1]): x_t = jnp.expand_dims(x_seq[0,ts], axis=0) ## get data at time t - circuit.clamp(x_t) - circuit.advance(t=ts*1., dt=1.) - circuit.evolve(t=ts*1., dt=1.) - print(" {}: input = {} ~> Wab = {}".format(ts, x_t, Wab.weights.value)) + clamp(x_t) + advance.run(t=ts*1., dt=1.) + evolve.run(t=ts*1., dt=1.) + print(" {}: input = {} ~> Wab = {}".format(ts, x_t, Wab.weights.get())) ``` -Your code should produce the same output (towards the bottom): +After running `run_lesson3.py`, your code should produce (printed to I/O) the same output as below: ```console -1: Wab = [[1.]] @@ -95,14 +87,11 @@ Your code should produce the same output (towards the bottom): 4: input = [1.] ~> Wab = [[8.]] ``` -Notice that for every non-spike (a value of `0`), the synaptic value remains -the same (because the product of a pre-synaptic value of `0` with a post-synaptic -value of anything -- in this case, also a `0` -- is simply `0`, meaning no -change will be applied to the synapse). For every spike (a value of `1`), we -get a synaptic change equal to `dW = input * (Wab * input)`; so for the -first time-step, the weight will change according to -`W = W + eta * dW = W + dW` and `dW = 1 * (1 * 1) = 1`, whereas, for the -second time-step, `W` will be increased by `dW = 1 * (2 * 1) = 2` (yielding a - new synaptic strength of `W = 4`). - -You have now created your first plastic, evolving neuronal system. +Notice that for every non-spike (a value of `0`), the synaptic value remains the same (because the product of a +pre-synaptic value of `0` with a post-synaptic value of anything -- in this case, also a `0` -- is simply `0`, meaning +that no change will be applied to the synapse). For every spike (a value of `1`), we get a synaptic change equal to +`dW = input * (Wab * input)`; so for the first time-step, the weight will change according to +`W = W + eta * dW = W + dW` and `dW = 1 * (1 * 1) = 1`, whereas, for the second time-step, `W` will be increased by +`dW = 1 * (2 * 1) = 2` (yielding a new synaptic strength of `W = 4`). + +As per the above, you have now created your first plastic, evolving neuronal system! diff --git a/docs/tutorials/model_basics/json_modules.md b/docs/tutorials/model_basics/json_modules.md deleted file mode 100644 index 54f8a81f..00000000 --- a/docs/tutorials/model_basics/json_modules.md +++ /dev/null @@ -1,154 +0,0 @@ -# Lesson 2: Configuring with the modules.json File - -## Basic Usage: - -The basic usage for the `modules.json` file is to provide ngclearn with a list of modules to import and associated -classes that are needed to build the models it will be loading. If there is a need to use the imported -modules outside of these cases, use `ngcsimlib.utils.load_attribute` and the loaded -attribute will be returned. - -By default, ngcsimlib, the backend -dependency of ngc-learn, looks for `json_files/modules.json` in your project path. -However, this can be changed inside the -configuration file. In -the event that this -file is missing, ngcsimlib will not break but its ability to load saved models will be limited. - -## Motivation - -The motivation behind the use of `modules.json` versus the registering all the -various parts of the model at the top of the file is reusability. When all the -parts have to be registered/imported at the top of every test file, or be placed into specific locations can be limiting -and slows down development. With a single project wide modules file all loaded models can look there to load components. -This also allows for components to be saved in humanreadable formats not as a pickled object as we can save and load all -the relevant class information from the class name and the modules file. - -## Structure - -A complete schema for the modules file can be found in `modules.schema` - -The general structure of the modules file can be thought of as a transformation -of python import statements to JSON objects. Take the following example: - -```python -from ngclearn.commands import AdvanceState as advance -``` - -In this statement we are importing a command from ngcsimlib and aliasing it to the -word "advance". Now we will transform this into JSON for the modules file. First, -we take the top level module that we are importing from, in this case -`ngcsimlib.commands`; this the absolute path to the location of this module. Next, -we look at the name of what we are importing here: `AdvanceState`. Finally, we -look at the keyword since this import is being assigned to `advance`. We then -take these three parts and combine them into the following JSON object: - -```json - { - "absolute_path": "ngclearn.commands", - "attributes": [ - { - "name": "AdvanceState", - "keywords": [ - "advance" - ] - } - ] -} -``` - -Now there are a few additional things that this JSON formulation of an import -allows us to do. Primarily, it allows for multiple keywords for a single import -to be defined. This if we wanted to use `advance` and `adv` all we would do is -change the keyword line to `"keywords": ["advance", "adv"]`. In addition, we are able -to specify more than one attribute to import from a single top level module -such as also importing the evolve command. - -```json - { - "absolute_path": "ngcsimlib.commands", - "attributes": [ - { - "name": "AdvanceState", - "keywords": [ - "advance", - "adv" - ] - }, - { - "name": "Evolve" - } - ] -} -``` - -Now you might notice above that, when importing the evolve attribute, no -keywords were given. This means that, in order to add an evolve command to -the controller, the whole name will need to be given. There is one caveat to -this scheme though; it is case-insensitive by default, meaning that both -`Evolve` and `evolve` are valid ways to using this import. - -## Example Transformations - -Below are some additional examples to help with transitioning from python -header import statements to JSON configuration. - -> Case 1 -> Python: -> ```python -> from ngcsimlib.commands import AdvanceState as advance, Evolve, Multiclamp as mClamp -> ``` -> Json: -> ```json -> [ -> { -> "absolute_path": "ngcsimlib.commands", -> "attributes": [ -> { -> "name": "AdvanceState", -> "keywords": ["advance"] -> }, -> { -> "name": "Evolve" -> }, -> { -> "name": "Multiclamp", -> "keywords": "mClamp" -> } -> ] -> } -> ] -> ``` - -> Case 2 -> Python -> ```python -> from ngclearn.commands import AdvanceState as advance -> from ngclearn.operations import summation as summ, overwrite -> ``` -> -> Json -> ```json -> [ -> { -> "absolute_path": "ngclearn.commands", -> "attributes": [ -> { -> "name": "AdvanceState", -> "keywords": ["advance"] -> } -> ] -> }, -> { -> "absolute_path": "ngclearn.operations", -> "attributes": [ -> { -> "name": "summation", -> "keywords": ["summ"] -> }, -> { -> "name": "overwrite" -> } -> ] -> } -> ] -> ``` diff --git a/docs/tutorials/model_basics/model_building.md b/docs/tutorials/model_basics/model_building.md index e5cff8e6..34c1be48 100755 --- a/docs/tutorials/model_basics/model_building.md +++ b/docs/tutorials/model_basics/model_building.md @@ -1,19 +1,19 @@ -# Lesson 3: Building a Model +# Lesson 2: Building a Model -In this tutorial, we will build a simple model made up of three components: -two simple graded cells that are connected by one synaptic cable. +In this tutorial, we will build a simple model made up of three components: two simple graded cells that are connected +by a single synaptic cable. ## Instantiating the Dynamical System as a Context -While building our dynamical system we will set up a Context and then add the three different components to it. +Create a file named `run_lesson2.py` to place/write your Python code below into. +While building our dynamical system we will set up a `Context` and then add the three different components to it, +like so: ```python from jax import numpy as jnp, random -from ngclearn import Context -from ngclearn.utils import JaxProcess -from ngcsimlib.compilers.process import Process +from ngclearn import Context, MethodProcess from ngclearn.components import RateCell, HebbianSynapse -import ngclearn.utils.weight_distribution as dist +from ngclearn.utils.distribution_generator import DistributionGenerator as dist ## create seeding keys dkey = random.PRNGKey(1234) @@ -23,94 +23,67 @@ dkey, *subkeys = random.split(dkey, 4) with Context("model") as model: a = RateCell(name="a", n_units=1, tau_m=0., act_fx="identity", key=subkeys[0]) b = RateCell(name="b", n_units=1, tau_m=20., act_fx="identity", key=subkeys[1]) - Wab = HebbianSynapse( - name="Wab", shape=(1, 1), weight_init=dist.constant(value=1.), key=subkeys[2] - ) + Wab = HebbianSynapse(name="Wab", shape=(1, 1), weight_init=dist.constant(value=1.), key=subkeys[2]) ``` -Next, we will want to wire together the three components we have embedded into -our model, connecting `a` to node `b` through synaptic cable `Wab`. In -other words, this means that the output compartment of `a` must be wired to the -input compartment of transformation `Wab` and the output compartment of `Wab` -must be wired to the input compartment of `b`. In code, this is done as follows: +Next, we will want to wire together the three components we have embedded into our model, connecting `a` to node `b` +through synaptic cable `Wab`. In other words, this means that the output compartment of `a` (which, if one checks +the documentation for `a`, turns out to be `.zF`) must be wired to the input compartment of transformation `Wab` +(i.e., `.inputs`) and the output compartment of `Wab` (i.e., `.outputs`) must be wired to the input compartment +of `b` (i.e., `.j`). In code, this is done (within the `Context`-block) as follows: ```python - ## wire a to w_ab and wire w_ab to b - Wab.inputs << a.zF - b.j << Wab.outputs + ## wire a to w_ab and wire w_ab to b (a -> Wab -> b) + a.zF >> Wab.inputs + Wab.outputs >> b.j ``` -Finally, to make our dynamical system do something for each step of simulated -time, we must append a few basic commands -(see [Understanding Commands](../foundations/commands.md) to the context. -The commands we will want, as implied by our JSON configuration that we put -together at the start of this tutorial, include a `reset` (which will -initialize the compartments within each node to their resting values, -i.e., generally zero, if they have them -- this will only end up affecting -nodes `a` and `b` since a basic synapse component like `Wab` does not have a -base/resting value), an `advance` (which moves all the nodes one step -forward in time according to their compartments' ODEs), and `clamp` (which will -allow us to insert data into particular nodes). -This is simply done with the use of the following convenience function calls: - - - +Finally, to make our dynamical system do something for each step of simulated time, we must append a few basic +processes (see [Understanding Processes](../configuration/processes.md)) to the context. +The commands that we will (in general) want will include a `reset` (which will initialize the compartments within +each node to their "resting" values, i.e., generally zero, if they have them), an `advance` (which moves all the +nodes one step forward in time according to their compartments' differential equations/internal dynamics), and +`clamp` (which will allow us to insert data into particular nodes). +This is simply done by writing the following next (within the `Context`-block): ```python ## configure desired commands for simulation object - reset_process = (JaxProcess() - >> a.reset - >> Wab.reset - >> b.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") + reset = (MethodProcess("reset") + >> a.reset + >> Wab.reset + >> b.reset) - advance_process = (JaxProcess() - >> a.advance_state - >> Wab.advance_state - >> b.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") + advance = (MethodProcess("advance") + >> a.advance_state + >> Wab.advance_state + >> b.advance_state) - ## set up clamp as a non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) +## set up clamp as a non-compiled utility commands (outside the context-block) +def clamp(x): + a.j.set(x) ## injects value/tensor x into compartment .j of component a ``` -## Running the Dynamical System's Controller +## Running the Dynamical System -With our simple 3-component dynamical system built, we may now run it on a -simple sequence of one-dimensional real-valued numbers: +With our simple 3-component dynamical system built, we may now apply and run it on a simple sequence of +one-dimensional real-valued numbers: ```python ## run some data through our simple dynamical system x_seq = jnp.asarray([[1., 2., 3., 4., 5.]], dtype=jnp.float32) -model.reset() +reset.run() for ts in range(x_seq.shape[1]): x_t = jnp.expand_dims(x_seq[0, ts], axis=0) ## get data at time ts - model.clamp_data(x_t) - model.advance(t=ts * 1., dt=1.) + clamp(x_t) + advance.run(t=ts * 1., dt=1.) ## naively extract simple statistics at time ts and print them to I/O - a_out = a.zF - b_out = b.zF + a_out = a.zF.get() + b_out = b.zF.get() print(" {}: a.zF = {} ~> b.zF = {}".format(ts, a_out, b_out)) ``` -and, assuming you place your code above in a Python script -(e.g., `run_lesson2.py`), we should obtain output in your terminal as below: +and, when running your Python script (i.e., `run_lesson2.py`), we should obtain output in your terminal as below: ```console $ python run_lesson2.py @@ -121,24 +94,17 @@ $ python run_lesson2.py 4: a.zF = [5.] ~> b.zF = [[0.75]] ``` -The simple 3-component system simulated above merely transforms the input -sequence into another time-evolving series. For the curious, in your code above, -you modeled a very simple non-leaky integration of cell `b` injected with some -value produced by `a` (since `Wab = 1`, the synapses had no effect and merely -copies the value along). While node `a` is always clamped to a value as per the -clamp command call we constructed and call above (even though its time constant -was `tau_m = 0` ms, meaning that it reduces to a stateless "feedforward" cell), -b had a time constant you set to `tau_m = 20` ms. This means, as can be confirmed -by inspecting the API for `RateCell`, with your integration time constant -`dt = 1` ms: - -1. at time step `ts = 0`, the value clamped to `a`, i.e., `1`, was multiplied by - `1/20 = 0.05` and then added `b`'s internal state (which started at the value - of `0` through the reset command called before the for-loop); -2. at step `ts = 1`, the value clamped to `a`, i.e., `2`, was multiplied by - `0.05` (yielding `0.1`) and then added to `b`'s current state -- meaning that - the new state becomes `0.05 + 0.1 = 0.15`; -3. at `ts = 2`, a value `3` is clamped to `a`, which is then multiplied by `0.05` - to yield `0.15` and then added to `b`'s current state -- meaning that the new - state is `0.15 + 0.15 = 0.3` - and so on and so forth (`b` acts like a non-decaying recurrently additive state). +The simple 3-component system simulated above merely transforms the input sequence into another time-evolving series. +For the curious, in your code above, you modeled a very simple non-leaky integration of cell `b` injected with some +value produced by `a` (since `Wab = 1`, the synapses had no effect and merely copies the value along). While node +`a` is always clamped to a value as per the clamp command call we constructed and call above (even though its +time constant was `tau_m = 0` ms, meaning that it reduces to a stateless "feedforward" cell), `b` had a time constant +you set to `tau_m = 20` ms. This means, as can be confirmed by inspecting the API for `RateCell`, with your integration time constant `dt = 1` ms: + +1. at time step `ts = 0`, the value clamped to `a`, i.e., `1`, was multiplied by `1/20 = 0.05` and then added + `b`'s internal state (which started at the value of `0` through the reset command called before the for-loop); +2. at step `ts = 1`, the value clamped to `a`, i.e., `2`, was multiplied by `0.05` (yielding `0.1`) and then added + to `b`'s current state -- meaning that the new state becomes `0.05 + 0.1 = 0.15`; +3. at `ts = 2`, a value `3` is clamped to `a`, which is then multiplied by `0.05` to yield `0.15` and then added to + `b`'s current state -- meaning that the new state is `0.15 + 0.15 = 0.3` and so on and so forth (`b` acts like a + non-decaying recurrently additive state). diff --git a/docs/tutorials/neurocog/adex_cell.md b/docs/tutorials/neurocog/adex_cell.md index 4a685488..f4ddc79a 100755 --- a/docs/tutorials/neurocog/adex_cell.md +++ b/docs/tutorials/neurocog/adex_cell.md @@ -22,9 +22,7 @@ AdEx cell amounts to the following: from jax import numpy as jnp, random, jit import numpy as np -from ngclearn.utils.model_utils import scanner -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.neurons.spiking.adExCell import AdExCell @@ -46,20 +44,15 @@ with Context("Model") as model: intrinsic_mem_thr=-55., v_thr=5., v_rest=-72., v_reset=-75., a=0.1, b=0.75, v0=v0, w0=w0, integration_type="euler", key=subkeys[0] ) - ## create and compile core simulation commands - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance_proc") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset_proc") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - cell.j.set(x) + +## set up non-compiled utility commands +def clamp(x): + cell.j.set(x) ``` In effect, the AdEx two-dimensional differential equation system [1]-[2] offers @@ -109,19 +102,19 @@ i_app = 19. ## electrical current to inject into AdEx cell data = jnp.asarray([[i_app]], dtype=jnp.float32) time_span = [] -model.reset() +reset_process.run() t = 0. for ts in range(T): x_t = data ## pass in t and dt and run step forward of simulation - model.clamp(x_t) - model.advance(t=t, dt=dt) + clamp(x_t) + advance_process.run(t=t, dt=dt) # run one step of dynamics t = t + dt ## naively extract simple statistics at time ts and print them to I/O - v = cell.v.value - w = cell.w.value - s = cell.s.value + v = cell.v.get() + w = cell.w.get() + s = cell.s.get() curr_in.append(data) mem_rec.append(v) recov_rec.append(w) @@ -150,26 +143,27 @@ recov_rec = np.squeeze(np.asarray(recov_rec)) spk_rec = np.squeeze(np.asarray(spk_rec)) # Plot the AdEx cell trajectory -cell_tag = "RS" n_plots = 1 fig, ax = plt.subplots(1, n_plots, figsize=(5*n_plots,5)) ax_ptr = ax -ax_ptr.set(xlabel='Time', ylabel='Voltage (v)', - title="AdEx ({}) Voltage Dynamics".format(cell_tag)) +ax_ptr.set( + xlabel='Time', ylabel='Voltage (v)', title="AdEx Voltage Dynamics" +) v = ax_ptr.plot(time_span, mem_rec, color='C0') ax_ptr.legend([v[0]],['v']) plt.tight_layout() -plt.savefig("{0}".format("adex_v_plot.jpg".format(cell_tag.lower()))) +plt.savefig("{0}".format("adex_v_plot.jpg")) fig, ax = plt.subplots(1, n_plots, figsize=(5*n_plots,5)) ax_ptr = ax -ax_ptr.set(xlabel='Time', ylabel='Recovery (w)', - title="AdEx ({}) Recovery Dynamics".format(cell_tag)) +ax_ptr.set( + xlabel='Time', ylabel='Recovery (w)', title="AdEx Recovery Dynamics" +) w = ax_ptr.plot(time_span, recov_rec, color='C1', alpha=.5) ax_ptr.legend([w[0]],['w']) plt.tight_layout() -plt.savefig("{0}".format("adex_w_plot.jpg".format(cell_tag.lower()))) +plt.savefig("{0}".format("adex_w_plot.jpg")) plt.close() ``` @@ -194,27 +188,6 @@ however, one could configure it to use the midpoint method for integration by setting its argument `integration_type = rk2` in cases where more accuracy in the dynamics is needed (at the cost of additional computational time). -## Optional: Setting Up The Components with a JSON Configuration - -While you are not required to create a JSON configuration file for ngc-learn, -to get rid of the warning that ngc-learn will throw at the start of your -program's execution (indicating that you do not have a configuration set up yet), -all you need to do is create a sub-directory for your JSON configuration -inside of your project code's directory, i.e., `json_files/modules.json`. -Inside the JSON file, you would write the following: - -```json -[ - {"absolute_path": "ngclearn.components", - "attributes": [ - {"name": "AdExCell"}] - }, - {"absolute_path": "ngcsimlib.operations", - "attributes": [ - {"name": "overwrite"}] - } -] -``` ## References diff --git a/docs/tutorials/neurocog/density_modeling.md b/docs/tutorials/neurocog/density_modeling.md new file mode 100644 index 00000000..4c930167 --- /dev/null +++ b/docs/tutorials/neurocog/density_modeling.md @@ -0,0 +1,164 @@ +# Density Modeling and Analysis + +NGC-Learn offers some support for density modeling/estimation, which can be particularly useful in analyzing how internal properties of neuronal models' self-organized cell populations (e.g., how the distributed representations of a model might cluster into distinct groups/categories) or to draw samples from the underlying generative model implied by a particular neuronal structure (e.g., sampling a trained predictive coding generative model). +Particularly, within `ngclearn.utils.density`, one can find implementations of mixture models -- such as mixtures of Bernoullis, Gaussians, and exponentials -- which might be employed to carry out such tasks. In this small lesson, we will demonstrate how to set up a Gaussian mixture model (GMM), fit it to some synthetic latent code data, and plot out the distribution it learns overlaid over the data samples as well as examine the kinds of patterns one may sample from the learnt GMM. + +## Setting Up a Gaussian Mixture Model (GMM) + +Let's say you have a two-dimensional dataset of neural code vectors collected from another model you have simulated -- here, we will artificially synthesize this kind of data in this lesson from an "unobserved" trio of multivariate Gaussians (as was done in the t-SNE tutorial) and pretend that this is a set of collected vector measurements. Furthermore, you decide that, after consideration that your data might follow a multi-modal distribution (and reasonably asssuming that multivariate Gaussians might capture most of the inherent structure/shape), you want to fit a GMM to these codes to later on sample from their underlying multi-modal distribution. + +The following Python code will employ an NGC-Learn-in-built GMM density estimator for you (including setting up the data generator): + +```python +from jax import numpy as jnp, random +from ngclearn.utils.density.gaussianMixture import GaussianMixture as GMM ## pull out density estimator + +def gen_data(dkey, n_samp_per_mode): ## data generator (or proxy stochastic data generating process) + scale = 0.3 + mu1 = jnp.asarray([[2.1, 3.2]]) * scale + cov1 = jnp.eye(mu1.shape[1]) * 0.78 * scale * 0.5 + mu2 = jnp.asarray([[-2.8, 2.0]]) * scale + cov2 = jnp.eye(mu2.shape[1]) * 0.52 * scale * 0.5 + mu3 = jnp.asarray([[1.2, -2.7]]) * scale + cov3 = jnp.eye(mu3.shape[1]) * 1.2 * scale * 0.5 + params = (mu1,cov1 ,mu2,cov2,mu3,cov3) + + dkey, *subkeys = random.split(dkey, 7) + samp1 = random.multivariate_normal(subkeys[0], mu1, cov1, shape=(n_samp_per_mode,)) + samp2 = random.multivariate_normal(subkeys[1], mu2, cov2, shape=(n_samp_per_mode,)) + samp3 = random.multivariate_normal(subkeys[2], mu3, cov3, shape=(n_samp_per_mode,)) + X = jnp.concatenate((samp1, samp2, samp3), axis=0) + y1 = jnp.ones((n_samp_per_mode, 3)) * jnp.asarray([[1., 0., 0.]]) + y2 = jnp.ones((n_samp_per_mode, 3)) * jnp.asarray([[0., 1., 0.]]) + y3 = jnp.ones((n_samp_per_mode, 3)) * jnp.asarray([[0., 0., 1.]]) + lab = jnp.concatenate((y1, y2, y3), axis=0) ## one-hot codes + + ## shuffle the data + ptrs = random.permutation(subkeys[3], X.shape[0]) + X = X[ptrs, :] + lab = lab[ptrs, :] + + return X, lab, params + +## set up the GMM density estimator +key = random.PRNGKey(69) +dkey, *skey = random.split(key, 3) +X, y, params = gen_data(key, n_samp_per_mode=200) ## X is your "vector dataset" + +n_iter = 100 ## maximum number of iterations to fit GMM to data +n_components = 3 ## number of mixture components w/in GMM +model = GMM(K=n_components, max_iter=n_iter, key=skey[0]) +model.init(X) ## initailize the GMM to dataset X +``` + +The above will construct a GMM with three components (or latent variables of its own) and be configured to use a maximum of `100` iterations to fit itself to data. Note that the call to `init()` will "shape" the GMM according to the dimensionality of the data and pre-initialize its parameters (i.e., choosing random data vectors to initialize its means). + +To fit the GMM itself to your dataset `X`, you will then write the following: + +```python +## estimate GMM parameters over dataset via E-M +model.fit(X, tol=1e-3, verbose=True) ## set verbose to `False` to silence the fitting process +``` + +which should print to I/O something akin to: + +```console +0: Mean-diff = 1.4147894382476807 log(p(X)) = -1706.0753173828125 nats +1: Mean-diff = 0.14663299918174744 log(p(X)) = -1386.569091796875 nats +2: Mean-diff = 0.18331432342529297 log(p(X)) = -1359.6962890625 nats +3: Mean-diff = 0.17693905532360077 log(p(X)) = -1309.736083984375 nats +4: Mean-diff = 0.1494818776845932 log(p(X)) = -1250.130615234375 nats +5: Mean-diff = 0.11344392597675323 log(p(X)) = -1221.0008544921875 nats +6: Mean-diff = 0.07362686842679977 log(p(X)) = -1204.680419921875 nats +7: Mean-diff = 0.03828870505094528 log(p(X)) = -1192.706298828125 nats +8: Mean-diff = 0.025705577805638313 log(p(X)) = -1188.51123046875 nats +9: Mean-diff = 0.021316207945346832 log(p(X)) = -1187.055908203125 nats +10: Mean-diff = 0.019372563809156418 log(p(X)) = -1186.157470703125 nats +11: Mean-diff = 0.018868334591388702 log(p(X)) = -1185.443115234375 nats +... + +... +46: Mean-diff = 0.017377303913235664 log(p(X)) = -1062.2596435546875 nats +47: Mean-diff = 0.007906327955424786 log(p(X)) = -1060.440185546875 nats +48: Mean-diff = 0.003615213558077812 log(p(X)) = -1060.09130859375 nats +49: Mean-diff = 0.0016773870447650552 log(p(X)) = -1060.0233154296875 nats +50: Mean-diff = 0.0007852672133594751 log(p(X)) = -1060.0093994140625 nats +Converged after 51 iterations. +``` + +In the above instance, notice that our GMM converged early, reaching a good, stable log likelihood in `51` iterations. We can further calculate our final model's log likelihood over the dataset `X` with the following in-built function: + +```python +# Calculate the GMM log likelihood +_, logPX = model.calc_log_likelihood(X) ## 1st output is log-likelihood per data pattern +print(f"log[p(X)] = {logPX} nats") +``` + +which will print out the following: + +```console +log[p(X)] = -1060.006591796875 nats +``` + +(If you add a log-likelihood measurement before you call `.fit()`, you will see that your original log-likelihood is around `-1060.01 nats`.) +Now, to visualize if our GMM actually capture the underlying multi-modal distribution of our dataset, we may visualize the final GMM with the following plotting code: + +```python +import matplotlib.pyplot as plt +x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 +y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 +xx, yy = jnp.meshgrid(jnp.linspace(x_min, x_max, 100), jnp.linspace(y_min, y_max, 100)) +Xspace = jnp.c_[xx.ravel(), yy.ravel()] +Z, _ = model.calc_log_likelihood(Xspace) # Get log likelihood (LL) +Z = -Z ## flip sign of LL (to get negative LL) +Z = Z.reshape(xx.shape) + +plt.figure(figsize=(8, 6)) +plt.scatter(X[:, 0], X[:, 1], c="blue", s=10, alpha=0.7, label='Latent Codes') +plt.contour(xx, yy, Z, levels=jnp.logspace(0, 2, 12), cmap='viridis', alpha=0.8) +plt.colorbar(label='Negative Log Likelihood') + +plt.title('GMM Distribution Plot') +plt.xlabel('Latent Dimension 1') +plt.ylabel('Latent Dimension 2') +plt.legend() +plt.grid(True) +plt.savefig("gmm_fit.jpg") #plt.show() + +plt.close() +``` + +which should produce a plot similar to the one below: + + + + +To draw samples from our fitted/learnt GMM, we may next call its in-built synthesizing routine as follows: + +```python +## Examine GMM samples +Xs = model.sample(n_samples=200 * 3) ## draw 600 samples from fitted GMM +``` + +and then visualize the collected batch of samples with the following plotting code: + +```python + +plt.figure(figsize=(8, 6)) +plt.scatter(Xs[:, 0], Xs[:, 1], c="green", s=10, alpha=0.7, label='Sample Points') +plt.contour(xx, yy, Z, levels=jnp.logspace(0, 2, 12), cmap='viridis', alpha=0.8) +plt.colorbar(label='Negative Log-Likelihood') +plt.title('GMM Samples') +plt.xlabel('Latent Dimension 1') +plt.ylabel('Latent Dimension 2') +plt.grid(True) #plt.show() +plt.savefig("gmm_samples.jpg") + +plt.close() +``` + +which will produce a plot similar to the one below: + + + +Notice that the green-colored data points roughly adhere to the contours of the GMM distribution and look much like the original (blue-colored) dataset we collected. In this example scenario, we see that we can successfully learn the density of our latent code dataset, facilitating some level of downstream distributional analysis and generative model sampling. diff --git a/docs/tutorials/neurocog/dynamic_synapses.md b/docs/tutorials/neurocog/dynamic_synapses.md index bc708264..d4e9b902 100644 --- a/docs/tutorials/neurocog/dynamic_synapses.md +++ b/docs/tutorials/neurocog/dynamic_synapses.md @@ -3,7 +3,7 @@ In this lesson, we will study dynamic synapses, or synaptic cable components in ngc-learn that evolve on fast time-scales in response to their pre-synaptic inputs. These types of chemical synapse components are useful for modeling time-varying -conductance which ultimately drives eletrical current input into neuronal units +conductance which ultimately drives electrical current input into neuronal units (such as spiking cells). Here, we will learn how to build three important types of dynamic synapses in ngc-learn -- the exponential, the alpha, and the double-exponential synapse -- and visualize the time-course of their resulting conductances. In addition, we will then @@ -22,19 +22,16 @@ value matrices we might initially employ (as in synapse components such as the [DenseSynapse](ngclearn.components.synapses.denseSynapse)). Building a dynamic synapse can be done by importing the [exponential synapse](ngclearn.components.synapses.exponentialSynapse), -the [double-exponential synapse](ngclearn.components.synapses.doubleExpSynapse), or the [alpha synapse](ngclearn.components.synapses.alphaSynapse) from ngc-learn's in-built components and setting them up within a model context for easy analysis. Go ahead and create a Python script named `probe_synapses.py` to place +the [double-exponential synapse](ngclearn.components.synapses.doubleExpSynapse), or the [alpha synapse](ngclearn.components.synapses.alphaSynapse) from ngc-learn's in-built components and setting them up within a model context for easy analysis. Go ahead and create a Python script named `probe_dynamic_synapses.py` to place the code you will write within. -For the first part of this lesson, we will import all three dynamic synpapse models and compare their behavior. +For the first part of this lesson, we will import all three dynamic synapse models and compare their behavior. This can be done as follows (using the meta-parameters we provide in the code block below to ensure reasonable dynamics): ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context -from ngclearn.components import ExponentialSynapse, AlphaSynapse, DoupleExpSynapse - -from ngcsimlib.compilers.process import Process -from ngcsimlib.context import Context -import ngclearn.utils.weight_distribution as dist +from ngclearn import Context, MethodProcess +from ngclearn.components import ExponentialSynapse, AlphaSynapse, DoubleExpSynapse +from ngclearn.utils.distribution_generator import DistributionGenerator dkey = random.PRNGKey(1234) ## creating seeding keys for synapses @@ -46,29 +43,27 @@ T = 8. # ms ## total duration time with Context("dual_syn_system") as ctx: Wexp = ExponentialSynapse( ## exponential dynamic synapse name="Wexp", shape=(1, 1), tau_decay=3., g_syn_bar=1., syn_rest=0., resist_scale=1., - weight_init=dist.constant(value=1.), key=subkeys[0] + weight_init=DistributionGenerator.constant(value=1.), key=subkeys[0] ) Walpha = AlphaSynapse( ## alpha dynamic synapse name="Walpha", shape=(1, 1), tau_decay=1., g_syn_bar=1., syn_rest=0., resist_scale=1., - weight_init=dist.constant(value=1.), key=subkeys[0] + weight_init=DistributionGenerator.constant(value=1.), key=subkeys[0] ) - Wexp2 = DoupleExpSynapse( + Wexp2 = DoubleExpSynapse( name="Wexp2", shape=(1, 1), tau_rise=1., tau_decay=3., g_syn_bar=1., syn_rest=0., resist_scale=1., - weight_init=dist.constant(value=1.), key=subkeys[0] + weight_init=DistributionGenerator.constant(value=1.), key=subkeys[0] ) ## set up basic simulation process calls - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> Wexp.advance_state >> Walpha.advance_state >> Wexp2.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> Wexp.reset >> Walpha.reset >> Wexp2.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") ``` where we notice in the above we have instantiated three different kinds of chemical synapse components @@ -90,7 +85,7 @@ $$ $$ where the conductance (for a post-synaptic unit) output of this synapse is driven by a sum over all of its incoming -pre-synaptic spikes; this ODE means that pre-synaptic spikes are filtered via an expoential kernel (i.e., a low-pass filter). +pre-synaptic spikes; this ODE means that pre-synaptic spikes are filtered via an exponential kernel (i.e., a low-pass filter). On the other hand, for the alpha synapse, the dynamics adhere to the following coupled set of ODEs: $$ @@ -100,7 +95,7 @@ $$ where $h_{\text{syn}}(t)$ is an intermediate variable that operates in service of driving the conductance variable $g_{\text{syn}}(t)$ itself. The double-exponential (or difference of exponentials) synapse model looks similar to the alpha synapse except that the -rise and fall/decay of its condutance dynamics are set separately using two different time constants, i.e., $\tau_{\text{rise}}$ and $\tau_{\text{decay}}$, +rise and fall/decay of its conductance dynamics are set separately using two different time constants, i.e., $\tau_{\text{rise}}$ and $\tau_{\text{decay}}$, as follows: $$ @@ -128,7 +123,7 @@ time_span = [] g = [] ga = [] gexp2 = [] -ctx.reset() +reset_process.run() Tsteps = int(T/dt) + 1 for t in range(Tsteps): s_t = jnp.zeros((1, 1)) @@ -136,21 +131,23 @@ for t in range(Tsteps): s_t = jnp.ones((1, 1)) Wexp.inputs.set(s_t) Walpha.inputs.set(s_t) - Wexp.v.set(Wexp.v.value * 0) + Wexp.v.set(Wexp.v.get() * 0) Wexp2.inputs.set(s_t) - Walpha.v.set(Walpha.v.value * 0) - Wexp2.v.set(Wexp2.v.value * 0) - ctx.run(t=t * dt, dt=dt) - - print(f"\r g = {Wexp.g_syn.value} ga = {Walpha.g_syn.value} gexp2 = {Wexp2.g_syn.value}", end="") - g.append(Wexp.g_syn.value) - ga.append(Walpha.g_syn.value) + Walpha.v.set(Walpha.v.get() * 0) + Wexp2.v.set(Wexp2.v.get() * 0) + advance_process.run(t=t * dt, dt=dt) + + print(f"\r g = {Wexp.g_syn.get()} ga = {Walpha.g_syn.get()} gexp2 = {Wexp2.g_syn.get()}", end="") + g.append(Wexp.g_syn.get()) + ga.append(Walpha.g_syn.get()) + gexp2.append(Wexp2.g_syn.get()) time_span.append(t) #* dt) print() g = jnp.squeeze(jnp.concatenate(g, axis=1)) g = g/jnp.amax(g) ga = jnp.squeeze(jnp.concatenate(ga, axis=1)) ga = ga/jnp.amax(ga) +gexp2 = jnp.squeeze(jnp.concatenate(gexp2, axis=1)) gexp2 = gexp2/jnp.amax(gexp2) ``` @@ -195,6 +192,9 @@ ax.grid(which="major") fig.savefig("alpha_syn.jpg") plt.close() +## ---- plot the double-exponential synapse conductance time-course ---- +fig, ax = plt.subplots() + gvals = ax.plot(time_span, gexp2, '-', color='tab:blue') #plt.xticks(time_span, time_labs) ax.set_xticks(time_ticks, time_labs) @@ -207,7 +207,7 @@ plt.close() ``` which should produce and save three plots to disk. You can then compare and contrast the plots of the -expoential, alpha synapse, and double-exponential conductance trajectories: +exponential, alpha synapse, and double-exponential conductance trajectories: ```{eval-rst} .. table:: @@ -222,7 +222,7 @@ expoential, alpha synapse, and double-exponential conductance trajectories: Note that the alpha synapse (right figure) would produce a more realistic fit to recorded synaptic currents (as it attempts to model the rise and fall of current in a less simplified manner) at the cost of extra compute, given it uses two ODEs to -emulate condutance, as opposed to the faster yet less-biophysically-realistic exponential synapse (left figure). +emulate conductance, as opposed to the faster yet less-biophysically-realistic exponential synapse (left figure). ## Excitatory-Inhibitory Driven Dynamics @@ -243,13 +243,10 @@ We will specifically model the excitatory and inhibitory conductance changes usi ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +from ngclearn.operations import Summation from ngclearn.components import ExponentialSynapse, PoissonCell, LIFCell -from ngclearn.operations import summation - -from ngcsimlib.compilers.process import Process -from ngcsimlib.context import Context -import ngclearn.utils.weight_distribution as dist +from ngclearn.utils.distribution_generator import DistributionGenerator ## create seeding keys dkey = random.PRNGKey(1234) @@ -287,39 +284,36 @@ with Context("ei_snn") as ctx: pre_inh = PoissonCell("pre_inh", n_units=n_inh, target_freq=inh_freq, key=subkeys[1]) ## pre-syn inhibitory group Wexc = ExponentialSynapse( ## dynamic synapse between excitatory group and LIF name="Wexc", shape=(n_exc,1), tau_decay=tau_syn_exc, g_syn_bar=g_e_bar, syn_rest=E_rest_exc, resist_scale=1./g_L, - weight_init=dist.constant(value=1.), key=subkeys[2] + weight_init=DistributionGenerator.constant(value=1.), key=subkeys[2] ) Winh = ExponentialSynapse( ## dynamic synapse between inhibitory group and LIF name="Winh", shape=(n_inh, 1), tau_decay=tau_syn_inh, g_syn_bar=g_i_bar, syn_rest=E_rest_inh, resist_scale=1./g_L, - weight_init=dist.constant(value=1.), key=subkeys[2] + weight_init=DistributionGenerator.constant(value=1.), key=subkeys[2] ) post_exc = LIFCell( ## post-syn LIF cell "post_exc", n_units=1, tau_m=tau_m, resist_m=1., thr=v_thr, v_rest=v_rest, conduct_leak=1., v_reset=-75., tau_theta=0., theta_plus=0., refract_time=2., key=subkeys[3] ) - Wexc.inputs << pre_exc.outputs - Winh.inputs << pre_inh.outputs - Wexc.v << post_exc.v ## couple voltage to exc synapse - Winh.v << post_exc.v ## couple voltage to inh synapse - post_exc.j << summation(Wexc.i_syn, Winh.i_syn) ## sum together excitatory & inhibitory pressures + pre_exc.outputs >> Wexc.inputs + pre_inh.outputs >> Winh.inputs + post_exc.v >> Wexc.v ## couple voltage to exc synapse + post_exc.v >> Winh.v ## couple voltage to inh synapse + Summation(Wexc.i_syn, Winh.i_syn) >> post_exc.j ## sum together excitatory & inhibitory pressures - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> pre_exc.advance_state >> pre_inh.advance_state >> Wexc.advance_state >> Winh.advance_state >> post_exc.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> pre_exc.reset >> pre_inh.reset >> Wexc.reset >> Winh.reset >> post_exc.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") ``` ### Examining the Simple Spiking Circuit's Behavior @@ -331,18 +325,18 @@ volts = [] time_span = [] spikes = [] -ctx.reset() +reset_process.run() pre_exc.inputs.set(jnp.ones((1, n_exc))) pre_inh.inputs.set(jnp.ones((1, n_inh))) -post_exc.v.set(post_exc.v.value * 0 - 65.) ## initial condition for LIF is -65 mV -volts.append(post_exc.v.value) +post_exc.v.set(post_exc.v.get() * 0 - 65.) ## initial condition for LIF is -65 mV +volts.append(post_exc.v.get()) time_span.append(0.) Tsteps = int(T/dt) + 1 for t in range(1, Tsteps): - ctx.run(t=t * dt, dt=dt) - print(f"\r v {post_exc.v.value}", end="") - volts.append(post_exc.v.value) - spikes.append(post_exc.s.value) + advance_process.run(t=t * dt, dt=dt) + print(f"\r v {post_exc.v.get()}", end="") + volts.append(post_exc.v.get()) + spikes.append(post_exc.s.get()) time_span.append(t) #* dt) print() volts = jnp.squeeze(jnp.concatenate(volts, axis=1)) @@ -384,9 +378,7 @@ ax.grid() fig.savefig("ei_circuit_dynamics.jpg") ``` -which should produce a figure depicting dynamics similar to the one below. Black tick -marks indicate post-synaptic pulses whereas the horizontal dashed blue shows the LIF unit's -voltage threshold. +which should produce a figure depicting dynamics similar to the one below. Black tick marks indicate post-synaptic pulses whereas the horizontal dashed blue shows the LIF unit's voltage threshold. ```{eval-rst} diff --git a/docs/tutorials/neurocog/error_cell.md b/docs/tutorials/neurocog/error_cell.md index 04368d5d..b7fbdb11 100644 --- a/docs/tutorials/neurocog/error_cell.md +++ b/docs/tutorials/neurocog/error_cell.md @@ -60,8 +60,8 @@ The code you would write amounts to the below: ```python from jax import numpy as jnp, jit -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess + +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.neurons.graded.gaussianErrorCell import GaussianErrorCell @@ -71,32 +71,29 @@ T = 5 ## number time steps to simulate with Context("Model") as model: cell = GaussianErrorCell("z0", n_units=3) - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance_proc") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset_proc") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - - @Context.dynamicCommand - def clamp(x, y): - ## error cells have two key input compartments; a "mu" and a "target" - cell.mu.set(x) - cell.target.set(y) +## set up non-compiled utility commands +def clamp(x, y): + ## error cells have two key input compartments; a "mu" and a "target" + cell.mu.set(x) + cell.target.set(y) + guess = jnp.asarray([[-1., 1., 1.]], jnp.float32) ## the produced guess or prediction answer = jnp.asarray([[1., -1., 1.]], jnp.float32) ## what we wish the guess had been -model.reset() +reset_process.run() for ts in range(T): - model.clamp(guess, answer) - model.advance(t=ts * 1., dt=dt) + clamp(guess, answer) + advance_process.run(t=ts * 1., dt=dt) ## extract compartment values of interest - dmu = cell.dmu.value - dtarget = cell.dtarget.value - loss = cell.L.value + dmu = cell.dmu.get() + dtarget = cell.dtarget.get() + loss = cell.L.get() ## print compartment values to I/O print("{} | dmu: {} dtarget: {} loss: {} ".format(ts, dmu, dtarget, loss)) ``` diff --git a/docs/tutorials/neurocog/fitzhugh_nagumo_cell.md b/docs/tutorials/neurocog/fitzhugh_nagumo_cell.md index 6575fc06..5faed24b 100644 --- a/docs/tutorials/neurocog/fitzhugh_nagumo_cell.md +++ b/docs/tutorials/neurocog/fitzhugh_nagumo_cell.md @@ -17,8 +17,7 @@ single component system made up of the Fitzhugh-Nagumo (`F-N`) cell. from jax import numpy as jnp, random, jit import numpy as np -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.neurons.spiking.fitzhughNagumoCell import FitzhughNagumoCell @@ -36,46 +35,26 @@ w0 = -0.16983366 ## initial recovery value (for reset condition) ## create simple system with only one F-N cell with Context("Model") as model: - cell = FitzhughNagumoCell("z0", n_units=1, tau_w=tau_w, alpha=alpha, beta=beta, - gamma=gamma, v0=v0, w0=w0, integration_type="euler") + cell = FitzhughNagumoCell( + "z0", n_units=1, tau_w=tau_w, alpha=alpha, beta=beta, gamma=gamma, v0=v0, w0=w0, integration_type="euler" + ) ## create and compile core simulation commands - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - cell.j.set(x) +## set up non-compiled utility commands +def clamp(x): + cell.j.set(x) ``` -In effect, the FitzHugh–Nagumo `F-N` two-dimensional differential -equation system (developed by [1] and [2]) is -a useful simplification of the more intricate Hodgkin–Huxley (H-H) squid axon -model, attempting to extract some of the benefits of its more detailed modeling -of the spiking cellular activation and deactivation dynamics (specifically -attempting to isolate the properties related to sodium/potassium ion flow -from cellular properties of excitation and propagation). Notably, the `F-N` -cell models membrane potential `v` with a cubic function (which facilitates -self-excitation through positive feedback) in tandem with a recovery variable `w` -that provides a slower form of negative feedback. The linear dynamics that govern -`w` are controlled by (dimensionless) coefficients `alpha` and `beta`, which -control its shift and scale, respectively (another factor `gamma` is introduced -in our implementation, which divides the cubic term in the voltage dynamics, but -generally this can usually be set to either a value of `1` or `3` as in [1]). -The value `tau_w` controls the time constant for the recovery variable (and, -technically, ngc-learn implements `tau_m` to control the membrane potential, -but this is default set to `1` since [1] and [2] typically only use a time -constant for the recovery variable). - -The initial conditions for the voltage (i.e., `v0`) and the recovery (i.e., `w0`) -have been set to particular interesting values above for the demonstration -purposes of this tutorial but, by default, are `0` in the `F-N` cell component. +In effect, the FitzHugh–Nagumo `F-N` two-dimensional differential equation system (developed by [1] and [2]) is a useful simplification of the more intricate Hodgkin–Huxley (H-H) squid axon model, attempting to extract some of the benefits of its more detailed modeling of the spiking cellular activation and deactivation dynamics (specifically attempting to isolate the properties related to sodium/potassium ion flow from cellular properties of excitation and propagation). Notably, the `F-N` cell models membrane potential `v` with a cubic function (which facilitates self-excitation through positive feedback) in tandem with a recovery variable `w` that provides a slower form of negative feedback. The linear dynamics that govern `w` are controlled by (dimensionless) coefficients `alpha` and `beta`, which control its shift and scale, respectively (another factor `gamma` is introduced in our implementation, which divides the cubic term in the voltage dynamics, but generally this can usually be set to either a value of `1` or `3` as in [1]). +The value `tau_w` controls the time constant for the recovery variable (and, technically, ngc-learn implements `tau_m` to control the membrane potential, but this is default set to `1` since [1] and [2] typically only use a time constant for the recovery variable). + +The initial conditions for the voltage (i.e., `v0`) and the recovery (i.e., `w0`) have been set to particular interesting values above for the demonstration purposes of this tutorial but, by default, are `0` in the `F-N` cell component. Formally, the core dynamics of the `F-N` can be written out as follows: @@ -84,24 +63,13 @@ $$ \tau_w \frac{\partial \mathbf{w}_t}{\partial t} &= \mathbf{v}_t + a - b\mathbf{w}_t $$ -where $a$ and $b$ are factors that drive the recovery variable's dynamics -(shift and scaling, respectively), $R$ is the membrane resistance, $\tau_m$ is the -membrane time constant, and $\tau_w$ is the recovery time constant ($g$ is a -dividing constant meant to dampen the effects of the cubic term, but is generally -set to $g = 1$ to adhere to [1] and [2]) +where $a$ and $b$ are factors that drive the recovery variable's dynamics (shift and scaling, respectively), $R$ is the membrane resistance, $\tau_m$ is the membrane time constant, and $\tau_w$ is the recovery time constant ($g$ is a dividing constant meant to dampen the effects of the cubic term, but is generally set to $g = 1$ to adhere to [1] and [2]) ### Simulating a FitzHugh–Nagumo Neuronal Cell -Given that we have a single-cell dynamical system set up as above, we can next -write some code for visualizing how the `F-N` node's membrane potential and -coupled recovery variable evolve with time (specifically over a period of about -`200` milliseconds). We will, much as we did with the leaky integrators in -prior tutorials, inject an electrical current `j` into the `F-N` cell (this time -just a constant current value of `0.23` amperes) and observe how the cell -produces action potentials. -Specifically, we can plot the neuron's voltage `v` and recovery variable `w` -as follows: +Given that we have a single-cell dynamical system set up as above, we can next write some code for visualizing how the `F-N` node's membrane potential and coupled recovery variable evolve with time (specifically over a period of about `200` milliseconds). We will, much as we did with the leaky integrators in prior tutorials, inject an electrical current `j` into the `F-N` cell (this time just a constant current value of `0.23` amperes) and observe how the cell produces action potentials. +Specifically, we can plot the neuron's voltage `v` and recovery variable `w` as follows: ```python curr_in = [] @@ -119,26 +87,26 @@ time_span = np.linspace(0, 200, num=T) dt = time_span[1] - time_span[0] # ~ 0.13342228152101404 ms time_span = [] -model.reset() +reset_process.run() t = 0. for ts in range(T): x_t = data ## pass in t and dt and run step forward of simulation - model.clamp(x_t) - model.advance(t=t, dt=dt) + clamp(x_t) + advance_process.run(t=t, dt=dt) t = t + dt ## naively extract simple statistics at time ts and print them to I/O - v = cell.v.value - w = cell.w.value - s = cell.s.value + v = cell.v.get() + w = cell.w.get() + s = cell.s.get() curr_in.append(data) mem_rec.append(v) recov_rec.append(w) spk_rec.append(s) ## print stats to I/O (overriding previous print-outs to reduce clutter) print("\r {}: s {} ; v {} ; w {}".format(ts, s, v, w), end="") - time_span.append((ts)*dt) + time_span.append(ts * dt) print() import matplotlib #.pyplot as plt @@ -169,38 +137,12 @@ plt.tight_layout() plt.savefig("{0}".format("fncell_plot.jpg")) ``` -You should get a plot that depicts the evolution of the voltage and recovery, -i.e., saved as `fncell_plot.jpg` locally to disk, like the one below: +You should get a plot that depicts the evolution of the voltage and recovery, i.e., saved as `fncell_plot.jpg` locally to disk, like the one below: -A useful note is that the `F-N` above used Euler integration to step through its -dynamics (this is the default/base routine for all cell components in ngc-learn); -however, one could configure it to use the midpoint method for integration -by setting its argument `integration_type = rk2` in cases where more -accuracy in the dynamics is needed (at the cost of additional computational time). - -## Optional: Setting Up The Components with a JSON Configuration - -While you are not required to create a JSON configuration file for ngc-learn, -to get rid of the warning that ngc-learn will throw at the start of your -program's execution (indicating that you do not have a configuration set up yet), -all you need to do is create a sub-directory for your JSON configuration -inside of your project code's directory, i.e., `json_files/modules.json`. -Inside the JSON file, you would write the following: - -```json -[ - {"absolute_path": "ngclearn.components", - "attributes": [ - {"name": "FitzHughNagumoCell"}] - }, - {"absolute_path": "ngcsimlib.operations", - "attributes": [ - {"name": "overwrite"}] - } -] -``` +A useful note is that the `F-N` above used Euler integration to step through its dynamics (this is the default/base routine for all cell components in ngc-learn); however, one could configure it to use the midpoint method for integration by setting its argument `integration_type = rk2` in cases where more accuracy in the dynamics is needed (at the cost of additional computational time). + ## References diff --git a/docs/tutorials/neurocog/hebbian.md b/docs/tutorials/neurocog/hebbian.md index 8e67754c..6c6afbed 100644 --- a/docs/tutorials/neurocog/hebbian.md +++ b/docs/tutorials/neurocog/hebbian.md @@ -21,30 +21,29 @@ Specifically, we will zoom in on two particular code snippets from below: ```python -Wab = HebbianSynapse(name="Wab", shape=(1, 1), eta=1., signVal=-1., - wInit=("constant", 1., None), w_bound=0., key=subkeys[3]) +Wab = HebbianSynapse( + name="Wab", shape=(1, 1), eta=1., signVal=-1., wInit=("constant", 1., None), w_bound=0., key=subkeys[3] +) # wire output compartment (rate-coded output zF) of RateCell `a` to input compartment of HebbianSynapse `Wab` -Wab.inputs << a.zF +a.zF >> Wab.inputs # wire output compartment of HebbianSynapse `Wab` to input compartment (electrical current j) RateCell `b` -b.j << Wab.outputs +Wab.outputs >> b.j # wire output compartment (rate-coded output zF) of RateCell `a` to presynaptic compartment of HebbianSynapse `Wab` -Wab.pre << a.zF +a.zF >> Wab.pre # wire output compartment (rate-coded output zF) of RateCell `b` to postsynaptic compartment of HebbianSynapse `Wab` -Wab.post << b.zF +b.zF >> Wab.post ``` as well as (a bit later in the model construction code): ```python -evolve_process = (JaxProcess() +evolve_process = (MethodProcess() >> a.evolve) -circuit.wrap_and_add_command(jit(evolve_process.pure), name="evolve") -advance_process = (JaxProcess() +advance_process = (MethodProcess() >> a.advance_state) -circuit.wrap_and_add_command(jit(advance_process.pure), name="advance") ``` Notice that beyond wiring component `a`'s values into the synapse `Wab`'s input compartment @@ -54,7 +53,7 @@ post-synaptic compartment `Wab.post`. These compartments are specifically used in `Wab`'s `evolve` call and are not strictly required to be exactly the same as its input and output compartments. Note that, if one wanted `pre` and `post` to be exactly identical to `inputs` and `outputs`, one would simply need -to write `Wab.pre << Wab.inputs` and `Wab.post << Wab.outputs` in place +to write `Wab.inputs >> Wab.pre` and `Wab.outputs >> Wab.post` in place of the pre- and post-synaptic compartment calls above. The above snippets highlight two key aspects of functionality that a synapse diff --git a/docs/tutorials/neurocog/hodgkin_huxley_cell.md b/docs/tutorials/neurocog/hodgkin_huxley_cell.md index e055b5c5..56a17cba 100755 --- a/docs/tutorials/neurocog/hodgkin_huxley_cell.md +++ b/docs/tutorials/neurocog/hodgkin_huxley_cell.md @@ -1,16 +1,12 @@ # Lecture 2E: The Hodgkin-Huxley Cell -In this tutorial, we will study/setup one of the most important biophysical -neuronal models in computational neuroscience -- the Hodgkin-Huxley (H-H) spiking -cell model. +In this tutorial, we will study/setup one of the most important and sophisticated biophysical neuronal models in computational neuroscience -- the Hodgkin-Huxley (H-H) spiking cell model. ## Using and Probing the H-H Cell -Go ahead and make a new folder for this study and create a Python script, -i.e., `run_hhcell.py`, to write your code for this part of the tutorial. +Go ahead and make a new folder for this study and create a Python script, i.e., `run_hhcell.py`, to write your code for this part of the tutorial. -Now let's set up the controller for this lesson's simulation and construct a -single component system made up of an H-H cell. +Now let's set up the controller for this lesson's simulation and construct a single component system made up of an H-H cell. ### Instantiating the H-H Neuronal Cell @@ -22,9 +18,7 @@ H-H cell amounts to the following: from jax import numpy as jnp, random, jit import numpy as np -from ngclearn.utils.model_utils import scanner -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.neurons.spiking.hodgkinHuxleyCell import HodgkinHuxleyCell @@ -52,18 +46,15 @@ with Context("Model") as model: ) ## create and compile core simulation commands - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - cell.j.set(x) +## set up non-compiled utility commands +def clamp(x): + cell.j.set(x) ``` Notably, the H-H model is a four-dimensional differential equation system, invented in 1952 @@ -86,15 +77,12 @@ $$ \frac{\partial \mathbf{h}_t}{\partial t} &= \alpha_h(\mathbf{v}_t) * (1 - \mathbf{h}_t) - \beta_h(\mathbf{v}_t) * \mathbf{h}_t $$ -where we observe that the above four-dimensional set of dynamics is composed of nonlinear ODEs. Notice that, in each gate or channel probability ODE, there are two generator functions (each of which is a function of the membrane potential $\mathbf{v}_t$) that produces the necessary dynamic coefficients at time $t$; $\alpha_x(\mathbf{v}_t)$ and $\beta_x(\mathbf{v}_t)$ produce different biopphysical weighting values depending on which channel $x = \{n, m, h\}$ they are related to. +where we observe that the above four-dimensional set of dynamics is composed of nonlinear ODEs. Notice that, in each gate or channel probability ODE, there are two generator functions (each of which is a function of the membrane potential $\mathbf{v}_t$) that produces the necessary dynamic coefficients at time $t$; $\alpha_x(\mathbf{v}_t)$ and $\beta_x(\mathbf{v}_t)$ produce different biophysical weighting values depending on which channel $x = \{n, m, h\}$ they are related to. Note that, in ngc-learn's implementation of the H-H cell model, most of the core coefficients have been generally set according to Hodgkin and Huxley's 1952 work but can be configured by the experimenter to obtain different kinds of behavior/dynamics. ### Simulating the H-H Neuronal Cell -To see how the H-H cell works, we next write some code for visualizing how -the node's membrane potential and core related gates/channels evolve with time -(over a period of about `200` milliseconds). We will inject a square input pulse current -into our H-H cell (specifically into its `j` compartment) and observe how the cell behaves in response. +To see how the H-H cell works, we next write some code for visualizing how the node's membrane potential and core related gates/channels evolve with time (over a period of about `200` milliseconds). We will inject a square input pulse current into our H-H cell (specifically into its `j` compartment) and observe how the cell behaves in response. Specifically, we simulate the injection of this kind of current via the code below: ```python @@ -110,17 +98,17 @@ v = [] n = [] m = [] h = [] -model.reset() +reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - model.clamp(x_t) - model.run(t=ts * dt, dt=dt) - outs.append(a.s.value) - n.append(cell.n.value[0, 0]) - m.append(cell.m.value[0, 0]) - h.append(cell.h.value[0, 0]) - v.append(cell.v.value[0, 0]) - print(f"\r {ts} v = {cell.v.value}", end="") + clamp(x_t) + advance_process.run(t=ts * dt, dt=dt) + outs.append(cell.s.get()) + n.append(cell.n.get()[0, 0]) + m.append(cell.m.get()[0, 0]) + h.append(cell.h.get()[0, 0]) + v.append(cell.v.get()[0, 0]) + print(f"\r {ts} v = {cell.v.get()}", end="") time_span.append(ts*dt) outs = jnp.concatenate(outs, axis=1) v = jnp.array(v) @@ -128,8 +116,7 @@ time_span = jnp.array(time_span) outs = jnp.squeeze(outs) ``` -and we can plot the dynamics of the neuron's voltage `v` and its three gate/channel -variables, `h`, `m`, and `n`, with the following: +and we can plot the dynamics of the neuron's voltage `v` and its three gate/channel variables, `h`, `m`, and `n`, with the following: ```python import matplotlib.pyplot as plt @@ -159,9 +146,7 @@ plt.savefig("{0}".format("hh_plot.jpg")) plt.close() ``` -You should get a compound plot that depict the evolution of the H-H cell's voltage -and channel/gate variables, i.e., saved as `hh_plot.jpg` locally to -disk, like the one below: +You should get a compound plot that depict the evolution of the H-H cell's voltage and channel/gate variables, i.e., saved as `hh_plot.jpg` locally to disk, like the one below: ```{eval-rst} .. table:: @@ -174,38 +159,11 @@ disk, like the one below: +--------------------------------------------------------+ ``` -A useful note is that the H-H cell above used Euler integration to step through its -dynamics (this is the default/base routine for all cell components in ngc-learn). -However, one could configure the cell to use the midpoint method for integration -by setting its argument `integration_type = rk2` or the Runge-Kutta fourth-order -routine via `integration_type=rk4` for cases where, at the cost of increased -compute time, more accurate dynamics are possible. - -## Optional: Setting Up The Components with a JSON Configuration - -While you are not required to create a JSON configuration file for ngc-learn, -to get rid of the warning that ngc-learn will throw at the start of your -program's execution (indicating that you do not have a configuration set up yet), -all you need to do is create a sub-directory for your JSON configuration -inside of your project code's directory, i.e., `json_files/modules.json`. -Inside the JSON file, you would write the following: - -```json -[ - {"absolute_path": "ngclearn.components", - "attributes": [ - {"name": "HodgkinHuxleyCell"}] - }, - {"absolute_path": "ngcsimlib.operations", - "attributes": [ - {"name": "overwrite"}] - } -] -``` +A useful note is that the H-H cell above used Euler integration to step through its dynamics (this is the default/base routine for all cell components in ngc-learn). +However, one could configure the cell to use the midpoint method for integration by setting its argument `integration_type = rk2` or the Runge-Kutta fourth-order routine via `integration_type=rk4` for cases where, at the cost of increased compute time, more accurate dynamics are possible. + ## References -[1] Hodgkin, Alan L., and Andrew F. Huxley. "A quantitative description -of membrane current and its application to conduction and excitation in nerve." -The Journal of physiology 117.4 (1952): 500. +[1] Hodgkin, Alan L., and Andrew F. Huxley. "A quantitative description of membrane current and its application to conduction and excitation in nerve." The Journal of physiology 117.4 (1952): 500. diff --git a/docs/tutorials/neurocog/index.rst b/docs/tutorials/neurocog/index.rst index 326591c2..b702a535 100644 --- a/docs/tutorials/neurocog/index.rst +++ b/docs/tutorials/neurocog/index.rst @@ -5,31 +5,20 @@ Neurocognitive Modeling Lessons =============================== -A central motivation for using ngc-learn is to flexibly build computational -models of neuronal information processing, dynamics, and credit -assignment (as well as design one's own custom instantiations of their -mathematical formulations and ideas). In this set of tutorials, we will go -through the central basics of using ngc-learn's in-built biophysical components, -also called "cells" and "synapses", to craft and simulate adaptive neural systems -and biophysical computational models. +A central motivation for using ngc-learn is to flexibly build computational models of neuronal information processing, +dynamics, and credit assignment (as well as design custom instantiations of one's own mathematical formulations and +ideas). In this set of tutorials, we will go through the central basics of using ngc-learn's in-built biophysical +components, also called "cells" and "synapses", to craft and simulate adaptive neural systems and biophysical +computational models. -Usefully, ngc-learn starts with a collection of cells -- those that are partitioned -into those that are graded / real-valued (`ngclearn.components.neurons.graded`) -and those that spike (`ngclearn.components.neurons.spiking`). In addition, -ngc-learn supports another collection called synapses -- generally, those that -adapt (or "learn") with biological credit assignment building blocks -(such as those in `ngclearn.components.synapses.hebbian`) such as -spike-timing-dependent plasticity and multi-factor rules. With the in-built, -standard cells and synapses in these two -core collections, you can readily construct a wide variety of models, recovering -many classical ones previously proposed in computational neuroscience -and brain-inspired computing researach (many of these kinds of models are available -for external download in the `Model Museum `_). - -While the reader is free to jump into any one self-contained tutorial in any -order based on their needs, we organize, within each topic, the lessons starting -from more basic, foundational modeling modules and library tools and sequentially -work towards more advanced concepts. +Usefully, ngc-learn starts with a collection of cells -- those that are partitioned into those that are graded / +real-valued (`ngclearn.components.neurons.graded`) and those that spike (`ngclearn.components.neurons.spiking`). In +addition, ngc-learn supports another collection called synapses -- generally, those that adapt (or "learn") with +biological credit assignment building blocks (such as those in `ngclearn.components.synapses.hebbian`) such as +spike-timing-dependent plasticity and multi-factor rules. With the in-built, standard cells and synapses in these two +core collections, you can readily construct a wide variety of models, recovering many classical ones previously +proposed in computational neuroscience and brain-inspired computing research (many of these kinds of models are +available for external download in the `Model Museum `_). .. toctree:: :maxdepth: 1 @@ -73,3 +62,4 @@ work towards more advanced concepts. plotting metrics integration + density_modeling diff --git a/docs/tutorials/neurocog/input_cells.md b/docs/tutorials/neurocog/input_cells.md index 1a58adac..c39c6ca7 100644 --- a/docs/tutorials/neurocog/input_cells.md +++ b/docs/tutorials/neurocog/input_cells.md @@ -39,8 +39,7 @@ spike train over $100$ steps in time as follows: ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess +from ngclearn import Context, MethodProcess from ngclearn.utils.viz.raster import create_raster_plot ## import model-specific mechanisms @@ -56,27 +55,24 @@ T = 100 ## number time steps to simulate with Context("Model") as model: cell = BernoulliCell("z0", n_units=10, key=subkeys[0]) - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance_proc") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset_proc") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - - @Context.dynamicCommand - def clamp(x): - cell.inputs.set(x) +def clamp(x): + cell.inputs.set(x) + probs = jnp.asarray([[0.8, 0.2, 0., 0.55, 0.9, 0, 0.15, 0., 0.6, 0.77]], dtype=jnp.float32) spikes = [] -model.reset() +reset_process.run() for ts in range(T): - model.clamp(probs) - model.advance(t=ts * 1., dt=dt) + clamp(probs) + advance_process.run(t=ts * 1., dt=dt) - s_t = cell.outputs.value + s_t = cell.outputs.get() spikes.append(s_t) spikes = jnp.concatenate(spikes, axis=0) create_raster_plot(spikes, plot_fname="input_cell_raster.jpg") @@ -121,7 +117,7 @@ and by replacing the line that has the `BernoulliCell` call with the following line instead: ```python -cell = PoissonCell("z0", n_units=10, max_freq=63.75, key=subkeys[0]) +cell = PoissonCell("z0", n_units=10, target_freq=63.75, key=subkeys[0]) ``` Running the code with the two above small modifications will @@ -149,12 +145,12 @@ mu = 0. probs = jnp.asarray([[1.]],dtype=jnp.float32) for _ in range(n_trials): spikes = [] - model.reset() + reset_process.run() for ts in range(T): - model.clamp(probs) - model.advance(t=ts*1., dt=dt) + clamp(probs) + advance_process.run(t=ts * 1., dt=dt) - s_t = cell.outputs.value + s_t = cell.outputs.get() spikes.append(s_t) count = jnp.sum(jnp.concatenate(spikes, axis=0)) mu += count diff --git a/docs/tutorials/neurocog/integration.md b/docs/tutorials/neurocog/integration.md index db3fa1ca..95320c6f 100644 --- a/docs/tutorials/neurocog/integration.md +++ b/docs/tutorials/neurocog/integration.md @@ -1,32 +1,14 @@ # Numerical Integration -In constructing one's own biophysical models, particularly those of phenomena -that change with time, ngc-learn offers useful flexible tools for numerical -integration that facilitate an easier time in constructing your own components -that play well with the library's simulation backend. Knowing how things work -beyond Euler integration -- the base/default form of integration often employed -by ngc-learn -- might be useful for constructing and simulating dynamics more -accurately (often at the cost of additional computational time). +In constructing one's own biophysical models, particularly those of phenomena that change with time, ngc-learn offers useful flexible tools for numerical integration that facilitate an easier time in constructing your own components that play well with the library's simulation backend. Knowing how things work beyond Euler integration -- the base/default form of integration often employed by ngc-learn -- might be useful for constructing and simulating dynamics more accurately (often at the cost of additional computational time). ## Euler Integration -Euler integration is very simple (and fast) way of using the ordinary differential -equations you typically define for the cellular dynamics of various components -in ngc-learn (which typically get called in any component's `AdvanceState()` -command). +Euler integration is very simple (and fast) way of using the ordinary differential equations you typically define for the cellular dynamics of various components in ngc-learn (which typically get called in any component's `advance_state()` command). -While utilizing the numerical integrator will depend on your component's design -and the (biophysical) elements you wish to model, let's observe ngc-learn's -base backend utilities (its integration backend `ngclearn.utils.diffeq`) in -the context of numerically integrating a simple -differential equation; specifically the autonomous (linear) ordinary differential equation (ODE): -$\frac{\partial y(t)}{\partial t} = y(t)$. The analytic -solution to this equation is also simple -- it is $y(t) = e^{t}$. +While utilizing the numerical integrator will depend on your component's design and the (biophysical) elements you wish to model, let's observe ngc-learn's base backend utilities (its integration backend `ngclearn.utils.diffeq`) in the context of numerically integrating a simple differential equation; specifically the autonomous (linear) ordinary differential equation (ODE): $\frac{\partial y(t)}{\partial t} = y(t)$. The analytic solution to this equation is also simple -- it is $y(t) = e^{t}$. -If you have defined your differential equation $\frac{\partial y(t)}{\partial t}$ -in a rather simple format[^1], you can write the following code to examine how -Euler integration approximates the analytical solution (in this example, we -examine just two different step sizes, i.e., `dt = 0.1` and `dt = 0.09`) +If you have defined your differential equation $\frac{\partial y(t)}{\partial t}$ in a rather simple format[^1], you can write the following code to examine how Euler integration approximates the analytical solution (in this example, we examine just two different step sizes, i.e., `dt = 0.1` and `dt = 0.09`) ```python from jax import numpy as jnp, random, jit, nn @@ -89,41 +71,13 @@ which should yield you a plot like the one below: -Notice how the integration constant `dt` (or $\Delta t$) chosen affects the approximation of ngc-learn's -Euler integrator and typically, when constructing your biophysical models, you -will need to think about this constant in the context of your simulation time-scale -and what you intend to model. Note that, in many biophysical component cells, -you will have an integration time constant of some form, i.e., a $\tau$, that you -can control, allowing you to fix your `dt` to your simulated time-scale -(say to a value like `dt = 1` millisecond) while tuning/altering your -time constant $\tau$ (since the differential equation will be weighted -by $\frac{\Delta t}{\tau}$). +Notice how the integration constant `dt` (or $\Delta t$) chosen affects the approximation of ngc-learn's Euler integrator and typically, when constructing your biophysical models, you will need to think about this constant in the context of your simulation time-scale and what you intend to model. Note that, in many biophysical component cells, you will have an integration time constant of some form, i.e., a $\tau$, that you can control, allowing you to fix your `dt` to your simulated time-scale (say to a value like `dt = 1` millisecond) while tuning/altering your time constant $\tau$ (since the differential equation will be weighted by $\frac{\Delta t}{\tau}$). ## Higher-Order Forms of (Explicit) Integration -Notably, ngc-learn has built-in several forms of (explicit) numerical integration beyond -the Euler method, such as a second order Runge-Kutta (RK-2) method (also known as -the midpoint method) and 4th-order Runge-Kutta (RK-4) method or an error-predictor method such as Heun's method -(also known as the trapezoid method). These forms of integration might be useful particularly -if a cell or plastic synaptic component you might be writing follows dynamics -that are more nonlinear or biophysically complex (requiring a higher degree -of simulation accuracy). For instance, ngc-learn's in-built cell components, -particularly those of higher biophysical complexity -- like the -[Izhikevich cell](ngclearn.components.neurons.spiking.izhikevichCell) or the -[FitzhughNagumo cell](ngclearn.components.neurons.spiking.fitzhughNagumoCell) -- -contain argument flags for switching their simulation steps to use RK-2. - -To illustrate the value of higher-order numerical integration methods, let us -examine a simple polynomial equation (thus nonlinear) that is further -non-autonomous, i.e., it is a function of the time variable $t$ itself. A -possible set of dynamics in this case might be: -$\frac{\partial y(t)}{\partial t} = -2 t^3 + 12 t^2 - 20 t + 8.5$ which -has the analytic solution $y(t) = -(1/2) t^4 + 4 t^3 - 10 t^2 + 8.5 t + C$ ( -where we will set $C = 1$). You can write code like below, importing from -`ngclearn.utils.diffeq.ode_utils` the Euler routine (`step_euler`), -the RK-2 routine (`step_rk2`), the RK-4 routine (`step_rk4`), and Heun's method (`step_heun`), and compare -how these methods approximate the nonlinear dynamics inherent to our -constructed $\frac{\partial y(t)}{\partial t}$ ODE below: +Notably, ngc-learn has built-in several forms of (explicit) numerical integration beyond the Euler method, such as a second order Runge-Kutta (RK-2) method (also known as the midpoint method) and 4th-order Runge-Kutta (RK-4) method or an error-predictor method such as Heun's method (also known as the trapezoid method). These forms of integration might be useful particularly if a cell or plastic synaptic component you might be writing follows dynamics that are more nonlinear or biophysically complex (requiring a higher degree of simulation accuracy). For instance, ngc-learn's in-built cell components, particularly those of higher biophysical complexity -- like the [Izhikevich cell](ngclearn.components.neurons.spiking.izhikevichCell) or the [FitzhughNagumo cell](ngclearn.components.neurons.spiking.fitzhughNagumoCell) -- contain argument flags for switching their simulation steps to use RK-2. + +To illustrate the value of higher-order numerical integration methods, let us examine a simple polynomial equation (thus nonlinear) that is further non-autonomous, i.e., it is a function of the time variable $t$ itself. A possible set of dynamics in this case might be: $\frac{\partial y(t)}{\partial t} = -2 t^3 + 12 t^2 - 20 t + 8.5$ which has the analytic solution $y(t) = -(1/2) t^4 + 4 t^3 - 10 t^2 + 8.5 t + C$ (where we will set $C = 1$). You can write code like below, importing from `ngclearn.utils.diffeq.ode_utils` the Euler routine (`step_euler`), the RK-2 routine (`step_rk2`), the RK-4 routine (`step_rk4`), and Heun's method (`step_heun`), and compare how these methods approximate the nonlinear dynamics inherent to our constructed $\frac{\partial y(t)}{\partial t}$ ODE below: ```python from jax import numpy as jnp, random, jit, nn @@ -194,12 +148,7 @@ which should yield you a plot like the one below: -As you might observe, RK-4 gives the best approximation of the solution. In addition, -when the integration step size is held constant, Euler integration -does quite poorly over just a few steps while RK-2 and Heun's method do much better -at approximating the analytical equation. In the end, the type of numerical integration method employed can -matter depending on the ODE(s) you use in modeling, particularly if you seek higher accuracy -for more nonlinear dynamics like in our example above. +As you might observe, RK-4 give the best approximation of the solution. In addition, when the integration step size is held constant, Euler integration does quite poorly over just a few steps while RK-2 and Heun's method do much better at approximating the analytical equation. In the end, the type of numerical integration method employed can matter depending on the ODE(s) you use in modeling, particularly if you seek higher accuracy for more nonlinear dynamics like in our example above. [^1]: The format expected by ngc-learn's backend is that the differential equation provides a functional API/form like so: for instance `dy/dt = diff_eqn(t, y(t), params)`, diff --git a/docs/tutorials/neurocog/izhikevich_cell.md b/docs/tutorials/neurocog/izhikevich_cell.md index 6d1449a6..bdbdc742 100644 --- a/docs/tutorials/neurocog/izhikevich_cell.md +++ b/docs/tutorials/neurocog/izhikevich_cell.md @@ -19,8 +19,7 @@ single component system made up of the Izhikevich (`IZH`) cell. from jax import numpy as jnp, random, jit import numpy as np -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.neurons.spiking.izhikevichCell import IzhikevichCell @@ -39,43 +38,25 @@ coupling_factor = 0.2 ## create simple system with only one Izh Cell with Context("Model") as model: - cell = IzhikevichCell("z0", n_units=1, tau_w=tau_w, v_reset=v_reset, - w_reset=w_reset, coupling_factor=coupling_factor, - integration_type="euler", v0=v0, w0=w0, key=subkeys[0]) + cell = IzhikevichCell( + "z0", n_units=1, tau_w=tau_w, v_reset=v_reset, w_reset=w_reset, coupling_factor=coupling_factor, + integration_type="euler", v0=v0, w0=w0, key=subkeys[0] + ) ## create and compile core simulation commands - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - cell.j.set(x) +## set up non-compiled utility commands +def clamp(x): + cell.j.set(x) ``` -The Izhikevich `IZH`, much like the FitzHugh–Nagumo cell covered in -[a different lesson](../neurocog/fitzhugh_nagumo_cell.md), is a two-dimensional -differential equation system (developed in [1]) that attempts to (approximately) -model spiking cellular activation and deactivation dynamics. Notably, the `IZH` -cell models membrane potential `v` (using a squared term) jointly with a -recovery variable `w` (which is meant to provide a slower form of negative feedback). -In his model, Izhikevich introduced four important control factors/coefficients, -the choices of values for each changes the behavior of the neuronal model and -thus recovering dynamics of different classes of neurons found in the brain. -Several of these control factors have been renamed and/or mapped to more -explicit descriptors in ngc-learn (for example, Izhikevich's original factor -`a` has been mapped to `a = 1/tau_w` allowing the user to define the time -constant for the recovery variable much in the same manner as the -FitzHugh–Nagumo cell). Also like the FitzHugh–Nagumo cell, the Izhikevich model -contains configurable initial conditions for its voltage (i.e., `v0`) and -recovery values (i.e., `w0`), which we see have been set to interesting values -for the purposes of this lesson (these are actually the default values of -the Izhikevich component, i.e., `v0=-65` and `w0=-14`). +The Izhikevich `IZH`, much like the FitzHugh–Nagumo cell covered in [a different lesson](../neurocog/fitzhugh_nagumo_cell.md), is a two-dimensional differential equation system (developed in [1]) that attempts to (approximately) model spiking cellular activation and deactivation dynamics. Notably, the `IZH` cell models membrane potential `v` (using a squared term) jointly with a recovery variable `w` (which is meant to provide a slower form of negative feedback). +In his model, Izhikevich introduced four important control factors/coefficients, the choices of values for each will change the behavior of the neuronal model and thus recovering dynamics of different classes of neurons found in the brain. Several of these control factors have been renamed and/or mapped to more explicit descriptors in ngc-learn (for example, Izhikevich's original factor `a` has been mapped to `a = 1/tau_w` allowing the user to define the time constant for the recovery variable much in the same manner as the FitzHugh–Nagumo cell). Also like the FitzHugh–Nagumo cell, the Izhikevich model contains configurable initial conditions for its voltage (i.e., `v0`) and recovery values (i.e., `w0`), which we see have been set to interesting values for the purposes of this lesson (these are actually the default values of the Izhikevich component, i.e., `v0=-65` and `w0=-14`). Formally, the core dynamics of the `IZH` can be written out as follows: @@ -84,22 +65,12 @@ $$ \tau_w \frac{\partial \mathbf{w}_t}{\partial t} &= b \mathbf{v}_t - \mathbf{w}_t $$ -where $b$ is the coupling factor, $R$ is the membrane resistance, $\tau_m$ is the -membrane time constant, and $\tau_w$ is the recovery time constant (technically, -$\tau_m = 1$, $R = 1$, and $\tau_w = 1/a$ to get to the perspective originally -put forth in [1]). +where $b$ is the coupling factor, $R$ is the membrane resistance, $\tau_m$ is the membrane time constant, and $\tau_w$ is the recovery time constant (technically, $\tau_m = 1$, $R = 1$, and $\tau_w = 1/a$ to get to the perspective originally put forth in [1]). ### Simulating a Izhikevich Neuronal Cell -Given the single-cell dynamical system we set up above, we finally write -some code that uses and visualizes the flow of the `IZH` cell's membrane -potential and coupled recovery variable (specifically over a period of about -`200` milliseconds). We will, much as we did with the leaky integrators in -prior tutorials, inject an electrical current `j` into the `IZH` cell -- this -time with a constant current value of `10` amperes -- and observe how the cell -produces action potentials. -Specifically, we can plot the `IZH` neuron's voltage `v` and recovery variable `w` -in the following manner: +Given the single-cell dynamical system we set up above, we finally write some code that uses and visualizes the flow of the `IZH` cell's membrane potential and coupled recovery variable (specifically over a period of about `200` milliseconds). We will, much as we did with the leaky integrators in prior tutorials, inject an electrical current `j` into the `IZH` cell -- this time with a constant current value of `10` amperes -- and observe how the cell produces action potentials. +Specifically, we can plot the `IZH` neuron's voltage `v` and recovery variable `w` in the following manner: ```python curr_in = [] @@ -114,19 +85,19 @@ i_app = 10. # 0.23 ## electrical current to inject into F-N cell data = jnp.asarray([[i_app]], dtype=jnp.float32) time_span = [] -model.reset() +reset_process.run() t = 0. for ts in range(T): x_t = data ## pass in t and dt and run step forward of simulation - model.clamp(x_t) - model.advance(t=t, dt=dt) + clamp(x_t) + advance_process.run(t=t, dt=dt) t = t + dt ## naively extract simple statistics at time ts and print them to I/O - v = cell.v.value - w = cell.w.value - s = cell.s.value + v = cell.v.get() + w = cell.w.get() + s = cell.s.get() curr_in.append(data) mem_rec.append(v) recov_rec.append(w) @@ -153,8 +124,9 @@ n_plots = 1 fig, ax = plt.subplots(1, n_plots, figsize=(5*n_plots,5)) ax_ptr = ax -ax_ptr.set(xlabel='Time', ylabel='Voltage (v), Recovery (w)', - title="Izhikevich (RS) Voltage/Recovery Dynamics") +ax_ptr.set( + xlabel='Time', ylabel='Voltage (v), Recovery (w)', title=f"Izhikevich ({cell_tag}) Voltage/Recovery Dynamics" +) v = ax_ptr.plot(time_span, mem_rec, color='C0') w = ax_ptr.plot(time_span, recov_rec, color='C1', alpha=.5) @@ -164,22 +136,12 @@ plt.tight_layout() plt.savefig("{0}".format("izhcell_plot.jpg")) ``` -You should get a plot that depicts the evolution of the voltage and recovery of -the Izhikevich cell, i.e., saved as `izhcell_plot.jpg` locally to disk, much -like the one below: +You should get a plot that depicts the evolution of the voltage and recovery of the Izhikevich cell, i.e., saved as `izhcell_plot.jpg` locally to disk, much like the one below: -The plot above, which you can modify slightly yourself to include the neuronal -type tag "RS" like we do, actually depicts the dynamics for a specific type of spiking -neuron called the "regular spiking" (RS) neuron (also the default configuration -for ngc-learn's neuronal cell implementation), which is only one of several -kinds of neurons you can emulate with Izhikevich's dynamics implemented in -ngc-learn. Try modifying the exposed Izhikevich cell hyper-parameters above -and setting them to particular values (such as those noted in the -component's documentation) to recreate other possible neuron types. For -example, to obtain a "fast spiking" (FS) neuronal cell, all you would need to -do is modify the recovery variable's time constant like so: +The plot above, which you can modify slightly yourself to include the neuronal type tag "RS" like we do, actually depicts the dynamics for a specific type of spiking neuron called the "regular spiking" (RS) neuron (also the default configuration for ngc-learn's neuronal cell implementation), which is only one of several kinds of neurons you can emulate with Izhikevich's dynamics implemented in +ngc-learn. Try modifying the exposed Izhikevich cell hyper-parameters above and setting them to particular values (such as those noted in the component's documentation) to recreate other possible neuron types. For example, to obtain a "fast spiking" (FS) neuronal cell, all you would need to do is modify the recovery variable's time constant like so: ```python ## FS cell configuration values @@ -189,15 +151,11 @@ w_reset = 8. ## ngc-learn default coupling_factor = 0.2 ## ngc-learn default ``` -to obtain a voltage/recovery dynamics plot like so (if you also modify the -plot title of the plotting code accordingly): +to obtain a voltage/recovery dynamics plot like so (if you also modify the plot title of the plotting code accordingly): -Three other well-known classes of neural behaviors are possible to easily simulate -under the following hyper-parameter configurations (which produce the array -of three plots similar to those shown near the bottom of this lesson), -by simplifying modifying hyper-parameters according to the following: +Three other well-known classes of neural behaviors are possible to easily simulate under the following hyper-parameter configurations (which produce the array of three plots similar to those shown near the bottom of this lesson), by simplifying modifying hyper-parameters according to the following: 1. Chattering (CH) neurons: ```python @@ -222,8 +180,7 @@ w_reset = 2. coupling_factor = 0.25 ``` -The above three hyper-parameter settings produce, from top-to-bottom, the -plots shown below (from left-to-right): +The above three hyper-parameter settings produce, from top-to-bottom, the plots shown below (from left-to-right): ```{eval-rst} @@ -237,27 +194,6 @@ plots shown below (from left-to-right): +-------------------------------------------------------+-------------------------------------------------------+--------------------------------------------------------+ ``` -## Optional: Setting Up The Components with a JSON Configuration - -While you are not required to create a JSON configuration file for ngc-learn, -to get rid of the warning that ngc-learn will throw at the start of your -program's execution (indicating that you do not have a configuration set up yet), -all you need to do is create a sub-directory for your JSON configuration -inside of your project code's directory, i.e., `json_files/modules.json`. -Inside the JSON file, you would write the following: - -```json -[ - {"absolute_path": "ngclearn.components", - "attributes": [ - {"name": "IzhikevichCell"}] - }, - {"absolute_path": "ngcsimlib.operations", - "attributes": [ - {"name": "overwrite"}] - } -] -``` ## References diff --git a/docs/tutorials/neurocog/lif.md b/docs/tutorials/neurocog/lif.md index 48485da9..82a08030 100755 --- a/docs/tutorials/neurocog/lif.md +++ b/docs/tutorials/neurocog/lif.md @@ -1,31 +1,15 @@ # Lecture 2B: The Leaky Integrate-and-Fire Cell -The leaky integrate-and-fire (LIF) cell component in ngc-learn is a stepping -stone towards working with more biophysical intricate cell components when crafting -your neuronal circuit models. This -[cell](ngclearn.components.neurons.spiking.LIFCell) is markedly different from the -[simplified LIF](ngclearn.components.neurons.spiking.sLIFCell) in both its -implemented dynamics as well as what modeling routines that it offers, including -the fact that it does not offer implicit fixed lateral inhibition like the -`SLIF` does (one would need to explicitly model the lateral inhibition as a -separate population of `LIF` cells, as we do in the -[Diehl and Cook model museum spiking network](../../museum/snn_dc.md)). Furthermore, -using this neuronal cell is a useful transition to using the more complicated and -biophysically more accurate neuronal models such as the -[adaptive exponential integrator cell](ngclearn.components.neurons.spiking.adExCell) -or the -[Izhikevich cell](ngclearn.components.neurons.spiking.izhikevichCell). +The leaky integrate-and-fire (LIF) cell component in ngc-learn is a stepping stone towards working with more biophysical intricate cell components when crafting your neuronal circuit models. This [cell](ngclearn.components.neurons.spiking.LIFCell) is markedly different from the [simplified LIF](ngclearn.components.neurons.spiking.sLIFCell) in both its implemented dynamics as well as what modeling routines that it offers, including the fact that it does not offer implicit fixed lateral inhibition like the `SLIF` does (one would need to explicitly model the lateral inhibition as a separate population of `LIF` cells, as we do in the [Diehl and Cook model museum spiking network](../../museum/snn_dc.md)). Furthermore, using this neuronal cell is a useful transition to using the more complicated and biophysically more accurate neuronal models such as the [adaptive exponential integrator cell](ngclearn.components.neurons.spiking.adExCell) or the [Izhikevich cell](ngclearn.components.neurons.spiking.izhikevichCell). ## Instantiating the LIF Neuronal Cell -To implement a single-component dynamical system made up of a single LIF -cell, you would write code akin to the following: +To implement a single-component dynamical system made up of a single LIF cell, you would write code akin to the following: ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.neurons.spiking.LIFCell import LIFCell from ngclearn.utils.viz.spike_plot import plot_spiking_neuron @@ -42,35 +26,27 @@ tau_m = 100. ## create simple system with only one AdEx with Context("Model") as model: - cell = LIFCell("z0", n_units=1, tau_m=tau_m, resist_m=tau_m/dt, thr=V_thr, - v_rest=V_rest, v_reset=-60., tau_theta=300., theta_plus=0.05, - refract_time=2., key=subkeys[0]) + cell = LIFCell( + "z0", n_units=1, tau_m=tau_m, resist_m=tau_m/dt, thr=V_thr, v_rest=V_rest, v_reset=-60., tau_theta=300., + theta_plus=0.05, refract_time=2., key=subkeys[0] + ) ## create and compile core simulation commands - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - cell.j.set(x) +## set up non-compiled utility commands +def clamp(x): + cell.j.set(x) ``` ## Simulating the LIF on Stepped Constant Electrical Current -Given our single-LIF dynamical system above, let us write some code to use -our `LIF` node and visualize the resultant spiking pattern super-imposed -over its membrane (voltage) potential by feeding -into it a step current, where the electrical current `j` starts at $0$ then -switches to $0.3$ at $t = 10$ ms (much as we did for the `SLIF` component -in the previous lesson). We craft the simulation portion of our code like so: - +Given our single-LIF dynamical system above, let us write some code to use our `LIF` node and visualize the resultant spiking pattern super-imposed over its membrane (voltage) potential by feeding into it a step current, where the electrical current `j` starts at $0$ then switches to $0.3$ at $t = 10$ ms (much as we did for the `SLIF` component in the previous lesson). We craft the simulation portion of our code like so: ```python # create a synthetic electrical step current @@ -80,14 +56,14 @@ curr_in = [] mem_rec = [] spk_rec = [] -model.reset() +reset_process.run() for ts in range(current.shape[1]): j_t = jnp.expand_dims(current[0,ts], axis=0) ## get data at time ts - model.clamp(j_t) - model.advance(t=ts*1., dt=dt) + clamp(j_t) + advance_process.run(t=ts*1., dt=dt) ## naively extract simple statistics at time ts and print them to I/O - v = cell.v.value - s = cell.s.value + v = cell.v.get() + s = cell.s.get() curr_in.append(j_t) mem_rec.append(v) spk_rec.append(s) @@ -95,43 +71,24 @@ for ts in range(current.shape[1]): print() ``` -Then, we can plot the input current, the neuron's voltage `v`, and its output -spikes as follows: +Then, we can plot the input current, the neuron's voltage `v`, and its output spikes as follows: ```python import numpy as np curr_in = np.squeeze(np.asarray(curr_in)) mem_rec = np.squeeze(np.asarray(mem_rec)) spk_rec = np.squeeze(np.asarray(spk_rec)) -plot_spiking_neuron(curr_in, mem_rec, spk_rec, None, dt, thr_line=V_thr, min_mem_val=V_rest-1., - max_mem_val=V_thr+2., spike_loc=V_thr, spike_spr=0.5, title="LIF-Node: Constant Electrical Input", fname="lif_plot.jpg") +plot_spiking_neuron( + curr_in, mem_rec, spk_rec, None, dt, thr_line=V_thr, min_mem_val=V_rest-1., max_mem_val=V_thr+2., spike_loc=V_thr, + spike_spr=0.5, title="LIF-Node: Constant Electrical Input", fname="lif_plot.jpg" +) ``` which should produce the following plot (saved to disk): -As we might observe, the LIF operates very differently from the SLIF, notably -that its dynamics live in the different space of values (one aspect of the -SLIF is that its dynamics are effectively normalized/configured to live -a non-negative membrane potential number space), specifically values that -are a bit better aligned with those observed in experimental neuroscience. -While more biophysically more accurate, the `LIF` typically involves consideration -of multiple additional hyper-parameters/simulation coefficients, including -the resting membrane potential value `v_rest` and the reset membrane value -`v_reset` (upon occurrence of a spike/emitted action potential); the `SLIF`, -in contrast, assumed a `v_reset = v_reset = 0.`. Note that the `LIF`'s -`tau_theta` and `theta_plus` coefficients govern its particular adaptive threshold, -which is a particular increment variable (one per cell in the `LIF` component) -that gets adjusted according to its own dynamics and added to the fixed constant -threshold `thr`, i.e., the threshold that a cell's membrane potential must -exceed for a spike to be emitted. - -The `LIF` cell component is particularly useful when more flexibility is required/ -desired in setting up neuronal dynamics, particularly when attempting to match -various mathematical models that have been proposed in computational neuroscience. -This benefit comes at the greater cost of additional tuning and experimental planning, -whereas the `SLIF` can be a useful go-to initial spiking cell for building certain spiking -models such as those proposed in machine intelligence research (we demonstrate -one such use-case in the context of the -[feedback alignment-trained spiking network](../../museum/snn_bfa.md) that we offer in the model museum). +As we might observe, the LIF operates very differently from the SLIF, notably that its dynamics live in the different space of values (one aspect of the SLIF is that its dynamics are effectively normalized/configured to live a non-negative membrane potential number space), specifically values that are a bit better aligned with those observed in experimental neuroscience. While more biophysically more accurate, the `LIF` typically involves consideration of multiple additional hyper-parameters/simulation coefficients, including +the resting membrane potential value `v_rest` and the reset membrane value `v_reset` (upon occurrence of a spike/emitted action potential); the `SLIF`, in contrast, assumed a `v_reset = v_reset = 0.`. Note that the `LIF`'s `tau_theta` and `theta_plus` coefficients govern its particular adaptive threshold, which is a particular increment variable (one per cell in the `LIF` component) that gets adjusted according to its own dynamics and added to the fixed constant threshold `thr`, i.e., the threshold that a cell's membrane potential must exceed for a spike to be emitted. + +The `LIF` cell component is particularly useful when more flexibility is required/desired in setting up neuronal dynamics, particularly when attempting to match various mathematical models that have been proposed in computational neuroscience. This benefit comes at the greater cost of additional tuning and experimental planning, whereas the `SLIF` can be a useful go-to initial spiking cell for building certain spiking models such as those proposed in machine intelligence research (we demonstrate one such use-case in the context of the [feedback alignment-trained spiking network](../../museum/snn_bfa.md) that we offer in the model museum). diff --git a/docs/tutorials/neurocog/metrics.md b/docs/tutorials/neurocog/metrics.md index aea77da6..e872e23c 100644 --- a/docs/tutorials/neurocog/metrics.md +++ b/docs/tutorials/neurocog/metrics.md @@ -1,26 +1,11 @@ # Metrics and Measurement Functions -Inside of `ngclearn.utils.metric_utils`, ngc-learn offers metrics and measurement -utility functions that can be quite useful when building neurocognitive models using -ngc-learn's node-and-cables system for specific tasks. While this utilities -sub-module will not always contain every possible function you might need, -given that measurements are often dependent on the task the experimenter wants -to conduct, there are several commonly-used ones drawn from machine intelligence -and computational neuroscience that are (jit-i-fied) in-built to ngc-learn you -can readily use. -In this small lesson, we will briefly examine two examples of importing such -functions and examine what they do. +Inside of `ngclearn.utils.metric_utils`, ngc-learn offers metrics and measurement utility functions that can be quite useful when building neurocognitive models using ngc-learn's node-and-cables system for specific tasks. While this utilities sub-module will not always contain every possible function you might need, given that measurements are often dependent on the task the experimenter wants to conduct, there are several commonly-used ones drawn from machine intelligence and computational neuroscience that are (jit-i-fied) in-built to ngc-learn you can readily use. +In this small lesson, we will briefly examine two examples of importing such functions and examine what they do. ## Measuring Task-Level Quantities -For many tasks that you might be interested in, a useful measurement -is the performance of the model in some supervised learning context. For example, -you might want to measure a model's accuracy on a classification task. To do so, -assuming we have some model outputs extracted from a model that you have constructed -elsewhere -- say a matrix of scores `Y_scores` -- and a target set of predictions -that you are testing against -- such as `Y_labels` (in one-hot binary encoded form ) --- then you can write some code to compute the accuracy, mean squared error (MSE), -and categorical log likelihood (Cat-NLL), like so: +For many tasks that you might be interested in, a useful measurement is the performance of the model in some supervised learning context. For example, you might want to measure a model's accuracy on a classification task. To do so, assuming we have some model outputs extracted from a model that you have constructed elsewhere -- say a matrix of scores `Y_scores` -- and a target set of predictions that you are testing against -- such as `Y_labels` (in one-hot binary encoded form ) -- then you can write some code to compute the accuracy, mean squared error (MSE), and categorical log likelihood (Cat-NLL), like so: ```python from jax import numpy as jnp @@ -55,24 +40,18 @@ and you should obtain the following in I/O like so: > Cat-NLL = 4.003 ``` -Notice that we imported the utility function `softmax` from -`ngclearn.utils.model_utils` to convert our raw theoretical model scores to -probability values so that using `measure_CatNLL()` makes sense (as this -assumes the model scores are normalized probability values). +Notice that we imported the utility function `softmax` from `ngclearn.utils.model_utils` to convert our raw theoretical model scores to +probability values so that using `measure_CatNLL()` makes sense (as this assumes the model scores are normalized probability values). ## Measuring Some Model Statistics -In some cases, you might be interested in measuring certain statistics -related to aspects of a model that you construct. For example, you might have -collected a (binary) spike train produced by one of the internal neuronal layers -of your ngc-learn-simulated spiking neural network and want to compute the -firing rates and Fano factors associated with each neuron. Doing so with -ngc-learn utility functions would entail writing something like: +In some cases, you might be interested in measuring certain statistics related to properties of a model that you construct. For example, you might have collected a (binary) spike train produced by one of the internal neuronal layers of your ngc-learn-simulated spiking neural network and want to compute the firing rates and Fano factors associated with each neuron. Doing so with ngc-learn utility functions would entail writing something like: ```python from jax import numpy as jnp from ngclearn.utils.metric_utils import measure_fanoFactor, measure_firingRate +## let's create a fake synthetic spike train for 3 neurons (one per column) spikes = jnp.asarray([[0., 0., 0.], [0., 0., 1.], [0., 1., 0.], @@ -92,6 +71,7 @@ spikes = jnp.asarray([[0., 0., 0.], [0., 1., 0.], [0., 0., 1.]], dtype=jnp.float32) +## measure the firing rates and Fano factors of the 3 neurons fr = measure_firingRate(spikes, preserve_batch=True) fano = measure_fanoFactor(spikes, preserve_batch=True) @@ -106,8 +86,4 @@ which should result in the following to be printed to I/O: > Fano Factor = [[0.8888888 0.77777773 0.55555546]] ``` -The Fano factor is a useful secondary statistic for characterizing the -variable of a neuronal spike train -- as we see in the measurement above, -the first and second neurons have a higher Fano factor (given they are -more irregular in their spiking patterns) whereas the third neuron is far more -regular in its spiking pattern and thus has a lower Fano factor. +The Fano factor is a useful secondary statistic for characterizing the variability of a neuronal spike train -- as we see in the measurement above, the first and second neurons have a higher Fano factor (given they are more irregular in their spiking patterns) whereas the third neuron is far more regular in its spiking pattern and thus has a lower Fano factor. diff --git a/docs/tutorials/neurocog/mod_stdp.md b/docs/tutorials/neurocog/mod_stdp.md index 3a76de37..f705f935 100755 --- a/docs/tutorials/neurocog/mod_stdp.md +++ b/docs/tutorials/neurocog/mod_stdp.md @@ -1,52 +1,28 @@ # Lecture 4D: Reward-Modulated Spike-Timing-Dependent Plasticity -In this lesson, we will build on the notions of spike-timing-dependent -plasticity (STDP), covered [earlier here](../neurocog/stdp.md), to construct -an important form of biological credit assignment in spiking neural networks -known as reward-modulated STDP (sometimes abbreviated to R-STDP). Specifically, -we will simulate and plot the underlying plasticity dynamics associated with -this form of change in synaptic efficacy, specifically studying two in-built -schemes of STDP: modulated STDP (MSTDP) and modulated STDP with eligibility -traces (MSTDP-ET). +In this lesson, we will build on the notions of spike-timing-dependent plasticity (STDP), covered [earlier here](../neurocog/stdp.md), to construct an important form of biological credit assignment in spiking neural networks known as reward-modulated STDP (sometimes abbreviated to R-STDP). Specifically, we will simulate and plot the underlying plasticity dynamics associated with this form of change in synaptic efficacy, specifically studying two in-built schemes of STDP: modulated STDP (MSTDP) and modulated STDP with eligibility traces (MSTDP-ET). ## Probing Modulated STDP and Eligibility Traces -Go ahead and make a new folder for this study and create a Python script, -i.e., `run_reward_stdp.py`, to write your code for this part of the tutorial. +Go ahead and make a new folder for this study and create a Python script, i.e., `run_reward_stdp.py`, to write your code for this part of the tutorial. -Much as we did in the STDP lesson, we will build a 3-component dynamical system --- two spiking neurons (represented by traces) that are connected with a single -synapse -- but, this time, we will simulate three variations of this system in -parallel. Each one of these variants will evolve its single synapse according -to a different condition of STDP: +Much as we did in the STDP lesson, we will build a 3-component dynamical system -- two spiking neurons (represented by traces) that are connected with a single synapse -- but, this time, we will simulate three variations of this system in parallel. Each one of these variants will evolve its single synapse according to a different condition of STDP: 1. the first one will change its synapse's strength in accordance with trace-based STDP; 2. the second one will change its synapse's strength via modulated STDP (MSTDP); and, 3. the third and final one will change its synapse's strength via modulated STDP equipped with an eligibility trace (MSTDP-ET). -The second and third model above will make use of ngc-learn's in-built -[MSTDPETSynapse](ngclearn.components.synapses.modulated.MSTDPETSynapse), which -is an STDP cable component that sub-classes the `TraceSTDPSynapse` cable component -and will offer the additional machinery we will need to carry out modulated -forms of STDP. -All three of these variant STDP-evolved systems will make use of the same set -of variable traces (the `VarTrace` object introduced in the previous STDP lesson), -and we will control the spike trains by providing a specific set of pre-synaptic -spike times and a corresponding set of post-synaptic spike times ( both in -milliseconds). Furthermore, we will insert a convenience cell in-built -to ngc-learn called the `RewardErrorCell`, which is generally use to produce -what is known in neuroscience literature as "reward prediction error" (RPE). - -Writing the above three parallel single synapse systems, including meta-parameters -and the required compiled simulation and dynamic commands, can be done as follows: +The second and third model above will make use of ngc-learn's in-built [MSTDPETSynapse](ngclearn.components.synapses.modulated.MSTDPETSynapse), which is an STDP cable component that sub-classes the `TraceSTDPSynapse` cable component and will offer the additional machinery we will need to carry out modulated forms of STDP. +All three of these variant STDP-evolved systems will make use of the same set of variable traces (the `VarTrace` object introduced in the previous STDP lesson), and we will control the spike trains by providing a specific set of pre-synaptic spike times and a corresponding set of post-synaptic spike times (both in milliseconds). Furthermore, we will insert a convenience cell in-built to ngc-learn called the `RewardErrorCell`, which is generally use to produce what is known in neuroscience literature as "reward prediction error" (RPE). + +Writing the above three parallel single synapse systems, including meta-parameters and the required compiled simulation and dynamic commands, can be done as follows: ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess + +from ngclearn import Context, MethodProcess ## import model-specific mechanisms -from ngclearn.components import (TraceSTDPSynapse, MSTDPETSynapse, - RewardErrorCell, VarTrace) -import ngclearn.utils.weight_distribution as dist +from ngclearn.components import (TraceSTDPSynapse, MSTDPETSynapse, RewardErrorCell, VarTrace) +from ngclearn.utils.distribution_generator import DistributionGenerator ## create seeding keys (JAX-style) dkey = random.PRNGKey(231) @@ -55,142 +31,95 @@ dkey, *subkeys = random.split(dkey, 2) dt = 1. # ms # integration time constant T_max = 200 ## number time steps to simulate tau_pre = tau_post = 20. # ms -tau_elg = 25. +tau_elg = 25. # ms ## eligibility trace time constant Aplus = Aminus = 1. ## in ngc-learn, Aplus/Aminus are magnitudes (signs are handled internally) gamma = 0.2 gamma_0 = 0.2/tau_elg with Context("Model") as model: W_stdp = TraceSTDPSynapse( ## reward-STDP (RSTDP) - "W1_stdp", shape=(1, 1), eta=gamma, A_plus=Aplus, A_minus=Aminus, - weight_init=dist.constant(value=0.2), key=subkeys[0]) + "W1_stdp", shape=(1, 1), eta=gamma, A_plus=Aplus, A_minus=Aminus, + weight_init=DistributionGenerator.constant(value=0.2), key=subkeys[0] + ) W_mstdp = MSTDPETSynapse( ## reward-STDP (RSTDP) - "W1_rstdp", shape=(1, 1), eta=gamma, A_plus=Aplus, A_minus=Aminus, - tau_elg=0., weight_init=dist.constant(value=0.2), key=subkeys[0]) + "W1_rstdp", shape=(1, 1), eta=gamma, A_plus=Aplus, A_minus=Aminus, tau_elg=0., + weight_init=DistributionGenerator.constant(value=0.2), key=subkeys[0] + ) W_mstdpet = MSTDPETSynapse( ## reward-STDP w/ eligibility traces - "W_mstdpet", shape=(1, 1), eta=gamma_0, A_plus=Aplus, A_minus=Aminus, - tau_elg=tau_elg, weight_init=dist.constant(value=0.2), key=subkeys[0]) + "W_mstdpet", shape=(1, 1), eta=gamma_0, A_plus=Aplus, A_minus=Aminus, tau_elg=tau_elg, + weight_init=DistributionGenerator.constant(value=0.2), key=subkeys[0] + ) ## set up pre- and -post synaptic trace variables tr0 = VarTrace("tr0", n_units=1, tau_tr=tau_pre, a_delta=Aplus) tr1 = VarTrace("tr1", n_units=1, tau_tr=tau_post, a_delta=Aminus) rpe = RewardErrorCell("r", n_units=1, alpha=0.) - evolve_process = (JaxProcess() + evolve_process = (MethodProcess("evolve") >> W_stdp.evolve >> W_mstdp.evolve >> W_mstdpet.evolve) - model.wrap_and_add_command(jit(evolve_process.pure), name="evolve") - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> tr0.advance_state >> tr1.advance_state >> rpe.advance_state >> W_stdp.advance_state >> W_mstdp.advance_state >> W_mstdpet.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> W_stdp.reset >> W_mstdp.reset >> W_mstdpet.reset >> rpe.reset >> tr0.reset - >> tr1.reset - ) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - - @Context.dynamicCommand - def clamp_spikes(f_j, f_i): - tr0.inputs.set(f_j) - tr1.inputs.set(f_i) - - @Context.dynamicCommand - def clamp_stdp_stats(f_j, f_i, trace_j, trace_i): - W_stdp.preSpike.set(f_j) - W_stdp.postSpike.set(f_i) - W_stdp.preTrace.set(trace_j) - W_stdp.postTrace.set(trace_i) - - @Context.dynamicCommand - def clamp_mstdp_stats(f_j, f_i, trace_j, trace_i, reward): - W_mstdp.preSpike.set(f_j) - W_mstdp.postSpike.set(f_i) - W_mstdp.preTrace.set(trace_j) - W_mstdp.postTrace.set(trace_i) - W_mstdp.modulator.set(reward) - - @Context.dynamicCommand - def clamp_mstdpet_stats(f_j, f_i, trace_j, trace_i, reward): - W_mstdpet.preSpike.set(f_j) - W_mstdpet.postSpike.set(f_i) - W_mstdpet.preTrace.set(trace_j) - W_mstdpet.postTrace.set(trace_i) - W_mstdpet.modulator.set(reward) + >> tr1.reset) + +## set up some utility functions for the model context +def clamp_spikes(f_j, f_i): + tr0.inputs.set(f_j) + tr1.inputs.set(f_i) + +def clamp_stdp_stats(f_j, f_i, trace_j, trace_i): + W_stdp.preSpike.set(f_j) + W_stdp.postSpike.set(f_i) + W_stdp.preTrace.set(trace_j) + W_stdp.postTrace.set(trace_i) + +def clamp_mstdp_stats(f_j, f_i, trace_j, trace_i, reward): + W_mstdp.preSpike.set(f_j) + W_mstdp.postSpike.set(f_i) + W_mstdp.preTrace.set(trace_j) + W_mstdp.postTrace.set(trace_i) + W_mstdp.modulator.set(reward) + +def clamp_mstdpet_stats(f_j, f_i, trace_j, trace_i, reward): + W_mstdpet.preSpike.set(f_j) + W_mstdpet.postSpike.set(f_i) + W_mstdpet.preTrace.set(trace_j) + W_mstdpet.postTrace.set(trace_i) + W_mstdpet.modulator.set(reward) ``` -Given our three parallel models constructed above, we ready to write some code -to use our simulation setup. Before we do, however, notice that we have -configured the simulation -time `T_max` to be `200` milliseconds (ms), the integration time constant -`dt` to be `1` ms, and the time constant for both our pre-synaptic and -post-synaptic spiking neuron traces to be `20` ms. Two final points to notice -about the models we have constructed above are: -1. the RPE cell `rpe` has been configured to only output a given clamped - reward signal via `alpha = 0`; this, according to the internal design of the - `RewardErrorCell`, just effectively shuts off the moving average prediciton - of reward signals that the cell encounters over time (in most practical - cases, you will not want this set to zero as we are often interested in - the difference between a reward prediction and a target reward value); -2. for the third model, the MSTDP-ET model, we have configured an eligibility - trace to be used by setting the eligibility time constant `tau_elg` to be - be non-zero, i.e., it was set to `25` ms. An eligibility trace, in the context - STDP/Hebbian synaptic updates, simply another set of dynamics (i.e., another - ordinary differential equation) that we maintain as STDP synaptic updates - are computed. - -With respect to the second point made about eligibility traces, formally, we note -that under MSTDP-ET, instead of computing a trace-based STDP update at -each and every single time step `t` and updating the synapses immediately, -we first aggregate each STDP into another variable (the eligibility) according -to the following ODE: +Given our three parallel models constructed above, we ready to write some code to use our simulation setup. Before we do, however, notice that we have configured the simulation time `T_max` to be `200` milliseconds (ms), the integration time constant `dt` to be `1` ms, and the time constant for both our pre-synaptic and post-synaptic spiking neuron traces to be `20` ms. Two final points to notice about the models that we have constructed above are: +1. the RPE cell `rpe` has been configured to only output a given clamped reward signal via `alpha = 0`; this, according to the internal design of the `RewardErrorCell`, just effectively shuts off the moving average prediction of reward signals that the cell encounters over time (in most practical cases, you will not want this set to zero as we are often interested in the difference between a reward prediction and a target reward value); +2. for the third model, the MSTDP-ET model, we have configured an eligibility trace to be used by setting the eligibility time constant `tau_elg` to be non-zero, i.e., it was set to `25` ms. An eligibility trace, in the context STDP/Hebbian synaptic updates, simply another set of dynamics (i.e., another ordinary differential equation) that we maintain as STDP synaptic updates are computed. + +With respect to the second point made above about eligibility traces, formally, we note that: under MSTDP-ET, instead of computing a trace-based STDP update at each and every single time step `t` and updating the synapses immediately, we first aggregate each STDP update into another variable (the "eligibility") according to the following ODE: $$ -\tau_{elg} \frac{\partial \mathbf{E}_{ij}}{\partial t} = -\mathbf{E}_{ij} + -\beta \frac{\partial \mathbf{W}_{ij}}{\partial t} +\tau_{elg} \frac{\partial \mathbf{E}_{ij}}{\partial t} = -\mathbf{E}_{ij} + \beta \frac{\partial \mathbf{W}_{ij}}{\partial t} $$ -where $i$ denotes the index of the post-synpatic spiking neuron (which emits -a spike we label as $f_i$) and $j$ denotes the index of the pre-synaptic -spiking neuron (which emits a spike we label as $f_j$), $\mathbf{W}_{ij}$ is -the synapse that connects neuron $j$ to $i$, $\mathbf{E}_{ij}$ is the eligibility -trace we maintain for synapse $\mathbf{W}_{ij}$, and $\beta$ is control factor -(typically set to one) for scaling the magnitude of the STDP update's effect. -Finally, note that $\frac{\partial \mathbf{W}_{ij}}{\partial t}$ is the actual -synaptic update produced by our trace-based STDP at time $t$. - -Given the idea of the eligibility trace above, and how our RPE cell has been -configured, we can write down simply what kind of synaptic update ] -$\Delta \mathbf{W}_{ij}(t)$ that each of -our three dynamical systems will yield once we simulate them. -1. Trace-based STDP will produce an update to the synapse according to the combined - products of a paired pre-synaptic trace and post-synaptic spike (long-term - potentiation) and a paired pre-synaptic spike and post-synaptic trace - (long-term depression), i.e, - $\Delta \mathbf{W}_{ij}(t) = \gamma \frac{\partial \mathbf{W}_{ij}}{\partial t}$; -2. MSTDP -- the second/middle model with the `MSTDPETSynapse` with its - `tau_elg = 0` -- will produce a modulated update to the synapse at each - time step as follows: - $\Delta \mathbf{W}_{ij}(t) = \gamma r(t) \frac{\partial \mathbf{W}_{ij}}{\partial t}$; -3. MSTDP-ET -- the third and final model that uses an eligiblity trace -- will - produce a modulated update to the synapse at each time step via: - $\Delta \mathbf{W}_{ij}(t) = \gamma r(t) \mathbf{E}_{ij}(t)$. -Note that $r(t)$ is the reward administered at each time step `t` and $\gamma$ -is just an additional dampening factor to control how much of the STDP update -is applied at each time step (i.e., a global learning rate). - -Armed with our knowledge of the plasticity dynamics above, we next write down -what we want our model simulations to do: +where $i$ denotes the index of the post-synaptic spiking neuron (which emits a spike we label as $f_i$) and $j$ denotes the index of the pre-synaptic spiking neuron (which emits a spike we label as $f_j$), $\mathbf{W}_{ij}$ is the synapse that connects neuron $j$ to $i$, $\mathbf{E}_{ij}$ is the eligibility trace we maintain for synapse $\mathbf{W}_{ij}$, and $\beta$ is control factor (typically set to one) for scaling the magnitude of the STDP update's effect. +Finally, note that $\frac{\partial \mathbf{W}_{ij}}{\partial t}$ is the actual synaptic update produced by our trace-based STDP at time $t$. + +Given the idea of the eligibility trace explained above, as well as how our RPE cell has been configured, we can write down simply what kind of synaptic update $\Delta \mathbf{W}_{ij}(t)$ that each of our three dynamical systems will yield once we simulate them. +1. Trace-based STDP will produce an update to the synapse according to the combined products of a paired pre-synaptic trace and post-synaptic spike (long-term potentiation) and a paired pre-synaptic spike and post-synaptic trace (long-term depression), i.e, $\Delta \mathbf{W}_{ij}(t) = \gamma \frac{\partial \mathbf{W}_{ij}}{\partial t}$; +2. MSTDP -- the second/middle model with the `MSTDPETSynapse` with its `tau_elg = 0` -- will produce a modulated update to the synapse at each time step as follows: $\Delta \mathbf{W}_{ij}(t) = \gamma r(t) \frac{\partial \mathbf{W}_{ij}}{\partial t}$; +3. MSTDP-ET -- the third and final model that uses an eligibility trace -- will produce a modulated update to the synapse at each time step via: $\Delta \mathbf{W}_{ij}(t) = \gamma r(t) \mathbf{E}_{ij}(t)$. Note that $r(t)$ is the reward administered at each time step `t` and $\gamma$ is just an additional dampening factor to control how much of the STDP update is applied at each time step (i.e., a global learning rate). + +Armed with our knowledge of the plasticity dynamics above, we next write down what we want our model simulations to do: ```python # synthetic spike times of pre and post synaptic neurons @@ -208,7 +137,7 @@ elg_vals = [] W_stdp_vals = [] W_mstdp_vals = [] W_mstdpet_vals = [] -model.reset() +reset_process.run() for i in range(T_max): f_j = jnp.zeros((1, 1)) ## pre-syn spike if (i * dt) in spike_times_pre: @@ -222,33 +151,29 @@ for i in range(T_max): reward = -reward rpe.reward.set(reward) - model.clamp_spikes(f_j, f_i) ## clamp pre/post spikes to traces - model.advance(t=i * dt, dt=dt) + clamp_spikes(f_j, f_i) ## clamp pre/post spikes to traces + advance_process.run(t=i * dt, dt=dt) - model.clamp_stdp_stats(f_j, f_i, tr0.trace.value, tr1.trace.value) - model.clamp_mstdp_stats( - f_j, f_i, tr0.trace.value, tr1.trace.value, rpe.reward.value) - model.clamp_mstdpet_stats( - f_j, f_i, tr0.trace.value, tr1.trace.value, rpe.reward.value) - model.evolve(t=i * dt, dt=dt) + clamp_stdp_stats(f_j, f_i, tr0.trace.get(), tr1.trace.get()) + clamp_mstdp_stats(f_j, f_i, tr0.trace.get(), tr1.trace.get(), rpe.reward.get()) + clamp_mstdpet_stats(f_j, f_i, tr0.trace.get(), tr1.trace.get(), rpe.reward.get()) + evolve_process.run(t=i * dt, dt=dt) ## record statistics for plotting pre_spikes.append(jnp.squeeze(f_j)) post_spikes.append(jnp.squeeze(f_i)) r_vals.append(jnp.squeeze(reward)) - tr0_vals.append(jnp.squeeze(tr0.trace.value)) - tr1_vals.append(jnp.squeeze(-tr1.trace.value)) - dWstdp_vals.append(jnp.squeeze(W_stdp.dWeights.value)) - elg_vals.append(jnp.squeeze(W_mstdpet.eligibility.value)) - W_stdp_vals.append(jnp.squeeze(W_stdp.weights.value)) - W_mstdp_vals.append(jnp.squeeze(W_mstdp.weights.value)) - W_mstdpet_vals.append(jnp.squeeze(W_mstdpet.weights.value)) + tr0_vals.append(jnp.squeeze(tr0.trace.get())) + tr1_vals.append(jnp.squeeze(-tr1.trace.get())) + dWstdp_vals.append(jnp.squeeze(W_stdp.dWeights.get())) + elg_vals.append(jnp.squeeze(W_mstdpet.eligibility.get())) + W_stdp_vals.append(jnp.squeeze(W_stdp.weights.get())) + W_mstdp_vals.append(jnp.squeeze(W_mstdp.weights.get())) + W_mstdpet_vals.append(jnp.squeeze(W_mstdpet.weights.get())) t_vals.append(i * dt) ``` -which will run all three models simultaneously for `200` simulated milliseconds -and collect statistics of interest. We may then finally make several plots of what happens under each STDP mode -(reproducing some key results in [1]. First, we will plot the resulting synaptic magnitude over time, like so: +which will run all three of our models simultaneously for `200` simulated milliseconds and collect statistics of interest. We may then finally make several plots of what happens under each STDP mode (reproducing some key results in [1]. First, we will plot the resulting synaptic magnitude over time, like so: ```python import matplotlib.pyplot as plt @@ -282,23 +207,13 @@ ax3.grid() fig1.savefig("modstdp_syn_dynamics.jpg") ``` -which should produce a plot like the one below: +which should produce a plot like the one below: -Notice, first, that the middle plot for MSTDP (the red curve in the middle plot) -essentially mimics the update produced by STDP for the first `100` ms and then -flips (becomes a mirror image) of the STDP trajectory; this is due to the fact -that, as you can see in the code you wrote earlier for the spike train simulation, -the reward signal changes sign after `100` ms and since MSTDP is effectively -the product of the reward and an STDP synaptic update the sign of the synaptic -change will flip as well. Finally, notice that the MSTDP-ET yields a -smoothened change in synaptic efficacy (the blue curve in the bottom plot); -this is due to the eligibility trace leakily integrating the STDP updates -over time (and ultimately multiplying the trace by the reward at time `t`). +Notice, first, that the middle plot for MSTDP (the red curve in the middle plot) essentially mimics the update produced by STDP for the first `100` ms and then flips (becomes a mirror image) of the STDP trajectory; this is due to the fact that, as you can see in the code you wrote earlier for the spike train simulation, the reward signal changes sign after `100` ms and since MSTDP is effectively the product of the reward and an STDP synaptic update the sign of the synaptic change will flip as well. Finally, notice that the MSTDP-ET yields a smoothened change in synaptic efficacy (the blue curve in the bottom plot); this is due to the eligibility trace leakily integrating the STDP updates over time (and ultimately multiplying the trace by the reward at time `t`). -We will then plot the dynamics of important compartments the drive the operation -of the various STDP models with the following code block: +We will then plot the dynamics of important compartments the drive the operation of the various STDP models with the following code block: ```python ## create STDP synaptic dynamics plots (figure 1) @@ -352,27 +267,8 @@ which should yield the following component dynamics plot: -This plot usefully breaks down the plasticity dynamics of all three STDP models -into the core component dynamics. The top two plots illustrate the emissions -of spikes over time (the pre-synaptic spike plot followed by the post-synaptic -spike plot) while underneath these -- the third plot -- is a visualization -of these spikes respective traces multiplied by their corresponding sign -that is used in STDP, i.e., the blue pre-synaptic curve is positive as it -represents synaptic potentiation over time (pre occurs before post) while the -orange post-synaptic curve is negative as it represents synaptic depression -over time (post occurs after pre). The teal curve in the fourth plot -illustrates what kind of updates that typical trace-based STDP would produce, -in the absence of a reward signal, whereas the yellow-ish/goldenrod curve -underneath shows the eligibilty trace that smoothens out the more pulse-like -adjustments that STDP yields. In the very bottom plot, we see the red piecewise -function that characterizes our reward signal -- for the first `100` ms it -is simply one whereas for the last `200` ms it is negative one. In general, -one will not likely have access to a clean dense reward in most control -problems, i.e., the reward signal is typically sparse, which will mean that -modulated STDP updates will only occur when the signal is non-zero; this is -the advantage that MSTDP-ET offers over MSTDP as the synaptic change -dynamics persist (yet decay) in between reward presentation times and thus -MSTDP-ET will be more effective in cases when the reward signal is delayed. +This plot usefully breaks down the plasticity dynamics of all three STDP models into the core component dynamics. The top two plots illustrate the emissions of spikes over time (the pre-synaptic spike plot followed by the post-synaptic spike plot) while underneath these -- the third plot -- is a visualization of these spikes respective traces multiplied by their corresponding sign +that is used in STDP, i.e., the blue pre-synaptic curve is positive as it represents synaptic potentiation over time (pre occurs before post) while the orange post-synaptic curve is negative as it represents synaptic depression over time (post occurs after pre). The teal curve in the fourth plot illustrates what kind of updates that typical trace-based STDP would produce, in the absence of a reward signal, whereas the yellow-ish/goldenrod curve underneath shows the eligibility trace that smoothens out the more pulse-like adjustments that STDP yields. In the very bottom plot, we see the red piecewise function that characterizes our reward signal -- for the first `100` ms it is simply one whereas for the last `200` ms it is negative one. In general, one will not likely have access to a clean dense reward in most control problems, i.e., the reward signal is typically sparse, which will mean that modulated STDP updates will only occur when the signal is non-zero; this is the advantage that MSTDP-ET offers over MSTDP as the synaptic change dynamics persist (yet decay) in between reward presentation times and, thus, MSTDP-ET will be more effective in cases when the reward signal is delayed. ## References diff --git a/docs/tutorials/neurocog/plotting.md b/docs/tutorials/neurocog/plotting.md index b105b06f..f48845b2 100644 --- a/docs/tutorials/neurocog/plotting.md +++ b/docs/tutorials/neurocog/plotting.md @@ -1,24 +1,12 @@ # Plotting and Visualization -While writing one's own custom task-specific matplotlib visualization code -might be needed for specific experimental setups, there are several useful tools -already in-built to ngc-learn, organized under the package sub-directory -`ngclearn.utils.viz`, including utilities for generating raster plots and -synaptic receptive field views (useful for biophysical models such as spiking -neural networks) as well as t-SNE plots of model latent codes. While the other -lesson/tutorials demonstrate some of these useful routines (e.g., raster plots -for spiking neuronal cells), in this small lesson, we will demonstrate how to -produce a t-SNE plot using ngc-learn's in-built tool. +While writing one's own custom task-specific matplotlib visualization code might be needed for specific experimental setups, there are several useful tools already in-built to ngc-learn, organized under the package sub-directory `ngclearn.utils.viz`, including utilities for generating raster plots and synaptic receptive field views (useful for biophysical models such as spiking neural networks) as well as t-SNE plots of model latent codes. While the other lesson/tutorials demonstrate some of these useful routines (e.g., raster plots for spiking neuronal cells), in this small lesson, we will demonstrate how to produce a t-SNE plot using ngc-learn's in-built tool. ## Generating a t-SNE Plot -Let's say you have a labeled five-dimensional (5D) dataset -- which we will -synthesize artificially in this lesson from an "unobserved" trio of multivariate -Gaussians -- and wanted to visualize these "model outputs" and their -corresponding labels in 2D via ngc-learn's in-built t-SNE. +Let's say you have a labeled five-dimensional (5D) dataset -- which we will artificially synthesize in this lesson from an "unobserved" trio of multivariate Gaussians -- and that you wanted to visualize these "model outputs" and their corresponding labels in 2D via ngc-learn's in-built t-SNE. -The following bit of Python code will do this for you (including the artificial -data generator): +The following bit of Python code will do this for you (including setting up the data generator): ```python from jax import numpy as jnp, random @@ -26,7 +14,7 @@ from ngclearn.utils.viz.dim_reduce import extract_tsne_latents, plot_latents dkey = random.PRNGKey(1234) -def gen_data(dkey, N): ## artificial data generator (or proxy model) +def gen_data(dkey, N): ## data generator (or proxy stochastic data generating process) mu1 = jnp.asarray([[2.1, 3.2, 0.6, -4., -2.]]) cov1 = jnp.eye(5) * 0.78 mu2 = jnp.asarray([[-1.8, 0.2, -0.1, 1.99, 1.56]]) @@ -59,6 +47,4 @@ which should produce a plot, i.e., `codes.jpg`, similar to the one below: -In this example scenario, we see that we can successfully map the 5D model output -data to a plottable 2D space, facilitating some level of downstream qualitative -interpretation of the model. +In this example scenario, we see that we can successfully map the 5D model output data to a plottable 2D space, facilitating some level of downstream qualitative interpretation of the model. diff --git a/docs/tutorials/neurocog/rate_cell.md b/docs/tutorials/neurocog/rate_cell.md index 56afb789..f6554116 100644 --- a/docs/tutorials/neurocog/rate_cell.md +++ b/docs/tutorials/neurocog/rate_cell.md @@ -1,7 +1,6 @@ # Lecture 3A: The Rate Cell Model -Graded neurons are one of the main classes/collections of cell components in ngc-learn. These specifically offer cell models that operate under real-valued dynamics -- in other words, they do not spike or use discrete pulse-like values in their operation. These are useful for building biophysical systems that evolve under continuous, time-varying dynamics, e.g., continuous-time recurrent neural networks, various kinds of predictive coding circuit models, as well as for continuous components in discrete systems, e.g. electrical -current differential equations in spiking networks. +Graded neurons are one of the main classes/collections of cell components in ngc-learn. These specifically offer cell models that operate under real-valued dynamics -- in other words, they do not spike or use discrete pulse-like values in their operation. These are useful for building biophysical systems that evolve under continuous, time-varying dynamics, e.g., continuous-time recurrent neural networks, various kinds of predictive coding circuit models, as well as for continuous components in discrete systems, e.g. electrical current differential equations in spiking networks. In this tutorial, we will study one of ngc-learn's workhorse in-built graded cell components, the rate cell ([RateCell](ngclearn.components.neurons.graded.rateCell)). @@ -9,15 +8,12 @@ In this tutorial, we will study one of ngc-learn's workhorse in-built graded cel ### Instantiating the Rate Cell -Let's go ahead and set up the controller for this lesson's simulation, -where we will a dynamical system with only a single component, -specifically the rate-cell (RateCell). Let's start with the file's header -(or import statements): +Let's go ahead and set up the controller for this lesson's simulation, where we will a dynamical system with only a single component, specifically the rate-cell (RateCell). Let's start with the file's header (or import statements): ```python from jax import numpy as jnp, random, jit -from ngclearn.utils import JaxProcess -from ngcsimlib.context import Context + +from ngclearn import Context, MethodProcess ## import model-specific elements from ngclearn.components.neurons.graded.rateCell import RateCell ``` @@ -36,91 +32,67 @@ gamma = 1. with Context("Model") as model: ## model/simulation definition ## instantiate components (like cells) - cell = RateCell("z0", n_units=1, tau_m=tau_m, act_fx=act_fx, - prior=("gaussian", gamma), integration_type="euler", key=subkeys[0]) + cell = RateCell( + "z0", n_units=1, tau_m=tau_m, act_fx=act_fx, prior=("gaussian", gamma), integration_type="euler", + key=subkeys[0] + ) ## instantiate desired core commands that drive the simulation - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - ## instantiate some non-jitted dynamic utility commands - @Context.dynamicCommand - def clamp(x): - cell.j.set(x) +## instantiate utility commands +def clamp(x): + cell.j.set(x) ``` -A notable argument to the rate-cell, beyond some of its differential equation -constants (`tau_m` and `gamma`), is its activation function choice (default is -the `identity`), which we have chosen to be a discrete pulse emitting function -known as the `unit_threshold` (which outputs a value of one for any input that -exceeds the threshold of one and zero for anything else). +A notable argument to the rate-cell, beyond some of its differential equation constants (`tau_m` and `gamma`), is its activation function choice (default is the `identity`), which we have chosen to be a discrete pulse emitting function known as the `unit_threshold` (which outputs a value of one for any input that exceeds the threshold of one and zero for anything else). -Mathematically, under the hood, a rate-cell evolves according to the -ordinary differential equation (ODE): +Mathematically, under the hood, a rate-cell evolves according to the ordinary differential equation (ODE): $$ \tau_m \frac{\partial \mathbf{z}}{\partial t} = -\gamma \text{prior}\big(\mathbf{z}\big) + (\mathbf{x} + \mathbf{x}_{td}) $$ -where $\mathbf{x}$ is external input signal and $\mathbf{x}_{td}$ (default -value is zero) is an optional additional input pressure signal (`td` stands for "top-down", -its name motivated by predictive coding literature). -A good way to understand this equation is in the context of two examples: -1. in a biophysically more realistic spiking network, $\mathbf{x}$ is the -total electrical input into the cell from multiple injections produced -by transmission across synapses ($\mathbf{x}_{td} = 0$)) and the $\text{prior}$ -is set to `gaussian` ($\gamma = 1$), yielding the equation -$\tau_m \frac{\partial \mathbf{z}}{\partial t} = -\mathbf{z} + \mathbf{x}$ for -a simple model of synaptic conductance, and -2. in a predictive coding circuit, $\mathbf{x}$ is the sum of input projections -(or messages) passed from a "lower" layer/group of neurons while $\mathbf{x}_{td}$ -is set to be the sum of (top-down) pressures produced by an "upper" layer/group -such as the value of a pair of nearby error neurons multiplied by $-1$.[^1] In -this example, $0 \leq \gamma \leq 1$ and $\text{prior}$ could be set to one -of any kind of kurtotic distribution to induce a soft form of sparsity in -the dynamics, e.g., such as "cauchy" for the Cauchy distribution. +where $\mathbf{x}$ is external input signal and $\mathbf{x}_{td}$ (default value is zero) is an optional additional input pressure signal (`td` stands for "top-down", its name motivated by predictive coding literature). +A good way to understand this equation is in the context of two examples: +1. in a biophysically more realistic spiking network, $\mathbf{x}$ is the total electrical input into the cell from multiple injections produced by transmission across synapses ($\mathbf{x}_{td} = 0$)) and the $\text{prior}$ is set to `gaussian` ($\gamma = 1$), yielding the equation $\tau_m \frac{\partial \mathbf{z}}{\partial t} = -\mathbf{z} + \mathbf{x}$ for a simple model of synaptic conductance, and +2. in a predictive coding circuit, $\mathbf{x}$ is the sum of input projections (or messages) passed from a "lower" layer/group of neurons while $\mathbf{x}_{td}$ is set to be the sum of (top-down) pressures produced by an "upper" layer/group such as the value of a pair of nearby error neurons multiplied by $-1$.[^1] In this example, $0 \leq \gamma \leq 1$ and $\text{prior}$ could be set to one of any kind of kurtotic distribution to induce a soft form of sparsity in the dynamics, e.g., such as "cauchy" for the Cauchy distribution. ### Simulating a Rate Cell -Given our single rate-cell dynamical system above, let us write some code to use -our `Rate` node and visualize its dynamics by feeding -into it a pulse current (a piecewise input function that is an alternating -sequence of intervals of where nothing is input and others where a non-zero -value is input) for a small period of time (`dt * T = 1 * 210` ms). Specifically, -we can plot the input current, the neuron's linear rate activity `z` and its -nonlinear activity `phi(z)` as follows: +Given our single rate-cell dynamical system above, let us write some code to use our `Rate` node and visualize its dynamics by feeding into it a pulse current (a piecewise input function that is an alternating sequence of intervals of where nothing is input and others where a non-zero value is input) for a small period of time (`dt * T = 1 * 210` ms). Specifically, we can plot the input current, the neuron's linear rate activity `z` and its nonlinear activity `phi(z)` as follows: ```python # create a synthetic electrical pulse current -current = jnp.concatenate((jnp.zeros((1,10)), - jnp.ones((1,50)) * 1.006, - jnp.zeros((1,50)), - jnp.ones((1,50)) * 1.006, - jnp.zeros((1,50))), axis=1) +current = jnp.concatenate( + (jnp.zeros((1,10)), + jnp.ones((1,50)) * 1.006, + jnp.zeros((1,50)), + jnp.ones((1,50)) * 1.006, + jnp.zeros((1,50))), axis=1 +) lin_out = [] nonlin_out = [] t_values = [] -model.reset() +reset_process.run() t = 0. for ts in range(current.shape[1]): j_t = jnp.expand_dims(current[0,ts], axis=0) ## get data at time ts - model.clamp(j_t) - model.advance(t=ts*1., dt=dt) + clamp(j_t) + advance_process.run(t=ts*1., dt=dt) t_values.append(t) - t += dt + t += dt ## advance time forward by dt milliseconds ## naively extract simple statistics at time ts and print them to I/O - linear_z = cell.z.value - nonlinear_z = cell.zF.value + linear_z = cell.z.get() + nonlinear_z = cell.zF.get() lin_out.append(linear_z) nonlin_out.append(nonlinear_z) print("\r {}: s {} ; v {}".format(ts, linear_z, nonlinear_z), end="") @@ -148,10 +120,11 @@ ax.grid() fig.savefig("rate_cell_integration.jpg") ``` -which should yield a dynamics plot similar to the one below: +which should yield a dynamics plot similar to the one below: + [^1]: [Error neurons](ngclearn.components.neurons.graded.gaussianErrorCell) produce this kind of "top-down" value, which is technically the first derivative diff --git a/docs/tutorials/neurocog/short_term_plasticity.md b/docs/tutorials/neurocog/short_term_plasticity.md index b225f3c5..c669c5bb 100755 --- a/docs/tutorials/neurocog/short_term_plasticity.md +++ b/docs/tutorials/neurocog/short_term_plasticity.md @@ -1,69 +1,28 @@ # Lecture 4E: Short-Term Plasticity -In this lesson, we will study how short-term plasticity (STP) [1] dynamics --- where synaptic efficacy is cast in terms of the history of presynaptic activity -- -using ngc-learn's in-built `STPDenseSynapse`. -Specifically, we will study how a dynamic synapse may be constructed and -examine what short-term depression (STD) and short-term facilitation -(STF) dominated configurations of an STP synapse look like. +In this lesson, we will study how short-term plasticity (STP) [1] dynamics -- where synaptic efficacy is cast in terms of the history of presynaptic activity -- using ngc-learn's in-built `STPDenseSynapse`. Specifically, we will study how a dynamic synapse may be constructed and examine what short-term depression (STD) and short-term facilitation (STF) dominated configurations of an STP synapse look like. ## Probing Short-Term Plasticity -Go ahead and make a new folder for this study and create a Python script, -i.e., `run_shortterm_plasticity.py`, to write your code for this part of the -tutorial. +Go ahead and make a new folder for this study and create a Python script, i.e., `run_shortterm_plasticity.py`, to write your code for this part of the tutorial. -We will write a 3-component dynamical system that connects a Poisson input -encoding cell to a leaky integrate-and-fire (LIF) cell via a single dynamic -synapse that evolves according to STP. We will first write our -simulation of this dynamic synapse from the perspective of STF-dominated -dynamics, plotting out the results under two different Poisson spike trains -with different spiking frequencies. Then, we will modify our simulation -to emulate dynamics from an STD-dominated perspective. +We will write a 3-component dynamical system that connects a Poisson input encoding cell to a leaky integrate-and-fire (LIF) cell via a single dynamic synapse that evolves according to STP. We will first write our simulation of this dynamic synapse from the perspective of STF-dominated dynamics, plotting out the results under two different Poisson spike trains with different spiking frequencies. Then, we will modify our simulation to emulate dynamics from an STD-dominated perspective. ### Starting with Facilitation-Dominated Dynamics -One experimental goal with using a "dynamic synapse" [1] is often to computationally -model the fact that synaptic efficacy (strength/conductance magnitude) is -not a fixed quantity -- even in cases where long-term adaptation/learning is -absent -- and instead a time-varying property that depends on a fixed -quantity of biophysical resources. Specifically, biological neuronal networks, -synaptic signaling (or communication of information across synaptic connection -pathways) consumes some quantity of neurotransmitters -- STF results from an -influx of calcium into an axon terminal of a pre-synaptic neuron (after -emission of a spike pulse) whereas STD occurs after a depletion of -neurotransmitters that is consumed by the act of synaptic signaling at the axon -terminal of a pre-synaptic neuron. Studies of cortical neuronal regions have -empirically found that some areas are STD-dominated, STF-dominated, or exhibit -some mixture of the two. - -Ultimately, the above means that, in the context of spiking cells, when a -pre-synaptic neuron emits a pulse, this act will affect the relative magnitude -of the synapse's efficacy. In some cases, this will result in an increase -(facilitation) and, in others, this will result in a decrease (depression) -that lasts over a short period of time (several hundreds to thousands of -milliseconds in many instances). -As a result of considering synapses to have a dynamic nature to them, both over -short and long time-scales, plasticity can now be thought of as a stimulus and -resource-dependent quantity, reflecting an important biophysical aspect that -affects how neuronal systems adapt and generalize given different kinds of -sensory stimuli. - -Writing our STP dynamic synapse can be done by importing -[STPDenseSynapse](ngclearn.components.synapses.STPDenseSynapse) -from ngc-learn's in-built components and using it to wire the output -spike compartment of the `PoissonCell` to the input electrical current -compartment of the `LIFCell`. This can be done as follows (using the -meta-parameters we provide in the code block below to ensure -STF-dominated dynamics): +One experimental goal with using a "dynamic synapse" [1] is often to computationally model the fact that synaptic efficacy (strength/conductance magnitude) is not a fixed quantity -- even in cases where long-term adaptation/learning is absent -- and instead a time-varying property that depends on a fixed quantity of biophysical resources. Specifically, biological neuronal networks, synaptic signaling (or communication of information across synaptic connection pathways) consumes some quantity of neurotransmitters -- STF results from an influx of calcium into an axon terminal of a pre-synaptic neuron (after emission of a spike pulse) whereas STD occurs after a depletion of neurotransmitters that is consumed by the act of synaptic signaling at the axon terminal of a pre-synaptic neuron. Studies of cortical neuronal regions have empirically found that some areas are STD-dominated, STF-dominated, or exhibit some mixture of the two. + +Ultimately, the above means that, in the context of spiking cells, when a pre-synaptic neuron emits a pulse, this act will affect the relative magnitude of the synapse's efficacy. In some cases, this will result in an increase (facilitation) and, in others, this will result in a decrease (depression) that lasts over a short period of time (several hundreds to thousands of milliseconds in many instances). As a result of considering synapses to have a dynamic nature to them, both over short and long time-scales, plasticity can now be thought of as a stimulus and resource-dependent quantity, reflecting an important biophysical aspect that affects how neuronal systems adapt and generalize given different kinds of sensory stimuli. + +Writing our STP dynamic synapse can be done by importing [STPDenseSynapse](ngclearn.components.synapses.STPDenseSynapse) from ngc-learn's in-built components and using it to wire the output spike compartment of the `PoissonCell` to the input electrical current compartment of the `LIFCell`. This can be done as follows (using the meta-parameters we provide in the code block below to ensure STF-dominated dynamics): ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess + +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components import PoissonCell, STPDenseSynapse, LIFCell -import ngclearn.utils.weight_distribution as dist +from ngclearn.utils.distribution_generator import DistributionGenerator ## create seeding keys (JAX-style) dkey = random.PRNGKey(231) @@ -88,49 +47,40 @@ plot_fname = "{}Hz_stp_{}.jpg".format(firing_rate_e, tag) with Context("Model") as model: W = STPDenseSynapse( - "W", shape=(1, 1), weight_init=dist.constant(value=2.5), - resources_init=dist.constant(value=Rval), tau_f=tau_f, tau_d=tau_d, - key=subkeys[0] + "W", shape=(1, 1), weight_init=DistributionGenerator.constant(value=2.5), + resources_init=DistributionGenerator.constant(value=Rval), tau_f=tau_f, tau_d=tau_d, key=subkeys[0] ) z0 = PoissonCell("z0", n_units=1, target_freq=firing_rate_e, key=subkeys[0]) z1 = LIFCell( - "z1", n_units=1, tau_m=tau_m, resist_m=(tau_m / dt) * R_m, v_rest=-60., - v_reset=-70., thr=-50., tau_theta=0., theta_plus=0., refract_time=0. + "z1", n_units=1, tau_m=tau_m, resist_m=(tau_m / dt) * R_m, v_rest=-60., v_reset=-70., thr=-50., tau_theta=0., + theta_plus=0., refract_time=0. ) - W.inputs << z0.outputs ## z0 -> W - z1.j << W.outputs ## W -> z1 + z0.outputs >> W.inputs ## z0 -> W + W.outputs >> z1.j ## W -> z1 - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> z0.advance_state >> W.advance_state >> z1.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> z0.reset >> z1.reset >> W.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - @Context.dynamicCommand - def clamp(obs): - z0.inputs.set(obs) +## set up some utility functions for the model context +def clamp(obs): + z0.inputs.set(obs) ``` -Notice that the `STPDenseSynapse` has two important time constants to configure; -`tau_f` ($\tau_f$), the facilitation time constant, and `tau_d` ($\tau_d$), the -depression time constant. In effect, it is these two constants that you will -want to set to obtain different desired behavior from this in-built dynamic -synapse: +Notice that the `STPDenseSynapse` has two important time constants to configure; `tau_f` ($\tau_f$), the facilitation time constant, and `tau_d` ($\tau_d$), the depression time constant. In effect, it is these two constants that you will want to set to obtain different desired behavior from this in-built dynamic synapse: 1. setting $\tau_f > \tau_d$ will result in STF-dominated behavior; whereas 2. setting $\tau_f < \tau_d$ will produce STD-dominated behavior. -Note that setting $\tau_d = 0$ will result in short-term depression being turned off -completely (and $\tau_f = 0$ disables STF). +Note that setting $\tau_d = 0$ will result in short-term depression being turned off completely (and $\tau_f = 0$ disables STF). -Formally, given the time constants above the dynamics of the `STPDenseSynapse` -operate according to the following coupled ordinary differential equations (ODEs): +Formally, given the time constants above the dynamics of the `STPDenseSynapse` operate according to the following coupled ordinary differential equations (ODEs): $$ \tau_f \frac{\partial u_j(t)}{\partial t} &= -u_j(t) + N_R \big(1 - u_j(t)\big) s_j(t) \\ @@ -144,25 +94,11 @@ W^{dyn}_{ij}(t + \Delta t) = \Big( W^{max}_{ij} u_j(t + \Delta t) x_j(t) s_j(t) + W^{dyn}_{ij} (1 - s_j(t)) $$ -where $N_R$ represents an increment produced by a pre-synaptic spike $\mathbf{s}_j(t)$ -(and in essence, the neurotransmitter resources available to yield facilitation), -$W^{max}_{ij}$ denotes the absolute synaptic efficacy (or maximum response -amplitude of this synapse in the case of a complete release of all -neurotransmitters; $x_j(t) = u_j(t) = 1$) of the connection between pre-synaptic -neuron $j$ and post-synaptic neuron $i$, and $W^{dyn}_{ij}(t)$ is the value -of the dynamic synapse's efficacy at time `t`. -$\mathbf{x}_j$ is a variable (which lies in the range of $[0,1]$) that indicates -the fraction of (neurotransmitter) resources available after a depletion of the -neurotransmitter resource pool. $\mathbf{u}_j$, on the hand, -represents the neurotransmitter "release probability", or the fraction of available -resources ready for the dynamic synapse's use. +where $N_R$ represents an increment produced by a pre-synaptic spike $\mathbf{s}_j(t)$ (and in essence, the neurotransmitter resources available to yield facilitation), $W^{max}_{ij}$ denotes the absolute synaptic efficacy (or maximum response amplitude of this synapse in the case of a complete release of all neurotransmitters; $x_j(t) = u_j(t) = 1$) of the connection between pre-synaptic neuron $j$ and post-synaptic neuron $i$, and $W^{dyn}_{ij}(t)$ is the value of the dynamic synapse's efficacy at time `t`. $\mathbf{x}_j$ is a variable (which lies in the range of $[0,1]$) that indicates the fraction of (neurotransmitter) resources available after a depletion of the neurotransmitter resource pool. $\mathbf{u}_j$, on the hand, represents the neurotransmitter "release probability", or the fraction of available resources ready for the dynamic synapse's use. ### Simulating and Visualizing STF -Now that we understand the basics of how an ngc-learn STP synapse works, we can next -try it out on a simple pre-synaptic Poisson spike train. Writing out the -simulated input Poisson spike train and our STP model's processing of this -data can be done as follows: +Now that we understand the basics of how an ngc-learn STP synapse works, we can next try it out on a simple pre-synaptic Poisson spike train. Writing out the simulated input Poisson spike train and our STP model's processing of this data can be done as follows: ```python t_vals = [] @@ -170,26 +106,27 @@ u_vals = [] x_vals = [] W_vals = [] num_z1_spikes = 0. -model.reset() +reset_process.run() obs = jnp.asarray([[1.]]) ts = 1. ptr = 0 # spike time pointer for i in range(T_max): - model.clamp(obs) - model.advance(t=dt * ts, dt=dt) - u = jnp.squeeze(W.u.value) - x = jnp.squeeze(W.x.value) - Wexc = jnp.squeeze(W.Wdyn.value) - s0 = jnp.squeeze(W.inputs.value) - s1 = jnp.squeeze(z1.s.value) + clamp(obs) + advance_process.run(t=dt * ts, dt=dt) + u = jnp.squeeze(W.u.get()) + x = jnp.squeeze(W.x.get()) + Wexc = jnp.squeeze(W.Wdyn.get()) + s0 = jnp.squeeze(W.inputs.get()) + s1 = jnp.squeeze(z1.s.get()) num_z1_spikes = s1 + num_z1_spikes u_vals.append(u) x_vals.append(x) W_vals.append(Wexc) t_vals.append(ts) - print("{}| u: {} x: {} W: {} pre: {} post {}".format(ts, u, x, Wexc, s0, s1)) + print("\r{}| u: {} x: {} W: {} pre: {} post {}".format(ts, u, x, Wexc, s0, s1), end="") ts += dt ptr += 1 +print() print("Number of z1 spikes = ",num_z1_spikes) u_vals = jnp.squeeze(jnp.asarray(u_vals)) @@ -197,8 +134,7 @@ x_vals = jnp.squeeze(jnp.asarray(x_vals)) t_vals = jnp.squeeze(jnp.asarray(t_vals)) ``` -We may then plot out the result of the STF-dominated dynamics we -simulate above with the following code: +We may then plot out the result of the STF-dominated dynamics we simulate above with the following code: ```python import matplotlib.pyplot as plt @@ -235,13 +171,13 @@ ax2.grid() fig1.savefig(plot_fname) ``` -Under the `2` Hertz Poisson spike train set up above, the plotting -code should produce (and save to disk) the following: +Under the `2` Hertz Poisson spike train set up above, the plotting code should produce (and save to disk) the following: -Note that, if you change the frequency of the input Poisson spike train to `20` -Hertz instead, like so: +where we also observe that about `3` spikes/pulses were emitted by the post-synaptic neuron over the course of this +simulation. +Note that, if you change the frequency of the input Poisson spike train to `20` Hertz instead, like so: ```python firing_rate_e = 20 ## Hz (of Poisson input train) @@ -251,16 +187,13 @@ and re-run your simulation script, you should obtain the following: -Notice that increasing the frequency in which the pre-synaptic spikes occur -results in more volatile dynamics with respect to the effective synaptic -efficacy over time. +where we further observe that about `68` spikes/pulses were emitted by the post-synaptic neuron over the course of this +simulation. +In general, notice that increasing the frequency in which the pre-synaptic spikes occur results in more volatile dynamics with respect to the effective synaptic efficacy over time. ### Depression-Dominated Dynamics -With your code above, it's simple to reconfigure the model to emulate -the opposite of STF dominated dynamics, i.e., short-term depression (STD) -dominated dynamics. -Modify your meta-parameter values like so: +With the code you have written code above, it's simple to reconfigure the model to emulate the opposite of STF dominated dynamics, i.e., short-term depression (STD) dominated dynamics. To do so, you will need to modify your meta-parameter values like so: ```python firing_rate_e = 2 ## Hz (of Poisson input train) @@ -274,17 +207,13 @@ and re-run your script to obtain an output akin to the following: -Now, modify your meta-parameters one last time to use a higher-frequency -input spike train, i.e., `firing_rate_e = 20 ## Hz`, to obtain a plot similar -to the one below: +which, after running the script, will print out that the post-synaptic neuron spiked about `3` times. Now, modify your meta-parameters one last time to use a higher-frequency input spike train, i.e., `firing_rate_e = 20 ## Hz`, to obtain a plot similar to the one below: -You have now successfully simulated a dynamic synapse in ngc-learn across -several different Poisson input train frequencies under both STF and -STD-dominated regimes. In more complex biophysical models, it could prove useful -to consider combining STP with other forms of long-term experience-dependent -forms of synaptic adaptation, such as spike-timing-dependent plasticity. +where the script will further print out that the post-synaptic neuron spiked only a single time. + +You have now successfully simulated a dynamic synapse in ngc-learn across several different Poisson input train frequencies under both STF- and STD-dominated regimes. In more complex biophysical models, it could prove useful to consider combining STP with other forms of long-term experience-dependent forms of synaptic adaptation, such as [spike-timing-dependent plasticity](stdp.md). ## References diff --git a/docs/tutorials/neurocog/simple_leaky_integrator.md b/docs/tutorials/neurocog/simple_leaky_integrator.md index ec8d485e..1aa6643e 100644 --- a/docs/tutorials/neurocog/simple_leaky_integrator.md +++ b/docs/tutorials/neurocog/simple_leaky_integrator.md @@ -1,24 +1,18 @@ # Lecture 2A: The Simplified Leaky Integrator Cell -In this tutorial, we will study one of ngc-learn's (simplest) in-built leaky -integrator components, the simplified leaky integrate-and-fire (SLIF). +In this tutorial, we will study one of ngc-learn's (simplest) in-built neuronal cell components, the simplified leaky integrate-and-fire (SLIF). ## Creating and Using a Leaky Integrator ### Instantiating the Leaky Integrate-and-Fire Cell -With our JSON configuration in place, go ahead and create a Python script, -i.e., `run_slif.py`, to write your code for this part of the tutorial. - -Now let's go ahead and set up the controller/context for this lesson's simulation, -where we will a dynamical system with only a single component, -specifically the simplified LIF (sLIF), like so: +Start by creating a Python script, i.e., `run_slif.py`, to write your code for this part of the tutorial. +Now let's go ahead and set up the controller/model-context for this lesson's simulation, where we will a dynamical system with only a single component, specifically the simplified LIF (sLIF). Write code to do this like so: ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.neurons.spiking.sLIFCell import SLIFCell from ngclearn.utils.viz.spike_plot import plot_spiking_neuron @@ -36,57 +30,28 @@ tau_m = R_m * C ## membrane time constant ## create simple system with only one sLIF with Context("Model") as model: - cell = SLIFCell("z0", n_units=1, tau_m=tau_m, resist_m=R_m, thr=V_thr, - refract_time=ref_T, key=subkeys[0]) + cell = SLIFCell("z0", n_units=1, tau_m=tau_m, resist_m=R_m, thr=V_thr, refract_time=ref_T, key=subkeys[0]) ## set up core commands that drive the simulation - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> cell.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> cell.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - cell.j.set(x) +## set up non-compiled utility commands +def clamp(x): + cell.j.set(x) ``` -This node has quite a few compartments and constants but only a handful are important -for understanding how this model governs spiking/firing rates within its simulation window. -Specifically, in this lesson, we will focus on -its electrical current `j` (formally labeled here as $\mathbf{j}_t$), -its voltage `v` (formally labeled: $\mathbf{v}_t$), its spike emission -(or action potential) `s` (formally $\mathbf{s}_t$), and its refractory -variable/marker (formally $\mathbf{r}_t$). The subscript $t$ indicates -that this compartment variable takes on a certain value at a certain time step -$t$ and we will refer to the ngc-learn context's integration time constant, -the amount of time we move forward by, as $\Delta t$. The constants or -hyper-parameters we will be most interested in are the cell's membrane resistance -`R_m` (formally $R$ with its capacitance $C$ implied), its membrane time -constant `tau_m` (formally $\tau_m$), its refractory period time -`refract_T` (formally $T_{ref}$), and its voltage threshold `v_thr` -(formally $V_thr$). (There are other constants inherent to the -sLIF, but these are sufficient for this exercise.) - -Later on, towards the end of this tutorial, we provide some theoretical -exposition and explanation of the above constants/compartments -(see `On the Dynamics of Leaky Integrators`); for practical -purposes we will now move on to using your `sLIF` node in a simple simulation -to illustrate some of its dynamics. +This node has quite a few compartments and constants but only a handful are important for understanding how this model governs spiking/firing rates during a controller's simulation window. Specifically, in this lesson, we will focus on its electrical current `j` (formally labeled here as $\mathbf{j}_t$), its voltage `v` (formally labeled: $\mathbf{v}_t$), its spike emission (or action potential) `s` (formally $\mathbf{s}_t$), and its refractory variable/marker (formally $\mathbf{r}_t$). The subscript $t$ indicates that this compartment variable takes on a certain value at a certain time step $t$ and we will refer to the ngc-learn controller's integration time constant, the amount of time we move forward by, as $\Delta t$. The constants or hyper-parameters we will be most interested in are the cell's membrane resistance `R_m` (formally $R$ with its capacitance $C$ implied), its membrane time constant `tau_m` (formally $\tau_m$), its refractory period time `refract_T` (formally $T_{ref}$), and its voltage threshold `v_thr` (formally $V_thr$). (There are other constants inherent to the sLIF, but these are sufficient for this exercise.) + +Later on, towards the end of this tutorial, we provide some theoretical exposition and explanation of the above constants/compartments +(see `On the Dynamics of Leaky Integrators`); for practical purposes, we will now move on to using your `sLIF` node in a simple simulation to illustrate some of its dynamics. ### Simulating a Leaky Integrator - -Given our single-cell dynamical system above, let us write some code to use -our `sLIF` node and visualize its spiking pattern by feeding -into it a step current, where the electrical current `j` starts at $0$ then -switches to $0.3$ at $t = 10$ (ms). Specifically, we can plot the input current, -the neuron's voltage `v`, and its output spikes as follows: +Given our single-cell dynamical system above, let us write some code to use our `sLIF` node and visualize its spiking pattern by feeding into it a step current, where the electrical current `j` starts at $0$ then switches to $0.3$ at $t = 10$ (ms). Specifically, we can plot the input current, the neuron's voltage `v`, and its output spikes as follows: ```python # create a synthetic electrical step current @@ -96,81 +61,65 @@ curr_in = [] mem_rec = [] spk_rec = [] -model.reset() +reset_process.run() for ts in range(current.shape[1]): j_t = jnp.expand_dims(current[0,ts], axis=0) ## get data at time ts - model.clamp(j_t) - model.advance(t=ts*1., dt=dt) + clamp(j_t) + advance_process.run(t=ts*1., dt=dt) ## naively extract simple statistics at time ts and print them to I/O - v = cell.v.value - s = cell.s.value + v = cell.v.get() + s = cell.s.get() curr_in.append(j_t) mem_rec.append(v) spk_rec.append(s) - print(" {}: s {} ; v {}".format(ts, s, v), end="") + print(f"\r{ts}: s {s} ; v {v}", end="") print() import numpy as np curr_in = np.squeeze(np.asarray(curr_in)) mem_rec = np.squeeze(np.asarray(mem_rec)) spk_rec = np.squeeze(np.asarray(spk_rec)) -plot_spiking_neuron(curr_in, mem_rec, spk_rec, None, dt, thr_line=V_thr, min_mem_val=0., - max_mem_val=1.3, title="SLIF-Node: Constant Electrical Input", - fname="lif_plot.jpg") +plot_spiking_neuron( + curr_in, mem_rec, spk_rec, None, dt, thr_line=V_thr, min_mem_val=0., max_mem_val=1.3, + title="SLIF-Node: Constant Electrical Input", fname="lif_plot.jpg" +) ``` -which produces the following plot (saved as `lif_plot.jpg` locally to disk): +which produces the following plot (saved as `lif_plot.jpg` locally to disk): -where we see that, given a build-up over time in the neuron's membrane potential -(since the current is constant and non-zero after $10$ ms), a spike is emitted -once the value of the membrane potential exceeds the threshold (indicated by -the dashed horizontal line in the middle plot) $V_{thr} = 1$. -Notice that if we play with the value of `ref_T` (the refactory period $T_{ref}$) -and change it to something like `ref_T = 10 * dt` (ten times the integration time -constant), we get the following neuronal dynamics plot: +where we see that, given a build-up over time in the neuron's membrane potential (since the current is constant and non-zero after $10$ ms), a spike is emitted once the value of the membrane potential exceeds the threshold (indicated by the dashed horizontal line in the middle plot) $V_{thr} = 1$. Notice that if we play with the value of `ref_T` (the refactory period $T_{ref}$) and change it to something like `ref_T = 10 * dt` (ten times the integration time constant), we get the following neuronal dynamics plot: -where we see that after the LIF neuron fires, it remains stuck at its resting -potential for a period of $0.01$ ms (the short flat periods in the red curve -starting after the first spike). +where we see that after the LIF neuron fires, it remains stuck at its resting potential for a period of $0.01$ ms (the short flat periods in the red curve starting after the first spike). ## On the Dynamics of Leaky Integrators -Now let us unpack this component by first defining the relevant compartments: +Now let us unpack this component by first defining the relevant compartments: -+ $\mathbf{j}_t$: the current electrical current of the neurons within this node - (note that this current could be the summation of multiple step/pointwise - current sources or be the current sample of an electrical current, itself - modeled by a differential equation); ++ $\mathbf{j}_t$: the current electrical current of the neurons within this node (note that this current could be the summation of multiple step/pointwise current sources or be the current sample of an electrical current, itself modeled by a differential equation); + $\mathbf{v}_t$: the current membrane potential of the neurons within this node; -+ $\mathbf{s}_t$: the current recording/reading of any spikes produced by this - node's neurons; -+ $\mathbf{r}_t$: the current value of the absolute refractory variables - this - accumulates with time (and forces neurons to rest) ++ $\mathbf{s}_t$: the current recording/reading of any spikes produced by this node's neurons; ++ $\mathbf{r}_t$: the current value of the absolute refractory variables - this accumulates with time (and forces neurons to rest) and finally the constants: -+ $V_{thr}$: threshold that a neuron's membrane potential must overcome before - a spike is transmitted; ++ $V_{thr}$: threshold that a neuron's membrane potential must overcome before a spike is transmitted; + $\Delta t$: the integration time constant, on the order of milliseconds (ms); + $R$: the neural (cell) membrane resistance, on the order of mega Ohms ($M \Omega$); + $C$: the neural (cell) membrane capacitance, on the order of picofarads ($pF$); -+ $\tau_{m}$: membrane potential time constant (also $\tau_{m} = R * C$ - - resistance times capacitance); ++ $\tau_{m}$: membrane potential time constant (also $\tau_{m} = R * C$, or resistance times capacitance); + $T_{ref}$: the length of a neuron's absolute refractory period. -With above defined, we can now explicitly lay out the underlying (linear) ordinary -differential equation that the `sLIF` evolves according to: +With above defined, we can now explicitly lay out the underlying (linear) ordinary differential equation that the `sLIF` evolves according to: $$ \tau_m \frac{\partial \mathbf{v}_t}{\partial t} = (-\mathbf{v}_t + R \mathbf{j}_t), \; \mbox{where, } \tau_m = R C $$ -and with some simple mathematical manipulations (leveraging the method of finite differences), -we can derive the Euler integrator employed by the `sLIF` as follows: +and with some simple mathematical manipulations (leveraging the method of finite differences), we can derive the Euler integrator employed by the `sLIF` as follows: $$ \tau_m \frac{\partial \mathbf{v}_t}{\partial t} &= (-\mathbf{v}_t + R \mathbf{j}_t) \\ @@ -178,32 +127,24 @@ $$ \mathbf{v}_{t + \Delta t} &= \mathbf{v}_t + (-\mathbf{v}_t + R \mathbf{j}_t) \frac{\Delta t}{\tau_m } $$ -where we see that above integration tells us that the membrane potential of this node varies -over time as a function of the sum of its input electrical current $\mathbf{j}_t$ -(multiplied by the cell membrane resistance) and a leak (or decay) $-\mathbf{v}_t$ -modulated by the integration time constant divided by the membrane time constant. -The `sLIF` allows you to control the value of $\tau_m$ directly (hence why we -calculated $\tau_m$ externally via our chosen $R$ and $C$; other neuronal cells -allow you to change $\tau_m$ via $R$ and $C$). - - - +in this walkthrough.) +--> -In effect, given the above, every time the `sLIF`'s `.advanceState()` function is -called within a simulation controller context (`Context()`), the above Euler integration of -the membrane potential differential equation is happening each time step. Knowing this, -the last item required to understand ngc-learn's `sLIF` node's computation is -related to its spike $\mathbf{s}_t$. The spike reading is computed simply by -comparing the current membrane potential $\mathbf{v}_t$ to the constant threshold -defined by $V_{thr}$ according to the following piecewise function: +In effect, given the above, every time the `sLIF`'s `.advanceState()` function is called within a simulation controller (`Controller()`), the above Euler integration of the membrane potential differential equation is happening each time step. Knowing this, the last item required to understand ngc-learn's `sLIF` node's computation is related to its spike $\mathbf{s}_t$. The spike reading is computed simply by comparing the current membrane potential $\mathbf{v}_t$ to the constant threshold defined by $V_{thr}$ according to the following piecewise function: $$ \mathbf{s}_{t, i} = \begin{cases} @@ -212,52 +153,8 @@ $$ \end{cases} $$ -where we see that if the $i$th neuron's membrane potential exceeds the threshold -$V_{thr}$, then a voltage spike is emitted. After a spike is emitted, the $i$th -neuron within the node needs to be reset to its resting potential and this is done -with the final compartment that we mentioned, i.e., the refractory -variable $\mathbf{r}_t$. -The refractory variable $\mathbf{r}_t$ is important for hyperpolarizing the -$i$th neuron back to its resting potential (establishing a critical reset mechanism --- otherwise, the neuron would fire out of control after overcoming its -threshold) and reducing the amount of spikes generated over time. This reduction -is one of the key factors behind the power efficiency of biological neuronal systems. -Another aspect of ngc-learn's refractory variable is the temporal length of the reset itself, -which is controlled by the $T_{ref}$ (`T_ref`) constant -- this yields what is known as the -absolute refractory period, or the interval of time at which a second action potential -absolutely cannot be initiated. If $T_{ref}$ is set to be greater than -zero, then the $i$th neuron that fires will be forced to remain at its resting -potential of zero for the duration of this refractory period. - -Note that the reason the `sLIF` contains simplified in its name is that its -internal dynamics and parameterization have been drastically simplified in -comparison to ngc-learn's more standard `LIF` component. Furthermore, the -`sLIF` operates assuming a resting membrane potential of `0` (milliVolts) whereas, -for more intricate leaky integrator models, the resting potential is often -negative, requiring a different and more careful setting of hyper-parameters -(such as the voltage threshold). Nevertheless, although `sLIF` is a simpler -model, it can be used as a rational first step for crafting very useful spiking -neural networks and offers other aspects of functionality not used in this tutorial, -such as adaptive threshold functionality and fast approximate lateral inhibition/recurrence. - -## Optional: Setting Up The Components with a JSON Configuration - -While you are not required to create a JSON configuration file for ngc-learn, -to get rid of the warning that ngc-learn will throw at the start of your -program's execution (indicating that you do not have a configuration set up yet), -all you need to do is create a sub-directory for your JSON configuration -inside of your project code's directory, i.e., `json_files/modules.json`. -Inside the JSON file, you would write the following: - -```json -[ - {"absolute_path": "ngclearn.components", - "attributes": [ - {"name": "SLIFCell"}] - }, - {"absolute_path": "ngcsimlib.operations", - "attributes": [ - {"name": "overwrite"}] - } -] -``` +where we see that if the $i$th neuron's membrane potential exceeds the threshold $V_{thr}$, then a voltage spike is emitted. After a spike is emitted, the $i$th neuron within the node needs to be reset to its resting potential and this is done with the final compartment that we mentioned, i.e., the refractory variable $\mathbf{r}_t$. +The refractory variable $\mathbf{r}_t$ is important for hyperpolarizing the $i$th neuron back to its resting potential (establishing a critical reset mechanism -- otherwise, the neuron would fire out of control after overcoming its threshold) and reducing the amount of spikes generated over time. This reduction is one of the key factors behind the power efficiency of biological neuronal systems. Another aspect of ngc-learn's refractory variable is the temporal length of the reset itself, which is controlled by the $T_{ref}$ (`T_ref`) constant -- this yields what is known as the absolute refractory period, or the interval of time at which a second action potential absolutely cannot be initiated. If $T_{ref}$ is set to be greater than zero, then the $i$th neuron that fires will be forced to remain at its resting potential of zero for the duration of this refractory period. + +Note that the reason the `sLIF` contains simplified in its name is that its internal dynamics and parameterization have been drastically simplified in comparison to ngc-learn's more standard `LIF` component. Furthermore, the `sLIF` operates assuming a resting membrane potential of `0` (milliVolts) whereas, for more intricate leaky integrator models, the resting potential is often negative, requiring a different and more careful setting of hyper-parameters (such as the voltage threshold). Nevertheless, although `sLIF` is a simpler model, it can be used as a rational first step for crafting very useful spiking neural networks and offers other aspects of functionality not used in this tutorial, such as adaptive threshold functionality and fast approximate lateral inhibition/recurrence. + diff --git a/docs/tutorials/neurocog/stdp.md b/docs/tutorials/neurocog/stdp.md index b8e889a0..ea65cc41 100755 --- a/docs/tutorials/neurocog/stdp.md +++ b/docs/tutorials/neurocog/stdp.md @@ -1,40 +1,23 @@ # Lecture 4C: Spike-Timing-Dependent Plasticity -In the context of spiking neuronal networks, one of the most important forms -of adaptation that is often simulated is that of spike-timing-dependent -plasticity (STDP). In this lesson, we will setup and use one -of ngc-learn's standard in-built STDP-based components, visualizing the -changes in synaptic efficacy that it produces in the context of -pre-synaptic and post-synaptic variable traces. +In the context of spiking neuronal networks, one of the most important forms of adaptation that is often simulated is that of spike-timing-dependent plasticity (STDP). In this lesson, we will setup and use one of ngc-learn's standard in-built STDP-based components, visualizing the changes in synaptic efficacy that it produces in the context of pre-synaptic and post-synaptic variable traces. ## Probing Spike-Timing-Dependent Plasticity -Go ahead and make a new folder for this study and create a Python script, -i.e., `run_trstdp.py`, to write your code for this part of the tutorial. +Go ahead and make a new folder for this study and create a Python script, i.e., `run_trstdp.py`, to write your code for this part of the tutorial. -Now let's set up the model for this lesson's simulation and construct a -3-component system made up of two variable traces (`VarTrace`) connected by -one single synapse that is capable of producing changes in connection strength -in accordance with STDP, specifically with a form of the update rule known -as [trace-based STDP](ngclearn.components.synapses.hebbian.traceSTDPSynapse). -Note that the trace components do not really do -anything meaningful unless they receive some input and we will provide -carefully controlled input spike values in order to control their behavior -so as to see how STDP responds to the relative temporal ordering of a pre- and -post-synaptic spike, where the time of spikes is approximated by the -corresponding pre- and post-synaptic traces (which decay exponentially with time -in the absence of input). +Now let's set up the model for this lesson's simulation and construct a 3-component system made up of two variable traces (`VarTrace`) connected by one single synapse that is capable of producing changes in connection strength in accordance with STDP, specifically with a form of the update rule known as [trace-based STDP](ngclearn.components.synapses.hebbian.traceSTDPSynapse). Note that the trace components do not really do anything meaningful unless they receive some input. Therefore, we will provide carefully controlled input spike values in order to control their behavior in order to see how STDP responds to the relative temporal ordering of a pre- and post-synaptic spike, where the timing of the spikes is approximated by the corresponding pre- and post-synaptic traces (which decay exponentially with time in the absence of input). -Writing the above 3-component system can be in the following manner: +Writing the above 3-component system can be done in the following manner: ```python from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context -from ngclearn.utils import JaxProcess + +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.other.varTrace import VarTrace from ngclearn.components.synapses.hebbian.traceSTDPSynapse import TraceSTDPSynapse -import ngclearn.utils.weight_distribution as dist +from ngclearn.utils.distribution_generator import DistributionGenerator ## create seeding keys (JAX-style) dkey = random.PRNGKey(231) @@ -46,55 +29,43 @@ T_max = 100 ## number time steps to simulate with Context("Model") as model: tr0 = VarTrace("tr0", n_units=1, tau_tr=8., a_delta=1.) tr1 = VarTrace("tr1", n_units=1, tau_tr=8., a_delta=1.) - W = TraceSTDPSynapse("W1", shape=(1, 1), eta=0., A_plus=1., A_minus=0.8, - weight_init=dist.uniform(0.0, 0.3), key=subkeys[0]) + W = TraceSTDPSynapse( + "W1", shape=(1, 1), eta=0., A_plus=1., A_minus=0.8, + weight_init=DistributionGenerator.uniform(low=0.0, high=0.3), key=subkeys[0] + ) # wire only relevant compartments to synaptic cable W for demo purposes - W.preTrace << tr0.trace - # self.W1.preSpike << self.z0.outputs ## we disable this as we will manually - ## insert a binary value (for a spike) - W.postTrace << tr1.trace - # self.W1.postSpike << self.z1e.s ## we disable this as we will manually - ## insert a binary value (for a spike) - - evolve_process = (JaxProcess() + tr0.trace >> W.preTrace + # self.z0.outputs >> self.W1.preSpike ## we disable this as we will manually + ## insert a binary value (for a spike) in this tutorial + tr1.trace >> W.postTrace + # self.z1e.s >> self.W1.postSpike ## we disable this as we will manually + ## insert a binary value (for a spike) in this tutorial + + evolve_synapse = (MethodProcess("evolve") >> W.evolve) - model.wrap_and_add_command(jit(evolve_process.pure), name="evolve") - - advance_process = (JaxProcess() - >> tr0.advance_state - >> tr1.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance_traces") - reset_process = (JaxProcess() - >> tr0.reset - >> tr1.reset - >> W.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") + advance_traces = (MethodProcess("advance") + >> tr0.advance_state + >> tr1.advance_state + >> W.advance_state) + reset = (MethodProcess("reset") + >> tr0.reset + >> tr1.reset + >> W.reset) - @Context.dynamicCommand - def clamp_synapse(pre_spk, post_spk): - W.preSpike.set(pre_spk) - W.postSpike.set(post_spk) +## set up some utility functions for the model context +def clamp_synapse(pre_spk, post_spk): + W.preSpike.set(pre_spk) + W.postSpike.set(post_spk) - - @Context.dynamicCommand - def clamp_traces(pre_spk, post_spk): - tr0.inputs.set(pre_spk) - tr1.inputs.set(post_spk) +def clamp_traces(pre_spk, post_spk): + tr0.inputs.set(pre_spk) + tr1.inputs.set(post_spk) ``` -With our carefully constructed STDP-adapted model above, we can then simulate -the changes to synaptic efficacy that it would produce as a function of -the distance between and order between a pre- and a post-synaptic binary spike. -Notice that in the above model, we have set the global learning rate `eta` to -zero, which will prevent the `TraceSTDPSynapse` from actually adjusting -its internal matrix of synaptic weight values using the updates produced by -STDP -- this means our synapses are held fixed throughout this particular -demonstration. Our goal is to produce an approximation of the theoretical synaptic -strength adjustment curve dictated by STDP; this can be done using the -code below: +With our carefully constructed STDP-adapted model above, we can then simulate the changes to synaptic efficacy that it would produce as a function of the distance between and order between a pre- and a post-synaptic binary spike. Notice that in the above model, we have set the global learning rate `eta` to zero, which will prevent the `TraceSTDPSynapse` from actually adjusting its internal matrix of synaptic weight values using the updates produced by STDP -- this means our synapses are held fixed throughout this particular demonstration. Our goal is to produce an approximation of the theoretical synaptic strength adjustment curve dictated by STDP; this can be done using the code below: ```python t_values = [] @@ -118,16 +89,13 @@ for i in range(T_max+1): _pre_trig = jnp.ones((1,1)) _post_trig = jnp.zeros((1,1)) ts = 0. - model.clamp_traces(pre_spk, post_spk) - model.advance_traces(t=dt * i, dt=dt) + clamp_traces(pre_spk, post_spk) + advance_traces.run(t=dt * i, dt=dt) ## get STDP update - W.preSpike.set(_pre_trig) - W.postSpike.set(_post_trig) - W.preTrace.set(tr0.trace.value) - W.postTrace.set(tr1.trace.value) - model.evolve(t=dt * i, dt=dt) - dW = W.dWeights.value + clamp_synapse(_pre_trig, _post_trig) + evolve_synapse.run(t=dt * i, dt=dt) + dW = W.dWeights.get() dW_vals.append(dW) if i >= int(T_max/2): t_values.append(ts) @@ -165,40 +133,12 @@ which should produce a plot similar to the one in the left-hand side below: +------------------------------------------------------------+----------------------------------------------------------------+ ``` -where we have provided a marked-up image of the STDP experimental data produced -and visualized in the classical work done by Bi and Poo in 1998 [1]. -We remark that our approximate STDP synaptic change curve does not perfectly -match/fit that of [1] perfectly by any means but does capture the -general trend and form of the long-term potentiation arc (the roughly -negative exponential curve to the right-hand side of zero) and the long-term -depression curve (the flipped exponential-like function to the left-hand -side of zero). Ultimately, a synaptic component like the `TraceSTDPSynapse` -can be quite useful for constructing spiking neural network architectures -that learn in a biologically-plausible fashion since this rule, as seen by the -above simulation usage, solely depends on information that is locally -available at the pre-synaptic neuron (its spike and a single trace that -tracks its temporal spiking history) and the post-synaptic neuron -(its own spike as well as a trace that tracks its spike history). Notably, -traced-based STDP can be an effective way of adapting the synapses of -biophysically more accurate computational models, such as those that balance -excitatory and inhibitory pressures produced by laterally-wired populations of -leaky integrator neurons, e.g., the -[Diehl and Cook spiking architecture](../../museum/snn_dc) we study in the model -museum in more detail. - -### Other Forms of Spike-Timing-Dependent Plasticity -Finally, beyond trace-based STDP, there are other types of STDP in-built to -ngc-learn, such as event-driven post-synaptic STDP -([eventSTDPSynapse](ngclearn.components.synapses.hebbian.eventSTDPSynapse)), that -you can experiment with and use in your model building and simulation projects. -You can learn more about these in the ngc-learn -[modeling API](../../modeling/components.md). -Beyond this, the ngc-learn dev team is always busy behind the scenes -constructing more standard computational neuroscience building blocks and -synaptic plasticity rules; so keep an eye out for future incoming developments! +Notice that, for the above visual, we have also provided a marked-up image of the STDP experimental data produced and visualized in the classical work done by Bi and Poo in 1998 [1]. We remark that our approximate STDP synaptic change curve does not perfectly match/fit that of [1] perfectly by any means; however, it does capture the general trend and form of the long-term potentiation arc (the roughly negative exponential curve to the right-hand side of zero) and the long-term depression curve (the flipped exponential-like function to the left-hand side of zero). Ultimately, a synaptic component like the `TraceSTDPSynapse` can be quite useful for constructing spiking neural network architectures that learn in a biologically-plausible fashion given that this rule, as seen by the above simulation usage, solely depends on information that is locally available at the pre-synaptic neuron (its spike and a single trace that tracks its temporal spiking history) and the post-synaptic neuron (its own spike as well as a trace that tracks its spike history). Notably, traced-based STDP can be an effective way of adapting the synapses of biophysically more accurate computational models, such as those that balance excitatory and inhibitory pressures produced by laterally-wired populations of leaky integrator neurons, e.g., the [Diehl and Cook spiking architecture](../../museum/snn_dc) that we study in more detail within the context of a model museum exhibit. + +### Other Forms of Spike-Timing-Dependent Plasticity +Finally, beyond trace-based STDP, there are other types of STDP in-built to ngc-learn, such as event-driven post-synaptic STDP ([eventSTDPSynapse](ngclearn.components.synapses.hebbian.eventSTDPSynapse)), which you can experiment with and use in your model building and simulation projects. You can learn more about these and other related biologically-plausible learning rules in the ngc-learn [modeling API](../../modeling/components.md) (specifically in the "Synapses" subsection page). +Beyond this, the ngc-learn dev team is always busy behind the scenes constructing more standard computational neuroscience building blocks and synaptic plasticity rules; so keep an eye out for future incoming developments! ## References -[1] Bi, Guo-qiang, and Mu-ming Poo. "Synaptic modifications in cultured -hippocampal neurons: dependence on spike timing, synaptic strength, and -postsynaptic cell type." Journal of neuroscience 18.24 (1998). +[1] Bi, Guo-qiang, and Mu-ming Poo. "Synaptic modifications in cultured hippocampal neurons: dependence on spike timing, synaptic strength, and postsynaptic cell type." Journal of neuroscience 18.24 (1998). diff --git a/docs/tutorials/neurocog/traces.md b/docs/tutorials/neurocog/traces.md index 4d338f65..da038db7 100755 --- a/docs/tutorials/neurocog/traces.md +++ b/docs/tutorials/neurocog/traces.md @@ -1,29 +1,17 @@ # Lecture 1B: Trace Variables and Filtering -Traces represent one very important component tool in ngc-learn as these are -often, in biophysical model simulations, used to produce real-valued -representations of often discrete-valued patterns, e.g., spike vectors within -a spike train, that can facilitate mechanisms such as online biological credit -assignment. In this lesson, we will observe how one of ngc-learn's core -trace components -- the `VarTrace` -- operates. +Traces represent one very important component tool in ngc-learn as these are often, in biophysical model simulations, used to produce real-valued representations of often discrete-valued patterns, e.g., spike vectors within a spike train, that can facilitate mechanisms such as online biological credit assignment. In this lesson, we will observe how one of ngc-learn's core trace components -- the `VarTrace` -- operates. ## Setting Up a Variable Trace for a Poisson Spike Train -To observe the value of a variable trace, we will pair it to another in-built -ngc-component; the `PoissonCell`, which will be configured to emit spikes -approximately at `63.75` Hertz (yielding a fairly sparse spike train). This means -we will construct a two-component dynamical system, where the input -compartment `outputs` of the `PoissonCell` will be wired directly into the -`inputs` compartment of the `VarTrace`. Note that a `VarTrace` has an `inputs` -compartment -- which is where raw signals typically go into -- and a `trace` -output compartment -- which is where filtered signal values/by-products are emitted from. +To observe the value of a variable trace, we will pair it to another in-built ngc-component; the `PoissonCell`, which will be configured to emit spikes approximately at `63.75` Hertz (yielding a fairly sparse spike train). This means we will construct a two-component dynamical system, where the input compartment `outputs` of the `PoissonCell` will be wired directly into the `inputs` compartment of the `VarTrace`. Note that a `VarTrace` has an `inputs` compartment -- which is where raw signals typically go into -- and a `trace` output compartment -- which is where filtered signal values/by-products are emitted from. The code below will instantiate the paired Poisson cell and corresponding variable trace: ```python from jax import numpy as jnp, random, jit -from ngclearn.utils import JaxProcess -from ngcsimlib.context import Context + +from ngclearn import Context, MethodProcess ## import model-specific mechanisms from ngclearn.components.input_encoders.poissonCell import PoissonCell from ngclearn.components.other.varTrace import VarTrace @@ -37,30 +25,24 @@ with Context("Model") as model: trace = VarTrace("tr0", n_units=1, tau_tr=30., a_delta=0.5) ## wire up cell z0 to trace tr0 - trace.inputs << cell.outputs + cell.outputs >> trace.inputs - advance_process = (JaxProcess() + advance_process = (MethodProcess("advance") >> cell.advance_state >> trace.advance_state) - model.wrap_and_add_command(jit(advance_process.pure), name="advance") - reset_process = (JaxProcess() + reset_process = (MethodProcess("reset") >> cell.reset >> trace.reset) - model.wrap_and_add_command(jit(reset_process.pure), name="reset") - - @Context.dynamicCommand - def clamp(x): - cell.inputs.set(x) +## set up some utility functions for the model context +def clamp(x): + cell.inputs.set(x) ``` ## Running the Paired Cell-Trace System -We can then run the above two-component dynamical system by injecting a fixed -(valid) probability value into the Poisson input encoder and then record the -resulting spikes and trace values. We will do this for `T = 200` milliseconds (ms) -with the code below: +We can then run the above two-component dynamical system by injecting a fixed (valid) probability value into the Poisson input encoder and then record the resulting spikes and trace values. We will do this for `T = 200` milliseconds (ms) with the code below: ```python dt = 1. # ms # integration time constant @@ -70,22 +52,21 @@ probs = jnp.asarray([[0.35]],dtype=jnp.float32) time_span = [] spikes = [] traceVals = [] -model.reset() +reset_process.run() for ts in range(T): - model.clamp(probs) - model.advance(t=ts*1., dt=dt) + clamp(probs) + advance_process.run(t=ts*1., dt=dt) - print("{} {}".format(cell.outputs.value, trace.trace.value), end="") - spikes.append( cell.outputs.value ) - traceVals.append( trace.trace.value ) + print(f"\r{cell.outputs.get()} {trace.trace.get()}", end="") + spikes.append( cell.outputs.get() ) + traceVals.append( trace.trace.get() ) time_span.append(ts * dt) print() spikes = jnp.concatenate(spikes,axis=0) traceVals = jnp.concatenate(traceVals,axis=0) ``` -We can plot the above simulation's trace outputs with the discrete spikes -super-imposed at their times of occurrence with the code below: +We can plot the above simulation's trace outputs with the discrete spikes super-imposed at their times of occurrence with the code below: ```python import matplotlib #.pyplot as plt @@ -100,8 +81,7 @@ stat = jnp.where(spikes > 0.) indx = (stat[0] * 1. - 1.).tolist() spk = ax.vlines(x=indx, ymin=0.985, ymax=1.05, colors='black', ls='-', lw=5) -ax.set(xlabel='Time (ms)', ylabel='Trace Output', - title='Variable Trace of Poisson Spikes') +ax.set(xlabel='Time (ms)', ylabel='Trace Output', title='Variable Trace of Poisson Spikes') #ax.legend([zTr[0],spk[0]],['z','phi(z)']) ax.grid() fig.savefig("poisson_trace.jpg") @@ -111,29 +91,16 @@ to get the following output saved to disk: -Notice that every time a spike is produced by the Poisson encoding cell, the trace -increments by `0.5` -- the result of the `a_delta` hyper-parameter we set when -crafting the model and simulation object -- and then exponentially decays in -the absence of a spike (with the time constant of `tau_tr = 30` milliseconds). +Notice that every time a spike is produced by the Poisson encoding cell, the trace increments by `0.5` -- the result of the `a_delta` hyper-parameter we set when crafting the model and simulation object -- and then exponentially decays in the absence of a spike (with the time constant of `tau_tr = 30` milliseconds). -The variable trace can be further configured to filter signals in different ways -if desired; specifically by manipulating its `decay_type` and `a_delta` arguments. -Notably, if a piecewise-gated variable trace is desired (a very common choice -in some neuronal circuit models), then all one would have to do is set `a_delta = 0`, -yielding the following line in the model creation code earlier in this tutorial: +The variable trace can be further configured to filter signals in different ways if desired; specifically by manipulating its `decay_type` and `a_delta` arguments. Notably, if a piecewise-gated variable trace is desired (a very common choice in some neuronal circuit models), then all one would have to do is set `a_delta = 0`, yielding the following line in the model creation code earlier in this tutorial: ```python trace = VarTrace("tr0", n_units=1, tau_tr=30., a_delta=0., decay_type="exp") ``` -Running the same code from before but with the above alteration would yield the -plot below: +Running the same code from before but with the above alteration would yield the plot below: -Notice that, this time, when a spike is emitted from the Poisson cell, the trace -is "clamped" to the value of one and then exponentially decays. Such a trace -configuration is useful if one requires the maintained trace to never increase -beyond a value of one, preventing divergence or run-away values if a spike train -is particularly dense and yielding friendlier values for biological learning -rules. +Notice that, this time, when a spike is emitted from the Poisson cell, the trace is "clamped" to the value of one and then exponentially decays. Such a trace configuration is useful if one requires the maintained trace to never increase beyond a value of one, preventing divergence or run-away values if a spike train is particularly dense and yielding friendlier values for biological learning rules. diff --git a/docs/tutorials/theory.md b/docs/tutorials/theory.md index 49bd9a6f..1622a6bf 100755 --- a/docs/tutorials/theory.md +++ b/docs/tutorials/theory.md @@ -1,48 +1,15 @@ # Theory and Design Motivation ## Cable Theory and Neural Compartments -At its core, part of ngc-learn's internal design is inspired by (neural) -cable theory , -where neuronal units, which are arranged in complex connectivity structures, are viewed -as performing dendritic calculations (of varying complexity). In essence, a particular -neuron integrates information from different input signal sources (for example, -signals produced by other neurons), in often highly nonlinear ways through a -complex dendritic tree. +At its core, part of NGC-Learn's internal design is inspired by (neural) cable theory and neuronal compartment models [1], where neuronal units, which are arranged in complex connectivity structures, are viewed as performing dendritic calculations (of varying complexity). In essence, a particular neuron integrates information from different input signal sources (for example, signals produced by other neurons), in often highly nonlinear ways through a complex dendritic tree. -Although modeling a complete neuronal system through the lens of cable theory is -complex and intricate in of itself, ngc-learn is built with this direction in -mind. ngc-learn starts with with the idea that a neuron (or a cluster of them) -can be viewed as a node or nodal component -- specifically a type of "cell" -component (in ngc-learn, many of these are component classes that end with the -suffix `Cell`) -- and each bundle of synapses that connects pairs of nodes can -be viewed as a cable -- specifically a "synapse" component (these component -classes usually end with the suffix `Synapse` or `SynapticCable`)-- that performs -some sort of transformation of its pre-synaptic signal (also treated as another -component in terms of abstract simulation) and often differentiated by its form -of plasticity. See the [Neurons](../modeling/neurons) specification for the base available -neuronal cells and the [Synapses](../modeling/synapses) specification for the base available -synaptic cables. Note that these two types of nodal components can be combined -with other types such as [Input Encoders](../modeling/input_encoders) and [Operations](../modeling/other_ops) to build -gradually more complex dynamical biomimetic/neuro-mimetic systems. +Although modeling a complete neuronal system through the lens of cable theory and compartmental structures is complex and intricate in of itself, NGC-Learn is built with this direction in mind. NGC-Learn starts with the idea that a neuron (or a cluster of them) can be viewed as a node or nodal component -- specifically a type of "cell" component (in NGC-Learn, many of these are component classes that end with the suffix `Cell`). Each bundle of synapses that connects pairs of nodes can +be viewed as a cable -- specifically a "synapse" component (these component classes usually end with the suffix `Synapse` or `SynapticCable`) -- which performs some sort of transformation of its pre-synaptic signal (also treated as another component in terms of abstract simulation); a synaptic bundle in NGC-Learn is often differentiated by its form of plasticity. See the [Neurons](../modeling/neurons) specification for the base available neuronal cells and the [Synapses](../modeling/synapses) specification for the base available synaptic cables. Note that these two types of nodal components can be combined with other types such as [Input Encoders](../modeling/input_encoders) and [Operations](../modeling/other_ops) to build gradually more complex dynamical biomimetic/neuro-mimetic/NeuroAI systems. -Each neuronal cell component/node has multiple, different (named) "compartments", -which are regions or slots within the node that other nodes can deposit -information/signals into. These compartments allow a node to collect information -from many different connected/related nodes and then decide how to combine these -different signals in order calculate its own output activity (either in the form -of a rate-coded firing rate or binary spikes) using the integration logic defined -within its own specific `advanceState()` function. When a biomimetic system, -composed of many of these nodes/components, is simulated over a period of time -(processing some form of sensory input), its underlying simulation object -(the `Controller`) calls the `advanceState()` routine of each constituent node, -shifting that nodes internal time by one discrete step. The order in which the -node `advanceState()` routines are called is governed by "run cycles", which are -defined by the experimenter at the object initialization of the controller. For -example, a user might want one set of nodes to first execute their internal step -logic before another set is able to -- this could be done by specifying two -distinct cycles in the order desired. +Each neuronal cell component/node has multiple, different (named) "compartments", which are regions or slots within the node that other nodes can deposit information/signals into. These compartments allow a node to collect information from many different connected/related nodes and then decide how to combine these different signals in order calculate its own output activity (either in the form of a rate-coded firing rate or binary spikes) using the integration logic defined within its own specific `advance_state()` function. When a biomimetic system, composed of many of these nodes/components, is simulated over a period of time (processing some form of sensory input), its underlying simulation object (the `Context` controller) calls the `advance_state()` routine of each constituent node, shifting that nodes internal time by one discrete step. The order in which the node `advance_state()` routines are called is governed by "run cycles", which are defined by the experimenter at the object initialization of the controller. For example, a user might want one set of nodes to first execute their internal step logic before another set is able to -- this could be done by specifying two distinct cycles in the order desired. -As a result, many nodes, and the synaptic cables that connect them, result in -a simulated biomimetic system where each node is itself, in general, treated as -a stateful computation even if we are processing inherently non-temporal data -such as static images. +As a result, many nodes, and the synaptic cables that connect them, result in a simulated biomimetic system where each node is itself, in general, treated as a stateful computation even if we are processing inherently non-temporal data such as static images. + +## References + +[1] Talevi, Alan, and Carolina Leticia Bellera. "Compartmental pharmacokinetic models." In ADME Processes in Pharmaceutical Sciences: Dosage, Design, and Pharmacotherapy, pp. 173-192. Cham: Springer Nature Switzerland, 2024. diff --git a/history.txt b/history.txt index 4ee30278..e03221af 100644 --- a/history.txt +++ b/history.txt @@ -19,8 +19,7 @@ History * NGCGraph .compile() further tweaked to use an injection/clamping look-up system to allow for dynamic changes to occur w/in a static graph compiled simulated NGC system - * Cable API slightly modified to increase flexiblity (demonstrations and - tests modified to reflect updated API) + * Cable API slightly modified to increase flexibility (demonstrations and tests modified to reflect updated API) * Demonstration 6 released showcasing how to use ngc-learn to construct/fit a restricted Boltzmann machine @@ -81,7 +80,15 @@ History * basic unit-tests (pytest framework) integrated to support dev * includes support for Intel's lava-nc emulator (several spiking/stdp components that play with ngc-lava) -2.0.3 -— — — — — — — — - - * Minor patch to point / depend on minor-patched ngcsimlib 1.0.1 (nudge to minor patched release) - * Added wrapper `inverse_sigmoid` for original `inverse_logistic` routine in model_utils (for convenience) + 3.0.0 + — — — — — — — — - + * revisions made / upgrades applied to framework/simulation back-end to integrate major version v2 of ngc-sim-lib + * new harmonium/RBM model-museum exhibit written and tutorial integrated + * clean-up of utils and new integration of mixture models for utils.density (Gaussian, Bernoulli, & exponential mixtures) + * addition of new BernoulliErrorCell (binary cross-entropy node); added leakyNoiseCell to support contus-time RNNs + * model museum (ngc-museum) and tutorials updated to reflect newest ngc-sim-lib format + * clean-up/upgrade of docs to reflect new v3 version (and patches) + * all model-museum (standard/main) exhibits revised/updated to operate with new v3 ngclearn / v2 ngcsimlib + * integration/addition of RL-SNN model in model-museum + * integration of full dynamics synapses -- alpha, exponential, and double-exponential synaptic cables + * new metrics/clean-up of metrics in utils.metric_utils (e.g., KL divs, etc.) diff --git a/ngclearn/__init__.py b/ngclearn/__init__.py index e457cb52..210f5121 100644 --- a/ngclearn/__init__.py +++ b/ngclearn/__init__.py @@ -1,16 +1,13 @@ import sys -import subprocess import pkg_resources from pkg_resources import get_distribution -#from pathlib import Path -#from sys import argv __version__ = get_distribution('ngclearn').version if sys.version_info.minor < 10: import warnings warnings.warn( - "Running ngclearn and jax in a python version prior to 3.10 may have unintended consequences. Compatability " + "Running ngclearn and jax in a python version prior to 3.10 may have unintended consequences. Compatibility " "with python 3.8 is maintained to allow for lava-nc components and should only be used with those") #required = {'ngcsimlib', 'jax', 'jaxlib'} ## list of core ngclearn dependencies @@ -31,33 +28,17 @@ import ngcsimlib -from ngcsimlib.context import Context -from ngcsimlib.component import Component +from ngclearn.utils import JointProcess, MethodProcess +from ngcsimlib.context import Context, ContextObjectTypes +from ngcsimlib import Component from ngcsimlib.compartment import Compartment -from ngcsimlib.resolver import resolver -from ngcsimlib import utils as sim_utils +from ngcsimlib import logger, get_config, provide_namespace +from ngcsimlib.parser import compilable +from ngcsimlib.operations import Summation, Product -from ngclearn.utils.jaxProcess import JaxProcess -from ngcsimlib.compilers.process import transition, Process - - -from ngcsimlib import configure, preload_modules -from ngcsimlib import logger if not Path(argv[0]).name == "sphinx-build" or Path(argv[0]).name == "build.py": if "readthedocs" not in argv[0]: ## prevent readthedocs execution of preload + from ngcsimlib import configure configure() logger.init_logging() - from ngcsimlib.configManager import get_config - pkg_config = get_config("packages") - if pkg_config is not None: - use_base_numpy = pkg_config.get("use_base_numpy", False) - if use_base_numpy: - import numpy as numpy - else: - from jax import numpy - else: - from jax import numpy - - - preload_modules() diff --git a/ngclearn/commands/__init__.py b/ngclearn/commands/__init__.py deleted file mode 100644 index 74eb06b3..00000000 --- a/ngclearn/commands/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from ngcsimlib.commands import * diff --git a/ngclearn/components/__init__.py b/ngclearn/components/__init__.py index af856c1a..d8c4dc67 100644 --- a/ngclearn/components/__init__.py +++ b/ngclearn/components/__init__.py @@ -2,6 +2,7 @@ ## point to rate-coded cell component types from .neurons.graded.rateCell import RateCell +from .neurons.graded.leakyNoiseCell import LeakyNoiseCell from .neurons.graded.gaussianErrorCell import GaussianErrorCell from .neurons.graded.laplacianErrorCell import LaplacianErrorCell from .neurons.graded.bernoulliErrorCell import BernoulliErrorCell @@ -39,7 +40,7 @@ from .synapses.hebbian.BCMSynapse import BCMSynapse from .synapses.STPDenseSynapse import STPDenseSynapse from .synapses.exponentialSynapse import ExponentialSynapse -from .synapses.doubleExpSynapse import DoupleExpSynapse +from .synapses.doubleExpSynapse import DoubleExpSynapse from .synapses.alphaSynapse import AlphaSynapse ## point to convolutional component types @@ -55,10 +56,7 @@ from .synapses.modulated.MSTDPETSynapse import MSTDPETSynapse from .synapses.modulated.REINFORCESynapse import REINFORCESynapse -## point to monitors -from .monitor import Monitor - -## point to patched component types +## point to patched component types from .synapses.patched.patchedSynapse import PatchedSynapse from .synapses.patched.staticPatchedSynapse import StaticPatchedSynapse from .synapses.patched.hebbianPatchedSynapse import HebbianPatchedSynapse diff --git a/ngclearn/components/base_monitor.py b/ngclearn/components/base_monitor.py deleted file mode 100644 index 8d7c71d0..00000000 --- a/ngclearn/components/base_monitor.py +++ /dev/null @@ -1,330 +0,0 @@ -import json - -from ngclearn import Component, Compartment, transition -from ngclearn import numpy as np -from ngcsimlib.utils import get_current_path -from ngcsimlib.logger import warn, critical - -import matplotlib.pyplot as plt - - -class Base_Monitor(Component): - """ - An abstract base for monitors for both ngclearn and ngclava. Compartments - wired directly into this component will have their value tracked during - `advance_state` loops automatically. - - Note the monitor only works for compiled methods currently - - - Using default window length: - myMonitor << myComponent.myCompartment - - Using custom window length: - myMonitor.watch(myComponent.myCompartment, customWindowLength) - - To get values out of the monitor either path to the stored value - directly, or pass in a compartment directly. All - paths are the same as their local path variable. - - Using a compartment: - myMonitor.view(myComponent.myCompartment) - - Using a path: - myMonitor.get_store(myComponent.myCompartment.path).value - - There can only be one monitor in existence at a time due to the way it - interacts with resolvers and the compilers - for ngclearn. - - Args: - name: The name of the component. - - default_window_length: The default window length. - """ - auto_resolve = False - - @staticmethod - def build_reset(component): - return Base_Monitor.reset(component) - - @staticmethod - def build_advance_state(component): - return Base_Monitor.record(component) - - @staticmethod - def _record_internal(compartments): - """ - A method to build the method to advance the stored values. - - Args: - compartments: A list of compartments to store values - - Returns: The method to advance the stored values. - - """ - critical( - "build_advance() is not defined on this monitor, use either the " - "monitor found in ngclearn.components or " - "ngclearn.components.lava (If using lava)") - - @transition(None, True) - @staticmethod - def reset(component): - """ - A method to build the method to reset the stored values. - Args: - component: The component to resolve - - Returns: the reset resolver - """ - output_compartments = [] - compartments = [] - for comp in component.compartments: - output_compartments.append(comp.split("/")[-1] + "*store") - compartments.append(comp.split("/")[-1]) - - @staticmethod - def _reset(**kwargs): - return_vals = [] - for comp in compartments: - current_store = kwargs[comp + "*store"] - return_vals.append(np.zeros(current_store.shape)) - return return_vals if len(compartments) > 1 else return_vals[0] - - # pure func, output compartments, args, params, input compartments - return _reset, output_compartments, [], [], output_compartments - - @transition(None, True) - @staticmethod - def record(component): - output_compartments = [] - compartments = [] - for comp in component.compartments: - output_compartments.append(comp.split("/")[-1] + "*store") - compartments.append(comp.split("/")[-1]) - - _advance = component._record_internal(compartments) - - return _advance, output_compartments, [], [], compartments + output_compartments - - def __init__(self, name, default_window_length=100, **kwargs): - super().__init__(name, **kwargs) - self.store = {} - self.compartments = [] - self._sources = [] - self.default_window_length = default_window_length - - def __lshift__(self, other): - if isinstance(other, Compartment): - self.watch(other, self.default_window_length) - else: - warn("Only Compartments can be monitored not", type(other)) - - def watch(self, compartment, window_length): - """ - Sets the monitor to watch a specific compartment, for a specified - window length. - - Args: - compartment: the compartment object to monitor - - window_length: the window length - """ - cs, end = self._add_path(compartment.path) - - if hasattr(compartment.value, "dtype"): - dtype = compartment.value.dtype - else: - dtype = type(compartment.value) - - if hasattr(compartment.value, "shape"): - shape = compartment.value.shape - else: - shape = (1,) - new_comp = Compartment(np.zeros(shape, dtype=dtype)) - new_comp_store = Compartment(np.zeros((window_length, *shape), dtype=dtype)) - - comp_key = "*".join(compartment.path.split("/")) - store_comp_key = comp_key + "*store" - - new_comp._setup(self, comp_key) - new_comp_store._setup(self, store_comp_key) - - new_comp << compartment - - cs[end] = new_comp_store - setattr(self, comp_key, new_comp) - setattr(self, store_comp_key, new_comp_store) - self.compartments.append(new_comp.path) - self._sources.append(compartment) - # self._update_resolver() - - def halt(self, compartment): - """ - Stops the monitor from watching a specific compartment. It is important - to note that it does not stop previously compiled methods. It does not - remove it from the stored values, so it can still be viewed. - Args: - compartment: The compartment object to stop watching - """ - if compartment not in self._sources: - return - - comp_key = "*".join(compartment.path.split("/")) - store_comp_key = comp_key + "*store" - - self.compartments.remove(getattr(self, comp_key).path) - self._sources.remove(compartment) - - delattr(self, comp_key) - delattr(self, store_comp_key) - self._update_resolver() - - def halt_all(self): - """ - Stops the monitor from watching all compartments. - """ - for compartment in self._sources: - self.halt(compartment) - - # def _update_resolver(self): - # output_compartments = [] - # compartments = [] - # for comp in self.compartments: - # output_compartments.append(comp.split("/")[-1] + "*store") - # compartments.append(comp.split("/")[-1]) - # - # args = [] - # parameters = [] - # - # add_component_resolver(self.__class__.__name__, "advance_state", - # (self.build_advance(compartments), - # output_compartments)) - # add_resolver_meta(self.__class__.__name__, "advance_state", - # (args, parameters, - # compartments + [o for o in output_compartments], - # False)) - - # add_component_resolver(self.__class__.__name__, "reset", ( - # self.build_reset(compartments), output_compartments)) - # add_resolver_meta(self.__class__.__name__, "reset", - # (args, parameters, [o for o in output_compartments], - # False)) - - def _add_path(self, path): - _path = path.split("/")[1:] - end = _path.pop(-1) - - current_store = self.store - for p in _path: - if p not in current_store.keys(): - current_store[p] = {} - current_store = current_store[p] - - return current_store, end - - def view(self, compartment): - """ - Gets the value associated with the specified compartment - - Args: - compartment: The compartment to extract the stored value of - - Returns: The stored value, None if not monitoring that compartment - - """ - _path = compartment.path.split("/")[1:] - store = self.get_store(_path) - return store.value if store is not None else store - - def get_store(self, path): - current_store = self.store - for p in path: - if p not in current_store.keys(): - return None - current_store = current_store[p] - return current_store - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".json" - _dict = {"sources": {}, "stores": {}} - for key in self.compartments: - n = key.split("/")[-1] - _dict["sources"][key] = self.__dict__[n].value.shape - _dict["stores"][key + "*store"] = self.__dict__[ - n + "*store"].value.shape - - with open(file_name, "w") as f: - json.dump(_dict, f) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".json" - with open(file_name, "r") as f: - vals = json.load(f) - - for comp_path, shape in vals["stores"].items(): - compartment_path = comp_path.split("/")[-1] - new_path = get_current_path() + "/" + "/".join( - compartment_path.split("*")[-3:-1]) - - cs, end = self._add_path(new_path) - - new_comp = Compartment(np.zeros(shape)) - new_comp._setup(self, compartment_path) - - cs[end] = new_comp - setattr(self, compartment_path, new_comp) - - for comp_path, shape in vals['sources'].items(): - compartment_path = comp_path.split("/")[-1] - new_comp = Compartment(np.zeros(shape)) - new_comp._setup(self, compartment_path) - - setattr(self, compartment_path, new_comp) - self.compartments.append(new_comp.path) - - # self._update_resolver() - - def make_plot(self, compartment, ax=None, ylabel=None, xlabel=None, title=None, n=None, plot_func=None): - vals = self.view(compartment) - - if n is None: - n = vals.shape[2] - if title is None: - title = compartment.name.split("/")[0] + " " + compartment.display_name - - if ylabel is None: - _ylabel = compartment.units - elif ylabel: - _ylabel = ylabel - else: - _ylabel = None - - if xlabel is None: - _xlabel = "Time Steps" - elif xlabel: - _xlabel = xlabel - else: - _xlabel = None - - if ax is None: - _ax = plt - _ax.title(title) - if _ylabel: - _ax.ylabel(_ylabel) - if _xlabel: - _ax.xlabel(_xlabel) - else: - _ax = ax - _ax.set_title(title) - if _ylabel: - _ax.set_ylabel(_ylabel) - if _xlabel: - _ax.set_xlabel(_xlabel) - - if plot_func is None: - for k in range(n): - _ax.plot(vals[:, 0, k]) - else: - plot_func(vals[:, :, 0:n], ax=_ax) diff --git a/ngclearn/components/input_encoders/__init__.py b/ngclearn/components/input_encoders/__init__.py index b779226e..5d14d2ec 100644 --- a/ngclearn/components/input_encoders/__init__.py +++ b/ngclearn/components/input_encoders/__init__.py @@ -2,3 +2,4 @@ from .poissonCell import PoissonCell from .latencyCell import LatencyCell from .phasorCell import PhasorCell + diff --git a/ngclearn/components/input_encoders/bernoulliCell.py b/ngclearn/components/input_encoders/bernoulliCell.py index d240de64..87b965fc 100755 --- a/ngclearn/components/input_encoders/bernoulliCell.py +++ b/ngclearn/components/input_encoders/bernoulliCell.py @@ -1,12 +1,9 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn - -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +import jax +from typing import Union class BernoulliCell(JaxComponent): """ @@ -29,51 +26,33 @@ class BernoulliCell(JaxComponent): batch_size: batch size dimension of this cell (Default: 1) """ - def __init__(self, name, n_units, batch_size=1, **kwargs): - super().__init__(name, **kwargs) - #super(BernoulliCell, self).__init__(name, **kwargs) + def __init__(self, name: str, n_units: int, batch_size: int = 1, key: Union[jax.Array, None] = None, **kwargs): + super().__init__(name=name, key=key) ## Layer Size Setup - self.batch_size = batch_size - self.n_units = n_units + self.batch_size = Compartment(batch_size) + self.n_units = Compartment(n_units) - # Compartments (state of the cell, parameters, will be updated through stateless calls) - restVals = jnp.zeros((self.batch_size, self.n_units)) + restVals = jnp.zeros((batch_size, n_units)) self.inputs = Compartment(restVals, display_name="Input Stimulus") # input compartment self.outputs = Compartment(restVals, display_name="Spikes") # output compartment self.tols = Compartment(restVals, display_name="Time-of-Last-Spike", units="ms") # time of last spike - @transition(output_compartments=["outputs", "tols", "key"]) - @staticmethod - def advance_state(t, key, inputs, tols): - ## NOTE: should `inputs` be checked if bounded to [0,1]? - # print(key) - # print(t) - # print(inputs.shape) - # print(tols.shape) - # print("-----") - key, *subkeys = random.split(key, 3) - outputs = random.bernoulli(subkeys[0], p=inputs).astype(jnp.float32) - # Updates time-of-last-spike (tols) variable: - # output = s = binary spike vector - # tols = current time-of-last-spike variable - tols = (1. - outputs) * tols + (outputs * t) - return outputs, tols, key - - @transition(output_compartments=["inputs", "outputs", "tols"]) - @staticmethod - def reset(batch_size, n_units): - restVals = jnp.zeros((batch_size, n_units)) - return restVals, restVals, restVals - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, key=self.key.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.key.set(data['key']) + @compilable + def advance_state(self, t): + key, subkey = random.split(self.key.get(), 2) + self.outputs.set(random.bernoulli(subkey, p=self.inputs.get()).astype(jnp.float32)) + self.tols.set((1. - self.outputs.get()) * self.tols.get() + (self.outputs.get() * t)) + self.key.set(key) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size.get(), self.n_units.get())) + # BUG: the self.inputs here does not have the targeted field + # NOTE: Quick workaround is to check if targeted is in the input or not + hasattr(self.inputs, "targeted") and not self.inputs.targeted and self.inputs.set(restVals) + self.outputs.set(restVals) + self.tols.set(restVals) @classmethod def help(cls): ## component help function @@ -101,22 +80,9 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: X = BernoulliCell("X", 9) - print(X) + + X.batch_size.set(10) diff --git a/ngclearn/components/input_encoders/latencyCell.py b/ngclearn/components/input_encoders/latencyCell.py index c7343cfa..c0708e3d 100755 --- a/ngclearn/components/input_encoders/latencyCell.py +++ b/ngclearn/components/input_encoders/latencyCell.py @@ -1,16 +1,13 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn - -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +import jax +from typing import Union from ngclearn.utils.model_utils import clamp_min, clamp_max +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment @partial(jit, static_argnums=[5]) def _calc_spike_times_linear(data, tau, thr, first_spk_t, num_steps=1., @@ -146,90 +143,79 @@ class LatencyCell(JaxComponent): batch_size: batch size dimension of this cell (Default: 1) """ - # Define Functions def __init__( - self, name, n_units, tau=1., threshold=0.01, first_spike_time=0., linearize=False, normalize=False, - clip_spikes=False, num_steps=1., batch_size=1, **kwargs + self, name: str, n_units: int, tau: float = 1., threshold: float = 0.01, first_spike_time: float = 0., + linearize: bool = False, normalize: bool = False, clip_spikes: bool = False, num_steps: float = 1., + batch_size: int = 1, key: Union[jax.Array, None] = None, **kwargs ): - super().__init__(name, **kwargs) + super().__init__(name=name, key=key) ## latency meta-parameters - self.first_spike_time = first_spike_time - self.tau = tau - self.threshold = threshold - self.linearize = linearize - self.clip_spikes = clip_spikes + self.first_spike_time = Compartment(first_spike_time) + self.tau = Compartment(tau) + self.threshold = Compartment(threshold) + self.linearize = Compartment(linearize) + self.clip_spikes = Compartment(clip_spikes) ## normalize latency code s.t. final spike(s) occur w/in num_steps - self.normalize = normalize - self.num_steps = num_steps + self.normalize = Compartment(normalize) + self.num_steps = Compartment(num_steps) ## Layer Size Setup - self.batch_size = batch_size - self.n_units = n_units + self.batch_size = Compartment(batch_size) + self.n_units = Compartment(n_units) ## Compartment setup - restVals = jnp.zeros((self.batch_size, self.n_units)) + restVals = jnp.zeros((batch_size, n_units)) self.inputs = Compartment(restVals, display_name="Input Stimulus") # input compartment self.outputs = Compartment(restVals, display_name="Spikes") # output compartment self.mask = Compartment(restVals, display_name="Spike Time Mask") self.clip_mask = Compartment(restVals, display_name="Clip Mask") self.tols = Compartment(restVals, display_name="Time-of-Last-Spike", units="ms") # time of last spike self.targ_sp_times = Compartment(restVals, display_name="Target Spike Time", units="ms") - #self.reset() - @transition(output_compartments=["targ_sp_times", "clip_mask"]) - @staticmethod - def calc_spike_times( - linearize, tau, threshold, first_spike_time, num_steps, normalize, clip_spikes, inputs - ): - ## would call this function before processing a spike train (at start) - data = inputs - if clip_spikes: - clip_mask = (data < threshold) * 1. ## find values under threshold + @compilable + def calc_spike_times(self): + if self.clip_spikes.get(): + self.clip_mask.set((self.inputs.get() < self.threshold) * 1.) else: - clip_mask = data * 0. ## all values allowed to fire spikes - if linearize: ## linearize spike time calculation - stimes = _calc_spike_times_linear(data, tau, threshold, - first_spike_time, - num_steps, normalize) - targ_sp_times = stimes #* calcEvent + targ_sp_times * (1. - calcEvent) - else: ## standard nonlinear spike time calculation - stimes = _calc_spike_times_nonlinear(data, tau, threshold, - first_spike_time, - num_steps=num_steps, - normalize=normalize) - targ_sp_times = stimes #* calcEvent + targ_sp_times * (1. - calcEvent) - return targ_sp_times, clip_mask - - @transition(output_compartments=["outputs", "tols", "mask", "targ_sp_times", "key"]) - @staticmethod - def advance_state(t, dt, key, inputs, mask, clip_mask, targ_sp_times, tols): - key, *subkeys = random.split(key, 2) - data = inputs ## get sensory pattern data / features - spikes, spk_mask = _extract_spike(targ_sp_times, t, mask) ## get spikes at t - - # Updates time-of-last-spike (tols) variable: - # output = s = binary spike vector - # tols = current time-of-last-spike variable - tols = (1. - spikes) * tols + (spikes * t) - - spikes = spikes * (1. - clip_mask) - return spikes, tols, spk_mask, targ_sp_times, key - - @transition(output_compartments=["inputs", "outputs", "tols", "mask", "clip_mask", "targ_sp_times"]) - @staticmethod - def reset(batch_size, n_units): - restVals = jnp.zeros((batch_size, n_units)) - return (restVals, restVals, restVals, restVals, restVals, restVals) - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, key=self.key.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.key.set(data['key']) + self.clip_mask.set(self.inputs.get() * 0.) + + if self.linearize.get(): + self.targ_sp_times.set( + _calc_spike_times_linear(self.inputs.get(), + self.tau.get(), + self.threshold.get(), + self.first_spike_time.get(), + self.num_steps.get(), + self.normalize.get())) + else: + self.targ_sp_times.set( + _calc_spike_times_nonlinear(self.inputs.get(), + self.tau.get(), + self.threshold.get(), + self.first_spike_time.get(), + self.num_steps.get(), + self.normalize.get())) + + + @compilable + def advance_state(self, t): + spikes, spike_mask = _extract_spike(self.targ_sp_times.get(), t, self.mask.get()) + self.tols.set((1. - spikes) * self.tols.get() + (spikes * t)) + self.outputs.set(spikes * (1. - self.clip_mask.get())) + self.mask.set(spike_mask) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size.get(), self.n_units.get())) + # BUG: the self.inputs here does not have the targeted field + # NOTE: Quick workaround is to check if targeted is in the input or not + hasattr(self.inputs, "targeted") and not self.inputs.targeted and self.inputs.set(restVals) + self.outputs.set(restVals) + self.tols.set(restVals) + self.mask.set(restVals) + self.clip_mask.set(restVals) + self.targ_sp_times.set(restVals) @classmethod def help(cls): ## component help function @@ -266,22 +252,10 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: X = LatencyCell("X", 9) print(X) + print(X.calc_spike_times.compiled.code) + print(X.advance_state.compiled.code) diff --git a/ngclearn/components/input_encoders/phasorCell.py b/ngclearn/components/input_encoders/phasorCell.py index 9eaa16a7..ada0ddc8 100755 --- a/ngclearn/components/input_encoders/phasorCell.py +++ b/ngclearn/components/input_encoders/phasorCell.py @@ -1,13 +1,11 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn - -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +import jax +from typing import Union +from ngcsimlib.logger import info, warn +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment class PhasorCell(JaxComponent): """ @@ -33,9 +31,9 @@ class PhasorCell(JaxComponent): batch_size: batch size dimension of this cell (Default: 1) """ - # Define Functions def __init__( - self, name, n_units, target_freq=63.75, batch_size=1, disable_phasor=False, **kwargs): + self, name, n_units, target_freq=63.75, batch_size=1, disable_phasor=False, **kwargs + ): super().__init__(name, **kwargs) ## Phasor meta-parameters @@ -44,7 +42,7 @@ def __init__( ## Layer Size Setup self.batch_size = batch_size self.n_units = n_units - _key, *subkey = random.split(self.key.value, 3) + _key, *subkey = random.split(self.key.get(), 3) self.key.set(_key) ## Compartment setup restVals = jnp.zeros((self.batch_size, self.n_units)) @@ -62,7 +60,7 @@ def __init__( # alpha = ((random.normal(subkey, self.angles.value.shape) * (jnp.sqrt(target_freq) / target_freq)) + 1) # beta = random.poisson(subkey, lam=target_freq, shape=self.angles.value.shape) / target_freq - self.base_scale = random.poisson(subkey[0], lam=target_freq, shape=self.angles.value.shape) / target_freq + self.base_scale = random.poisson(subkey[0], lam=target_freq, shape=self.angles.get().shape) / target_freq self.disable_phasor = disable_phasor def validate(self, dt=None, **validation_kwargs): @@ -86,21 +84,27 @@ def validate(self, dt=None, **validation_kwargs): ) return valid - @transition(output_compartments=["outputs", "tols", "key", "angles"]) - @staticmethod - def advance_state(t, dt, target_freq, key, inputs, angles, tols, base_scale, disable_phasor): + # @transition(output_compartments=["outputs", "tols", "key", "angles"]) + # @staticmethod + @compilable + def advance_state(self, t, dt, ): + + inputs = self.inputs.get() + angles = self.angles.get() + tols = self.tols.get() + ms_per_second = 1000 # ms/s - events_per_ms = target_freq / ms_per_second # e/s s/ms -> e/ms + events_per_ms = self.target_freq / ms_per_second # e/s s/ms -> e/ms ms_per_event = 1 / events_per_ms # ms/e time_step_per_event = ms_per_event / dt # ms/e * ts/ms -> ts / e angle_per_event = 2 * jnp.pi # rad / e angle_per_timestep = angle_per_event / time_step_per_event # rad / e # * e/ts -> rad / ts - key, *subkey = random.split(key, 3) + key, *subkey = random.split(self.key.get(), 3) # scatter = random.uniform(subkey, angles.shape, minval=0.5, # maxval=1.5) * base_scale - scatter = ((random.normal(subkey[0], angles.shape) * 0.2) + 1) * base_scale + scatter = ((random.normal(subkey[0], angles.shape) * 0.2) + 1) * self.base_scale scattered_update = angle_per_timestep * scatter scaled_scattered_update = scattered_update * inputs @@ -109,27 +113,30 @@ def advance_state(t, dt, target_freq, key, inputs, angles, tols, base_scale, dis updated_angles = jnp.where(updated_angles > angle_per_event, updated_angles - angle_per_event, updated_angles) - if disable_phasor: + if self.disable_phasor: outputs = inputs + 0 tols = tols * (1. - outputs) + t * outputs - return outputs, tols, key, updated_angles + self.outputs.set(outputs) + self.tols.set(tols) + self.key.set(key) + self.angles.set(updated_angles) - @transition(output_compartments=["inputs", "outputs", "tols", "angles", "key"]) - @staticmethod - def reset(batch_size, n_units, key, target_freq): - restVals = jnp.zeros((batch_size, n_units)) - key, *subkey = random.split(key, 3) - return restVals, restVals, restVals, restVals, key - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, key=self.key.value) + # @transition(output_compartments=["inputs", "outputs", "tols", "angles", "key"]) + # @staticmethod + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + key, *subkey = random.split(self.key.get(), 3) - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.key.set(data['key']) + # BUG: the self.inputs here does not have the targeted field + # NOTE: Quick workaround is to check if targeted is in the input or not + hasattr(self.inputs, "targeted") and not self.inputs.targeted and self.inputs.set(restVals) + self.outputs.set(restVals) + self.tols.set(restVals) + self.angles.set(restVals) + self.key.set(key) @classmethod def help(cls): ## component help function @@ -157,19 +164,4 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if - Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - diff --git a/ngclearn/components/input_encoders/poissonCell.py b/ngclearn/components/input_encoders/poissonCell.py index 5f385951..810776ab 100644 --- a/ngclearn/components/input_encoders/poissonCell.py +++ b/ngclearn/components/input_encoders/poissonCell.py @@ -1,12 +1,11 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn +import jax +from typing import Union -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngcsimlib import deprecate_args +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment class PoissonCell(JaxComponent): """ @@ -32,8 +31,11 @@ class PoissonCell(JaxComponent): """ @deprecate_args(max_freq="target_freq") - def __init__(self, name, n_units, target_freq=63.75, batch_size=1, **kwargs): - super().__init__(name, **kwargs) + def __init__( + self, name: str, n_units: int, target_freq: float = 63.75, batch_size: int = 1, + key: Union[jax.Array, None] = None, **kwargs + ): + super().__init__(name=name, key=key) ## Constrained Bernoulli meta-parameters self.target_freq = target_freq ## maximum frequency (in Hertz/Hz) @@ -48,55 +50,25 @@ def __init__(self, name, n_units, target_freq=63.75, batch_size=1, **kwargs): self.outputs = Compartment(restVals, display_name="Spikes") # output compartment self.tols = Compartment(restVals, display_name="Time-of-Last-Spike", units="ms") # time of last spike - def validate(self, dt=None, **validation_kwargs): - valid = super().validate(**validation_kwargs) - if dt is None: - warn(f"{self.name} requires a validation kwarg of `dt`") - return False - ## check for unstable combinations of dt and target-frequency meta-params - events_per_timestep = (dt/1000.) * self.target_freq ## compute scaled probability - if events_per_timestep > 1.: - valid = False - warn( - f"{self.name} will be unable to make as many temporal events as " - f"requested! ({events_per_timestep} events/timestep) Unstable " - f"combination of dt = {dt} and target_freq = {self.target_freq} " - f"being used!" - ) - return valid - - @transition(output_compartments=["outputs", "tols", "key"]) - @staticmethod - def advance_state(t, dt, target_freq, key, inputs, tols): - key, *subkeys = random.split(key, 2) - pspike = inputs * (dt / 1000.) * target_freq - eps = random.uniform(subkeys[0], inputs.shape, minval=0., maxval=1., + @compilable + def advance_state(self, t, dt): + key, subkey = random.split(self.key.get(), 2) + pspike = self.inputs.get() * (dt / 1000.) * self.target_freq + eps = random.uniform(subkey, self.inputs.get().shape, minval=0., maxval=1., dtype=jnp.float32) - outputs = (eps < pspike).astype(jnp.float32) - - # Updates time-of-last-spike (tols) variable: - # output = s = binary spike vector - # tols = current time-of-last-spike variable - tols = (1. - outputs) * tols + (outputs * t) - return outputs, tols, key - - @transition(output_compartments=["inputs", "outputs", "tols"]) - @staticmethod - def reset(batch_size, n_units): - restVals = jnp.zeros((batch_size, n_units)) - return restVals, restVals, restVals - - def save(self, directory, **kwargs): - target_freq = (self.target_freq if isinstance(self.target_freq, float) - else jnp.ones([[self.target_freq]])) - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, key=self.key.value, target_freq=target_freq) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.key.set(data['key']) - self.target_freq = data['target_freq'] + + self.outputs.set((eps < pspike).astype(jnp.float32)) + self.tols.set((1. - self.outputs.get()) * self.tols.get() + (self.outputs.get() * t)) + self.key.set(key) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + # BUG: the self.inputs here does not have the targeted field + # NOTE: Quick workaround is to check if targeted is in the input or not + hasattr(self.inputs, "targeted") and not self.inputs.targeted and self.inputs.set(restVals) + self.outputs.set(restVals) + self.tols.set(restVals) @classmethod def help(cls): ## component help function @@ -126,22 +98,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if - Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - - if __name__ == '__main__': from ngcsimlib.context import Context diff --git a/ngclearn/components/jaxComponent.py b/ngclearn/components/jaxComponent.py index 0488c47c..8cffa49a 100755 --- a/ngclearn/components/jaxComponent.py +++ b/ngclearn/components/jaxComponent.py @@ -1,8 +1,13 @@ import time + +from typing import Union, Dict, Any +import jax +from jax import numpy as jnp from jax import random -#from ngclearn import resolver, Component, Compartment -from ngcsimlib.component import Component from ngcsimlib.compartment import Compartment +from ngcsimlib import Component +from ngclearn.utils import tensorstats + class JaxComponent(Component): """ @@ -14,12 +19,56 @@ class JaxComponent(Component): key: PRNG key to control determinism of any underlying random values associated with this cell - directory: string indicating directory on disk to save component parameter - values to """ - def __init__(self, name, key=None, directory=None, **kwargs): - super().__init__(name, **kwargs) - self.directory = directory + def __init__(self, name: str, key: Union[jax.Array, None] = None): + super().__init__(name) self.key = Compartment( random.PRNGKey(time.time_ns()) if key is None else key) + + def save(self, directory: str): + """ + The default save method for JaxComponents, it stores the values of all + non-targeted (non-wired) compartments into a .npz file. + + Args: + directory: The directory to save the .npz file. + """ + file_name = directory + "/" + self.name + ".npz" + data = {} + for comp_name, comp in self.compartments: + if not comp.targeted and comp.auto_save: + data[comp_name] = comp.get() + jnp.savez(file_name, **data) + + + def load(self, directory: str): + """ + The default load method for JaxComponents, it is expected to work with + the default save. If the save method is modified this one will need to + be modified too. + + Args: + directory: The directory to load the .npz file. + """ + file_name = directory + "/" + self.name + ".npz" + data = jnp.load(file_name) + for comp_name, comp in self.compartments: + d = data.get(comp_name, None) + if d is not None: + comp.set(d) + + def __repr__(self): + comps = [varname for varname in dir(self) if isinstance(getattr(self, varname), Compartment)] + maxlen = max(len(c) for c in comps) + 5 + lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" + for c in comps: + stats = tensorstats(getattr(self, c).get()) + if stats is not None: + line = [f"{k}: {v}" for k, v in stats.items()] + line = ", ".join(line) + else: + line = "None" + lines += f" {f'({c})'.ljust(maxlen)}{line}\n" + return lines + diff --git a/ngclearn/components/lava/__init__.py b/ngclearn/components/lava/__init__.py deleted file mode 100644 index 962f843a..00000000 --- a/ngclearn/components/lava/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -## lava-compliant neuronal cells -from .neurons.LIFCell import LIFCell -## lava-compliant synapses -from .synapses.staticSynapse import StaticSynapse -from .synapses.traceSTDPSynapse import TraceSTDPSynapse -from .synapses.hebbianSynapse import HebbianSynapse -## Lava-compliant encoders/traces -from .traces.gatedTrace import GatedTrace - -#monitor -from .monitor import Monitor \ No newline at end of file diff --git a/ngclearn/components/lava/monitor.py b/ngclearn/components/lava/monitor.py deleted file mode 100644 index aaabf8f8..00000000 --- a/ngclearn/components/lava/monitor.py +++ /dev/null @@ -1,32 +0,0 @@ -from ngclearn.components.base_monitor import Base_Monitor - - -class Monitor(Base_Monitor): - """ - A numpy implementation of `Base_Monitor`. Designed to be used with all lava compatible ngclearn components - """ - auto_resolve = False - - - @staticmethod - def build_advance(compartments): - @staticmethod - def _advance(**kwargs): - return_vals = [] - for comp in compartments: - new_val = kwargs[comp] - current_store = kwargs[comp + "*store"] - current_store[:-1] = current_store[1:] - current_store[-1] = new_val - return_vals.append(current_store) - return return_vals if len(compartments) > 1 else return_vals[0] - - return _advance - - @staticmethod - def build_advance_state(component): - return super().build_advance_state(component) - - @staticmethod - def build_reset(component): - return super().build_reset(component) diff --git a/ngclearn/components/lava/neurons/LIFCell.py b/ngclearn/components/lava/neurons/LIFCell.py deleted file mode 100644 index e0ba3641..00000000 --- a/ngclearn/components/lava/neurons/LIFCell.py +++ /dev/null @@ -1,177 +0,0 @@ -from ngclearn import numpy as jnp -from ngcsimlib.logger import info, warn -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -from ngclearn.utils import tensorstats - -class LIFCell(Component): ## Lava-compliant leaky integrate-and-fire cell - """ - A spiking cell based on (leaky) integrate-and-fire (LIF) neuronal dynamics. - Note that this cell can be readily configured to pure integrate-and-fire - dynamics as needed. Note that dynamics in this Lava-compliant cell are - hard-coded to move according to Euler integration. - - The specific differential equation that characterize this cell - is (for adjusting v, given current j, over time) is: - - | tau_m * dv/dt = gamma_d * (v_rest - v) + j * R - | where R is the membrane resistance and v_rest is the resting potential - | gamma_d is voltage decay -- 1 recovers LIF dynamics and 0 recovers IF dynamics - - | --- Cell Input Compartments: (Takes wired-in signals) --- - | j_exc - excitatory electrical input - | j_inh - inhibitory electrical input - | --- Cell Output Compartments: (These signals are generated) --- - | v - membrane potential/voltage state - | s - emitted binary spikes/action potentials - | rfr - (relative) refractory variable state - | thr_theta - homeostatic/adaptive threshold increment state - - Args: - name: the string name of this cell - - n_units: number of cellular entities (neural population size) - - dt: integration time constant (ms) - - tau_m: cell membrane time constant - - thr_theta_init: initialization kernel for threshold increment variable - - resist_m: membrane resistance value (Default: 1) - - thr: base value for adaptive thresholds that govern short-term - plasticity (in milliVolts, or mV) - - v_rest: membrane resting potential (in mV) - - v_reset: membrane reset potential (in mV) -- upon occurrence of a spike, - a neuronal cell's membrane potential will be set to this value - - v_decay: decay factor applied to voltage leak (Default: 1.); setting this - to 0 mV results in pure integrate-and-fire (IF) dynamics - - tau_theta: homeostatic threshold time constant - - theta_plus: physical increment to be applied to any threshold value if - a spike was emitted - - refract_time: relative refractory period time (ms; Default: 1 ms) - - thr_theta0: (DEPRECATED) initial conditions for voltage threshold - """ - - # Define Functions - def __init__(self, name, n_units, dt, tau_m, thr_theta_init=None, resist_m=1., - thr=-52., v_rest=-65., v_reset=-60., v_decay=1., tau_theta=1e7, - theta_plus=0.05, refract_time=5., thr_theta0=None, **kwargs): - super().__init__(name, **kwargs) - - ## Cell dynamics setup - self.dt = dt - self.tau_m = tau_m ## membrane time constant - self.R_m = resist_m ## resistance value - if kwargs.get("R_m") is not None: - warn("The argument `R_m` being used is deprecated.") - self.Rscale = kwargs.get("R_m") - self.v_rest = v_rest # mV - self.v_reset = v_reset # mV (milli-volts) - self.v_decay = v_decay - ## basic asserts to prevent neuronal dynamics breaking... - assert (self.v_decay * self.dt / self.tau_m) <= 1. - assert self.R_m > 0. - self.tau_theta = tau_theta ## threshold time constant # ms (0 turns off) - self.theta_plus = theta_plus ## threshold increment - self.refract_T = refract_time ## refractory period # ms - self.thr = thr ## (fixed) base value for threshold # mV - self.thr_theta_init = thr_theta_init - self.thr_theta0 = thr_theta0 ## initial jittered adaptive threshold values - - ## Component size setup - self.batch_size = 1 - self.n_units = n_units - - ## Compartment setup - restVals = jnp.zeros((self.batch_size, self.n_units)) - self.j_exc = Compartment(restVals) - self.j_inh = Compartment(restVals) - self.v = Compartment(restVals + self.v_rest) - self.s = Compartment(restVals) - self.rfr = Compartment(restVals + self.refract_T) - self.thr_theta = Compartment(None) - - if thr_theta0 is not None: - warn("The argument `thr_theta0` being used is deprecated.") - self._init(thr_theta0) - else: - if self.thr_theta_init is None: - info(self.name, "is using default threshold variable initializer!") - self.thr_theta_init = {"dist": "constant", "value": 0.} - thr_theta0 = initialize_params(None, self.thr_theta_init, (1, self.n_units)) - self._init(thr_theta0) - - def _init(self, thr_theta0): - self.thr_theta.set(thr_theta0) - - @transition(output_compartments=["v", "s", "rfr", "thr_theta"]) - @staticmethod - def advance_state(dt, tau_m, R_m, v_rest, v_reset, v_decay, refract_T, thr, tau_theta, - theta_plus, j_exc, j_inh, v, s, rfr, thr_theta): - #j = j * (tau_m/dt) ## scale electrical current - j = j_exc - j_inh ## sum the excitatory and inhibitory input channels - mask = (rfr >= refract_T) * 1. #numpy.greater_equal(rfr, refract_T) * 1. - ## update voltage / membrane potential - ### note: the ODE is a bit differently formulated here than usual - dv_dt = (v_rest - v) * v_decay * (dt/tau_m) + ((j * R_m) * mask) - v = v + dv_dt ### hard-coded Euler integration - ## obtain action potentials/spikes - s = (v > (thr + thr_theta)) * 1. #numpy.greater_equal(v, thr + thr_theta) * 1. - ## update refractory variables - rfr = (rfr + dt) * (1. - s) - ## perform hyper-polarization of neuronal cells - v = v * (1. - s) + s * v_reset - ## update adaptive threshold variables - theta_decay = jnp.exp(-dt/tau_theta) - thr_theta = thr_theta * theta_decay + s * theta_plus - ## update time-of-last-spike - #tols = (1. - s) * tols + (s * t) - return v, s, rfr, thr_theta #, tols - - @transition(output_compartments=["j_exc", "j_inh", "v", "s", "rfr"]) - @staticmethod - def reset(batch_size, n_units, v_rest, refract_T): - restVals = jnp.zeros((batch_size, n_units)) - j_exc = restVals #+ 0 - j_inh = restVals #+ 0 - v = restVals + v_rest - s = restVals #+ 0 - rfr = restVals + refract_T - return j_exc, j_inh, v, s, rfr #, tols - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, - threshold_theta=self.thr_theta.value) - - def load(self, directory, seeded=False, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self._init( data['threshold_theta'] ) - - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/lava/neurons/__init__.py b/ngclearn/components/lava/neurons/__init__.py deleted file mode 100644 index e28ed0f8..00000000 --- a/ngclearn/components/lava/neurons/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .LIFCell import LIFCell diff --git a/ngclearn/components/lava/synapses/__init__.py b/ngclearn/components/lava/synapses/__init__.py deleted file mode 100644 index bd7f9ea3..00000000 --- a/ngclearn/components/lava/synapses/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .staticSynapse import StaticSynapse -from .hebbianSynapse import HebbianSynapse -from .traceSTDPSynapse import TraceSTDPSynapse diff --git a/ngclearn/components/lava/synapses/hebbianSynapse.py b/ngclearn/components/lava/synapses/hebbianSynapse.py deleted file mode 100644 index c06a3792..00000000 --- a/ngclearn/components/lava/synapses/hebbianSynapse.py +++ /dev/null @@ -1,159 +0,0 @@ -from ngclearn import numpy as jnp -from ngcsimlib.logger import info, warn -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -from ngclearn.utils import tensorstats - -class HebbianSynapse(Component): ## Lava-compliant Hebbian synapse - """ - A synaptic cable that adjusts its efficacies via a two-factor Hebbian adjustment rule. This is a Lava-compliant - synaptic cable that adjusts with a hard-coded form of (stochastic) gradient ascent. - - | --- Synapse Input Compartments: (Takes wired-in signals) --- - | inputs - input (pre-synaptic) stimulus - | --- Synaptic Plasticity Input Compartments: (Takes in wired-in signals) --- - | pre - pre-synaptic signal to drive first term of Hebbian update - | post - post-synaptic signal to drive 2nd term of Hebbian update - | eta - global learning rate (unidimensional/scalar value) - | --- Synapse Output Compartments: (These signals are generated) --- - | outputs - transformed (post-synaptic) signal - | weights - current value matrix of synaptic efficacies (this is post-update if eta > 0) - - Args: - name: the string name of this cell - - dt: integration time constant (ms) - - resist_scale: a fixed scaling factor to apply to synaptic transform - (Default: 1.), i.e., yields: out = ((W * Rscale) * in) + b - - weight_init: a kernel to drive initialization of this synaptic cable's values; - typically a tuple with 1st element as a string calling the name of - initialization to use - - shape: tuple specifying shape of this synaptic cable (usually a 2-tuple - with number of inputs by number of outputs) - - eta: global learning rate - - w_decay: degree to which (L2) synaptic weight decay is applied to the - computed Hebbian adjustment (Default: 0); note that decay is not - applied to any configured biases - - w_bound: maximum weight to softly bound this cable's value matrix to; if - set to 0, then no synaptic value bounding will be applied - - weights: matrix of synaptic weight values to initialize this synapse - component to - - Rscale: DEPRECATED argument (maps to resist_scale) - """ - - # Define Functions - def __init__(self, name, dt, resist_scale=1., weight_init=None, shape=None, - eta=0., w_decay=0., w_bound=1., weights=None, **kwargs): - super().__init__(name, **kwargs) - - ## synaptic plasticity properties and characteristics - self.weight_init = weight_init - self.shape = shape - self.batch_size = 1 - - self.dt = dt - self.Rscale = resist_scale - if kwargs.get("Rscale") is not None: - warn("The argument `Rscale` being used is deprecated.") - self.Rscale = kwargs.get("Rscale") - self.w_bounds = w_bound - self.w_decay = w_decay ## synaptic decay - self.eta0 = eta - - self.inputs = Compartment(None) - self.outputs = Compartment(None) - self.pre = Compartment(None) - self.post = Compartment(None) - self.weights = Compartment(None) - self.eta = Compartment(jnp.ones((1, 1)) * eta) - - if weights is not None: - warn("The argument `weights` being used is deprecated.") - self._init(weights) - else: - assert self.shape is not None ## if using an init, MUST have shape - if self.weight_init is None: - info(self.name, "is using default weight initializer!") - self.weight_init = {"dist": "uniform", "amin": 0.025, - "amax": 0.8} - weights = initialize_params(None, self.weight_init, self.shape) - self._init(weights) - - def _init(self, weights): - self.rows = weights.shape[0] - self.cols = weights.shape[1] - - ## pre-computed empty zero pads - preVals = jnp.zeros((self.batch_size, self.rows)) - postVals = jnp.zeros((self.batch_size, self.cols)) - ## Compartments - self.inputs.set(preVals) - self.outputs.set(postVals) - self.pre.set(preVals) - self.post.set(postVals) - self.weights.set(weights) - - @transition(output_compartments=["outputs", "weights"]) - @staticmethod - def advance_state(dt, Rscale, w_bounds, w_decay, inputs, weights, - pre, post, eta): - outputs = jnp.matmul(inputs, weights) * Rscale - ######################################################################## - ## Run one step of 2-factor Hebbian adaptation online - dW = jnp.matmul(pre.T, post) - #db = jnp.sum(_post, axis=0, keepdims=True) - ## reformulated bounding flag to be linear algebraic - flag = (w_bounds > 0.) * 1. - dW = (dW * (w_bounds - jnp.abs(weights))) * flag + (dW) * (1. - flag) - ## add small amount of synaptic decay - weights = weights + (dW - weights * w_decay) * eta - weights = jnp.clip(weights, 0., w_bounds) - ######################################################################## - return outputs, weights - - @transition(output_compartments=["inputs", "outputs", "pre", "post", "eta"]) - @staticmethod - def reset(batch_size, rows, cols, eta0): - preVals = jnp.zeros((batch_size, rows)) - postVals = jnp.zeros((batch_size, cols)) - return ( - preVals, # inputs - postVals, # outputs - preVals, # pre - postVals, # post - jnp.ones((1,1)) * eta0 - ) - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self._init( data['weights'] ) - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/lava/synapses/staticSynapse.py b/ngclearn/components/lava/synapses/staticSynapse.py deleted file mode 100755 index 20f39ebe..00000000 --- a/ngclearn/components/lava/synapses/staticSynapse.py +++ /dev/null @@ -1,122 +0,0 @@ -from ngclearn import numpy as jnp -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info, warn -from ngclearn.components.synapses.hebbian import TraceSTDPSynapse -from ngclearn.utils import tensorstats - -class StaticSynapse(Component): ## Lava-compliant fixed/non-evolvable synapse - """ - A static (dense) synaptic cable; no form of synaptic evolution/adaptation is in-built to this component. This a - Lava-compliant version of the static synapse component from the synapses sub-package of components. - - | --- Synapse Input Compartments: (Takes wired-in signals) --- - | inputs - input (pre-synaptic) stimulus - | --- Synapse Output Compartments: .set()ese signals are generated) --- - | outputs - transformed (post-synaptic) signal - | weights - current value matrix of synaptic efficacies (this is post-update if eta > 0) - - Args: - name: the string name of this cell - - dt: integration time constant (ms) - - weight_init: a kernel to drive initialization of this synaptic cable's values; - typically a tuple with 1st element as a string calling the name of - initialization to use - - shape: tuple specifying shape of this synaptic cable (usually a 2-tuple - with number of inputs by number of outputs) - - resist_scale: a fixed scaling factor to apply to synaptic transform - (Default: 1.), i.e., yields: out = ((W * Rscale) * in) + b - - Rscale: DEPRECATED argument (maps to resist_scale) - - weights: a provided, externally created weight value matrix that will - be used instead of an auto-init call - """ - - # Define Functions - def __init__(self, name, dt, weight_init=None, shape=None, resist_scale=1., - weights=None, **kwargs): - super().__init__(name, **kwargs) - - ## synaptic plasticity properties and characteristics - self.batch_size = 1 - self.dt = dt - self.Rscale = resist_scale - if kwargs.get("Rscale") is not None: - warn("The argument `Rscale` being used is deprecated.") - self.Rscale = kwargs.get("Rscale") - self.shape = shape - self.weight_init = weight_init - - self.inputs = Compartment(None) - self.outputs = Compartment(None) - self.weights = Compartment(None) - - if weights is not None: - warn("The argument `weights` being used is deprecated.") - self._init(weights) - else: - assert self.shape is not None ## if using an init, MUST have shape - if self.weight_init is None: - info(self.name, "is using default weight initializer!") - self.weight_init = {"dist": "uniform", "amin": 0.025, - "amax": 0.8} - weights = initialize_params(None, self.weight_init, self.shape) - self._init(weights) - - def _init(self, weights): - self.rows = weights.shape[0] - self.cols = weights.shape[1] - ## pre-computed empty zero pads - preVals = jnp.zeros((self.batch_size, self.rows)) - postVals = jnp.zeros((self.batch_size, self.cols)) - ## Compartments - self.inputs.set(preVals) - self.outputs.set(postVals) - self.weights.set(weights) - - @transition(output_compartments=["outputs"]) - @staticmethod - def advance_state(dt, Rscale, inputs, weights): - outputs = jnp.matmul(inputs, weights) * Rscale - return outputs - - @transition(output_compartments=["inputs", "outputs"]) - @staticmethod - def reset(batch_size, rows, cols): - preVals = jnp.zeros((batch_size, rows)) - postVals = jnp.zeros((batch_size, cols)) - return ( - preVals, # inputs - postVals, # outputs - ) - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self._init( data['weights'] ) - - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/lava/synapses/traceSTDPSynapse.py b/ngclearn/components/lava/synapses/traceSTDPSynapse.py deleted file mode 100755 index 23a3287d..00000000 --- a/ngclearn/components/lava/synapses/traceSTDPSynapse.py +++ /dev/null @@ -1,181 +0,0 @@ -from ngclearn import numpy as jnp -from ngcsimlib.logger import info, warn -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -from ngclearn.utils import tensorstats - -class TraceSTDPSynapse(Component): ## Lava-compliant trace-STDP synapse - """ - A synaptic cable that adjusts its efficacies via trace-based form of spike-timing-dependent plasticity (STDP). - This is a Lava-compliant synaptic cable that adjusts with a hard-coded form of (stochastic) gradient ascent. - - | --- Synapse Input Compartments: (Takes wired-in signals) --- - | inputs - input (pre-synaptic) stimulus - | --- Synaptic Plasticity Input Compartments: (Takes in wired-in signals) --- - | pre - pre-synaptic spike(s) to drive STDP update - | x_pre - pre-synaptic trace value(s) to drive STDP update - | post - post-synaptic spike(s) to drive STDP update - | x_post - post-synaptic trace value(s) to drive STDP update - | eta - global learning rate (unidimensional/scalar value) - | --- Synapse Output Compartments: (These signals are generated) --- - | outputs - transformed (post-synaptic) signal - | weights - current value matrix of synaptic efficacies (this is post-update if eta > 0) - - Args: - name: the string name of this cell - - dt: integration time constant (ms) - - resist_scale: a fixed scaling factor to apply to synaptic transform - (Default: 1.), i.e., yields: out = ((W * Rscale) * in) + b - - weight_init: a kernel to drive initialization of this synaptic cable's values; - typically a tuple with 1st element as a string calling the name of - initialization to use - - shape: tuple specifying shape of this synaptic cable (usually a 2-tuple - with number of inputs by number of outputs) - - Aplus: strength of long-term potentiation (LTP) - - Aminus: strength of long-term depression (LTD) - - eta: global learning rate (default: 1) - - w_decay: degree to which (L2) synaptic weight decay is applied to the - computed Hebbian adjustment (Default: 0); note that decay is not - applied to any configured biases - - w_bound: maximum weight to softly bound this cable's value matrix to; if - set to 0, then no synaptic value bounding will be applied - - preTrace_target: controls degree of pre-synaptic disconnect, i.e., amount of decay - (higher -> lower synaptic values) - - weights: matrix of synaptic weight values to initialize this synapse - component to - - Rscale: DEPRECATED argument (maps to resist_scale) - """ - - # Define Functions - def __init__(self, name, dt, resist_scale=1., weight_init=None, shape=None, - Aplus=0.01, Aminus=0.001, eta=1., w_decay=0., w_bound=1., - preTrace_target=0., weights=None, **kwargs): - super().__init__(name, **kwargs) - - ## synaptic plasticity properties and characteristics - self.weight_init = weight_init - self.shape = shape - self.dt = dt - self.Rscale = resist_scale - if kwargs.get("Rscale") is not None: - warn("The argument `Rscale` being used is deprecated.") - self.Rscale = kwargs.get("Rscale") - self.w_bounds = w_bound - self.w_decay = w_decay ## synaptic decay - self.eta0 = eta - self.Aplus = Aplus - self.Aminus = Aminus - self.x_tar = preTrace_target - - ## Component size setup - self.batch_size = 1 - - self.eta = Compartment(jnp.ones((1, 1)) * eta) - - self.inputs = Compartment(None) - self.outputs = Compartment(None) - self.pre = Compartment(None) ## pre-synaptic spike - self.x_pre = Compartment(None) ## pre-synaptic trace - self.post = Compartment(None) ## post-synaptic spike - self.x_post = Compartment(None) ## post-synaptic trace - self.weights = Compartment(None) - - if weights is not None: - warn("The argument `weights` being used is deprecated.") - self._init(weights) - else: - assert self.shape is not None ## if using an init, MUST have shape - if self.weight_init is None: - info(self.name, "is using default weight initializer!") - self.weight_init = {"dist": "uniform", "amin": 0.025, - "amax": 0.8} - weights = initialize_params(None, self.weight_init, self.shape) - self._init(weights) - - def _init(self, weights): - self.rows = weights.shape[0] - self.cols = weights.shape[1] - ## pre-computed empty zero pads - preVals = jnp.zeros((self.batch_size, self.rows)) - postVals = jnp.zeros((self.batch_size, self.cols)) - ## Compartments - self.inputs.set(preVals) - self.outputs.set(postVals) - self.pre.set(preVals) ## pre-synaptic spike - self.x_pre.set(preVals) ## pre-synaptic trace - self.post.set(postVals) ## post-synaptic spike - self.x_post.set(postVals) ## post-synaptic trace - self.weights.set(weights) - - @transition(output_compartments=["outputs", "weights"]) - @staticmethod - def advance_state(dt, Rscale, Aplus, Aminus, w_bounds, w_decay, x_tar, - inputs, weights, pre, x_pre, post, x_post, eta): - outputs = jnp.matmul(inputs, weights) * Rscale - ######################################################################## - ## Run one step of STDP online - dWpost = jnp.matmul((x_pre - x_tar).T, post * Aplus) - dWpre = -jnp.matmul(pre.T, x_post * Aminus) - dW = dWpost + dWpre - ## reformulated bounding flag to be linear algebraic - flag = (w_bounds > 0.) * 1. - dW = (dW * (w_bounds - jnp.abs(weights))) * flag + (dW) * (1. - flag) - ## physically adjust synapses - weights = weights + (dW - weights * w_decay) * eta - #weights = weights + (dW - weights * w_decay) * dt/tau_w ## ODE format - weights = jnp.clip(weights, 0., w_bounds) - ######################################################################## - return outputs, weights - - @transition(output_compartments=["inputs", "outputs", "pre", "post", "x_pre", "x_post", "eta"]) - @staticmethod - def reset(batch_size, rows, cols, eta0): - preVals = jnp.zeros((batch_size, rows)) - postVals = jnp.zeros((batch_size, cols)) - return ( - preVals, # inputs - postVals, # outputs - preVals, # pre - postVals, # post - preVals, # x_pre - postVals, # x_post - jnp.ones((1, 1)) * eta0 - ) - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self._init( data['weights'] ) - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/lava/traces/__init__.py b/ngclearn/components/lava/traces/__init__.py deleted file mode 100755 index 5dc901bf..00000000 --- a/ngclearn/components/lava/traces/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .gatedTrace import GatedTrace diff --git a/ngclearn/components/lava/traces/gatedTrace.py b/ngclearn/components/lava/traces/gatedTrace.py deleted file mode 100755 index 941fe061..00000000 --- a/ngclearn/components/lava/traces/gatedTrace.py +++ /dev/null @@ -1,69 +0,0 @@ -from ngclearn import numpy as jnp -from ngcsimlib.logger import info, warn -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -from ngclearn.utils import tensorstats - -class GatedTrace(Component): ## gated/piecewise low-pass filter - """ - A gated/piecewise variable trace (filter). This is a Lava-compliant trace component. - - | --- Cell Input Compartments: (Takes wired-in signals) --- - | inputs - input (takes wired-in external signals) - | --- Cell Output Compartments: (These signals are generated) --- - | trace - traced value signal - - Args: - name: the string name of this operator - - n_units: number of calculating entities or units - - dt: integration time constant (ms) - - tau_tr: trace time constant (in milliseconds, or ms) - """ - - # Define Functions - def __init__(self, name, n_units, dt, tau_tr, **kwargs): - super().__init__(name, **kwargs) - - ## trace control coefficients - self.dt = dt - self.tau_tr = tau_tr ## trace time constant - - ## Layer size setup - self.batch_size = 1 - self.n_units = n_units - - restVals = jnp.zeros((self.batch_size, self.n_units)) - self.inputs = Compartment(restVals) # input compartment - self.trace = Compartment(restVals) - - @transition(output_compartments=["trace"]) - @staticmethod - def advance_state(dt, tau_tr, inputs, trace): - trace = (trace * (1. - dt/tau_tr)) * (1. - inputs) + inputs - return trace - - @transition(output_compartments=["inputs", "trace"]) - @staticmethod - def reset(batch_size, n_units): - restVals = jnp.zeros((batch_size, n_units)) - return restVals, restVals - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/monitor.py b/ngclearn/components/monitor.py deleted file mode 100644 index 3b373cf3..00000000 --- a/ngclearn/components/monitor.py +++ /dev/null @@ -1,31 +0,0 @@ -from ngclearn.components.base_monitor import Base_Monitor -from ngclearn import transition - -class Monitor(Base_Monitor): - """ - A jax implementation of `Base_Monitor`. Designed to be used with all - non-lava ngclearn components - """ - auto_resolve = False - - @staticmethod - def _record_internal(compartments): - @staticmethod - def _record(**kwargs): - return_vals = [] - for comp in compartments: - new_val = kwargs[comp] - current_store = kwargs[comp + "*store"] - current_store = current_store.at[:-1].set(current_store[1:]) - current_store = current_store.at[-1].set(new_val) - return_vals.append(current_store) - return return_vals if len(compartments) > 1 else return_vals[0] - return _record - - @staticmethod - def build_advance_state(component): - return super().build_advance_state(component) - - @staticmethod - def build_reset(component): - return super().build_reset(component) diff --git a/ngclearn/components/neurons/__init__.py b/ngclearn/components/neurons/__init__.py index e7165d7e..564577cd 100644 --- a/ngclearn/components/neurons/__init__.py +++ b/ngclearn/components/neurons/__init__.py @@ -1,5 +1,6 @@ ## point to rate-coded cell componet types from .graded.rateCell import RateCell +from .graded.leakyNoiseCell import LeakyNoiseCell from .graded.gaussianErrorCell import GaussianErrorCell from .graded.laplacianErrorCell import LaplacianErrorCell from .graded.bernoulliErrorCell import BernoulliErrorCell @@ -15,3 +16,4 @@ from .spiking.izhikevichCell import IzhikevichCell from .spiking.hodgkinHuxleyCell import HodgkinHuxleyCell from .spiking.RAFCell import RAFCell + diff --git a/ngclearn/components/neurons/graded/__init__.py b/ngclearn/components/neurons/graded/__init__.py index bde64b39..2974d91f 100644 --- a/ngclearn/components/neurons/graded/__init__.py +++ b/ngclearn/components/neurons/graded/__init__.py @@ -1,6 +1,8 @@ -## point to rate-coded cell componet types +## point to rate-coded cell component types from .rateCell import RateCell +from .leakyNoiseCell import LeakyNoiseCell from .gaussianErrorCell import GaussianErrorCell from .laplacianErrorCell import LaplacianErrorCell from .bernoulliErrorCell import BernoulliErrorCell from .rewardErrorCell import RewardErrorCell + diff --git a/ngclearn/components/neurons/graded/bernoulliErrorCell.py b/ngclearn/components/neurons/graded/bernoulliErrorCell.py index 6bf0ebe6..978aa1ce 100755 --- a/ngclearn/components/neurons/graded/bernoulliErrorCell.py +++ b/ngclearn/components/neurons/graded/bernoulliErrorCell.py @@ -1,14 +1,16 @@ -from ngclearn import resolver, Component, Compartment +# %% + from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, jit -from ngclearn.utils import tensorstats from ngclearn.utils.model_utils import sigmoid, d_sigmoid -from ngcsimlib.compilers.process import transition + +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment class BernoulliErrorCell(JaxComponent): ## Rate-coded/real-valued error unit/cell """ A simple (non-spiking) Bernoulli error cell - this is a fixed-point solution - of a mismatch signal. Specifically, this cell operates as a factorized multivariate + of a mismatch signal. Specifically, this cell operates as a factorized multivariate Bernoulli distribution. | --- Cell Input Compartments: --- @@ -59,14 +61,20 @@ def __init__(self, name, n_units, batch_size=1, input_logits=False, shape=None, self.modulator = Compartment(restVals + 1.0) # to be set/consumed self.mask = Compartment(restVals + 1.0) - @transition(output_compartments=["dp", "dtarget", "L", "mask"]) - @staticmethod - def advance_state(dt, p, target, modulator, mask, input_logits): ## compute Bernoulli error cell output + # @transition(output_compartments=["dp", "dtarget", "L", "mask"]) + @compilable + def advance_state(self, dt): ## compute Bernoulli error cell output + # Get the variables + p = self.p.get() + target = self.target.get() + modulator = self.modulator.get() + mask = self.mask.get() + # Moves Bernoulli error cell dynamics one step forward. Specifically, this routine emulates the error unit # behavior of the local cost functional eps = 0.0001 _p = p - if input_logits: ## convert from "logits" to probs via sigmoidal link function + if self.input_logits: ## convert from "logits" to probs via sigmoidal link function _p = sigmoid(p) _p = jnp.clip(_p, eps, 1. - eps) ## post-process to prevent div by 0 x = target @@ -78,7 +86,7 @@ def advance_state(dt, p, target, modulator, mask, input_logits): ## compute Bern log_p = jnp.log(_p) ## ln(p) log_one_min_p = jnp.log(one_min_p) ## ln(1 - p) L = jnp.sum(log_p * x + log_one_min_p * one_min_x) ## Bern LL - if input_logits: + if self.input_logits: dL_dp = x - _p ## d(Bern LL)/dp where _p = sigmoid(p) else: dL_dp = x/(_p) - one_min_x/one_min_p ## d(Bern LL)/dp @@ -89,14 +97,21 @@ def advance_state(dt, p, target, modulator, mask, input_logits): ## compute Bern dp = dp * modulator * mask ## NOTE: how does mask apply to a multivariate Bernoulli? dtarget = dL_dx * modulator * mask mask = mask * 0. + 1. ## "eat" the mask as it should only apply at time t - return dp, dtarget, jnp.squeeze(L), mask - - @transition(output_compartments=["dp", "dtarget", "target", "p", "modulator", "L", "mask"]) - @staticmethod - def reset(batch_size, shape): ## reset core components/statistics - _shape = (batch_size, shape[0]) - if len(shape) > 1: - _shape = (batch_size, shape[0], shape[1], shape[2]) + + # Set state + # dp, dtarget, jnp.squeeze(L), mask + self.dp.set(dp) + self.dtarget.set(dtarget) + self.L.set(jnp.squeeze(L)) + self.mask.set(mask) + + + # @transition(output_compartments=["dp", "dtarget", "target", "p", "modulator", "L", "mask"]) + @compilable + def reset(self): ## reset core components/statistics + _shape = (self.batch_size, self.shape[0]) + if len(self.shape) > 1: + _shape = (self.batch_size, self.shape[0], self.shape[1], self.shape[2]) restVals = jnp.zeros(_shape) ## "rest"/reset values dp = restVals dtarget = restVals @@ -105,7 +120,16 @@ def reset(batch_size, shape): ## reset core components/statistics modulator = restVals + 1. ## reset modulator signal L = 0. #jnp.zeros((1, 1)) ## rest loss mask = jnp.ones(_shape) ## reset mask - return dp, dtarget, target, p, modulator, L, mask + + # Set compartment + self.dp.set(dp) + self.dtarget.set(dtarget) + self.target.set(target) + self.p.set(p) + self.modulator.set(modulator) + self.L.set(L) + self.mask.set(mask) + @classmethod def help(cls): ## component help function @@ -135,20 +159,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/graded/gaussianErrorCell.py b/ngclearn/components/neurons/graded/gaussianErrorCell.py index 29b5f267..776dad46 100755 --- a/ngclearn/components/neurons/graded/gaussianErrorCell.py +++ b/ngclearn/components/neurons/graded/gaussianErrorCell.py @@ -1,8 +1,9 @@ -from ngclearn import resolver, Component, Compartment +# %% + from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, jit -from ngclearn.utils import tensorstats -from ngcsimlib.compilers.process import transition +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment class GaussianErrorCell(JaxComponent): ## Rate-coded/real-valued error unit/cell """ @@ -71,9 +72,15 @@ def eval_log_density(target, mu, Sigma): log_density = -jnp.sum(jnp.square(_dmu)) * (0.5 / Sigma) return log_density - @transition(output_compartments=["dmu", "dtarget", "dSigma", "L", "mask"]) - @staticmethod - def advance_state(dt, mu, target, Sigma, modulator, mask): ## compute Gaussian error cell output + @compilable + def advance_state(self, dt): ## compute Gaussian error cell output + # Get the variables + mu = self.mu.get() + target = self.target.get() + Sigma = self.Sigma.get() + modulator = self.modulator.get() + mask = self.mask.get() + # Moves Gaussian cell dynamics one step forward. Specifically, this routine emulates the error unit # behavior of the local cost functional: # FIXME: Currently, below does: L(targ, mu) = -(1/(2*sigma)) * ||targ - mu||^2_2 @@ -90,24 +97,39 @@ def advance_state(dt, mu, target, Sigma, modulator, mask): ## compute Gaussian e dmu = dmu * modulator * mask ## not sure how mask will apply to a full covariance... dtarget = dtarget * modulator * mask mask = mask * 0. + 1. ## "eat" the mask as it should only apply at time t - return dmu, dtarget, dSigma, jnp.squeeze(L), mask - @transition(output_compartments=["dmu", "dtarget", "dSigma", "target", "mu", "modulator", "L", "mask"]) - @staticmethod - def reset(batch_size, shape, sigma_shape): ## reset core components/statistics - _shape = (batch_size, shape[0]) - if len(shape) > 1: - _shape = (batch_size, shape[0], shape[1], shape[2]) + # Update compartments + self.dmu.set(dmu) + self.dtarget.set(dtarget) + self.dSigma.set(dSigma) + self.L.set(jnp.squeeze(L)) + self.mask.set(mask) + + # @transition(output_compartments=["dmu", "dtarget", "dSigma", "target", "mu", "modulator", "L", "mask"]) + # @staticmethod + @compilable + def reset(self): ## reset core components/statistics + _shape = (self.batch_size, self.shape[0]) + if len(self.shape) > 1: + _shape = (self.batch_size, self.shape[0], self.shape[1], self.shape[2]) restVals = jnp.zeros(_shape) dmu = restVals dtarget = restVals - dSigma = jnp.zeros(sigma_shape) + dSigma = jnp.zeros(self.sigma_shape) target = restVals mu = restVals modulator = mu + 1. L = 0. #jnp.zeros((1, 1)) mask = jnp.ones(_shape) - return dmu, dtarget, dSigma, target, mu, modulator, L, mask + + self.dmu.set(dmu) + self.dtarget.set(dtarget) + self.dSigma.set(dSigma) + self.target.set(target) + self.mu.set(mu) + self.modulator.set(modulator) + self.L.set(L) + self.mask.set(mask) @classmethod def help(cls): ## component help function @@ -139,20 +161,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/graded/laplacianErrorCell.py b/ngclearn/components/neurons/graded/laplacianErrorCell.py index 6d825fe0..c881372b 100755 --- a/ngclearn/components/neurons/graded/laplacianErrorCell.py +++ b/ngclearn/components/neurons/graded/laplacianErrorCell.py @@ -1,8 +1,9 @@ -from ngclearn import resolver, Component, Compartment +# %% + from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, jit -from ngclearn.utils import tensorstats -from ngcsimlib.compilers.process import transition +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment class LaplacianErrorCell(JaxComponent): ## Rate-coded/real-valued error unit/cell """ @@ -33,7 +34,6 @@ class LaplacianErrorCell(JaxComponent): ## Rate-coded/real-valued error unit/cel to a constant/fixed `scale` """ - # Define Functions def __init__(self, name, n_units, batch_size=1, scale=1., shape=None, **kwargs): super().__init__(name, **kwargs) @@ -44,7 +44,7 @@ def __init__(self, name, n_units, batch_size=1, scale=1., shape=None, **kwargs): else: _shape = (batch_size, shape[0], shape[1], shape[2]) ## shape is 4D tensor scale_shape = (1, 1) - if not isinstance(scale, float) and not isinstance(sigma, int): + if not isinstance(scale, float) and not isinstance(scale, int): scale_shape = jnp.array(scale).shape self.scale_shape = scale_shape ## Layer Size setup @@ -67,9 +67,15 @@ def __init__(self, name, n_units, batch_size=1, scale=1., shape=None, **kwargs): self.modulator = Compartment(restVals + 1.0) ## to be set/consumed self.mask = Compartment(restVals + 1.0) - @transition(output_compartments=["dshift", "dtarget", "dScale", "L", "mask"]) - @staticmethod - def advance_state(dt, shift, target, Scale, modulator, mask): ## compute Laplacian error cell output + @compilable + def advance_state(self, dt): ## compute Laplacian error cell output + # Get the variables + shift = self.shift.get() + target = self.target.get() + Scale = self.Scale.get() + modulator = self.modulator.get() + mask = self.mask.get() + # Moves Laplacian cell dynamics one step forward. Specifically, this routine emulates the error unit # behavior of the local cost functional: # FIXME: Currently, below does: L(targ, shift) = -||targ - shift||_1/scale @@ -85,21 +91,34 @@ def advance_state(dt, shift, target, Scale, modulator, mask): ## compute Laplaci dshift = dshift * modulator * mask dtarget = dtarget * modulator * mask mask = mask * 0. + 1. ## "eat" the mask as it should only apply at time t - return dshift, dtarget, dScale, jnp.squeeze(L), mask - @transition(output_compartments=["dshift", "dtarget", "dScale", "target", "shift", "modulator", "L", "mask"]) - @staticmethod - def reset(batch_size, n_units, scale_shape): - restVals = jnp.zeros((batch_size, n_units)) + # Update compartments + self.dshift.set(dshift) + self.dtarget.set(dtarget) + self.dScale.set(dScale) + self.L.set(jnp.squeeze(L)) + self.mask.set(mask) + + @compilable + def reset(self): ## reset core components/statistics + restVals = jnp.zeros((self.batch_size, self.n_units)) dshift = restVals dtarget = restVals - dScale = jnp.zeros(scale_shape) + dScale = jnp.zeros(self.scale_shape) target = restVals shift = restVals modulator = shift + 1. L = 0. - mask = jnp.ones((batch_size, n_units)) - return dshift, dtarget, dScale, target, shift, modulator, L, mask + mask = jnp.ones((self.batch_size, self.n_units)) + + self.dshift.set(dshift) + self.dtarget.set(dtarget) + self.dScale.set(dScale) + self.target.set(target) + self.shift.set(shift) + self.modulator.set(modulator) + self.L.set(L) + self.mask.set(mask) @classmethod def help(cls): ## component help function @@ -130,20 +149,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/graded/leakyNoiseCell.py b/ngclearn/components/neurons/graded/leakyNoiseCell.py new file mode 100755 index 00000000..85c4cd03 --- /dev/null +++ b/ngclearn/components/neurons/graded/leakyNoiseCell.py @@ -0,0 +1,157 @@ +from jax import numpy as jnp, random, jit +from ngcsimlib.logger import info +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +from ngclearn.components.jaxComponent import JaxComponent +from ngclearn.utils.model_utils import create_function +from ngclearn.utils.diffeq.ode_utils import get_integrator_code, step_euler, step_rk2, step_rk4 + +def _dfz_fn(z, j_input, j_recurrent, eps, tau_x, sigma_rec, leak_scale): ## raw dynamics ODE + dz_dt = -(z * leak_scale) + (j_recurrent + j_input) + jnp.sqrt(2. * tau_x * jnp.square(sigma_rec)) * eps + return dz_dt * (1. / tau_x) + +def _dfz(t, z, params): ## raw dynamics ODE wrapper + j_input, j_recurrent, eps, tau_x, sigma_rec, leak_scale = params + return _dfz_fn(z, j_input, j_recurrent, eps, tau_x, sigma_rec, leak_scale) + +class LeakyNoiseCell(JaxComponent): ## Real-valued, leaky noise cell + """ + A non-spiking cell driven by the gradient dynamics entailed by a continuous-time noisy, leaky recurrent state. + + Reference: https://pmc.ncbi.nlm.nih.gov/articles/PMC4771709/ + + The specific differential equation that characterizes this cell is (for adjusting x) is: + + | tau_x * dx/dt = -x + j_rec + j_in + sqrt(2 alpha (sigma_rec)^2) * eps + | where j_in is the set of incoming input signals + | and j_rec is the set of recurrent input signals + | and eps is a sample of unit Gaussian noise, i.e., eps ~ N(0, 1) + + | --- Cell Input Compartments: --- + | j_input - input (bottom-up) electrical/stimulus current (takes in external signals) + | j_recurrent - recurrent electrical/stimulus pressure + | --- Cell State Compartments --- + | x - noisy rate activity / current value of state + | --- Cell Output Compartments: --- + | r - post-rectified activity, i.e., fx(x) = relu(x) + + Args: + name: the string name of this cell + + n_units: number of cellular entities (neural population size) + + tau_x: state membrane time constant (milliseconds) + + act_fx: rectification function (Default: "relu") + + output_scale: factor to multiply output of nonlinearity of this cell by (Default: 1.) + + integration_type: type of integration to use for this cell's dynamics; + current supported forms include "euler" (Euler/RK-1 integration) and "midpoint" or "rk2" + (midpoint method/RK-2 integration) (Default: "euler") + + :Note: setting the integration type to the midpoint method will increase the accuracy of the estimate of + the cell's evolution at an increase in computational cost (and simulation time) + + sigma_rec: noise scaling factor / standard deviation (Default: 1) + """ + + # Define Functions + def __init__( + self, name, n_units, tau_x, act_fx="relu", integration_type="euler", batch_size=1, sigma_rec=1., + leak_scale=1., shape=None, **kwargs + ): + super().__init__(name, **kwargs) + + + self.tau_x = tau_x + self.sigma_rec = sigma_rec ## a "resistance" scaling factor + self.leak_scale = leak_scale ## the leak scaling factor (most appropriate default is 1) + + ## integration properties + self.integrationType = integration_type + self.intgFlag = get_integrator_code(self.integrationType) + + ## Layer size setup + _shape = (batch_size, n_units) ## default shape is 2D/matrix + if shape is None: + shape = (n_units,) ## we set shape to be equal to n_units if nothing provided + else: + _shape = (batch_size, shape[0], shape[1], shape[2]) ## shape is 4D tensor + self.shape = shape + self.n_units = n_units + self.batch_size = batch_size + + self.fx, self.dfx = create_function(fun_name=act_fx) + + # compartments (state of the cell & parameters will be updated through stateless calls) + restVals = jnp.zeros(_shape) + self.j_input = Compartment(restVals, display_name="Input Stimulus Current", units="mA") # electrical current + self.j_recurrent = Compartment(restVals, display_name="Recurrent Stimulus Current", units="mA") # electrical current + self.x = Compartment(restVals, display_name="Rate Activity", units="mA") # rate activity + self.r = Compartment(restVals, display_name="Rectified Rate Activity") # rectified output + + @compilable + def advance_state(self, t, dt): + ### run a step of integration over neuronal dynamics + key, skey = random.split(self.key.get(), 2) + eps = random.normal(skey, shape=self.x.get().shape) ## sample of unit distributional noise + + #x = _run_cell(dt, self.j_input.get(), self.j_recurrent.get(), self.x.get(), eps, self.tau_x, self.sigma_rec, integType=self.intgFlag) + _step_fns = { + 0: step_euler, + 1: step_rk2, + 2: step_rk4, + } + _step_fn = _step_fns[self.intgFlag] #_step_fns.get(self.intgFlag, step_euler) + params = (self.j_input.get(), self.j_recurrent.get(), eps, self.tau_x, self.sigma_rec, self.leak_scale) + _, x = _step_fn(0., self.x.get(), _dfz, dt, params) ## update state activation dynamics + r = self.fx(x) ## calculate rectified / post-activation function value(s) + + ## set compartments to next state values in accordance with dynamics + self.key.set(key) + self.x.set(x) + self.r.set(r) + + @compilable + def reset(self): + _shape = (self.batch_size, self.shape[0]) + if len(self.shape) > 1: + _shape = (self.batch_size, self.shape[0], self.shape[1], self.shape[2]) + restVals = jnp.zeros(_shape) + self.j_input.set(restVals) + self.j_recurrent.set(restVals) + self.x.set(restVals) + self.r.set(restVals) + + @classmethod + def help(cls): ## component help function + properties = { + "cell_type": "LeakyNoiseCell - evolves neurons according to continuous-time noisy/leaky dynamics " + } + compartment_props = { + "inputs": + {"j_input": "External input stimulus value(s)", + "j_recurrent": "Recurrent/prior-state stimulus value(s)"}, + "states": + {"x": "Update to continuous noisy, leaky dynamics; value at time t"}, + "outputs": + {"r": "A linear rectifier applied to rate-coded dynamics; f(z)"}, + } + hyperparams = { + "n_units": "Number of neuronal cells to model in this layer", + "batch_size": "Batch size dimension of this component", + "tau_x": "State time constant", + "sigma_rec": "The non-zero degree/scale of noise to inject into this neuron" + } + info = {cls.__name__: properties, + "compartments": compartment_props, + "dynamics": "tau_x * dz/dt = -z + j_input + j_recurrent + noise, where noise ~N(0, sigma_rec)", + "hyperparameters": hyperparams} + return info + +if __name__ == '__main__': + from ngcsimlib.context import Context + with Context("Bar") as bar: + X = LeakyNoiseCell("X", 9, 0.03) + print(X) diff --git a/ngclearn/components/neurons/graded/rateCell.py b/ngclearn/components/neurons/graded/rateCell.py index e55ce8ff..f70b0f52 100755 --- a/ngclearn/components/neurons/graded/rateCell.py +++ b/ngclearn/components/neurons/graded/rateCell.py @@ -1,16 +1,16 @@ # %% from jax import numpy as jnp, random, jit -from functools import partial -from ngclearn.utils import tensorstats -# from ngclearn import resolver, Component, Compartment -from ngcsimlib.compartment import Compartment -from ngcsimlib.compilers.process import transition + +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngclearn.components.jaxComponent import JaxComponent from ngclearn.utils.model_utils import create_function, threshold_soft, \ threshold_cauchy from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ step_euler, step_rk2, step_rk4 +from ngcsimlib.logger import info + def _dfz_internal_laplace(z, j, j_td, tau_m, leak_gamma): ## raw dynamics z_leak = jnp.sign(z) ## d/dx of Laplace is signum @@ -158,11 +158,12 @@ class RateCell(JaxComponent): ## Rate-coded/real-valued cell resist_scale: a scaling factor applied to incoming pressure `j` (default: 1) """ - # Define Functions def __init__( self, name, n_units, tau_m, prior=("gaussian", 0.), act_fx="identity", output_scale=1., threshold=("none", 0.), integration_type="euler", batch_size=1, resist_scale=1., shape=None, is_stateful=True, **kwargs): - super().__init__(name, **kwargs) + jax_comp_kwargs = {k: v for k, v in kwargs.items() if k not in ('omega_0',)} + this_class_kwargs = {k: v for k, v in kwargs.items() if k in ('omega_0',)} + super().__init__(name, **jax_comp_kwargs) ## membrane parameter setup (affects ODE integration) self.output_scale = output_scale @@ -199,10 +200,9 @@ def __init__( self.n_units = n_units self.batch_size = batch_size - omega_0 = None if act_fx == "sine": - omega_0 = kwargs["omega_0"] + omega_0 = this_class_kwargs["omega_0"] self.fx, self.dfx = create_function(fun_name=act_fx, args=omega_0) # compartments (state of the cell & parameters will be updated through stateless calls) @@ -212,70 +212,79 @@ def __init__( self.j_td = Compartment(restVals, display_name="Modulatory Stimulus Current", units="mA") # top-down electrical current - pressure self.z = Compartment(restVals, display_name="Rate Activity", units="mA") # rate activity - @transition(output_compartments=["j", "j_td", "z", "zF"]) - @staticmethod - def advance_state( - dt, fx, dfx, tau_m, priorLeakRate, intgFlag, priorType, resist_scale, thresholdType, thr_lmbda, is_stateful, - output_scale, j, j_td, z): + @compilable + def advance_state(self, dt): + # Get the compartment values + j = self.j.get() + j_td = self.j_td.get() + z = self.z.get() + #if tau_m > 0.: - if is_stateful: + if self.is_stateful: ### run a step of integration over neuronal dynamics ## Notes: ## self.pressure <-- "top-down" expectation / contextual pressure ## self.current <-- "bottom-up" data-dependent signal - dfx_val = dfx(z) + dfx_val = self.dfx(z) j = _modulate(j, dfx_val) - j = j * resist_scale - tmp_z = _run_cell(dt, j, j_td, z, - tau_m, leak_gamma=priorLeakRate, - integType=intgFlag, priorType=priorType) + j = j * self.resist_scale + tmp_z = _run_cell( + dt, j, j_td, z, self.tau_m, leak_gamma=self.priorLeakRate, integType=self.intgFlag, + priorType=self.priorType + ) ## apply optional thresholding sub-dynamics - if thresholdType == "soft_threshold": - tmp_z = threshold_soft(tmp_z, thr_lmbda) - elif thresholdType == "cauchy_threshold": - tmp_z = threshold_cauchy(tmp_z, thr_lmbda) + if self.thresholdType == "soft_threshold": + tmp_z = threshold_soft(tmp_z, self.thr_lmbda) + elif self.thresholdType == "cauchy_threshold": + tmp_z = threshold_cauchy(tmp_z, self.thr_lmbda) z = tmp_z ## pre-activation function value(s) - zF = fx(z) * output_scale ## post-activation function value(s) + zF = self.fx(z) * self.output_scale ## post-activation function value(s) else: ## run in "stateless" mode (when no membrane time constant provided) j_total = j + j_td z = _run_cell_stateless(j_total) - zF = fx(z) * output_scale - return j, j_td, z, zF - - @transition(output_compartments=["j", "j_td", "z", "zF"]) - @staticmethod - def reset(batch_size, shape): #n_units - _shape = (batch_size, shape[0]) - if len(shape) > 1: - _shape = (batch_size, shape[0], shape[1], shape[2]) + zF = self.fx(z) * self.output_scale + + # Update compartments + self.j.set(j) + self.j_td.set(j_td) + self.z.set(z) + self.zF.set(zF) + + @compilable + def reset(self): #, batch_size, shape): #n_units + _shape = (self.batch_size, self.shape[0]) + if len(self.shape) > 1: + _shape = (self.batch_size, self.shape[0], self.shape[1], self.shape[2]) restVals = jnp.zeros(_shape) - return tuple([restVals for _ in range(4)]) - - - def save(self, directory, **kwargs): - ## do a protected save of constants, depending on whether they are floats or arrays - tau_m = (self.tau_m if isinstance(self.tau_m, float) - else jnp.ones([[self.tau_m]])) - priorLeakRate = (self.priorLeakRate if isinstance(self.priorLeakRate, float) - else jnp.ones([[self.priorLeakRate]])) - resist_scale = (self.resist_scale if isinstance(self.resist_scale, float) - else jnp.ones([[self.resist_scale]])) - - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, - tau_m=tau_m, priorLeakRate=priorLeakRate, - resist_scale=resist_scale) #, key=self.key.value) - - def load(self, directory, seeded=False, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - ## constants loaded in - self.tau_m = data['tau_m'] - self.priorLeakRate = data['priorLeakRate'] - self.resist_scale = data['resist_scale'] - #if seeded: - # self.key.set(data['key']) + self.j.set(restVals) + self.j_td.set(restVals) + self.z.set(restVals) + self.zF.set(restVals) + + # def save(self, directory, **kwargs): + # ## do a protected save of constants, depending on whether they are floats or arrays + # tau_m = (self.tau_m if isinstance(self.tau_m, float) + # else jnp.ones([[self.tau_m]])) + # priorLeakRate = (self.priorLeakRate if isinstance(self.priorLeakRate, float) + # else jnp.ones([[self.priorLeakRate]])) + # resist_scale = (self.resist_scale if isinstance(self.resist_scale, float) + # else jnp.ones([[self.resist_scale]])) + # + # file_name = directory + "/" + self.name + ".npz" + # jnp.savez(file_name, + # tau_m=tau_m, priorLeakRate=priorLeakRate, + # resist_scale=resist_scale) #, key=self.key.value) + # + # def load(self, directory, seeded=False, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # data = jnp.load(file_name) + # ## constants loaded in + # self.tau_m = data['tau_m'] + # self.priorLeakRate = data['priorLeakRate'] + # self.resist_scale = data['resist_scale'] + # #if seeded: + # # self.key.set(data['key']) @classmethod def help(cls): ## component help function @@ -308,20 +317,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/graded/rewardErrorCell.py b/ngclearn/components/neurons/graded/rewardErrorCell.py index fe9670c3..91a8056d 100755 --- a/ngclearn/components/neurons/graded/rewardErrorCell.py +++ b/ngclearn/components/neurons/graded/rewardErrorCell.py @@ -1,8 +1,9 @@ -from ngclearn import resolver, Component, Compartment +# %% + from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngclearn.utils import tensorstats +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment class RewardErrorCell(JaxComponent): ## Reward prediction error cell """ @@ -51,38 +52,53 @@ def __init__(self, name, n_units, alpha, ema_window_len=10, self.accum_reward = Compartment(restVals) ## accumulated reward signal(s) self.n_ep_steps = Compartment(jnp.zeros((self.batch_size, 1))) ## number of episode steps taken - @transition(output_compartments=["mu", "rpe", "n_ep_steps", "accum_reward"]) - @staticmethod - def advance_state(dt, use_online_predictor, alpha, mu, rpe, reward, - n_ep_steps, accum_reward): + @compilable + def advance_state(self, dt): + # Get the variables + mu = self.mu.get() + reward = self.reward.get() + n_ep_steps = self.n_ep_steps.get() + accum_reward = self.accum_reward.get() + ## compute/update RPE and predictor values accum_reward = accum_reward + reward rpe = reward - mu - if use_online_predictor: - mu = mu * (1. - alpha) + reward * alpha + if self.use_online_predictor: + mu = mu * (1. - self.alpha) + reward * self.alpha n_ep_steps = n_ep_steps + 1 - return mu, rpe, n_ep_steps, accum_reward - @transition(output_compartments=["mu"]) - @staticmethod - def evolve(dt, use_online_predictor, ema_window_len, n_ep_steps, mu, - accum_reward): - if use_online_predictor: + # Update compartments + self.mu.set(mu) + self.rpe.set(rpe) + self.n_ep_steps.set(n_ep_steps) + self.accum_reward.set(accum_reward) + + @compilable + def evolve(self, dt): + # Get the variables + mu = self.mu.get() + n_ep_steps = self.n_ep_steps.get() + accum_reward = self.accum_reward.get() + + if self.use_online_predictor: ## total episodic reward signal r = accum_reward/n_ep_steps - mu = (1. - 1./ema_window_len) * mu + (1./ema_window_len) * r - return mu + mu = (1. - 1./self.ema_window_len) * mu + (1./self.ema_window_len) * r - @transition(output_compartments=["mu", "rpe", "accum_reward", "n_ep_steps"]) - @staticmethod - def reset(batch_size, n_units): - restVals = jnp.zeros((batch_size, n_units)) + # Update compartment + self.mu.set(mu) + + @compilable + def reset(self): ## reset core components/statistics + restVals = jnp.zeros((self.batch_size, self.n_units)) mu = restVals rpe = restVals accum_reward = restVals - n_ep_steps = jnp.zeros((batch_size, 1)) - return mu, rpe, accum_reward, n_ep_steps - + n_ep_steps = jnp.zeros((self.batch_size, 1)) + self.mu.set(mu) + self.rpe.set(rpe) + self.accum_reward.set(accum_reward) + self.n_ep_steps.set(n_ep_steps) @classmethod def help(cls): ## component help function @@ -115,16 +131,8 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines +if __name__ == '__main__': + from ngcsimlib.context import Context + with Context("Bar") as bar: + X = RewardErrorCell("X", 9, 0.03) + print(X) diff --git a/ngclearn/components/neurons/spiking/IFCell.py b/ngclearn/components/neurons/spiking/IFCell.py index 08416f6d..640d9995 100755 --- a/ngclearn/components/neurons/spiking/IFCell.py +++ b/ngclearn/components/neurons/spiking/IFCell.py @@ -1,18 +1,14 @@ from ngclearn.components.jaxComponent import JaxComponent -from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn +from jax import numpy as jnp, random, nn, Array, jit +from ngcsimlib import deprecate_args from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ step_euler, step_rk2 from ngclearn.utils.surrogate_fx import (secant_lif_estimator, arctan_estimator, triangular_estimator, straight_through_estimator) -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment @jit @@ -35,7 +31,7 @@ class IFCell(JaxComponent): ## integrate-and-fire cell The specific differential equation that characterizes this cell is (for adjusting v, given current j, over time) is: - | tau_m * dv/dt = (v_rest - v) + j * R + | tau_m * dv/dt = j * R | where R is the membrane resistance and v_rest is the resting potential | also, if a spike occurs, v is set to v_reset @@ -91,10 +87,10 @@ class IFCell(JaxComponent): ## integrate-and-fire cell """ @deprecate_args(thr_jitter=None) - def __init__(self, name, n_units, tau_m, resist_m=1., thr=-52., v_rest=-65., - v_reset=-60., refract_time=0., integration_type="euler", - surrogate_type="straight_through", lower_clamp_voltage=True, - **kwargs): + def __init__( + self, name, n_units, tau_m, resist_m=1., thr=-52., v_rest=-65., v_reset=-60., refract_time=0., + integration_type="euler", surrogate_type="straight_through", lower_clamp_voltage=True, **kwargs + ): super().__init__(name, **kwargs) ## Integration properties @@ -118,12 +114,12 @@ def __init__(self, name, n_units, tau_m, resist_m=1., thr=-52., v_rest=-65., self.n_units = n_units ## set up surrogate function for spike emission - if surrogate_type == "arctan": - self.spike_fx, self.d_spike_fx = arctan_estimator() - elif surrogate_type == "triangular": - self.spike_fx, self.d_spike_fx = triangular_estimator() - else: ## default: straight_through - self.spike_fx, self.d_spike_fx = straight_through_estimator() + # if surrogate_type == "arctan": + # self.spike_fx, self.d_spike_fx = arctan_estimator() + # elif surrogate_type == "triangular": + # self.spike_fx, self.d_spike_fx = triangular_estimator() + # else: ## default: straight_through + # self.spike_fx, self.d_spike_fx = straight_through_estimator() ## Compartment setup @@ -136,76 +132,50 @@ def __init__(self, name, n_units, tau_m, resist_m=1., thr=-52., v_rest=-65., display_name="Refractory Time Period", units="ms") self.tols = Compartment(restVals, display_name="Time-of-Last-Spike", units="ms") ## time-of-last-spike - self.surrogate = Compartment(restVals + 1., display_name="Surrogate State Value") + #self.surrogate = Compartment(restVals + 1., display_name="Surrogate State Value") - @transition(output_compartments=["v", "s", "rfr", "tols", "key", "surrogate"]) - @staticmethod + @compilable def advance_state( - t, dt, tau_m, resist_m, v_rest, v_reset, refract_T, thr, lower_clamp_voltage, intgFlag, d_spike_fx, key, - j, v, rfr, tols + self, dt, t ): ## run one integration step for neuronal dynamics - j = j * resist_m + j = self.j.get() * self.resist_m ### Runs integrator (or integrate-and-fire; IF) neuronal dynamics ## update voltage / membrane potential - v_params = (j, rfr, tau_m, refract_T) - if intgFlag == 1: - _, _v = step_rk2(0., v, _dfv, dt, v_params) + v_params = (j, self.rfr.get(), self.tau_m, self.refract_T) + if self.intgFlag == 1: + _, _v = step_rk2(0., self.v.get(), _dfv, dt, v_params) else: - _, _v = step_euler(0., v, _dfv, dt, v_params) + _, _v = step_euler(0., self.v.get(), _dfv, dt, v_params) ## obtain action potentials/spikes - s = (_v > thr) * 1. + s = (_v > self.thr) * 1. ## update refractory variables - rfr = (rfr + dt) * (1. - s) + rfr = (self.rfr.get() + dt) * (1. - s) ## perform hyper-polarization of neuronal cells - v = _v * (1. - s) + s * v_reset + v = _v * (1. - s) + s * self.v_reset + + #surrogate = d_spike_fx(v, self.thr) - surrogate = d_spike_fx(v, thr) ## update tols - tols = (1. - s) * tols + (s * t) - if lower_clamp_voltage: ## ensure voltage never < v_rest - v = jnp.maximum(v, v_rest) - return v, s, rfr, tols, key, surrogate - - @transition(output_compartments=["j", "v", "s", "rfr", "tols", "surrogate"]) - @staticmethod - def reset(batch_size, n_units, v_rest, refract_T): - restVals = jnp.zeros((batch_size, n_units)) - j = restVals #+ 0 - v = restVals + v_rest - s = restVals #+ 0 - rfr = restVals + refract_T - tols = restVals #+ 0 - surrogate = restVals + 1. - return j, v, s, rfr, tols, surrogate - - def save(self, directory, **kwargs): - ## do a protected save of constants, depending on whether they are floats or arrays - tau_m = (self.tau_m if isinstance(self.tau_m, float) - else jnp.asarray([[self.tau_m * 1.]])) - thr = (self.thr if isinstance(self.thr, float) - else jnp.asarray([[self.thr * 1.]])) - v_rest = (self.v_rest if isinstance(self.v_rest, float) - else jnp.asarray([[self.v_rest * 1.]])) - v_reset = (self.v_reset if isinstance(self.v_reset, float) - else jnp.asarray([[self.v_reset * 1.]])) - v_decay = (self.v_decay if isinstance(self.v_decay, float) - else jnp.asarray([[self.v_decay * 1.]])) - resist_m = (self.resist_m if isinstance(self.resist_m, float) - else jnp.asarray([[self.resist_m * 1.]])) - tau_theta = (self.tau_theta if isinstance(self.tau_theta, float) - else jnp.asarray([[self.tau_theta * 1.]])) - theta_plus = (self.theta_plus if isinstance(self.theta_plus, float) - else jnp.asarray([[self.theta_plus * 1.]])) + self.tols.set((1. - s) * self.tols.get() + (s * t)) + if self.lower_clamp_voltage: ## ensure voltage never < v_rest + _v = jnp.maximum(v, self.v_rest) - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, - tau_m=tau_m, thr=thr, v_rest=v_rest, - v_reset=v_reset, v_decay=v_decay, - resist_m=resist_m, tau_theta=tau_theta, - theta_plus=theta_plus, - key=self.key.value) + self.v.set(_v) + self.s.set(s) + self.rfr.set(rfr) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + if not self.j.targeted: + self.j.set(restVals) + self.v.set(restVals + self.v_rest) + self.s.set(restVals) + self.rfr.set(restVals + self.refract_T) + self.tols.set(restVals) + #surrogate = restVals + 1. def load(self, directory, seeded=False, **kwargs): file_name = directory + "/" + self.name + ".npz" @@ -260,17 +230,3 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - diff --git a/ngclearn/components/neurons/spiking/LIFCell.py b/ngclearn/components/neurons/spiking/LIFCell.py index 371e8058..6fedf559 100644 --- a/ngclearn/components/neurons/spiking/LIFCell.py +++ b/ngclearn/components/neurons/spiking/LIFCell.py @@ -1,18 +1,13 @@ from ngclearn.components.jaxComponent import JaxComponent -from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn +from jax import numpy as jnp, random, nn, Array from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ step_euler, step_rk2 from ngclearn.utils.surrogate_fx import (secant_lif_estimator, arctan_estimator, triangular_estimator, straight_through_estimator) -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment def _dfv(t, v, params): ## voltage dynamics wrapper j, rfr, tau_m, refract_T, v_rest, g_L = params @@ -24,7 +19,7 @@ def _dfv(t, v, params): ## voltage dynamics wrapper #@partial(jit, static_argnums=[3, 4]) -def _update_theta(dt, v_theta, s, tau_theta, theta_plus=0.05): +def _update_theta(dt, v_theta, s, tau_theta, theta_plus: Array=0.05): ### Runs homeostatic threshold update dynamics one step (via Euler integration). #theta_decay = 0.9999999 #0.999999762 #jnp.exp(-dt/1e7) #theta_plus = 0.05 @@ -112,23 +107,23 @@ class LIFCell(JaxComponent): ## leaky integrate-and-fire cell v_min: minimum voltage to clamp dynamics to (Default: None) """ ## batch_size arg? - @deprecate_args(thr_jitter=None, v_decay="conduct_leak") def __init__( self, name, n_units, tau_m, resist_m=1., thr=-52., v_rest=-65., v_reset=-60., conduct_leak=1., tau_theta=1e7, theta_plus=0.05, refract_time=5., one_spike=False, integration_type="euler", surrogate_type="straight_through", - v_min=None, max_one_spike=False, **kwargs + v_min=None, max_one_spike=False, key=None ): - super().__init__(name, **kwargs) + super().__init__(name, key) ## Integration properties self.integrationType = integration_type self.intgFlag = get_integrator_code(self.integrationType) + self.one_spike = one_spike ## True => constrains system to simulate 1 spike per time step + self.max_one_spike = max_one_spike ## membrane parameter setup (affects ODE integration) self.tau_m = tau_m ## membrane time constant self.resist_m = resist_m ## resistance value - self.one_spike = one_spike ## True => constrains system to simulate 1 spike per time step - self.max_one_spike = max_one_spike + self.v_min = v_min ## ensures voltage is never < v_min self.v_rest = v_rest #-65. # mV @@ -146,146 +141,87 @@ def __init__( self.batch_size = 1 self.n_units = n_units - ## set up surrogate function for spike emission - if surrogate_type == "secant_lif": - self.spike_fx, self.d_spike_fx = secant_lif_estimator() - elif surrogate_type == "arctan": - self.spike_fx, self.d_spike_fx = arctan_estimator() - elif surrogate_type == "triangular": - self.spike_fx, self.d_spike_fx = triangular_estimator() - else: ## default: straight_through - self.spike_fx, self.d_spike_fx = straight_through_estimator() - + # ## set up surrogate function for spike emission + # if surrogate_type == "secant_lif": + # spike_fx, d_spike_fx = secant_lif_estimator() + # elif surrogate_type == "arctan": + # spike_fx, d_spike_fx = arctan_estimator() + # elif surrogate_type == "triangular": + # spike_fx, d_spike_fx = triangular_estimator() + # else: ## default: straight_through + # spike_fx, d_spike_fx = straight_through_estimator() ## Compartment setup restVals = jnp.zeros((self.batch_size, self.n_units)) self.j = Compartment(restVals, display_name="Current", units="mA") - self.v = Compartment(restVals + self.v_rest, - display_name="Voltage", units="mV") + self.v = Compartment(restVals + self.v_rest, display_name="Voltage", units="mV") self.s = Compartment(restVals, display_name="Spikes") self.s_raw = Compartment(restVals, display_name="Raw Spike Pulses") - self.rfr = Compartment(restVals + self.refract_T, - display_name="Refractory Time Period", units="ms") - self.thr_theta = Compartment(restVals, display_name="Threshold Adaptive Shift", - units="mV") - self.tols = Compartment(restVals, display_name="Time-of-Last-Spike", - units="ms") ## time-of-last-spike - self.surrogate = Compartment(restVals + 1., display_name="Surrogate State Value") - - @transition(output_compartments=["v", "s", "s_raw", "rfr", "thr_theta", "tols", "key", "surrogate"]) - @staticmethod - def advance_state( - t, dt, tau_m, resist_m, v_rest, v_reset, g_L, refract_T, thr, tau_theta, theta_plus, one_spike, max_one_spike, - v_min, intgFlag, d_spike_fx, key, j, v, rfr, thr_theta, tols - ): - skey = None ## this is an empty dkey if single_spike mode turned off - if one_spike and not max_one_spike: - key, skey = random.split(key, 2) - ## run one integration step for neuronal dynamics - j = j * resist_m - ############################################################################ - ### Runs leaky integrator (leaky integrate-and-fire; LIF) neuronal dynamics. - _v_thr = thr_theta + thr ## calc present voltage threshold - #mask = (rfr >= refract_T).astype(jnp.float32) # get refractory mask - ## update voltage / membrane potential - v_params = (j, rfr, tau_m, refract_T, v_rest, g_L) - if intgFlag == 1: - _, _v = step_rk2(0., v, _dfv, dt, v_params) + self.rfr = Compartment(restVals + self.refract_T, display_name="Refractory Time Period", units="ms") + self.thr_theta = Compartment(restVals, display_name="Threshold Adaptive Shift", units="mV") + self.tols = Compartment(restVals, display_name="Time-of-Last-Spike", units="ms") ## time-of-last-spike + # self.surrogate = Compartment(restVals + 1., display_name="Surrogate State Value") + + @compilable + def advance_state(self, dt, t): + j = self.j.get() * self.resist_m + + _v_thr = self.thr_theta.get() + self.thr ## calc present voltage threshold + + v_params = (j, self.rfr.get(), self.tau_m.get(), self.refract_T, self.v_rest, self.g_L) + + if self.intgFlag == 1: + _, _v = step_rk2(0., self.v.get(), _dfv, dt, v_params) else: - _, _v = step_euler(0., v, _dfv, dt, v_params) - ## obtain action potentials/spikes/pulses + _, _v = step_euler(0., self.v.get(), _dfv, dt, v_params) + s = (_v > _v_thr) * 1. - v_prespike = v - ## update refractory variables - _rfr = (rfr + dt) * (1. - s) - ## perform hyper-polarization of neuronal cells - _v = _v * (1. - s) + s * v_reset - - raw_s = s + 0 ## preserve un-altered spikes - ############################################################################ - ## this is a spike post-processing step - if skey is not None: + _rfr = (self.rfr.get() + dt) * (1. - s) + _v = _v * (1. - s) + s * self.v_reset + + raw_s = s + + if self.one_spike and not self.max_one_spike: + key, skey = random.split(self.key.get(), 2) + m_switch = (jnp.sum(s) > 0.).astype(jnp.float32) ## TODO: not batch-able rS = s * random.uniform(skey, s.shape) - rS = nn.one_hot(jnp.argmax(rS, axis=1), num_classes=s.shape[1], - dtype=jnp.float32) + rS = nn.one_hot(jnp.argmax(rS, axis=1), num_classes=s.shape[1], dtype=jnp.float32) s = s * (1. - m_switch) + rS * m_switch - if max_one_spike: - rS = nn.one_hot(jnp.argmax(v_prespike, axis=1), num_classes=s.shape[1], dtype=jnp.float32) ## get max-volt spike + self.key.set(key) + + if self.max_one_spike: + rS = nn.one_hot(jnp.argmax(self.v.get(), axis=1), num_classes=s.shape[1], dtype=jnp.float32) ## get max-volt spike s = s * rS ## mask out non-max volt spikes - ############################################################################ - raw_spikes = raw_s - v = _v - rfr = _rfr - surrogate = d_spike_fx(v, _v_thr) #d_spike_fx(v, thr + thr_theta) - if tau_theta > 0.: + if self.tau_theta > 0.: ## run one integration step for threshold dynamics - thr_theta = _update_theta(dt, thr_theta, raw_spikes, tau_theta, theta_plus) - ## update tols - tols = (1. - s) * tols + (s * t) - if v_min is not None: ## ensures voltage never < v_rest - v = jnp.maximum(v, v_min) - return v, s, raw_spikes, rfr, thr_theta, tols, key, surrogate - - @transition(output_compartments=["j", "v", "s", "s_raw", "rfr", "tols", "surrogate"]) - @staticmethod - def reset(batch_size, n_units, v_rest, refract_T): - restVals = jnp.zeros((batch_size, n_units)) - j = restVals #+ 0 - v = restVals + v_rest - s = restVals #+ 0 - s_raw = restVals - rfr = restVals + refract_T - #thr_theta = restVals ## do not reset thr_theta - tols = restVals #+ 0 - surrogate = restVals + 1. - return j, v, s, s_raw, rfr, tols, surrogate - - def save(self, directory, **kwargs): - ## do a protected save of constants, depending on whether they are floats or arrays - tau_m = (self.tau_m if isinstance(self.tau_m, float) - else jnp.asarray([[self.tau_m * 1.]])) - thr = (self.thr if isinstance(self.thr, float) - else jnp.asarray([[self.thr * 1.]])) - v_rest = (self.v_rest if isinstance(self.v_rest, float) - else jnp.asarray([[self.v_rest * 1.]])) - v_reset = (self.v_reset if isinstance(self.v_reset, float) - else jnp.asarray([[self.v_reset * 1.]])) - g_L = (self.g_L if isinstance(self.g_L, float) - else jnp.asarray([[self.g_L * 1.]])) - resist_m = (self.resist_m if isinstance(self.resist_m, float) - else jnp.asarray([[self.resist_m * 1.]])) - tau_theta = (self.tau_theta if isinstance(self.tau_theta, float) - else jnp.asarray([[self.tau_theta * 1.]])) - theta_plus = (self.theta_plus if isinstance(self.theta_plus, float) - else jnp.asarray([[self.theta_plus * 1.]])) - - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, - threshold_theta=self.thr_theta.value, - tau_m=tau_m, thr=thr, v_rest=v_rest, - v_reset=v_reset, g_L=g_L, - resist_m=resist_m, tau_theta=tau_theta, - theta_plus=theta_plus, - key=self.key.value) - - def load(self, directory, seeded=False, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.thr_theta.set(data['threshold_theta']) - ## constants loaded in - self.tau_m = data['tau_m'] - self.thr = data['thr'] - self.v_rest = data['v_rest'] - self.v_reset = data['v_reset'] - self.g_L = data['g_L'] - self.resist_m = data['resist_m'] - self.tau_theta = data['tau_theta'] - self.theta_plus = data['theta_plus'] - - if seeded: - self.key.set(data['key']) + thr_theta = _update_theta(dt, self.thr_theta.get(), raw_s, self.tau_theta, self.theta_plus) #.get()) + self.thr_theta.set(thr_theta) + + ## update time-of-last spike variable(s) + self.tols.set((1. - s) * self.tols.get() + (s * t)) + + if self.v_min is not None: ## ensures voltage never < v_rest + _v = jnp.maximum(_v, self.v_min) + + + self.v.set(_v) + self.s.set(s) + self.s_raw.set(raw_s) + self.rfr.set(_rfr) + + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + if not self.j.targeted: + self.j.set(restVals) + self.v.set(restVals + self.v_rest) + self.s.set(restVals) + self.s_raw.set(restVals) + self.rfr.set(restVals + self.refract_T) + self.tols.set(restVals) @classmethod def help(cls): ## component help function @@ -315,17 +251,13 @@ def help(cls): ## component help function "v_reset": "Reset membrane potential value", "conduct_leak": "Conductance leak / voltage decay factor", "tau_theta": "Threshold/homoestatic increment time constant", - "theta_plus": "Amount to increment threshold by upon occurrence " - "of spike", + "theta_plus": "Amount to increment threshold by upon occurrence of a spike", "refract_time": "Length of relative refractory period (ms)", - "one_spike": "Should only one spike be sampled/allowed to emit at " - "any given time step?", - "integration_type": "Type of numerical integration to use for the " - "cell dynamics", + "one_spike": "Should only one spike be sampled/allowed to emit at any given time step?", + "integration_type": "Type of numerical integration to use for the cell dynamics", "surrgoate_type": "Type of surrogate function to use approximate " "derivative of spike w.r.t. voltage/current", - "lower_bound_clamp": "Should voltage be lower bounded to be never " - "be below `v_rest`" + "v_min": "Minimum voltage allowed before voltage variables are min-clipped/clamped" } info = {cls.__name__: properties, "compartments": compartment_props, @@ -333,20 +265,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/spiking/RAFCell.py b/ngclearn/components/neurons/spiking/RAFCell.py index df95de1d..6c2bdc5d 100755 --- a/ngclearn/components/neurons/spiking/RAFCell.py +++ b/ngclearn/components/neurons/spiking/RAFCell.py @@ -1,16 +1,15 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args +from ngcsimlib import deprecate_args from ngcsimlib.logger import info, warn from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ step_euler, step_rk2 -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +######################################################################################################################## +## RAF dynamics (multi-dimensional ODEs) @jit def _dfv_internal(j, v, w, tau_m, omega, b): ## "voltage" dynamics # dy/dt = omega x + b y @@ -34,6 +33,7 @@ def _dfw(t, w, params): ## angular driver dynamics wrapper j, v, tau_w, omega, b = params dv_dt = _dfw_internal(j, v, w, tau_w, omega, b) return dv_dt +######################################################################################################################## class RAFCell(JaxComponent): """ @@ -60,8 +60,7 @@ class RAFCell(JaxComponent): | tols - time-of-last-spike | References: - | Izhikevich, Eugene M. "Resonate-and-fire neurons." Neural networks - | 14.6-7 (2001): 883-894. + | Izhikevich, Eugene M. "Resonate-and-fire neurons." Neural networks 14.6-7 (2001): 883-894. Args: name: the string name of this cell @@ -77,7 +76,7 @@ class RAFCell(JaxComponent): omega: angular frequency (Default: 10) - b: oscillation dampening factor (Default: -1) + dampen_factor: oscillation dampening factor (Default: -1) ("b" in Izhikevich 2001) v_reset: reset condition for membrane potential (Default: 1 mV) @@ -98,10 +97,10 @@ class RAFCell(JaxComponent): at an increase in computational cost (and simulation time) """ - @deprecate_args(resist_m="resist_v", tau_m="tau_v") + @deprecate_args(resist_m="resist_v", tau_m="tau_v", b="dampen_factor") def __init__( - self, name, n_units, tau_v=1., tau_w=1., thr=1., omega=10., b=-1., v_reset=0., w_reset=0., v0=0., w0=0., - resist_v=1., integration_type="euler", batch_size=1, **kwargs + self, name, n_units, tau_v=1., tau_w=1., thr=1., omega=10., dampen_factor=-1., v_reset=0., w_reset=0., + v0=0., w0=0., resist_v=1., integration_type="euler", batch_size=1, **kwargs ): #v_rest=-72., v_reset=-75., w_reset=0., thr=5., v0=-70., w0=0., tau_w=400., thr=5., omega=10., b=-1. super().__init__(name, **kwargs) @@ -115,8 +114,8 @@ def __init__( self.resist_v = resist_v self.tau_w = tau_w self.omega = omega ## angular frequency - self.b = b ## dampening factor - ## note: the smaller b is, the faster the oscillation dampens to resting state values + self.dampen_factor = dampen_factor ## dampening factor (b) + ## Note: the smaller that dampen_factor "b" is, the faster the oscillation dampens to resting state values self.v_reset = v_reset self.w_reset = w_reset self.v0 = v0 @@ -137,42 +136,44 @@ def __init__( restVals, display_name="Time-of-Last-Spike", units="ms" ) ## time-of-last-spike - @transition(output_compartments=["j", "v", "w", "s", "tols"]) - @staticmethod - def advance_state(t, dt, tau_v, resist_v, tau_w, thr, omega, b, - v_reset, w_reset, intgFlag, j, v, w, tols): + @compilable + def advance_state(self, t, dt): ## continue with centered dynamics - j_ = j * resist_v - if intgFlag == 1: ## RK-2/midpoint + j_ = self.j.get() * self.resist_v + if self.intgFlag == 1: ## RK-2/midpoint ## Note: we integrate ODEs in order: first w, then v - w_params = (j_, v, tau_w, omega, b) - _, _w = step_rk2(0., w, _dfw, dt, w_params) - v_params = (j_, _w, tau_v, omega, b) - _, _v = step_rk2(0., v, _dfv, dt, v_params) + w_params = (j_, self.v.get(), self.tau_w, self.omega, self.dampen_factor) + _, _w = step_rk2(0., self.w.get(), _dfw, dt, w_params) + v_params = (j_, _w, self.tau_v, self.omega, self.dampen_factor) + _, _v = step_rk2(0., self.v.get(), _dfv, dt, v_params) else: # integType == 0 (default -- Euler) ## Note: we integrate ODEs in order: first w, then v - w_params = (j_, v, tau_w, omega, b) - _, _w = step_euler(0., w, _dfw, dt, w_params) - v_params = (j_, _w, tau_v, omega, b) - _, _v = step_euler(0., v, _dfv, dt, v_params) - s = (_v > thr) * 1. ## emit spikes/pulses + w_params = (j_, self.v.get(), self.tau_w, self.omega, self.dampen_factor) + _, _w = step_euler(0., self.w.get(), _dfw, dt, w_params) + v_params = (j_, _w, self.tau_v, self.omega, self.dampen_factor) + _, _v = step_euler(0., self.v.get(), _dfv, dt, v_params) + + s = (_v > self.thr) * 1. ## emit spikes/pulses ## hyperpolarize/reset/snap variables - w = _w * (1. - s) + s * w_reset - v = _v * (1. - s) + s * v_reset - - tols = (1. - s) * tols + (s * t) ## update times-of-last-spike(s) - return j, v, w, s, tols - - @transition(output_compartments=["j", "v", "w", "s", "tols"]) - @staticmethod - def reset(batch_size, n_units, v0, w0): - restVals = jnp.zeros((batch_size, n_units)) - j = restVals # None - v = restVals + v0 - w = restVals + w0 - s = restVals #+ 0 - tols = restVals #+ 0 - return j, v, w, s, tols + w = _w * (1. - s) + s * self.w_reset + v = _v * (1. - s) + s * self.v_reset + + self.tols.set((1. - s) * self.tols.get() + (s * t)) ## update times-of-last-spike(s) + + #self.j.set(j_) + self.v.set(v) + self.w.set(w) + self.s.set(s) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + if not self.j.targeted: + self.j.set(restVals) + self.v.set(restVals + self.v0) + self.w.set(restVals + self.w0) + self.s.set(restVals) + self.tols.set(restVals) @classmethod def help(cls): ## component help function @@ -198,7 +199,7 @@ def help(cls): ## component help function "tau_w": "Recovery variable time constant", "v_reset": "Reset membrane potential value", "w_reset": "Reset angular driver value", - "b": "Exponential dampening factor applied to oscillations", + "dampen_factor": "Exponential dampening factor applied to oscillations", "omega": "Angular frequency of neuronal progress per second (radians)", "v0": "Initial condition for membrane potential/voltage", "w0": "Initial condition for membrane angular driver variable", @@ -207,21 +208,7 @@ def help(cls): ## component help function } info = {cls.__name__: properties, "compartments": compartment_props, - "dynamics": "tau_v * dv/dt = omega * w + v * b; " - "tau_w * dw/dt = w * b - v * omega + j", + "dynamics": "tau_v * dv/dt = omega * w + v * dampen_factor; " + "tau_w * dw/dt = w * dampen_factor - v * omega + j", "hyperparameters": hyperparams} return info - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/neurons/spiking/WTASCell.py b/ngclearn/components/neurons/spiking/WTASCell.py index c6f9edb6..b4602c74 100755 --- a/ngclearn/components/neurons/spiking/WTASCell.py +++ b/ngclearn/components/neurons/spiking/WTASCell.py @@ -1,14 +1,9 @@ from jax import numpy as jnp, random, jit, nn from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn - -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngcsimlib import deprecate_args +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngclearn.utils.model_utils import softmax @@ -53,7 +48,7 @@ class WTASCell(JaxComponent): ## winner-take-all spiking cell thr_jitter: scale of uniform jitter to add to initialization of thresholds """ - # Define Functions + @deprecate_args(thrBase="thr_base") def __init__( self, name, n_units, tau_m, resist_m=1., thr_base=0.4, thr_gain=0.002, refract_time=0., thr_jitter=0.05, **kwargs @@ -74,7 +69,7 @@ def __init__( ## base threshold setup ## according to eqn 26 of the source paper, the initial condition for the ## threshold should technically be between: 1/n_units < threshold0 << 0.5, e.g., 0.15 - key, subkey = random.split(self.key.value) + key, subkey = random.split(self.key.get()) self.threshold0 = thr_base + random.uniform(subkey, (1, n_units), minval=-thr_jitter, maxval=thr_jitter, dtype=jnp.float32) @@ -88,42 +83,44 @@ def __init__( self.rfr = Compartment(restVals + self.refract_T) self.tols = Compartment(restVals) ## time-of-last-spike - @transition(output_compartments=["v", "s", "thr", "rfr", "tols"]) - @staticmethod - def advance_state(t, dt, tau_m, R_m, thr_gain, refract_T, j, v, thr, rfr, tols): - mask = (rfr >= refract_T) * 1. ## check refractory period - v = (j * R_m) * mask + @compilable + def advance_state(self, t, dt): + mask = (self.rfr.get() >= self.refract_T) * 1. ## check refractory period + v = (self.j.get() * self.R_m) * mask vp = softmax(v) # convert to Categorical (spike) probabilities # s = nn.one_hot(jnp.argmax(vp, axis=1), j.shape[1]) ## hard-max spike - s = (vp > thr) * 1. ## calculate action potential + s = (vp > self.thr.get()) * 1. ## calculate action potential q = 1. ## Note: thr_gain ==> "rho_b" ## increment threshold upon spike(s) occurrence dthr = jnp.sum(s, axis=1, keepdims=True) - q - thr = jnp.maximum(thr + dthr * thr_gain, 0.025) ## calc new threshold - rfr = (rfr + dt) * (1. - s) + s * dt # set refract to dt - - tols = (1. - s) * tols + (s * t) ## update tols - return v, s, thr, rfr, tols - - @transition(output_compartments=["j", "v", "s", "rfr", "tols"]) - @staticmethod - def reset(batch_size, n_units, refract_T): - restVals = jnp.zeros((batch_size, n_units)) - j = restVals #+ 0 - v = restVals #+ 0 - s = restVals #+ 0 - rfr = restVals + refract_T - tols = restVals #+ 0 - return j, v, s, rfr, tols - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, threshold=self.thr.value) - - def load(self, directory, seeded=False, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.thr.set( data['threshold'] ) + thr = jnp.maximum(self.thr.get() + dthr * self.thr_gain, 0.025) ## calc new threshold + rfr = (self.rfr.get() + dt) * (1. - s) + s * dt # set refract to dt + + self.tols.set((1. - s) * self.tols.get() + (s * t)) ## update times-of-last-spike(s) + + self.v.set(v) + self.s.set(s) + self.thr.set(thr) + self.rfr.set(rfr) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + if not self.j.targeted: + self.j.set(restVals) + self.v.set(restVals) + self.s.set(restVals) + self.rfr.set(restVals + self.refract_T) + self.tols.set(restVals) + + # def save(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # jnp.savez(file_name, threshold=self.thr.get()) + # + # def load(self, directory, seeded=False, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # data = jnp.load(file_name) + # self.thr.set( data['threshold'] ) @classmethod def help(cls): ## component help function @@ -158,20 +155,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/spiking/__init__.py b/ngclearn/components/neurons/spiking/__init__.py index 690087b7..b4c0b3db 100644 --- a/ngclearn/components/neurons/spiking/__init__.py +++ b/ngclearn/components/neurons/spiking/__init__.py @@ -9,3 +9,4 @@ from .izhikevichCell import IzhikevichCell from .RAFCell import RAFCell from .hodgkinHuxleyCell import HodgkinHuxleyCell + diff --git a/ngclearn/components/neurons/spiking/adExCell.py b/ngclearn/components/neurons/spiking/adExCell.py index fdff5f4c..1e55b55d 100755 --- a/ngclearn/components/neurons/spiking/adExCell.py +++ b/ngclearn/components/neurons/spiking/adExCell.py @@ -1,14 +1,11 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args +from ngcsimlib import deprecate_args from ngcsimlib.logger import info, warn -from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ - step_euler, step_rk2 -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn.utils.diffeq.ode_utils import get_integrator_code, step_euler, step_rk2 + +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment @jit def _dfv_internal(j, v, w, tau_m, v_rest, sharpV, vT, R_m): ## raw voltage dynamics @@ -32,7 +29,7 @@ def _dfw(t, w, params): ## recovery dynamics wrapper dv_dt = _dfw_internal(j, v, w, a, tau_m, v_rest) return dv_dt -class AdExCell(JaxComponent): +class AdExCell(JaxComponent): ## adaptive exponential integrate-and-fire cell """ The AdEx (adaptive exponential leaky integrate-and-fire) neuronal cell model; a two-variable model. This cell model iteratively evolves @@ -136,39 +133,40 @@ def __init__( self.tols = Compartment(restVals, display_name="Time-of-Last-Spike", units="ms") ## time-of-last-spike - @transition(output_compartments=["j", "v", "w", "s", "tols"]) - @staticmethod - def advance_state( - t, dt, tau_m, R_m, tau_w, thr, a, b, sharpV, vT, v_rest, v_reset, intgFlag, j, v, w, tols - ): - if intgFlag == 1: ## RK-2/midpoint - v_params = (j, w, tau_m, v_rest, sharpV, vT, R_m) - _, _v = step_rk2(0., v, _dfv, dt, v_params) - w_params = (j, v, a, tau_w, v_rest) - _, _w = step_rk2(0., w, _dfw, dt, w_params) + @compilable + def advance_state(self, t, dt): + if self.intgFlag == 1: ## RK-2/midpoint + v_params = (self.j.get(), self.w.get(), self.tau_m, self.v_rest, self.sharpV, self.vT, self.R_m) + _, _v = step_rk2(0., self.v.get(), _dfv, dt, v_params) + w_params = (self.j.get(), self.v.get(), self.a, self.tau_w, self.v_rest) + _, _w = step_rk2(0., self.w.get(), _dfw, dt, w_params) else: # intgFlag == 0 (default -- Euler) - v_params = (j, w, tau_m, v_rest, sharpV, vT, R_m) - _, _v = step_euler(0., v, _dfv, dt, v_params) - w_params = (j, v, a, tau_w, v_rest) - _, _w = step_euler(0., w, _dfw, dt, w_params) - s = (_v > thr) * 1. ## emit spikes/pulses + v_params = (self.j.get(), self.w.get(), self.tau_m, self.v_rest, self.sharpV, self.vT, self.R_m) + _, _v = step_euler(0., self.v.get(), _dfv, dt, v_params) + w_params = (self.j.get(), self.v.get(), self.a, self.tau_w, self.v_rest) + _, _w = step_euler(0., self.w.get(), _dfw, dt, w_params) + s = (_v > self.thr) * 1. ## emit spikes/pulses ## hyperpolarize/reset/snap variables - v = _v * (1. - s) + s * v_reset - w = _w * (1. - s) + s * (_w + b) - - tols = (1. - s) * tols + (s * t) ## update time-of-last spike variable(s) - return j, v, w, s, tols - - @transition(output_compartments=["j", "v", "w", "s", "tols"]) - @staticmethod - def reset(batch_size, n_units, v0, w0): - restVals = jnp.zeros((batch_size, n_units)) - j = restVals # None - v = restVals + v0 - w = restVals + w0 - s = restVals #+ 0 - tols = restVals #+ 0 - return j, v, w, s, tols + v = _v * (1. - s) + s * self.v_reset + w = _w * (1. - s) + s * (_w + self.b) + + ## update time-of-last spike variable(s) + self.tols.set((1. - s) * self.tols.get() + (s * t)) + + #self.j.set(j) ## j is not getting modified in these dynamics + self.v.set(v) + self.w.set(w) + self.s.set(s) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + if not self.j.targeted: + self.j.set(restVals) + self.v.set(restVals + self.v0) + self.w.set(restVals + self.w0) + self.s.set(restVals) + self.tols.set(restVals) @classmethod def help(cls): ## component help function @@ -211,20 +209,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/spiking/fitzhughNagumoCell.py b/ngclearn/components/neurons/spiking/fitzhughNagumoCell.py index 2cab7f56..9fe7f603 100755 --- a/ngclearn/components/neurons/spiking/fitzhughNagumoCell.py +++ b/ngclearn/components/neurons/spiking/fitzhughNagumoCell.py @@ -1,16 +1,12 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args +from ngcsimlib import deprecate_args from ngcsimlib.logger import info, warn from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ step_euler, step_rk2 -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment @jit def _dfv_internal(j, v, w, a, b, g, tau_m): ## raw voltage dynamics @@ -34,7 +30,7 @@ def _dfw(t, w, params): ## recovery dynamics wrapper dv_dt = _dfw_internal(j, v, w, a, b, g, tau_m) return dv_dt -class FitzhughNagumoCell(JaxComponent): +class FitzhughNagumoCell(JaxComponent): ## F-H cell """ The Fitzhugh-Nagumo neuronal cell model; a two-variable simplification of the Hodgkin-Huxley (squid axon) model. This cell model iteratively evolves @@ -103,10 +99,10 @@ class FitzhughNagumoCell(JaxComponent): at an increase in computational cost (and simulation time) """ - # Define Functions - def __init__(self, name, n_units, tau_m=1., resist_m=1., tau_w=12.5, alpha=0.7, - beta=0.8, gamma=3., v0=0., w0=0., v_thr=1.07, spike_reset=False, - integration_type="euler", **kwargs): + def __init__( + self, name, n_units, tau_m=1., resist_m=1., tau_w=12.5, alpha=0.7, beta=0.8, gamma=3., v0=0., w0=0., + v_thr=1.07, spike_reset=False, integration_type="euler", **kwargs + ): super().__init__(name, **kwargs) ## Integration properties @@ -115,7 +111,7 @@ def __init__(self, name, n_units, tau_m=1., resist_m=1., tau_w=12.5, alpha=0.7, ## Cell properties self.tau_m = tau_m - self.R_m = resist_m + self.resist_m = resist_m ## resistance R_m self.tau_w = tau_w self.alpha = alpha self.beta = beta @@ -138,41 +134,44 @@ def __init__(self, name, n_units, tau_m=1., resist_m=1., tau_w=12.5, alpha=0.7, self.s = Compartment(restVals) self.tols = Compartment(restVals) ## time-of-last-spike - @transition(output_compartments=["j", "v", "w", "s", "tols"]) - @staticmethod - def advance_state(t, dt, tau_m, R_m, tau_w, v_thr, spike_reset, v0, w0, alpha, - beta, gamma, intgFlag, j, v, w, tols): - j_mod = j * R_m - if intgFlag == 1: - v_params = (j_mod, w, alpha, beta, gamma, tau_m) - _, _v = step_rk2(0., v, _dfv, dt, v_params) # _v = step_rk2(v, v_params, _dfv, dt) - w_params = (j_mod, v, alpha, beta, gamma, tau_w) - _, _w = step_rk2(0., w, _dfw, dt, w_params) # _w = step_rk2(w, w_params, _dfw, dt) + @compilable + def advance_state(self, t, dt): + j_mod = self.j.get() * self.resist_m + if self.intgFlag == 1: + v_params = (j_mod, self.w.get(), self.alpha, self.beta, self.gamma, self.tau_m) + _, _v = step_rk2(0., self.v.get(), _dfv, dt, v_params) # _v = step_rk2(v, v_params, _dfv, dt) + w_params = (j_mod, self.v.get(), self.alpha, self.beta, self.gamma, self.tau_w) + _, _w = step_rk2(0., self.w.get(), _dfw, dt, w_params) # _w = step_rk2(w, w_params, _dfw, dt) else: # integType == 0 (default -- Euler) - v_params = (j_mod, w, alpha, beta, gamma, tau_m) - _, _v = step_euler(0., v, _dfv, dt, v_params) # _v = step_euler(v, v_params, _dfv, dt) - w_params = (j_mod, v, alpha, beta, gamma, tau_w) - _, _w = step_euler(0., w, _dfw, dt, w_params) # _w = step_euler(w, w_params, _dfw, dt) - s = (_v > v_thr) * 1. + v_params = (j_mod, self.w.get(), self.alpha, self.beta, self.gamma, self.tau_m) + _, _v = step_euler(0., self.v.get(), _dfv, dt, v_params) # _v = step_euler(v, v_params, _dfv, dt) + w_params = (j_mod, self.v.get(), self.alpha, self.beta, self.gamma, self.tau_w) + _, _w = step_euler(0., self.w.get(), _dfw, dt, w_params) # _w = step_euler(w, w_params, _dfw, dt) + s = (_v > self.v_thr) * 1. v = _v w = _w - if spike_reset: ## if spike-reset used, variables snapped back to initial conditions - v = v * (1. - s) + s * v0 - w = w * (1. - s) + s * w0 - tols = (1. - s) * tols + (s * t) ## update tols - return j, v, w, s, tols - - @transition(output_compartments=["j", "v", "w", "s", "tols"]) - @staticmethod - def reset(batch_size, n_units, v0, w0): - restVals = jnp.zeros((batch_size, n_units)) - j = restVals # None - v = restVals + v0 - w = restVals + w0 - s = restVals #+ 0 - tols = restVals #+ 0 - return j, v, w, s, tols + if self.spike_reset: ## if spike-reset used, variables snapped back to initial conditions + v = v * (1. - s) + s * self.v0 + w = w * (1. - s) + s * self.w0 + + ## update time-of-last spike variable(s) + self.tols.set((1. - s) * self.tols.get() + (s * t)) + + # self.j.set(j) ## j is not getting modified in these dynamics + self.v.set(v) + self.w.set(w) + self.s.set(s) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + if not self.j.targeted: + self.j.set(restVals) + self.v.set(restVals + self.v0) + self.w.set(restVals + self.w0) + self.s.set(restVals) + self.tols.set(restVals) @classmethod def help(cls): ## component help function @@ -197,8 +196,7 @@ def help(cls): ## component help function "resist_m": "Membrane resistance value", "tau_w": "Recovery variable time constant", "v_thr": "Base voltage threshold value", - "spike_reset": "Should voltage/recover be snapped to initial " - "condition(s) if spike emitted?", + "spike_reset": "Should voltage/recover be snapped to initial condition(s) if spike emitted?", "alpha": "Dimensionless recovery variable shift factor `a", "beta": "Dimensionless recovery variable scale factor `b`", "gamma": "Power-term divisor constant", @@ -213,20 +211,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/spiking/hodgkinHuxleyCell.py b/ngclearn/components/neurons/spiking/hodgkinHuxleyCell.py index 29ab648e..87ec823b 100644 --- a/ngclearn/components/neurons/spiking/hodgkinHuxleyCell.py +++ b/ngclearn/components/neurons/spiking/hodgkinHuxleyCell.py @@ -1,15 +1,11 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args +from ngcsimlib import deprecate_args from ngcsimlib.logger import info, warn -from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ - step_euler, step_rk2, step_rk4 +from ngclearn.utils.diffeq.ode_utils import get_integrator_code, step_euler, step_rk2, step_rk4 -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment def _calc_biophysical_constants(v): ## computes H-H biophysical constants (which are functions of voltage v) @@ -113,7 +109,6 @@ class HodgkinHuxleyCell(JaxComponent): ## Hodgkin-Huxley spiking cell at an increase in computational cost (and simulation time) """ - # Define Functions def __init__( self, name, n_units, tau_v, resist_m=1., v_Na=115., v_K=-35., v_L=10.6, g_Na=100., g_K=5., g_L=0.3, thr=4., spike_reset=False, v_reset=0., integration_type="euler", **kwargs @@ -126,7 +121,7 @@ def __init__( ## cell properties / biophysical parameter setup (affects ODE integration) self.tau_v = tau_v ## membrane time constant - self.R_m = resist_m ## resistance value + self.resist_m = resist_m ## resistance value R_m self.spike_reset = spike_reset self.thr = thr # mV ## base value for threshold self.v_reset = v_reset ## base value to reset voltage to (if spike_reset = True) @@ -151,38 +146,49 @@ def __init__( self.s = Compartment(restVals, display_name="Spike pulse") self.tols = Compartment(restVals, display_name="Time-of-last-spike") ## time-of-last-spike - @transition(output_compartments=["v", "m", "n", "h", "s", "tols"]) - @staticmethod - def advance_state( - t, dt, spike_reset, v_reset, thr, tau_v, R_m, g_Na, g_K, g_L, v_Na, v_K, v_L, j, v, m, n, h, tols, intgFlag - ): - _j = j * R_m - alpha_n_of_v, beta_n_of_v, alpha_m_of_v, beta_m_of_v, alpha_h_of_v, beta_h_of_v = _calc_biophysical_constants(v) + #@transition(output_compartments=["v", "m", "n", "h", "s", "tols"]) + #@staticmethod + @compilable + def advance_state(self, t, dt): #t, dt, spike_reset, v_reset, thr, tau_v, R_m, g_Na, g_K, g_L, v_Na, v_K, v_L, j, v, m, n, h, tols, intgFlag + _j = self.j.get() * self.resist_m + alpha_n_of_v, beta_n_of_v, alpha_m_of_v, beta_m_of_v, alpha_h_of_v, beta_h_of_v = _calc_biophysical_constants(self.v.get()) ## integrate voltage / membrane potential - if intgFlag == 1: ## midpoint method - _, _v = step_rk2(0., v, dv_dt, dt, (_j, m + 0., n + 0., h + 0., tau_v, g_Na, g_K, g_L, v_Na, v_K, v_L)) + if self.intgFlag == 1: ## midpoint method + _, _v = step_rk2( + 0., self.v.get(), dv_dt, dt, + (_j, self.m.get() + 0., self.n.get() + 0., self.h.get() + 0., self.tau_v, self.g_Na, self.g_K, + self.g_L, self.v_Na, self.v_K, self.v_L) + ) ## next, integrate different channels - _, _n = step_rk2(0., n, dx_dt, dt, (alpha_n_of_v, beta_n_of_v)) - _, _m = step_rk2(0., m, dx_dt, dt, (alpha_m_of_v, beta_m_of_v)) - _, _h = step_rk2(0., h, dx_dt, dt, (alpha_h_of_v, beta_h_of_v)) - elif intgFlag == 4: ## Runge-Kutta 4th order - _, _v = step_rk4(0., v, dv_dt, dt, (_j, m + 0., n + 0., h + 0., tau_v, g_Na, g_K, g_L, v_Na, v_K, v_L)) + _, _n = step_rk2(0., self.n.get(), dx_dt, dt, (alpha_n_of_v, beta_n_of_v)) + _, _m = step_rk2(0., self.m.get(), dx_dt, dt, (alpha_m_of_v, beta_m_of_v)) + _, _h = step_rk2(0., self.h.get(), dx_dt, dt, (alpha_h_of_v, beta_h_of_v)) + elif self.intgFlag == 4: ## Runge-Kutta 4th order + _, _v = step_rk4( + 0., self.v.get(), dv_dt, dt, + (_j, self.m.get() + 0., self.n.get() + 0., self.h.get() + 0., self.tau_v, self.g_Na, self.g_K, + self.g_L, self.v_Na, self.v_K, self.v_L) + ) ## next, integrate different channels - _, _n = step_rk4(0., n, dx_dt, dt, (alpha_n_of_v, beta_n_of_v)) - _, _m = step_rk4(0., m, dx_dt, dt, (alpha_m_of_v, beta_m_of_v)) - _, _h = step_rk4(0., h, dx_dt, dt, (alpha_h_of_v, beta_h_of_v)) + _, _n = step_rk4(0., self.n.get(), dx_dt, dt, (alpha_n_of_v, beta_n_of_v)) + _, _m = step_rk4(0., self.m.get(), dx_dt, dt, (alpha_m_of_v, beta_m_of_v)) + _, _h = step_rk4(0., self.h.get(), dx_dt, dt, (alpha_h_of_v, beta_h_of_v)) else: # integType == 0 (default -- Euler) - _, _v = step_euler(0., v, dv_dt, dt, (_j, m + 0., n + 0., h + 0., tau_v, g_Na, g_K, g_L, v_Na, v_K, v_L)) + _, _v = step_euler( + 0., self.v.get(), dv_dt, dt, + (_j, self.m.get() + 0., self.n.get() + 0., self.h.get() + 0., self.tau_v, self.g_Na, self.g_K, + self.g_L, self.v_Na, self.v_K, self.v_L) + ) ## next, integrate different channels - _, _n = step_euler(0., n, dx_dt, dt, (alpha_n_of_v, beta_n_of_v)) - _, _m = step_euler(0., m, dx_dt, dt, (alpha_m_of_v, beta_m_of_v)) - _, _h = step_euler(0., h, dx_dt, dt, (alpha_h_of_v, beta_h_of_v)) + _, _n = step_euler(0., self.n.get(), dx_dt, dt, (alpha_n_of_v, beta_n_of_v)) + _, _m = step_euler(0., self.m.get(), dx_dt, dt, (alpha_m_of_v, beta_m_of_v)) + _, _h = step_euler(0., self.h.get(), dx_dt, dt, (alpha_h_of_v, beta_h_of_v)) ## obtain action potentials/spikes/pulses - s = (_v > thr) * 1. - if spike_reset: ## if spike-reset used, variables snapped back to initial conditions + s = (_v > self.thr) * 1. + if self.spike_reset: ## if spike-reset used, variables snapped back to initial conditions alpha_n_of_v, beta_n_of_v, alpha_m_of_v, beta_m_of_v, alpha_h_of_v, beta_h_of_v = ( - _calc_biophysical_constants(v * 0 + v_reset)) - _v = _v * (1. - s) + s * v_reset + _calc_biophysical_constants(self.v.get() * 0 + self.v_reset)) + _v = _v * (1. - s) + s * self.v_reset _n = _n * (1. - s) + s * (alpha_n_of_v / (alpha_n_of_v + beta_n_of_v)) _m = _m * (1. - s) + s * (alpha_m_of_v / (alpha_m_of_v + beta_m_of_v)) _h = _h * (1. - s) + s * (alpha_h_of_v / (alpha_h_of_v + beta_h_of_v)) @@ -191,32 +197,40 @@ def advance_state( m = _m n = _n h = _h - tols = (1. - s) * tols + (s * t) ## update tols + ## update time-of-last spike variable(s) + self.tols.set((1. - s) * self.tols.get() + (s * t)) - return v, m, n, h, s, tols + self.v.set(v) + self.m.set(m) + self.n.set(n) + self.h.set(h) + self.s.set(s) - @transition(output_compartments=["j", "v", "m", "n", "h", "s", "tols"]) - @staticmethod - def reset(batch_size, n_units): - restVals = jnp.zeros((batch_size, n_units)) + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) v = restVals # + 0 alpha_n_of_v, beta_n_of_v, alpha_m_of_v, beta_m_of_v, alpha_h_of_v, beta_h_of_v = _calc_biophysical_constants(v) - j = restVals #+ 0 + if not self.j.targeted: + self.j.set(restVals) n = alpha_n_of_v / (alpha_n_of_v + beta_n_of_v) m = alpha_m_of_v / (alpha_m_of_v + beta_m_of_v) h = alpha_h_of_v / (alpha_h_of_v + beta_h_of_v) - s = restVals #+ 0 - tols = restVals #+ 0 - return j, v, m, n, h, s, tols - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - #jnp.savez(file_name, threshold=self.thr.value) - - def load(self, directory, seeded=False, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - #self.thr.set( data['threshold'] ) + self.v.set(v) + self.n.set(n) + self.m.set(m) + self.h.set(h) + self.s.set(restVals) + self.tols.set(restVals) + + # def save(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # #jnp.savez(file_name, threshold=self.thr.value) + # + # def load(self, directory, seeded=False, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # data = jnp.load(file_name) + # #self.thr.set( data['threshold'] ) @classmethod def help(cls): ## component help function @@ -257,20 +271,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/spiking/izhikevichCell.py b/ngclearn/components/neurons/spiking/izhikevichCell.py index 0027f314..b94c3402 100755 --- a/ngclearn/components/neurons/spiking/izhikevichCell.py +++ b/ngclearn/components/neurons/spiking/izhikevichCell.py @@ -1,16 +1,11 @@ from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args +from ngcsimlib import deprecate_args from ngcsimlib.logger import info, warn -from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ - step_euler, step_rk2 - -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn.utils.diffeq.ode_utils import get_integrator_code, step_euler, step_rk2 +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment @jit def _dfv_internal(j, v, w, b, tau_m): ## raw voltage dynamics @@ -119,17 +114,16 @@ class IzhikevichCell(JaxComponent): ## Izhikevich neuronal cell at an increase in computational cost (and simulation time) """ - # Define Functions def __init__(self, name, n_units, tau_m=1., resist_m=1., v_thr=30., v_reset=-65., tau_w=50., w_reset=8., coupling_factor=0.2, v0=-65., w0=-14., integration_type="euler", **kwargs): super().__init__(name, **kwargs) ## Cell properties - self.R_m = resist_m + self.resist_m = resist_m ## resistance R_m self.tau_m = tau_m self.tau_w = tau_w - self.coupling = coupling_factor + self.coupling_factor = coupling_factor self.v_reset = v_reset self.w_reset = w_reset @@ -153,45 +147,47 @@ def __init__(self, name, n_units, tau_m=1., resist_m=1., v_thr=30., v_reset=-65. self.s = Compartment(restVals) self.tols = Compartment(restVals) ## time-of-last-spike - @transition(output_compartments=["j", "v", "w", "s", "tols"]) - @staticmethod - def advance_state(t, dt, tau_m, tau_w, v_thr, coupling, v_reset, w_reset, R_m, - intgFlag, j, v, w, s, tols): + @compilable + def advance_state(self, t, dt): ## note: a = 0.1 --> fast spikes, a = 0.02 --> regular spikes - a = 1. / tau_w ## we map time constant to variable "a" (a = 1/tau_w) - _j = j * R_m + a = 1. / self.tau_w ## we map time constant to variable "a" (a = 1/tau_w) + _j = self.j.get() * self.resist_m # _j = jnp.maximum(-30.0, _j) ## lower-bound/clip input current ## check for spikes - s = (v > v_thr) * 1. + s = (self.v.get() > self.v_thr) * 1. ## for non-spikes, evolve according to dynamics - if intgFlag == 1: - v_params = (_j, w, coupling, tau_m) - _, _v = step_rk2(0., v, _dfv, dt, v_params) # _v = step_rk2(v, v_params, _dfv, dt) - w_params = (_j, v, coupling, tau_w) - _, _w = step_rk2(0., w, _dfw, dt, w_params) # _w = step_rk2(w, w_params, _dfw, dt) + if self.intgFlag == 1: + v_params = (_j, self.w.get(), self.coupling_factor, self.tau_m) + _, _v = step_rk2(0., self.v.get(), _dfv, dt, v_params) # _v = step_rk2(v, v_params, _dfv, dt) + w_params = (_j, self.v.get(), self.coupling_factor, self.tau_w) + _, _w = step_rk2(0., self.w.get(), _dfw, dt, w_params) # _w = step_rk2(w, w_params, _dfw, dt) else: # integType == 0 (default -- Euler) - v_params = (_j, w, coupling, tau_m) - _, _v = step_euler(0., v, _dfv, dt, v_params) # _v = step_euler(v, v_params, _dfv, dt) - w_params = (_j, v, coupling, tau_w) - _, _w = step_euler(0., w, _dfw, dt, w_params) # _w = step_euler(w, w_params, _dfw, dt) + v_params = (_j, self.w.get(), self.coupling_factor, self.tau_m) + _, _v = step_euler(0., self.v.get(), _dfv, dt, v_params) # _v = step_euler(v, v_params, _dfv, dt) + w_params = (_j, self.v.get(), self.coupling_factor, self.tau_w) + _, _w = step_euler(0., self.w.get(), _dfw, dt, w_params) # _w = step_euler(w, w_params, _dfw, dt) ## for spikes, snap to particular states - _v, _w = _post_process(s, _v, _w, v, w, v_reset, w_reset) + _v, _w = _post_process(s, _v, _w, self.v.get(), self.w.get(), self.v_reset, self.w_reset) v = _v w = _w - tols = (1. - s) * tols + (s * t) ## update tols - return j, v, w, s, tols + ## update time-of-last spike variable(s) + self.tols.set((1. - s) * self.tols.get() + (s * t)) + + # self.j.set(j) ## j is not getting modified in these dynamics + self.v.set(v) + self.w.set(w) + self.s.set(s) - @transition(output_compartments=["j", "v", "w", "s", "tols"]) - @staticmethod - def reset(batch_size, n_units, v0, w0): - restVals = jnp.zeros((batch_size, n_units)) - j = restVals # None - v = restVals + v0 - w = restVals + w0 - s = restVals #+ 0 - tols = restVals #+ 0 - return j, v, w, s, tols + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + if not self.j.targeted: + self.j.set(restVals) + self.v.set(restVals + self.v0) + self.w.set(restVals + self.w0) + self.s.set(restVals) + self.tols.set(restVals) @classmethod def help(cls): ## component help function @@ -219,8 +215,7 @@ def help(cls): ## component help function "v_rest": "Resting membrane potential value", "v_reset": "Reset membrane potential value", "w_reset": "Reset recover variable value", - "coupling_factor": "Degree to which recovery variable is sensitive to " - "subthreshold voltage fluctuations", + "coupling_factor": "Degree to which recovery variable is sensitive to subthreshold voltage fluctuations", "v0": "Initial condition for membrane potential/voltage", "w0": "Initial condition for recovery variable", "integration_type": "Type of numerical integration to use for the cell dynamics" @@ -232,20 +227,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/spiking/quadLIFCell.py b/ngclearn/components/neurons/spiking/quadLIFCell.py index ec7bbd32..6d7c95b6 100755 --- a/ngclearn/components/neurons/spiking/quadLIFCell.py +++ b/ngclearn/components/neurons/spiking/quadLIFCell.py @@ -1,18 +1,15 @@ from ngclearn.components.jaxComponent import JaxComponent -from jax import numpy as jnp, random, jit, nn -from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args +from jax import numpy as jnp, random, jit, nn, Array +from ngcsimlib import deprecate_args from ngcsimlib.logger import info, warn from ngclearn.utils.diffeq.ode_utils import get_integrator_code, \ step_euler, step_rk2 -from ngclearn.utils.surrogate_fx import (secant_lif_estimator, arctan_estimator, - triangular_estimator, - straight_through_estimator) +# from ngclearn.utils.surrogate_fx import (secant_lif_estimator, arctan_estimator, +# triangular_estimator, +# straight_through_estimator) -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngclearn.components.neurons.spiking.LIFCell import LIFCell @@ -30,7 +27,7 @@ def _dfv(t, v, params): ## voltage dynamics wrapper return dv_dt #@partial(jit, static_argnums=[3, 4]) -def _update_theta(dt, v_theta, s, tau_theta, theta_plus=0.05): +def _update_theta(dt, v_theta, s, tau_theta, theta_plus: Array=0.05): ### Runs homeostatic threshold update dynamics one step (via Euler integration). #theta_decay = 0.9999999 #0.999999762 #jnp.exp(-dt/1e7) #theta_plus = 0.05 @@ -117,132 +114,88 @@ class QuadLIFCell(LIFCell): ## quadratic integrate-and-fire cell (straight-through estimator), "triangular" (triangular estimator), "arctan" (arc-tangent estimator), and "secant_lif" (the LIF-specialized secant estimator) + + v_min: minimum voltage to clamp dynamics to (Default: None) """ ## batch_size arg? - @deprecate_args(thr_jitter=None, critical_v="critical_V") + @deprecate_args(thr_jitter=None, critical_V="critical_v") def __init__( self, name, n_units, tau_m, resist_m=1., thr=-52., v_rest=-65., v_reset=-60., v_scale=-41.6, critical_v=1., tau_theta=1e7, theta_plus=0.05, refract_time=5., one_spike=False, integration_type="euler", - surrogate_type="straight_through", lower_clamp_voltage=True, **kwargs + surrogate_type="straight_through", v_min=None, **kwargs ): super().__init__( name, n_units, tau_m, resist_m, thr, v_rest, v_reset, 1., tau_theta, theta_plus, refract_time, - one_spike, integration_type, surrogate_type, lower_clamp_voltage, **kwargs + one_spike, integration_type, surrogate_type, v_min=v_min, **kwargs ) + ## only two distinct additional constants distinguish the Quad-LIF cell self.v_c = v_scale self.a0 = critical_v - @transition(output_compartments=["v", "s", "s_raw", "rfr", "thr_theta", "tols", "key", "surrogate"]) - @staticmethod - def advance_state( - t, dt, tau_m, resist_m, v_rest, v_reset, v_c, a0, refract_T, thr, tau_theta, theta_plus, - one_spike, lower_clamp_voltage, intgFlag, d_spike_fx, key, j, v, rfr, thr_theta, tols - ): - skey = None ## this is an empty dkey if single_spike mode turned off - if one_spike: - key, skey = random.split(key, 2) - ## run one integration step for neuronal dynamics - j = j * resist_m - ############################################################################ - ### Runs leaky integrator (leaky integrate-and-fire; LIF) neuronal dynamics. - _v_thr = thr_theta + thr #v_theta + v_thr ## calc present voltage threshold - #mask = (rfr >= refract_T).astype(jnp.float32) # get refractory mask - ## update voltage / membrane potential - v_params = (j, rfr, tau_m, refract_T, v_rest, v_c, a0) - if intgFlag == 1: - _, _v = step_rk2(0., v, _dfv, dt, v_params) - else: #_v = v + (v_rest - v) * (dt/tau_m) + (j * mask) - _, _v = step_euler(0., v, _dfv, dt, v_params) - ## obtain action potentials/spikes + @compilable + def advance_state(self, dt, t): + j = self.j.get() * self.resist_m + + _v_thr = self.thr_theta.get() + self.thr ## calc present voltage threshold + + v_params = (j, self.rfr.get(), self.tau_m, self.refract_T, self.v_rest, self.v_c, self.a0) + + if self.intgFlag == 1: + _, _v = step_rk2(0., self.v.get(), _dfv, dt, v_params) + else: + _, _v = step_euler(0., self.v.get(), _dfv, dt, v_params) + s = (_v > _v_thr) * 1. - ## update refractory variables - _rfr = (rfr + dt) * (1. - s) - ## perform hyper-polarization of neuronal cells - _v = _v * (1. - s) + s * v_reset - - raw_s = s + 0 ## preserve un-altered spikes - ############################################################################ - ## this is a spike post-processing step - if skey is not None: - m_switch = (jnp.sum(s) > 0.).astype(jnp.float32) ## TODO: not batch-able + _rfr = (self.rfr.get() + dt) * (1. - s) + _v = _v * (1. - s) + s * self.v_reset + + raw_s = s + + #surrogate = d_spike_fx(v, _v_thr) # d_spike_fx(v, thr + thr_theta) + + if self.one_spike and not self.max_one_spike: + key, skey = random.split(self.key.get(), 2) + + m_switch = (jnp.sum(s) > 0.).astype(jnp.float32) ## TODO: not batch-able rS = s * random.uniform(skey, s.shape) rS = nn.one_hot(jnp.argmax(rS, axis=1), num_classes=s.shape[1], dtype=jnp.float32) s = s * (1. - m_switch) + rS * m_switch - ############################################################################ - raw_spikes = raw_s - v = _v - rfr = _rfr + self.key.set(key) - surrogate = d_spike_fx(v, _v_thr) #d_spike_fx(v, thr + thr_theta) - if tau_theta > 0.: + if self.max_one_spike: + rS = nn.one_hot(jnp.argmax(self.v.get(), axis=1), num_classes=s.shape[1], + dtype=jnp.float32) ## get max-volt spike + s = s * rS ## mask out non-max volt spikes + + if self.tau_theta > 0.: ## run one integration step for threshold dynamics - thr_theta = _update_theta(dt, thr_theta, raw_spikes, tau_theta, theta_plus) + thr_theta = _update_theta(dt, self.thr_theta.get(), raw_s, self.tau_theta, self.theta_plus) # .get()) + self.thr_theta.set(thr_theta) + ## update tols - tols = (1. - s) * tols + (s * t) - if lower_clamp_voltage: ## ensure voltage never < v_rest - v = jnp.maximum(v, v_rest) - return v, s, raw_spikes, rfr, thr_theta, tols, key, surrogate - - @transition(output_compartments=["j", "v", "s", "s_raw", "rfr", "tols", "surrogate"]) - @staticmethod - def reset(batch_size, n_units, v_rest, refract_T): - restVals = jnp.zeros((batch_size, n_units)) - j = restVals #+ 0 - v = restVals + v_rest - s = restVals #+ 0 - s_raw = restVals - rfr = restVals + refract_T - #thr_theta = restVals ## do not reset thr_theta - tols = restVals #+ 0 - surrogate = restVals + 1. - return j, v, s, s_raw, rfr, tols, surrogate - - def save(self, directory, **kwargs): - ## do a protected save of constants, depending on whether they are floats or arrays - tau_m = (self.tau_m if isinstance(self.tau_m, float) - else jnp.asarray([[self.tau_m * 1.]])) - thr = (self.thr if isinstance(self.thr, float) - else jnp.asarray([[self.thr * 1.]])) - v_rest = (self.v_rest if isinstance(self.v_rest, float) - else jnp.asarray([[self.v_rest * 1.]])) - v_reset = (self.v_reset if isinstance(self.v_reset, float) - else jnp.asarray([[self.v_reset * 1.]])) - v_decay = (self.v_decay if isinstance(self.v_decay, float) - else jnp.asarray([[self.v_decay * 1.]])) - resist_m = (self.resist_m if isinstance(self.resist_m, float) - else jnp.asarray([[self.resist_m * 1.]])) - tau_theta = (self.tau_theta if isinstance(self.tau_theta, float) - else jnp.asarray([[self.tau_theta * 1.]])) - theta_plus = (self.theta_plus if isinstance(self.theta_plus, float) - else jnp.asarray([[self.theta_plus * 1.]])) - - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, - threshold_theta=self.thr_theta.value, - tau_m=tau_m, thr=thr, v_rest=v_rest, - v_reset=v_reset, v_decay=v_decay, - resist_m=resist_m, tau_theta=tau_theta, - theta_plus=theta_plus, - key=self.key.value) - - def load(self, directory, seeded=False, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.thr_theta.set(data['threshold_theta']) - ## constants loaded in - self.tau_m = data['tau_m'] - self.thr = data['thr'] - self.v_rest = data['v_rest'] - self.v_reset = data['v_reset'] - self.v_decay = data['v_decay'] - self.resist_m = data['resist_m'] - self.tau_theta = data['tau_theta'] - self.theta_plus = data['theta_plus'] - - if seeded: - self.key.set(data['key']) + self.tols.set((1. - s) * self.tols.get() + (s * t)) + + if self.v_min is not None: ## ensures voltage never < v_rest + _v = jnp.maximum(_v, self.v_min) + + self.v.set(_v) + self.s.set(s) + self.s_raw.set(raw_s) + self.rfr.set(_rfr) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + if not self.j.targeted: + self.j.set(restVals) + self.v.set(restVals + self.v_rest) + self.s.set(restVals) + self.s_raw.set(restVals) + self.rfr.set(restVals + self.refract_T) + self.tols.set(restVals) + #self.surrogate.set(restVals) @classmethod def help(cls): ## component help function @@ -272,17 +225,13 @@ def help(cls): ## component help function "v_reset": "Reset membrane potential value", "v_decay": "Voltage leak/decay factor", "tau_theta": "Threshold/homoestatic increment time constant", - "theta_plus": "Amount to increment threshold by upon occurrence " - "of spike", + "theta_plus": "Amount to increment threshold by upon occurrence of a spike", "refract_time": "Length of relative refractory period (ms)", - "one_spike": "Should only one spike be sampled/allowed to emit at " - "any given time step?", - "integration_type": "Type of numerical integration to use for the " - "cell dynamics", + "one_spike": "Should only one spike be sampled/allowed to emit at any given time step?", + "integration_type": "Type of numerical integration to use for the cell dynamics", "surrgoate_type": "Type of surrogate function to use approximate " "derivative of spike w.r.t. voltage/current", - "lower_bound_clamp": "Should voltage be lower bounded to be never " - "be below `v_rest`" + "v_min": "Minimum voltage allowed before voltage variables are min-clipped/clamped" } info = {cls.__name__: properties, "compartments": compartment_props, @@ -290,20 +239,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/neurons/spiking/sLIFCell.py b/ngclearn/components/neurons/spiking/sLIFCell.py index 76736aec..6b0c6fd8 100644 --- a/ngclearn/components/neurons/spiking/sLIFCell.py +++ b/ngclearn/components/neurons/spiking/sLIFCell.py @@ -1,15 +1,13 @@ +# %% + from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn from ngclearn.utils.diffeq.ode_utils import step_euler from ngclearn.utils.surrogate_fx import secant_lif_estimator -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment @jit def _dfv_internal(j, v, rfr, tau_m, refract_T): ## raw voltage dynamics @@ -101,7 +99,9 @@ class SLIFCell(JaxComponent): ## leaky integrate-and-fire cell refract_time: relative refractory period time (ms; Default: 1 ms) - rho_b: threshold sparsity factor (Default: 0) + rho_b: threshold sparsity factor (Default: 0); note that setting rho_b > 0 will + force the adaptive threshold to follow dynamics that ignore `thr_grain` and + `thr_leak` sticky_spikes: if True, spike variables will be pinned to action potential value (i.e, 1) throughout duration of the refractory period; this recovers @@ -112,7 +112,6 @@ class SLIFCell(JaxComponent): ## leaky integrate-and-fire cell batch_size: batch size dimension of this cell (Default: 1) """ - # Define Functions def __init__( self, name, n_units, tau_m, resist_m, thr, resist_inh=0., thr_persist=False, thr_gain=0.0, thr_leak=0.0, rho_b=0., refract_time=0., sticky_spikes=False, thr_jitter=0.05, batch_size=1, **kwargs @@ -132,7 +131,7 @@ def __init__( ## create simple recurrent inhibitory pressure self.inh_R = resist_inh ## lateral inhibitory magnitude - key, subkey = random.split(self.key.value) + key, subkey = random.split(self.key.get()) self.inh_weights = random.uniform(subkey, (n_units, n_units), minval=0.025, maxval=1.) self.inh_weights = self.inh_weights * (1. - jnp.eye(n_units)) @@ -162,12 +161,8 @@ def __init__( self.rfr = Compartment(restVals + self.refract_T) ## refractory variable(s) self.surrogate = Compartment(restVals + 1.) ## surrogate signal - @transition(output_compartments=["j", "s", "tols", "v", "thr", "rfr", "surrogate"]) - @staticmethod - def advance_state( - t, dt, inh_weights, R_m, inh_R, d_spike_fx, tau_m, spike_fx, refract_T, thrGain, - thrLeak, rho_b, sticky_spikes, v_min, j, s, v, thr, rfr, tols - ): + @compilable + def advance_state(self, t, dt): ##################################################################################### #The following 3 lines of code modify electrical current j via application of a #scalar membrane resistance value and an approximate form of lateral inhibition. @@ -180,20 +175,31 @@ def advance_state( #| R_m: membrane resistance (to multiply/scale j by), #| inh_R: inhibitory resistance to scale lateral inhibitory current by; if inh_R = 0, # NO lateral inhibitory pressure will be applied - j = j * R_m - if inh_R > 0.: ## if inh_R > 0, then lateral inhibition is applied - j = j - (jnp.matmul(spikes, inh_weights) * inh_R) + + # First, get the relevant compartment values + j = self.j.get() + # s = self.s.get() # NOTE: This is unused + tols = self.tols.get() + v = self.v.get() + thr = self.thr.get() + rfr = self.rfr.get() + surrogate = self.surrogate.get() + ## modify electrical current j via membrane resistance and lateral inhibition + + j = j * self.R_m + if self.inh_R > 0.: ## if inh_R > 0, then lateral inhibition is applied + j = j - (jnp.matmul(self.s.get(), self.inh_weights) * self.inh_R) ##################################################################################### - surrogate = d_spike_fx(j, c1=0.82, c2=0.08) ## calc surrogate deriv of spikes + surrogate = self.d_spike_fx(j, c1=0.82, c2=0.08) ## calc surrogate deriv of spikes ## transition to: voltage(t+dt), spikes, threshold(t+dt), refractory_variables(t+dt) - v_params = (j, rfr, tau_m, refract_T) + v_params = (j, rfr, self.tau_m, self.refract_T) _, _v = step_euler(0., v, _dfv, dt, v_params) - spikes = spike_fx(_v, thr) + spikes = self.spike_fx(_v, thr) #_v = _hyperpolarize(_v, spikes) _v = (1. - spikes) * _v ## hyper-polarize cells - new_thr = _update_threshold(dt, thr, spikes, thrGain, thrLeak, rho_b) - _rfr, spikes = _update_refract_and_spikes(dt, rfr, spikes, refract_T, sticky_spikes) + new_thr = _update_threshold(dt, thr, spikes, self.thrGain, self.thrLeak, self.rho_b) + _rfr, spikes = _update_refract_and_spikes(dt, rfr, spikes, self.refract_T, self.sticky_spikes) v = _v s = spikes thr = new_thr @@ -201,34 +207,48 @@ def advance_state( ## update tols tols = (1. - s) * tols + (s * t) - return j, s, tols, v, thr, rfr, surrogate - - @transition(output_compartments=["j", "s", "tols", "v", "thr", "rfr", "surrogate"]) - @staticmethod - def reset(refract_T, thr_persist, threshold0, batch_size, n_units, thr): - restVals = jnp.zeros((batch_size, n_units)) + # return j, s, tols, v, thr, rfr, surrogate + self.j.set(j) + self.s.set(s) + self.tols.set(tols) + self.v.set(v) + self.thr.set(thr) + self.rfr.set(rfr) + self.surrogate.set(surrogate) + + @compilable + def reset(self): + # refract_T, thr_persist, threshold0, batch_size, n_units, thr + restVals = jnp.zeros((self.batch_size, self.n_units)) voltage = restVals - refract = restVals + refract_T + refract = restVals + self.refract_T current = restVals surrogate = restVals + 1. timeOfLastSpike = restVals spikes = restVals - if not thr_persist: ## if thresh non-persistent, reset to base value - thr = threshold0 + 0 - return current, spikes, timeOfLastSpike, voltage, thr, refract, surrogate + if not self.thr_persist: ## if thresh non-persistent, reset to base value + thr = self.threshold0 + 0 + self.thr.set(thr) + # return current, spikes, timeOfLastSpike, voltage, thr, refract, surrogate + self.j.set(current) + self.s.set(spikes) + self.tols.set(timeOfLastSpike) + self.v.set(voltage) + self.rfr.set(refract) + self.surrogate.set(surrogate) def save(self, directory, **kwargs): file_name = directory + "/" + self.name + ".npz" if self.thr_persist == False: jnp.savez(file_name, threshold=self.threshold0) # save threshold0 else: - jnp.savez(file_name, threshold=self.thr.value) # save the actual threshold param/compartment + jnp.savez(file_name, threshold=self.thr.get()) # save the actual threshold param/compartment def load(self, directory, **kwargs): file_name = directory + "/" + self.name + ".npz" data = jnp.load(file_name) self.thr.set(data['threshold']) - self.threshold0 = self.thr.value + 0 + self.threshold0 = self.thr.get() + 0 @classmethod def help(cls): ## component help function @@ -269,20 +289,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/other/expKernel.py b/ngclearn/components/other/expKernel.py index a074c30e..7c99049f 100644 --- a/ngclearn/components/other/expKernel.py +++ b/ngclearn/components/other/expKernel.py @@ -2,12 +2,8 @@ from jax import numpy as jnp, random, jit from functools import partial from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn - -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment @partial(jit, static_argnums=[5,6]) def _apply_kernel(tf_curr, s, t, tau_w, win_len, krn_start, krn_end): @@ -49,7 +45,6 @@ class ExpKernel(JaxComponent): ## exponential kernel batch_size: batch size dimension of this cell (Default: 1) """ - # Define Functions def __init__(self, name, n_units, dt, tau_w=500., nu=4., batch_size=1, **kwargs): super().__init__(name, **kwargs) @@ -67,21 +62,31 @@ def __init__(self, name, n_units, dt, tau_w=500., nu=4., batch_size=1, **kwargs) ## window of spike times self.tf = Compartment(jnp.zeros((self.win_len, self.batch_size, self.n_units))) - @transition(output_compartments=["epsp", "tf"]) - @staticmethod - def advance_state(t, tau_w, win_len, inputs, tf): + @compilable + def advance_state(self, t): + # Get the variables + inputs = self.inputs.get() + tf = self.tf.get() + s = inputs ## update spike time window and corresponding window volume - tf, epsp = _apply_kernel(tf, s, t, tau_w, win_len, krn_start=0, - krn_end=win_len-1) #0:win_len-1) - return epsp, tf - - @transition(output_compartments=["inputs", "epsp", "tf"]) - @staticmethod - def reset(batch_size, n_units, win_len): - restVals = jnp.zeros((batch_size, n_units)) - restTensor = jnp.zeros([win_len, batch_size, n_units], jnp.float32) # tf - return restVals, restVals, restTensor # inputs, epsp, tf + tf, epsp = _apply_kernel( + tf, s, t, self.tau_w, self.win_len, krn_start=0, krn_end=self.win_len-1 + ) #0:win_len-1) + + # Update compartments + self.epsp.set(epsp) + self.tf.set(tf) + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) ## inputs, epsp + restTensor = jnp.zeros([self.win_len, self.batch_size, self.n_units], jnp.float32) ## tf + # BUG: the self.inputs here does not have the targeted field + # NOTE: Quick workaround is to check if targeted is in the input or not + hasattr(self.inputs, "targeted") and not self.inputs.targeted and self.inputs.set(restVals) + self.epsp.set(restVals) + self.tf.set(restTensor) @classmethod def help(cls): ## component help function diff --git a/ngclearn/components/other/varTrace.py b/ngclearn/components/other/varTrace.py index 94510e75..d4de9f47 100644 --- a/ngclearn/components/other/varTrace.py +++ b/ngclearn/components/other/varTrace.py @@ -1,13 +1,10 @@ +# %% + from ngclearn.components.jaxComponent import JaxComponent from jax import numpy as jnp, random, jit from functools import partial -from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args -from ngcsimlib.logger import info, warn - -from ngcsimlib.compilers.process import transition -#from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment @partial(jit, static_argnums=[4]) def _run_varfilter(dt, x, x_tr, decayFactor, gamma_tr, a_delta=0.): @@ -77,17 +74,17 @@ class VarTrace(JaxComponent): ## low-pass filter batch_size: batch size dimension of this cell (Default: 1) """ - # Define Functions def __init__(self, name, n_units, tau_tr, a_delta, P_scale=1., gamma_tr=1, decay_type="exp", - n_nearest_spikes=0, batch_size=1, **kwargs): - super().__init__(name, **kwargs) + n_nearest_spikes=0, batch_size=1, key=None): + super().__init__(name, key) ## Trace control coefficients + self.decay_type = decay_type ## lin --> linear decay; exp --> exponential decay + self.tau_tr = tau_tr ## trace time constant self.a_delta = a_delta ## trace increment (if spike occurred) self.P_scale = P_scale ## trace scale if non-additive trace to be used self.gamma_tr = gamma_tr - self.decay_type = decay_type ## lin --> linear decay; exp --> exponential decay self.n_nearest_spikes = n_nearest_spikes ## Layer Size Setup @@ -99,32 +96,37 @@ def __init__(self, name, n_units, tau_tr, a_delta, P_scale=1., gamma_tr=1, decay self.outputs = Compartment(restVals) # output compartment self.trace = Compartment(restVals) - @transition(output_compartments=["outputs", "trace"]) - @staticmethod - def advance_state( - dt, decay_type, tau_tr, a_delta, P_scale, gamma_tr, inputs, trace, n_nearest_spikes - ): - decayFactor = 0. - if "exp" in decay_type: - decayFactor = jnp.exp(-dt/tau_tr) - elif "lin" in decay_type: - decayFactor = (1. - dt/tau_tr) - _x_tr = gamma_tr * trace * decayFactor - if n_nearest_spikes > 0: ## run k-nearest neighbor trace - _x_tr = _x_tr + inputs * (a_delta - (trace/n_nearest_spikes)) + @compilable + def advance_state(self, dt): + if "exp" in self.decay_type: + decayFactor = jnp.exp(-dt/self.tau_tr) + elif "lin" in self.decay_type: + decayFactor = (1. - dt/self.tau_tr) + else: + decayFactor = 0. + + + _x_tr = self.gamma_tr * self.trace.get() * decayFactor + if self.n_nearest_spikes > 0: + _x_tr = _x_tr + self.inputs.get() * (self.a_delta - (self.trace.get() / self.n_nearest_spikes)) else: - if a_delta > 0.: ## run full convolution trace - _x_tr = _x_tr + inputs * a_delta - else: ## run simple max-clamped trace - _x_tr = _x_tr * (1. - inputs) + inputs * P_scale - trace = _x_tr - return trace, trace - - @transition(output_compartments=["inputs", "outputs", "trace"]) - @staticmethod - def reset(batch_size, n_units): - restVals = jnp.zeros((batch_size, n_units)) - return restVals, restVals, restVals + if self.a_delta > 0.: + _x_tr = _x_tr + self.inputs.get() * self.a_delta + else: + _x_tr = _x_tr * (1. - self.inputs.get()) + self.inputs.get() * self.P_scale + + self.trace.set(_x_tr) + self.outputs.set(_x_tr) + + + @compilable + def reset(self): + restVals = jnp.zeros((self.batch_size, self.n_units)) + # BUG: the self.inputs here does not have the targeted field + # NOTE: Quick workaround is to check if targeted is in the input or not + hasattr(self.inputs, "targeted") and not self.inputs.targeted and self.inputs.set(restVals) + self.outputs.set(restVals) + self.trace.set(restVals) @classmethod def help(cls): ## component help function @@ -159,19 +161,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines if __name__ == '__main__': from ngcsimlib.context import Context diff --git a/ngclearn/components/synapses/STPDenseSynapse.py b/ngclearn/components/synapses/STPDenseSynapse.py index 4fc1a81b..31cf7c67 100755 --- a/ngclearn/components/synapses/STPDenseSynapse.py +++ b/ngclearn/components/synapses/STPDenseSynapse.py @@ -1,12 +1,10 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from ngclearn.utils.weight_distribution import initialize_params from ngcsimlib.logger import info + +from ngclearn.utils.distribution_generator import DistributionGenerator +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngclearn.components.synapses import DenseSynapse -from ngclearn.utils import tensorstats class STPDenseSynapse(DenseSynapse): ## short-term plastic synaptic cable """ @@ -56,10 +54,10 @@ class STPDenseSynapse(DenseSynapse): ## short-term plastic synaptic cable resources_int: initialization kernel for synaptic resources matrix """ - # Define Functions - def __init__(self, name, shape, weight_init=None, bias_init=None, - resist_scale=1., p_conn=1., tau_f=750., tau_d=50., - resources_init=None, **kwargs): + def __init__( + self, name, shape, weight_init=None, bias_init=None, resist_scale=1., p_conn=1., tau_f=750., tau_d=50., + resources_init=None, **kwargs + ): super().__init__(name, shape, weight_init, bias_init, resist_scale, p_conn, **kwargs) ## STP meta-parameters self.resources_init = resources_init @@ -67,69 +65,72 @@ def __init__(self, name, shape, weight_init=None, bias_init=None, self.tau_d = tau_d ## Set up short-term plasticity / dynamic synapse compartment values - tmp_key, *subkeys = random.split(self.key.value, 4) + tmp_key, *subkeys = random.split(self.key.get(), 4) preVals = jnp.zeros((self.batch_size, shape[0])) self.u = Compartment(preVals) ## release prob variables self.x = Compartment(preVals + 1) ## resource availability variables - self.Wdyn = Compartment(self.weights.value * 0) ## dynamic synapse values + self.Wdyn = Compartment(self.weights.get() * 0) ## dynamic synapse values if self.resources_init is None: info(self.name, "is using default resources value initializer!") - self.resources_init = {"dist": "uniform", "amin": 0.125, "amax": 0.175} # 0.15 + #self.resources_init = {"dist": "uniform", "amin": 0.125, "amax": 0.175} # 0.15 + self.resources_init = DistributionGenerator.uniform(low=0.125, high=0.175) self.resources = Compartment( - initialize_params(subkeys[2], self.resources_init, shape) + self.resources_init(shape, subkeys[2]) #initialize_params(subkeys[2], self.resources_init, shape) ) ## matrix U - synaptic resources matrix - @transition(output_compartments=["outputs", "u", "x", "Wdyn"]) - @staticmethod - def advance_state( - tau_f, tau_d, Rscale, inputs, weights, biases, resources, u, x, Wdyn - ): - s = inputs + @compilable + def advance_state(self, t, dt): + s = self.inputs.get() ## compute short-term facilitation #u = u - u * (1./tau_f) + (resources * (1. - u)) * s - if tau_f > 0.: ## compute short-term facilitation - u = u - u * (1./tau_f) + (resources * (1. - u)) * s + if self.tau_f > 0.: ## compute short-term facilitation + u = self.u.get() - self.u.get() * (1./self.tau_f) + (self.resources.get() * (1. - self.u.get())) * s else: - u = resources ## disabling STF yields fixed resource u variables + u = self.resources.get() ## disabling STF yields fixed resource u variables ## compute dynamic synaptic values/conductances - Wdyn = (weights * u * x) * s + Wdyn * (1. - s) ## OR: -W/tau_w + W * u * x - if tau_d > 0.: - ## compute short-term depression - x = x + (1. - x) * (1./tau_d) - u * x * s - outputs = jnp.matmul(inputs, Wdyn * Rscale) + biases - return outputs, u, x, Wdyn - - @transition(output_compartments=["inputs", "outputs", "u", "x", "Wdyn"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - u = preVals - x = preVals + 1 - Wdyn = jnp.zeros(shape) - return inputs, outputs, u, x, Wdyn - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - if self.bias_init != None: - jnp.savez(file_name, - weights=self.weights.value, - biases=self.biases.value, - resources=self.resources.value) - else: - jnp.savez(file_name, - weights=self.weights.value, - resources=self.resources.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - self.resources.set(data['resources']) - if "biases" in data.keys(): - self.biases.set(data['biases']) + Wdyn = (self.weights.get() * u * self.x.get()) * s + self.Wdyn.get() * (1. - s) ## OR: -W/tau_w + W * u * x + ## compute short-term depression + x = self.x.get() + if self.tau_d > 0.: + x = x + (1. - x) * (1./self.tau_d) - u * x * s + ## else, do nothing with x (keep it pointing to current x compartment) + outputs = jnp.matmul(self.inputs.get(), Wdyn * self.resist_scale) + self.biases.get() + + self.outputs.set(outputs) + self.u.set(u) + self.x.set(x) + self.Wdyn.set(Wdyn) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.u.set(preVals) + self.x.set(preVals + 1) + self.Wdyn.set(jnp.zeros(self.shape.get())) + + # def save(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # if self.bias_init != None: + # jnp.savez(file_name, + # weights=self.weights.value, + # biases=self.biases.value, + # resources=self.resources.value) + # else: + # jnp.savez(file_name, + # weights=self.weights.value, + # resources=self.resources.value) + # + # def load(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # data = jnp.load(file_name) + # self.weights.set(data['weights']) + # self.resources.set(data['resources']) + # if "biases" in data.keys(): + # self.biases.set(data['biases']) @classmethod def help(cls): ## component help function @@ -166,17 +167,3 @@ def help(cls): ## component help function "dW/dt = W_full * u * x * inputs", "hyperparameters": hyperparams} return info - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/synapses/__init__.py b/ngclearn/components/synapses/__init__.py index 2c21c231..95bf3f70 100644 --- a/ngclearn/components/synapses/__init__.py +++ b/ngclearn/components/synapses/__init__.py @@ -1,21 +1,19 @@ from .denseSynapse import DenseSynapse from .staticSynapse import StaticSynapse - ## short-term plasticity components from .STPDenseSynapse import STPDenseSynapse from .exponentialSynapse import ExponentialSynapse -from .doubleExpSynapse import DoupleExpSynapse +from .doubleExpSynapse import DoubleExpSynapse from .alphaSynapse import AlphaSynapse ## dense synaptic components -from .hebbian.hebbianSynapse import HebbianSynapse +# from .hebbian.hebbianSynapse import HebbianSynapse from .hebbian.traceSTDPSynapse import TraceSTDPSynapse from .hebbian.expSTDPSynapse import ExpSTDPSynapse from .hebbian.eventSTDPSynapse import EventSTDPSynapse from .hebbian.BCMSynapse import BCMSynapse - ## conv/deconv synaptic components from .convolution.convSynapse import ConvSynapse from .convolution.staticConvSynapse import StaticConvSynapse @@ -26,10 +24,9 @@ from .convolution.hebbianDeconvSynapse import HebbianDeconvSynapse from .convolution.traceSTDPDeconvSynapse import TraceSTDPDeconvSynapse - ## modulated synaptic components from .modulated.MSTDPETSynapse import MSTDPETSynapse -from .modulated.REINFORCESynapse import REINFORCESynapse +# from .modulated.REINFORCESynapse import REINFORCESynapse ## patched synaptic components from .patched.patchedSynapse import PatchedSynapse diff --git a/ngclearn/components/synapses/alphaSynapse.py b/ngclearn/components/synapses/alphaSynapse.py index cf5f9543..cbdbb8c8 100644 --- a/ngclearn/components/synapses/alphaSynapse.py +++ b/ngclearn/components/synapses/alphaSynapse.py @@ -1,12 +1,8 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngclearn.components.synapses import DenseSynapse -from ngclearn.utils import tensorstats class AlphaSynapse(DenseSynapse): ## dynamic alpha synapse cable """ @@ -62,10 +58,9 @@ class AlphaSynapse(DenseSynapse): ## dynamic alpha synapse cable """ - # Define Functions def __init__( - self, name, shape, tau_decay, g_syn_bar, syn_rest, weight_init=None, bias_init=None, resist_scale=1., p_conn=1., - is_nonplastic=True, **kwargs + self, name, shape, tau_decay, g_syn_bar, syn_rest, weight_init=None, bias_init=None, resist_scale=1., + p_conn=1., is_nonplastic=True, **kwargs ): super().__init__(name, shape, weight_init, bias_init, resist_scale, p_conn, **kwargs) ## dynamic synapse meta-parameters @@ -82,55 +77,41 @@ def __init__( self.g_syn = Compartment(postVals) ## conductance variable self.h_syn = Compartment(postVals) ## intermediate conductance variable if is_nonplastic: - self.weights.set(self.weights.value * 0 + 1.) + self.weights.set(self.weights.get() * 0 + 1.) - @transition(output_compartments=["outputs", "i_syn", "g_syn", "h_syn"]) - @staticmethod - def advance_state( - dt, tau_decay, g_syn_bar, syn_rest, Rscale, inputs, weights, i_syn, g_syn, h_syn, v - ): - s = inputs + @compilable + def advance_state(self, t, dt): + s = self.inputs.get() ## advance conductance variable(s) - _out = jnp.matmul(s, weights) ## sum all pre-syn spikes at t going into post-neuron) - dhsyn_dt = -h_syn/tau_decay + (_out * g_syn_bar) * (1./dt) - h_syn = h_syn + dhsyn_dt * dt ## run Euler step to move intermediate conductance h + _out = jnp.matmul(s, self.weights.get()) ## sum all pre-syn spikes at t going into post-neuron) + dhsyn_dt = -self.h_syn.get()/self.tau_decay + (_out * self.g_syn_bar) * (1./dt) + h_syn = self.h_syn.get() + dhsyn_dt * dt ## run Euler step to move intermediate conductance h - dgsyn_dt = -g_syn/tau_decay + h_syn * (1./dt) # or -g_syn/tau_decay + h_syn/tau_decay - g_syn = g_syn + dgsyn_dt * dt ## run Euler step to move conductance g + dgsyn_dt = -self.g_syn.get()/self.tau_decay + h_syn * (1./dt) # or -g_syn/tau_decay + h_syn/tau_decay + g_syn = self.g_syn.get() + dgsyn_dt * dt ## run Euler step to move conductance g ## compute derive electrical current variable - i_syn = -g_syn * Rscale - if syn_rest is not None: - i_syn = -(g_syn * Rscale) * (v - syn_rest) - outputs = i_syn #jnp.matmul(inputs, Wdyn * Rscale) + biases - return outputs, i_syn, g_syn, h_syn - - @transition(output_compartments=["inputs", "outputs", "i_syn", "g_syn", "h_syn", "v"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - i_syn = postVals - g_syn = postVals - h_syn = postVals - v = postVals - return inputs, outputs, i_syn, g_syn, h_syn, v - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - if self.bias_init != None: - jnp.savez(file_name, weights=self.weights.value, biases=self.biases.value) - else: - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - if "biases" in data.keys(): - self.biases.set(data['biases']) + i_syn = -g_syn * self.resist_scale + if self.syn_rest is not None: + i_syn = -(g_syn * self.resist_scale) * (self.v.get() - self.syn_rest) + outputs = i_syn #jnp.matmul(inputs, Wdyn * self.resist_scale) + biases + + self.outputs.set(outputs) + self.i_syn.set(i_syn) + self.g_syn.set(g_syn) + self.h_syn.set(h_syn) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.i_syn.set(postVals) + self.g_syn.set(postVals) + self.h_syn.set(postVals) + self.v.set(postVals) @classmethod def help(cls): ## component help function @@ -170,17 +151,3 @@ def help(cls): ## component help function "dgsyn_dt = -g_syn/tau_decay + h_syn", "hyperparameters": hyperparams} return info - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/synapses/convolution/__init__.py b/ngclearn/components/synapses/convolution/__init__.py index ed305c38..0724f25f 100755 --- a/ngclearn/components/synapses/convolution/__init__.py +++ b/ngclearn/components/synapses/convolution/__init__.py @@ -6,3 +6,4 @@ from .hebbianDeconvSynapse import HebbianDeconvSynapse from .traceSTDPConvSynapse import TraceSTDPConvSynapse from .traceSTDPDeconvSynapse import TraceSTDPDeconvSynapse + diff --git a/ngclearn/components/synapses/convolution/convSynapse.py b/ngclearn/components/synapses/convolution/convSynapse.py index 12c5e674..5af6810f 100755 --- a/ngclearn/components/synapses/convolution/convSynapse.py +++ b/ngclearn/components/synapses/convolution/convSynapse.py @@ -1,15 +1,12 @@ from jax import random, numpy as jnp, jit -from ngclearn.components.jaxComponent import JaxComponent -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from ngclearn.utils.weight_distribution import initialize_params +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngcsimlib.logger import info -from ngclearn.utils import tensorstats -import ngclearn.utils.weight_distribution as dist +from ngclearn.utils.distribution_generator import DistributionGenerator from ngclearn.components.synapses.convolution.ngcconv import conv2d +from ngclearn.components.jaxComponent import JaxComponent + class ConvSynapse(JaxComponent): ## base-level convolutional cable """ A base convolutional synaptic cable. @@ -47,7 +44,6 @@ class ConvSynapse(JaxComponent): ## base-level convolutional cable batch_size: batch size dimension of this component """ - # Define Functions def __init__( self, name, shape, x_shape, filter_init=None, bias_init=None, stride=1, padding=None, resist_scale=1., batch_size=1, **kwargs @@ -61,7 +57,7 @@ def __init__( self.shape = shape ## shape of synaptic filter tensor x_size, x_size = x_shape self.x_size = x_size - self.Rscale = resist_scale ## post-transformation scale factor + self.resist_scale = resist_scale ## post-transformation scale factor self.padding = padding self.stride = stride @@ -69,7 +65,7 @@ def __init__( k_size, k_size, n_in_chan, n_out_chan = shape self.pad_args = None if self.padding is not None and self.padding == "SAME": - if (x_size % stride == 0): + if x_size % stride == 0: pad_along_height = max(k_size - stride, 0) else: pad_along_height = max(k_size - (x_size % stride), 0) @@ -83,8 +79,13 @@ def __init__( self.pad_args = ((0, 0), (0, 0)) ######################### set up compartments ########################## - tmp_key, *subkeys = random.split(self.key.value, 4) - weights = dist.initialize_params(subkeys[0], filter_init, shape) ## filter tensor + tmp_key, *subkeys = random.split(self.key.get(), 4) + #weights = dist.initialize_params(subkeys[0], filter_init, shape) + if self.filter_init is None: + info(self.name, "is using default weight initializer!") + self.filter_init = DistributionGenerator.uniform(0.025, 0.8) + weights = self.filter_init(shape, subkeys[0]) ## filter tensor + self.batch_size = batch_size # 1 ## Compartment setup and shape computation _x = jnp.zeros((self.batch_size, x_size, x_size, n_in_chan)) @@ -95,42 +96,42 @@ def __init__( self.outputs = Compartment(jnp.zeros(self.out_shape)) self.weights = Compartment(weights) if self.bias_init is None: - info(self.name, "is using default bias value of zero (no bias " - "kernel provided)!") + info(self.name, "is using default bias value of zero (no bias kernel provided)!") self.biases = Compartment( - dist.initialize_params(subkeys[2], bias_init, (1, shape[1])) if bias_init else 0.0 + #dist.initialize_params(subkeys[2], bias_init, (1, shape[1])) if bias_init else 0.0 + self.bias_init((1, shape[1]), subkeys[2]) if bias_init else 0.0 ) - @transition(output_compartments=["outputs"]) - @staticmethod - def advance_state(Rscale, padding, stride, weights, biases, inputs): - _x = inputs - outputs = conv2d(_x, weights, stride_size=stride, padding=padding) * Rscale + biases - return outputs - - @transition(output_compartments=["inputs", "outputs"]) - @staticmethod - def reset(in_shape, out_shape): - preVals = jnp.zeros(in_shape) - postVals = jnp.zeros(out_shape) - inputs = preVals - outputs = postVals - return inputs, outputs - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - if self.bias_init != None: - jnp.savez(file_name, weights=self.weights.value, - biases=self.biases.value) - else: - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - if "biases" in data.keys(): - self.biases.set(data['biases']) + @compilable + def advance_state(self): #Rscale, padding, stride, weights, biases, inputs): + _x = self.inputs.get() + ## FIXME: does resist_scale affect update rules? + outputs = conv2d( + _x, self.weights.get(), stride_size=self.stride, padding=self.padding + ) * self.resist_scale + self.biases.get() + self.outputs.set(outputs) + + @compilable + def reset(self): #in_shape, out_shape): + preVals = jnp.zeros(self.in_shape) + postVals = jnp.zeros(self.out_shape) + self.inputs.set(preVals) + self.outputs.set(postVals) + + # def save(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # if self.bias_init != None: + # jnp.savez(file_name, weights=self.weights.get(), + # biases=self.biases.get()) + # else: + # jnp.savez(file_name, weights=self.weights.get()) + # + # def load(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # data = jnp.load(file_name) + # self.weights.set(data['weights']) + # if "biases" in data.keys(): + # self.biases.set(data['biases']) @classmethod def help(cls): ## component help function @@ -163,17 +164,3 @@ def help(cls): ## component help function "dynamics": "outputs = [K @ inputs] * R + b", "hyperparameters": hyperparams} return info - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/synapses/convolution/deconvSynapse.py b/ngclearn/components/synapses/convolution/deconvSynapse.py index 13d78c6b..cf52d9d7 100755 --- a/ngclearn/components/synapses/convolution/deconvSynapse.py +++ b/ngclearn/components/synapses/convolution/deconvSynapse.py @@ -1,15 +1,13 @@ from jax import random, numpy as jnp, jit -from ngclearn.components.jaxComponent import JaxComponent -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from ngclearn.utils.weight_distribution import initialize_params +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngcsimlib.logger import info -from ngclearn.utils import tensorstats -import ngclearn.utils.weight_distribution as dist +from ngclearn.utils.distribution_generator import DistributionGenerator from ngclearn.components.synapses.convolution.ngcconv import deconv2d +from ngclearn.components.jaxComponent import JaxComponent + + class DeconvSynapse(JaxComponent): ## base-level deconvolutional cable """ A base deconvolutional (transposed convolutional) synaptic cable. @@ -47,7 +45,6 @@ class DeconvSynapse(JaxComponent): ## base-level deconvolutional cable batch_size: batch size dimension of this component """ - # Define Functions def __init__( self, name, shape, x_shape, filter_init=None, bias_init=None, stride=1, padding=None, resist_scale=1., batch_size=1, **kwargs @@ -61,7 +58,7 @@ def __init__( self.shape = shape ## shape of synaptic filter tensor x_size, x_size = x_shape self.x_size = x_size - self.Rscale = resist_scale ## post-transformation scale factor + self.resist_scale = resist_scale ## post-transformation scale factor self.padding = padding self.stride = stride @@ -70,9 +67,13 @@ def __init__( self.pad_args = None ######################### set up compartments ########################## - tmp_key, *subkeys = random.split(self.key.value, 4) - weights = dist.initialize_params(subkeys[0], filter_init, - shape) ## filter tensor + tmp_key, *subkeys = random.split(self.key.get(), 4) + #weights = dist.initialize_params(subkeys[0], filter_init, shape) + if self.filter_init is None: + info(self.name, "is using default weight initializer!") + self.filter_init = DistributionGenerator.uniform(0.025, 0.8) + weights = self.filter_init(shape, subkeys[0]) ## filter tensor + self.batch_size = batch_size # 1 ## Compartment setup and shape computation _x = jnp.zeros((self.batch_size, x_size, x_size, n_in_chan)) @@ -85,40 +86,40 @@ def __init__( if self.bias_init is None: info(self.name, "is using default bias value of zero (no bias " "kernel provided)!") - self.biases = Compartment(dist.initialize_params(subkeys[2], bias_init, - (1, shape[1])) - if bias_init else 0.0) - - @transition(output_compartments=["outputs"]) - @staticmethod - def advance_state(Rscale, padding, stride, weights, biases, inputs): - _x = inputs - out = deconv2d(_x, weights, stride_size=stride, padding=padding) * Rscale + biases - return out - - @transition(output_compartments=["inputs", "outputs"]) - @staticmethod - def reset(in_shape, out_shape): - preVals = jnp.zeros(in_shape) - postVals = jnp.zeros(out_shape) - inputs = preVals - outputs = postVals - return inputs, outputs - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - if self.bias_init != None: - jnp.savez(file_name, weights=self.weights.value, - biases=self.biases.value) - else: - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - if "biases" in data.keys(): - self.biases.set(data['biases']) + self.biases = Compartment( + # dist.initialize_params(subkeys[2], bias_init, (1, shape[1])) if bias_init else 0.0 + self.bias_init((1, shape[1]), subkeys[2]) if bias_init else 0.0 + ) + + @compilable + def advance_state(self): + _x = self.inputs.get() + out = deconv2d( + _x, self.weights.get(), stride_size=self.stride, padding=self.padding + ) * self.resist_scale + self.biases.get() + self.outputs.set(out) + + @compilable + def reset(self): #in_shape, out_shape): + preVals = jnp.zeros(self.in_shape) + postVals = jnp.zeros(self.out_shape) + self.inputs.set(preVals) + self.outputs.set(postVals) + + # def save(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # if self.bias_init != None: + # jnp.savez(file_name, weights=self.weights.get(), + # biases=self.biases.get()) + # else: + # jnp.savez(file_name, weights=self.weights.get()) + # + # def load(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # data = jnp.load(file_name) + # self.weights.set(data['weights']) + # if "biases" in data.keys(): + # self.biases.set(data['biases']) @classmethod def help(cls): ## component help function @@ -151,17 +152,3 @@ def help(cls): ## component help function "dynamics": "outputs = [K @.T inputs] * R + b", "hyperparameters": hyperparams} return info - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/synapses/convolution/hebbianConvSynapse.py b/ngclearn/components/synapses/convolution/hebbianConvSynapse.py index ff45f76b..a66242a4 100755 --- a/ngclearn/components/synapses/convolution/hebbianConvSynapse.py +++ b/ngclearn/components/synapses/convolution/hebbianConvSynapse.py @@ -1,13 +1,8 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from .convSynapse import ConvSynapse -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -from ngclearn.utils import tensorstats -import ngclearn.utils.weight_distribution as dist +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +from ngclearn.components.synapses.convolution.convSynapse import ConvSynapse + from ngclearn.components.synapses.convolution.ngcconv import (_conv_same_transpose_padding, _conv_valid_transpose_padding) from ngclearn.components.synapses.convolution.ngcconv import (conv2d, _calc_dX_conv, @@ -17,8 +12,7 @@ class HebbianConvSynapse(ConvSynapse): ## Hebbian-evolved convolutional cable """ - A synaptic convolutional cable that adjusts its efficacies via a two-factor - Hebbian adjustment rule. + A specialized synaptic convolutional cable that adjusts its efficacies via a two-factor Hebbian adjustment rule. | --- Synapse Compartments: --- | inputs - input (takes in external signals) @@ -87,11 +81,11 @@ class HebbianConvSynapse(ConvSynapse): ## Hebbian-evolved convolutional cable batch_size: batch size dimension of this component """ - # Define Functions - def __init__(self, name, shape, x_shape, eta=0., filter_init=None, bias_init=None, - stride=1, padding=None, resist_scale=1., w_bound=0., - is_nonnegative=False, w_decay=0., sign_value=1., optim_type="sgd", - batch_size=1, **kwargs): + def __init__( + self, name, shape, x_shape, eta=0., filter_init=None, bias_init=None, stride=1, padding=None, + resist_scale=1., w_bound=0., is_nonnegative=False, w_decay=0., sign_value=1., optim_type="sgd", + batch_size=1, **kwargs + ): super().__init__( name, shape, x_shape=x_shape, filter_init=filter_init, bias_init=bias_init, resist_scale=resist_scale, stride=stride, padding=padding, batch_size=batch_size, **kwargs @@ -107,9 +101,9 @@ def __init__(self, name, shape, x_shape, eta=0., filter_init=None, bias_init=Non ######################### set up compartments ########################## ## Compartment setup and shape computation - self.dWeights = Compartment(self.weights.value * 0) + self.dWeights = Compartment(self.weights.get() * 0) self.dInputs = Compartment(jnp.zeros(self.in_shape)) - self.dBiases = Compartment(self.biases.value * 0) + self.dBiases = Compartment(self.biases.get() * 0) self.pre = Compartment(jnp.zeros(self.in_shape)) self.post = Compartment(jnp.zeros(self.out_shape)) @@ -120,80 +114,75 @@ def __init__(self, name, shape, x_shape, eta=0., filter_init=None, bias_init=Non self.antiPad = None k_size, k_size, n_in_chan, n_out_chan = self.shape if padding == "SAME": - self.antiPad = _conv_same_transpose_padding(self.post.value.shape[1], + self.antiPad = _conv_same_transpose_padding(self.post.get().shape[1], self.x_size, k_size, stride) elif padding == "VALID": - self.antiPad = _conv_valid_transpose_padding(self.post.value.shape[1], + self.antiPad = _conv_valid_transpose_padding(self.post.get().shape[1], self.x_size, k_size, stride) ######################################################################## ## set up outer optimization compartments - self.opt_params = Compartment(get_opt_init_fn(optim_type)( - [self.weights.value, self.biases.value] - if bias_init else [self.weights.value])) + self.opt_params = Compartment( + get_opt_init_fn(optim_type)([self.weights.get(), self.biases.get()] if bias_init else [self.weights.get()]) + ) def _init(self, batch_size, x_size, shape, stride, padding, pad_args, weights): k_size, k_size, n_in_chan, n_out_chan = shape _x = jnp.zeros((batch_size, x_size, x_size, n_in_chan)) - _d = conv2d(_x, weights.value, stride_size=stride, padding=padding) * 0 + _d = conv2d(_x, weights.get(), stride_size=stride, padding=padding) * 0 _dK = _calc_dK_conv(_x, _d, stride_size=stride, padding=pad_args) ## get filter update correction - dx = _dK.shape[0] - weights.value.shape[0] - dy = _dK.shape[1] - weights.value.shape[1] + dx = _dK.shape[0] - weights.get().shape[0] + dy = _dK.shape[1] - weights.get().shape[1] self.delta_shape = (max(dx, 0), max(dy, 0)) ## get input update correction - _dx = _calc_dX_conv(weights.value, _d, stride_size=stride, - anti_padding=pad_args) + _dx = _calc_dX_conv(weights.get(), _d, stride_size=stride, anti_padding=pad_args) dx = (_dx.shape[1] - _x.shape[1]) dy = (_dx.shape[2] - _x.shape[2]) self.x_delta_shape = (dx, dy) - @staticmethod - def _compute_update( - sign_value, w_decay, bias_init, stride, pad_args, delta_shape, pre, post, weights - ): ## synaptic kernel adjustment calculation co-routine + def _compute_update(self): #sign_value, w_decay, bias_init, stride, pad_args, delta_shape, pre, post, weights + ## synaptic kernel adjustment calculation co-routine ## compute adjustment to filters - dWeights = calc_dK_conv(pre, post, delta_shape=delta_shape, stride_size=stride, padding=pad_args) - dWeights = dWeights * sign_value - if w_decay > 0.: ## apply synaptic decay - dWeights = dWeights - weights * w_decay + dWeights = calc_dK_conv( + self.pre.get(), self.post.get(), delta_shape=self.delta_shape, stride_size=self.stride, padding=self.pad_args + ) + dWeights = dWeights * self.sign_value + if self.w_decay > 0.: ## apply synaptic decay + dWeights = dWeights - self.weights.get() * self.w_decay ## compute adjustment to base-rates (if applicable) dBiases = 0. # jnp.zeros((1,1)) - if bias_init != None: - dBiases = jnp.sum(post, axis=0, keepdims=True) * sign_value + if self.bias_init != None: + dBiases = jnp.sum(self.post.get(), axis=0, keepdims=True) * self.sign_value return dWeights, dBiases - @transition(output_compartments=["opt_params", "weights", "biases", "dWeights", "dBiases"]) - @staticmethod - def evolve( - opt, sign_value, w_decay, w_bounds, is_nonnegative, bias_init, stride, pad_args, delta_shape, pre, post, - weights, biases, opt_params - ): + @compilable + def evolve(self): ## calc dFilters / dBiases - update to filters and biases - dWeights, dBiases = HebbianConvSynapse._compute_update( - sign_value, w_decay, bias_init, stride, pad_args, delta_shape, pre, post, weights - ) - if bias_init != None: - opt_params, [weights, biases] = opt(opt_params, [weights, biases], [dWeights, dBiases]) + dWeights, dBiases = self._compute_update() + if self.bias_init is not None: + opt_params, [weights, biases] = self.opt(self.opt_params.get(), [self.weights.get(), self.biases.get()], [dWeights, dBiases]) else: ## ignore dBiases since no biases configured - opt_params, [weights] = opt(opt_params, [weights], [dWeights]) - + opt_params, [weights] = self.opt(self.opt_params.get(), [self.weights.get()], [dWeights]) + biases = None ## apply any enforced filter constraints - if w_bounds > 0.: - if is_nonnegative: - weights = jnp.clip(weights, 0., w_bounds) + if self.w_bounds > 0.: + if self.is_nonnegative: + weights = jnp.clip(weights, 0., self.w_bounds) else: - weights = jnp.clip(weights, -w_bounds, w_bounds) - return opt_params, weights, biases, dWeights, dBiases - - @transition(output_compartments=["dInputs"]) - @staticmethod - def backtransmit( - sign_value, x_size, shape, stride, padding, x_delta_shape, antiPad, post, weights - ): ## action-backpropagating routine + weights = jnp.clip(weights, -self.w_bounds, self.w_bounds) + + self.opt_params.set(opt_params) + self.weights.set(weights) + self.biases.set(biases) + self.dWeights.set(dWeights) + self.dBiases.set(dBiases) + + @compilable + def backtransmit(self): ## action-backpropagating co-routine ## calc dInputs - adjustment w.r.t. input signal - k_size, k_size, n_in_chan, n_out_chan = shape + k_size, k_size, n_in_chan, n_out_chan = self.shape # antiPad = None # if padding == "SAME": # antiPad = _conv_same_transpose_padding(post.shape[1], x_size, @@ -201,22 +190,20 @@ def backtransmit( # elif padding == "VALID": # antiPad = _conv_valid_transpose_padding(post.shape[1], x_size, # k_size, stride) - dInputs = calc_dX_conv(weights, post, delta_shape=x_delta_shape, stride_size=stride, anti_padding=antiPad) + dInputs = calc_dX_conv(self.weights.get(), self.post.get(), delta_shape=self.x_delta_shape, stride_size=self.stride, anti_padding=self.antiPad) ## flip sign of back-transmitted signal (if applicable) - dInputs = dInputs * sign_value - return dInputs - - @transition(output_compartments=["inputs", "outputs", "pre", "post", "dInputs"]) - @staticmethod - def reset(in_shape, out_shape): - preVals = jnp.zeros(in_shape) - postVals = jnp.zeros(out_shape) - inputs = preVals - outputs = postVals - pre = preVals - post = postVals - dInputs = preVals - return inputs, outputs, pre, post, dInputs + dInputs = dInputs * self.sign_value + self.dInputs.set(dInputs) + + @compilable + def reset(self): #in_shape, out_shape): + preVals = jnp.zeros(self.in_shape.get()) + postVals = jnp.zeros(self.out_shape.get()) + self.inputs.set(preVals) + self.outputs.set(postVals) + self.pre.set(preVals) + self.post.set(postVals) + self.dInputs.set(preVals) @classmethod def help(cls): ## component help function diff --git a/ngclearn/components/synapses/convolution/hebbianDeconvSynapse.py b/ngclearn/components/synapses/convolution/hebbianDeconvSynapse.py index f203400a..d3317728 100755 --- a/ngclearn/components/synapses/convolution/hebbianDeconvSynapse.py +++ b/ngclearn/components/synapses/convolution/hebbianDeconvSynapse.py @@ -1,13 +1,8 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from .deconvSynapse import DeconvSynapse -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -from ngclearn.utils import tensorstats -import ngclearn.utils.weight_distribution as dist +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +from ngclearn.components.synapses.convolution.deconvSynapse import DeconvSynapse + from ngclearn.components.synapses.convolution.ngcconv import (deconv2d, _calc_dX_deconv, _calc_dK_deconv, calc_dX_deconv, calc_dK_deconv) @@ -15,8 +10,8 @@ class HebbianDeconvSynapse(DeconvSynapse): ## Hebbian-evolved deconvolutional cable """ - A synaptic deconvolutional (transposed convolutional) cable that adjusts its - efficacies via a two-factor Hebbian adjustment rule. + A specialized synaptic deconvolutional (transposed convolutional) cable that adjusts its efficacies via a + two-factor Hebbian adjustment rule. | --- Synapse Compartments: --- | inputs - input (takes in external signals) @@ -85,7 +80,6 @@ class HebbianDeconvSynapse(DeconvSynapse): ## Hebbian-evolved deconvolutional ca batch_size: batch size dimension of this component """ - # Define Functions def __init__( self, name, shape, x_shape, eta=0., filter_init=None, bias_init=None, stride=1, padding=None, resist_scale=1., w_bound=0., is_nonnegative=False, w_decay=0., sign_value=1., optim_type="sgd", @@ -104,11 +98,11 @@ def __init__( ## optimization / adjustment properties (given learning dynamics above) self.opt = get_opt_step_fn(optim_type, eta=self.eta) - self.dWeights = Compartment(self.weights.value * 0) + self.dWeights = Compartment(self.weights.get() * 0) self.dInputs = Compartment(jnp.zeros(self.in_shape)) self.pre = Compartment(jnp.zeros(self.in_shape)) self.post = Compartment(jnp.zeros(self.out_shape)) - self.dBiases = Compartment(self.biases.value * 0) + self.dBiases = Compartment(self.biases.get() * 0) ######################################################################## ## Shape error correction -- do shape correction inference (for local updates) @@ -117,85 +111,85 @@ def __init__( ######################################################################## ## set up outer optimization compartments - self.opt_params = Compartment(get_opt_init_fn(optim_type)( - [self.weights.value, self.biases.value] - if bias_init else [self.weights.value])) + self.opt_params = Compartment( + get_opt_init_fn(optim_type)([self.weights.get(), self.biases.get()] if bias_init else [self.weights.get()]) + ) def _init(self, batch_size, x_size, shape, stride, padding, pad_args, weights): k_size, k_size, n_in_chan, n_out_chan = shape _x = jnp.zeros((batch_size, x_size, x_size, n_in_chan)) - _d = deconv2d(_x, self.weights.value, stride_size=self.stride, + _d = deconv2d(_x, self.weights.get(), stride_size=self.stride, padding=self.padding) * 0 _dK = _calc_dK_deconv(_x, _d, stride_size=self.stride, out_size=k_size) ## get filter update correction - dx = _dK.shape[0] - self.weights.value.shape[0] - dy = _dK.shape[1] - self.weights.value.shape[1] + dx = _dK.shape[0] - self.weights.get().shape[0] + dy = _dK.shape[1] - self.weights.get().shape[1] self.delta_shape = (abs(dx), abs(dy)) ## get input update correction - _dx = _calc_dX_deconv(self.weights.value, _d, stride_size=self.stride, + _dx = _calc_dX_deconv(self.weights.get(), _d, stride_size=self.stride, padding=self.padding) dx = (_dx.shape[1] - _x.shape[1]) # abs() dy = (_dx.shape[2] - _x.shape[2]) self.x_delta_shape = (dx, dy) - @staticmethod - def _compute_update(sign_value, w_decay, bias_init, shape, stride, padding, delta_shape, pre, post, weights): - k_size, k_size, n_in_chan, n_out_chan = shape + def _compute_update(self): + k_size, k_size, n_in_chan, n_out_chan = self.shape ## compute adjustment to filters dWeights = calc_dK_deconv( - pre, post, delta_shape=delta_shape, stride_size=stride, out_size=k_size, padding=padding + self.pre.get(), self.post.get(), delta_shape=self.delta_shape, stride_size=self.stride, out_size=k_size, + padding=self.padding ) - dWeights = dWeights * sign_value - if w_decay > 0.: ## apply synaptic decay - dWeights = dWeights - weights * w_decay + dWeights = dWeights * self.sign_value + if self.w_decay > 0.: ## apply synaptic decay + dWeights = dWeights - self.weights.get() * self.w_decay ## compute adjustment to base-rates (if applicable) dBiases = 0. # jnp.zeros((1,1)) - if bias_init != None: - dBiases = jnp.sum(post, axis=0, keepdims=True) * sign_value + if self.bias_init != None: + dBiases = jnp.sum(self.post.get(), axis=0, keepdims=True) * self.sign_value return dWeights, dBiases - @transition(output_compartments=["opt_params", "weights", "biases", "dWeights", "dBiases"]) - @staticmethod - def evolve( - opt, sign_value, w_decay, w_bounds, is_nonnegative, bias_init, shape, stride, padding, delta_shape, - pre, post, weights, biases, opt_params - ): - dWeights, dBiases = HebbianDeconvSynapse._compute_update( - sign_value, w_decay, bias_init, shape, stride, padding, delta_shape, pre, post, weights - ) - if bias_init != None: - opt_params, [weights, biases] = opt(opt_params, [weights, biases], [dWeights, dBiases]) + @compilable + def evolve(self): + dWeights, dBiases = self._compute_update() + if self.bias_init != None: + opt_params, [weights, biases] = self.opt(self.opt_params.get(), [self.weights.get(), self.biases.get()], [dWeights, dBiases]) else: ## ignore dBiases since no biases configured - opt_params, [weights] = opt(opt_params, [weights], [dWeights]) + opt_params, [weights] = self.opt(self.opt_params.get(), [self.weights.get()], [dWeights]) + biases = None ## apply any enforced filter constraints - if w_bounds > 0.: - if is_nonnegative: - weights = jnp.clip(weights, 0., w_bounds) + if self.w_bounds > 0.: + if self.is_nonnegative: + weights = jnp.clip(weights, 0., self.w_bounds) else: - weights = jnp.clip(weights, -w_bounds, w_bounds) - return opt_params, weights, biases, dWeights, dBiases + weights = jnp.clip(weights, -self.w_bounds, self.w_bounds) + + self.opt_params.set(opt_params) + self.weights.set(weights) + self.biases.set(biases) + self.dWeights.set(dWeights) + self.dBiases.set(dBiases) - @transition(output_compartments=["dInputs"]) - @staticmethod - def backtransmit(sign_value, stride, padding, x_delta_shape, pre, post, weights): ## action-backpropagating routine + @compilable + def backtransmit(self): ## action-backpropagating co-routine ## calc dInputs - dInputs = calc_dX_deconv(weights, post, delta_shape=x_delta_shape, stride_size=stride, padding=padding) + dInputs = calc_dX_deconv( + self.weights.get(), self.post.get(), delta_shape=self.x_delta_shape, stride_size=self.stride, + padding=self.padding + ) ## flip sign of back-transmitted signal (if applicable) - dInputs = dInputs * sign_value - return dInputs - - @transition(output_compartments=["inputs", "outputs", "pre", "post", "dInputs"]) - @staticmethod - def reset(in_shape, out_shape): - preVals = jnp.zeros(in_shape) - postVals = jnp.zeros(out_shape) - inputs = preVals - outputs = postVals - pre = preVals - post = postVals - dInputs = preVals - return inputs, outputs, pre, post, dInputs + dInputs = dInputs * self.sign_value + self.dInputs.set(dInputs) + + @compilable + def reset(self): #in_shape, out_shape): + preVals = jnp.zeros(self.in_shape.get()) + postVals = jnp.zeros(self.out_shape.get()) + self.inputs.set(preVals) + self.outputs.set(postVals) + self.pre.set(preVals) + self.post.set(postVals) + self.dInputs.set(preVals) @classmethod def help(cls): ## component help function diff --git a/ngclearn/components/synapses/convolution/traceSTDPConvSynapse.py b/ngclearn/components/synapses/convolution/traceSTDPConvSynapse.py index 7fbb5021..86aa33c4 100755 --- a/ngclearn/components/synapses/convolution/traceSTDPConvSynapse.py +++ b/ngclearn/components/synapses/convolution/traceSTDPConvSynapse.py @@ -1,13 +1,8 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from .convSynapse import ConvSynapse -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -from ngclearn.utils import tensorstats -import ngclearn.utils.weight_distribution as dist +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +from ngclearn.components.synapses.convolution.convSynapse import ConvSynapse + from ngclearn.components.synapses.convolution.ngcconv import (_conv_same_transpose_padding, _conv_valid_transpose_padding) from ngclearn.components.synapses.convolution.ngcconv import (conv2d, _calc_dX_conv, @@ -16,8 +11,8 @@ class TraceSTDPConvSynapse(ConvSynapse): ## trace-based STDP convolutional cable """ - A synaptic convolutional cable that adjusts its filter efficacies via a - trace-based form of spike-timing-dependent plasticity (STDP). + A specialized synaptic convolutional cable that adjusts its filter efficacies via a trace-based form of + spike-timing-dependent plasticity (STDP). | --- Synapse Compartments: --- | inputs - input (takes in external signals) @@ -73,7 +68,6 @@ class TraceSTDPConvSynapse(ConvSynapse): ## trace-based STDP convolutional cable batch_size: batch size dimension of this component """ - # Define Functions def __init__( self, name, shape, x_shape, A_plus, A_minus, eta=0., pretrace_target=0., filter_init=None, stride=1, padding=None, resist_scale=1., w_bound=0., w_decay=0., batch_size=1, **kwargs @@ -93,7 +87,7 @@ def __init__( ######################### set up compartments ########################## ## Compartment setup and shape computation - self.dWeights = Compartment(self.weights.value * 0) + self.dWeights = Compartment(self.weights.get() * 0) self.dInputs = Compartment(jnp.zeros(self.in_shape)) self.preSpike = Compartment(jnp.zeros(self.in_shape)) self.preTrace = Compartment(jnp.zeros(self.in_shape)) @@ -108,72 +102,64 @@ def __init__( k_size, k_size, n_in_chan, n_out_chan = self.shape if padding == "SAME": self.antiPad = _conv_same_transpose_padding( - self.postSpike.value.shape[1], + self.postSpike.get().shape[1], self.x_size, k_size, stride) elif padding == "VALID": self.antiPad = _conv_valid_transpose_padding( - self.postSpike.value.shape[1], + self.postSpike.get().shape[1], self.x_size, k_size, stride) ######################################################################## def _init(self, batch_size, x_size, shape, stride, padding, pad_args, weights): k_size, k_size, n_in_chan, n_out_chan = shape _x = jnp.zeros((batch_size, x_size, x_size, n_in_chan)) - _d = conv2d(_x, weights.value, stride_size=stride, padding=padding) * 0 + _d = conv2d(_x, weights.get(), stride_size=stride, padding=padding) * 0 _dK = _calc_dK_conv(_x, _d, stride_size=stride, padding=pad_args) ## get filter update correction - dx = _dK.shape[0] - weights.value.shape[0] - dy = _dK.shape[1] - weights.value.shape[1] + dx = _dK.shape[0] - weights.get().shape[0] + dy = _dK.shape[1] - weights.get().shape[1] #self.delta_shape = (dx, dy) self.delta_shape = (max(dx, 0), max(dy, 0)) ## get input update correction - _dx = _calc_dX_conv(weights.value, _d, stride_size=stride, + _dx = _calc_dX_conv(weights.get(), _d, stride_size=stride, anti_padding=pad_args) dx = (_dx.shape[1] - _x.shape[1]) dy = (_dx.shape[2] - _x.shape[2]) self.x_delta_shape = (dx, dy) - @staticmethod - def _compute_update( - pretrace_target, Aplus, Aminus, stride, pad_args, delta_shape, preSpike, preTrace, postSpike, postTrace - ): + def _compute_update(self): ## Compute long-term potentiation to filters dW_ltp = calc_dK_conv( - preTrace - pretrace_target, postSpike * Aplus, delta_shape=delta_shape, stride_size=stride, padding=pad_args + self.preTrace.get() - self.pretrace_target, self.postSpike.get() * self.Aplus, delta_shape=self.delta_shape, + stride_size=self.stride, padding=self.pad_args ) ## Compute long-term depression to filters dW_ltd = -calc_dK_conv( - preSpike, postTrace * Aminus, delta_shape=delta_shape, stride_size=stride, padding=pad_args + self.preSpike.get(), self.postTrace.get() * self.Aminus, delta_shape=self.delta_shape, + stride_size=self.stride, padding=self.pad_args ) dWeights = (dW_ltp + dW_ltd) return dWeights - @transition(output_compartments=["weights", "dWeights"]) - @staticmethod - def evolve( - pretrace_target, Aplus, Aminus, w_decay, w_bound, stride, pad_args, delta_shape, preSpike, preTrace, - postSpike, postTrace, weights, eta - ): - dWeights = TraceSTDPConvSynapse._compute_update( - pretrace_target, Aplus, Aminus, stride, pad_args, delta_shape, preSpike, preTrace, postSpike, postTrace - ) - if w_decay > 0.: ## apply synaptic decay - weights = weights + dWeights * eta - weights * w_decay ## conduct decayed STDP-ascent + @compilable + def evolve(self): + dWeights = self._compute_update() + if self.w_decay > 0.: ## apply synaptic decay + weights = self.weights.get() + dWeights * self.eta - self.weights.get() * self.w_decay ## conduct decayed STDP-ascent else: - weights = weights + dWeights * eta ## conduct STDP-ascent + weights = self.weights.get() + dWeights * self.eta ## conduct STDP-ascent ## Apply any enforced filter constraints - if w_bound > 0.: ## enforce non-negativity + if self.w_bound > 0.: ## enforce non-negativity eps = 0.01 # 0.001 - weights = jnp.clip(weights, eps, w_bound - eps) - return weights, dWeights - - @transition(output_compartments=["dInputs"]) - @staticmethod - def backtransmit( - x_size, shape, stride, padding, x_delta_shape, antiPad, postSpike, weights - ): ## action-backpropagating routine + weights = jnp.clip(weights, eps, self.w_bound - eps) + + self.weights.set(weights) + self.dWeights.set(dWeights) + + @compilable + def backtransmit(self): ## action-backpropagating co-routine ## calc dInputs - adjustment w.r.t. input signal - k_size, k_size, n_in_chan, n_out_chan = shape + k_size, k_size, n_in_chan, n_out_chan = self.shape # antiPad = None # if padding == "SAME": # antiPad = _conv_same_transpose_padding(postSpike.shape[1], x_size, @@ -181,21 +167,22 @@ def backtransmit( # elif padding == "VALID": # antiPad = _conv_valid_transpose_padding(postSpike.shape[1], x_size, # k_size, stride) - dInputs = calc_dX_conv(weights, postSpike, delta_shape=x_delta_shape, stride_size=stride, anti_padding=antiPad) - return dInputs - - @transition(output_compartments=["inputs", "outputs", "preSpike", "postSpike", "preTrace", "postTrace"]) - @staticmethod - def reset(in_shape, out_shape): - preVals = jnp.zeros(in_shape) - postVals = jnp.zeros(out_shape) - inputs = preVals - outputs = postVals - preSpike = preVals - postSpike = postVals - preTrace = preVals - postTrace = postVals - return inputs, outputs, preSpike, postSpike, preTrace, postTrace + dInputs = calc_dX_conv( + self.weights.get(), self.postSpike.get(), delta_shape=self.x_delta_shape, stride_size=self.stride, + anti_padding=self.antiPad + ) + self.dInputs.set(dInputs) + + @compilable + def reset(self): # in_shape, out_shape): + preVals = jnp.zeros(self.in_shape.get()) + postVals = jnp.zeros(self.out_shape.get()) + self.inputs.set(preVals) + self.outputs.set(postVals) + self.preSpike.set(preVals) + self.postSpike.set(postVals) + self.preTrace.set(preVals) + self.postTrace.set(postVals) @classmethod def help(cls): ## component help function diff --git a/ngclearn/components/synapses/convolution/traceSTDPDeconvSynapse.py b/ngclearn/components/synapses/convolution/traceSTDPDeconvSynapse.py index 0e5d76b4..a894213e 100755 --- a/ngclearn/components/synapses/convolution/traceSTDPDeconvSynapse.py +++ b/ngclearn/components/synapses/convolution/traceSTDPDeconvSynapse.py @@ -1,22 +1,16 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from .deconvSynapse import DeconvSynapse -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -from ngclearn.utils import tensorstats -import ngclearn.utils.weight_distribution as dist +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +from ngclearn.components.synapses.convolution.deconvSynapse import DeconvSynapse + from ngclearn.components.synapses.convolution.ngcconv import (deconv2d, _calc_dX_deconv, _calc_dK_deconv, calc_dX_deconv, calc_dK_deconv) -from ngclearn.utils.optim import get_opt_init_fn, get_opt_step_fn class TraceSTDPDeconvSynapse(DeconvSynapse): ## trace-based STDP deconvolutional cable """ - A synaptic deconvolutional (transposed convolutional) cable that adjusts its - filter efficacies via a trace-based form of spike-timing-dependent plasticity (STDP). + A specialized synaptic deconvolutional (transposed convolutional) cable that adjusts its filter efficacies via a + trace-based form of spike-timing-dependent plasticity (STDP). | --- Synapse Compartments: --- | inputs - input (takes in external signals) @@ -72,7 +66,6 @@ class TraceSTDPDeconvSynapse(DeconvSynapse): ## trace-based STDP deconvolutional batch_size: batch size dimension of this component """ - # Define Functions def __init__( self, name, shape, x_shape, A_plus, A_minus, eta=0., pretrace_target=0., filter_init=None, stride=1, padding=None, resist_scale=1., w_bound=0., w_decay=0., batch_size=1, **kwargs @@ -92,7 +85,7 @@ def __init__( ######################### set up compartments ########################## ## Compartment setup and shape computation - self.dWeights = Compartment(self.weights.value * 0) + self.dWeights = Compartment(self.weights.get() * 0) self.dInputs = Compartment(jnp.zeros(self.in_shape)) self.preSpike = Compartment(jnp.zeros(self.in_shape)) self.preTrace = Compartment(jnp.zeros(self.in_shape)) @@ -108,76 +101,73 @@ def __init__( def _init(self, batch_size, x_size, shape, stride, padding, pad_args, weights): k_size, k_size, n_in_chan, n_out_chan = shape _x = jnp.zeros((batch_size, x_size, x_size, n_in_chan)) - _d = deconv2d(_x, self.weights.value, stride_size=self.stride, + _d = deconv2d(_x, self.weights.get(), stride_size=self.stride, padding=self.padding) * 0 _dK = _calc_dK_deconv(_x, _d, stride_size=self.stride, out_size=k_size) ## get filter update correction - dx = _dK.shape[0] - self.weights.value.shape[0] - dy = _dK.shape[1] - self.weights.value.shape[1] + dx = _dK.shape[0] - self.weights.get().shape[0] + dy = _dK.shape[1] - self.weights.get().shape[1] self.delta_shape = (abs(dx), abs(dy)) ## get input update correction - _dx = _calc_dX_deconv(self.weights.value, _d, stride_size=self.stride, + _dx = _calc_dX_deconv(self.weights.get(), _d, stride_size=self.stride, padding=self.padding) dx = (_dx.shape[1] - _x.shape[1]) # abs() dy = (_dx.shape[2] - _x.shape[2]) self.x_delta_shape = (dx, dy) - @staticmethod - def _compute_update( - pretrace_target, Aplus, Aminus, shape, stride, padding, delta_shape, preSpike, preTrace, postSpike, postTrace - ): - k_size, k_size, n_in_chan, n_out_chan = shape + def _compute_update(self): + k_size, k_size, n_in_chan, n_out_chan = self.shape ## calc dFilters - dW_ltp = calc_dK_deconv(preTrace - pretrace_target, postSpike * Aplus, - delta_shape=delta_shape, stride_size=stride, - out_size=k_size, padding=padding) - dW_ltd = -calc_dK_deconv(preSpike, postTrace * Aminus, - delta_shape=delta_shape, stride_size=stride, - out_size=k_size, padding=padding) + dW_ltp = calc_dK_deconv( + self.preTrace.get() - self.pretrace_target, self.postSpike.get() * self.Aplus, + delta_shape=self.delta_shape, stride_size=self.stride, out_size=k_size, padding=self.padding + ) + dW_ltd = -calc_dK_deconv( + self.preSpike.get(), self.postTrace.get() * self.Aminus, delta_shape=self.delta_shape, + stride_size=self.stride, out_size=k_size, padding=self.padding + ) dWeights = (dW_ltp + dW_ltd) return dWeights - @transition(output_compartments=["weights", "dWeights"]) - @staticmethod - def evolve( - pretrace_target, Aplus, Aminus, w_decay, w_bound, shape, stride, padding, delta_shape, preSpike, preTrace, - postSpike, postTrace, weights, eta - ): - dWeights = TraceSTDPDeconvSynapse._compute_update( - pretrace_target, Aplus, Aminus, shape, stride, padding, delta_shape, - preSpike, preTrace, postSpike, postTrace - ) - if w_decay > 0.: ## apply synaptic decay - weights = weights + dWeights * eta - weights * w_decay ## conduct decayed STDP-ascent + @compilable + def evolve(self): + dWeights = self._compute_update() + # dWeights = TraceSTDPDeconvSynapse._compute_update( + # pretrace_target, Aplus, Aminus, shape, stride, padding, delta_shape, + # preSpike, preTrace, postSpike, postTrace + # ) + if self.w_decay > 0.: ## apply synaptic decay and conduct decayed STDP-ascent + weights = self.weights.get() + dWeights * self.eta - self.weights.get() * self.w_decay else: - weights = weights + dWeights * eta ## conduct STDP-ascent + weights = self.weights.get() + dWeights * self.eta ## conduct STDP-ascent ## Apply any enforced filter constraints - if w_bound > 0.: ## enforce non-negativity + if self.w_bound > 0.: ## enforce non-negativity eps = 0.01 # 0.001 - weights = jnp.clip(weights, eps, w_bound - eps) - return weights, dWeights + weights = jnp.clip(weights, eps, self.w_bound - eps) - @transition(output_compartments=["dInputs"]) - @staticmethod - def backtransmit(stride, padding, x_delta_shape, preSpike, postSpike, weights): ## action-backpropagating routine + self.weights.set(weights) + self.dWeights.set(dWeights) + + @compilable + def backtransmit(self): ## action-backpropagating co-routine ## calc dInputs - dInputs = calc_dX_deconv(weights, postSpike, delta_shape=x_delta_shape, - stride_size=stride, padding=padding) - return dInputs - - @transition(output_compartments=["inputs", "outputs", "preSpike", "postSpike", "preTrace", "postTrace"]) - @staticmethod - def reset(in_shape, out_shape): - preVals = jnp.zeros(in_shape) - postVals = jnp.zeros(out_shape) - inputs = preVals - outputs = postVals - preSpike = preVals - postSpike = postVals - preTrace = preVals - postTrace = postVals - return inputs, outputs, preSpike, postSpike, preTrace, postTrace + dInputs = calc_dX_deconv( + self.weights.get(), self.postSpike.get(), delta_shape=self.x_delta_shape, stride_size=self.stride, + padding=self.padding + ) + self.dInputs.set(dInputs) + + @compilable + def reset(self): # in_shape, out_shape): + preVals = jnp.zeros(self.in_shape.get()) + postVals = jnp.zeros(self.out_shape.get()) + self.inputs.set(preVals) + self.outputs.set(postVals) + self.preSpike.set(preVals) + self.postSpike.set(postVals) + self.preTrace.set(preVals) + self.postTrace.set(postVals) @classmethod def help(cls): ## component help function diff --git a/ngclearn/components/synapses/denseSynapse.py b/ngclearn/components/synapses/denseSynapse.py index fc4e7ea0..977f2464 100755 --- a/ngclearn/components/synapses/denseSynapse.py +++ b/ngclearn/components/synapses/denseSynapse.py @@ -1,12 +1,10 @@ from jax import random, numpy as jnp, jit from ngclearn.components.jaxComponent import JaxComponent -from ngclearn.utils import tensorstats -from ngclearn.utils.weight_distribution import initialize_params +from ngclearn.utils.distribution_generator import DistributionGenerator from ngcsimlib.logger import info -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment class DenseSynapse(JaxComponent): ## base dense synaptic cable """ @@ -40,75 +38,55 @@ class DenseSynapse(JaxComponent): ## base dense synaptic cable (lower values yield sparse structure) """ - # Define Functions def __init__( - self, name, shape, weight_init=None, bias_init=None, resist_scale=1., - p_conn=1., batch_size=1, **kwargs + self, name, shape, weight_init=None, bias_init=None, resist_scale=1., p_conn=1., batch_size=1, **kwargs ): super().__init__(name, **kwargs) self.batch_size = batch_size - self.weight_init = weight_init - self.bias_init = bias_init ## Synapse meta-parameters self.shape = shape - self.Rscale = resist_scale + self.resist_scale = resist_scale ## Set up synaptic weight values - tmp_key, *subkeys = random.split(self.key.value, 4) - if self.weight_init is None: + tmp_key, *subkeys = random.split(self.key.get(), 4) + + if weight_init is None: info(self.name, "is using default weight initializer!") - self.weight_init = {"dist": "uniform", "amin": 0.025, "amax": 0.8} - weights = initialize_params(subkeys[0], self.weight_init, shape) - if 0. < p_conn < 1.: ## only non-zero and <1 probs allowed + # self.weight_init = {"dist": "uniform", "amin": 0.025, "amax": 0.8} + weight_init = DistributionGenerator.uniform(0.025, 0.8) + weights = weight_init(shape, subkeys[0]) + + if 0. < p_conn < 1.: ## Modifier/constraint: only non-zero and <1 probs allowed p_mask = random.bernoulli(subkeys[1], p=p_conn, shape=shape) weights = weights * p_mask ## sparsify matrix - self.batch_size = batch_size #1 ## Compartment setup preVals = jnp.zeros((self.batch_size, shape[0])) postVals = jnp.zeros((self.batch_size, shape[1])) + self.inputs = Compartment(preVals) self.outputs = Compartment(postVals) self.weights = Compartment(weights) ## Set up (optional) bias values - if self.bias_init is None: - info(self.name, "is using default bias value of zero (no bias " - "kernel provided)!") - self.biases = Compartment(initialize_params(subkeys[2], bias_init, - (1, shape[1])) - if bias_init else 0.0) - - @transition(output_compartments=["outputs"]) - @staticmethod - def advance_state(Rscale, inputs, weights, biases): - outputs = (jnp.matmul(inputs, weights) * Rscale) + biases - return outputs - - @transition(output_compartments=["inputs", "outputs"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - return inputs, outputs - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - if self.bias_init != None: - jnp.savez(file_name, weights=self.weights.value, - biases=self.biases.value) - else: - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - if "biases" in data.keys(): - self.biases.set(data['biases']) + if bias_init is None: + info(self.name, "is using default bias value of zero (no bias kernel provided)!") + self.biases = Compartment(bias_init((1, shape[1]), subkeys[2]) if bias_init else 0.0) + ## pin weight/bias initializers to component + self.weight_init = weight_init + self.bias_init = bias_init + + @compilable + def advance_state(self): + self.outputs.set((jnp.matmul(self.inputs.get(), self.weights.get()) * self.resist_scale) + self.biases.get()) + + @compilable + def reset(self): + if not self.inputs.targeted: + self.inputs.set(jnp.zeros((self.batch_size, self.shape[0]))) + + self.outputs.set(jnp.zeros((self.batch_size, self.shape[1]))) @classmethod def help(cls): ## component help function @@ -141,20 +119,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/synapses/doubleExpSynapse.py b/ngclearn/components/synapses/doubleExpSynapse.py index 86225a68..91a05d60 100644 --- a/ngclearn/components/synapses/doubleExpSynapse.py +++ b/ngclearn/components/synapses/doubleExpSynapse.py @@ -1,14 +1,10 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngclearn.components.synapses import DenseSynapse -from ngclearn.utils import tensorstats -class DoupleExpSynapse(DenseSynapse): ## dynamic double-exponential synapse cable +class DoubleExpSynapse(DenseSynapse): ## dynamic double-exponential synapse cable """ A dynamic double-exponential synaptic cable; this synapse evolves according to difference of two exponentials synaptic conductance dynamics. @@ -64,10 +60,9 @@ class DoupleExpSynapse(DenseSynapse): ## dynamic double-exponential synapse cabl """ - # Define Functions def __init__( - self, name, shape, tau_decay, tau_rise, g_syn_bar, syn_rest, weight_init=None, bias_init=None, resist_scale=1., p_conn=1., - is_nonplastic=True, **kwargs + self, name, shape, tau_decay, tau_rise, g_syn_bar, syn_rest, weight_init=None, bias_init=None, + resist_scale=1., p_conn=1., is_nonplastic=True, **kwargs ): super().__init__(name, shape, weight_init, bias_init, resist_scale, p_conn, **kwargs) ## dynamic synapse meta-parameters @@ -85,57 +80,44 @@ def __init__( self.g_syn = Compartment(postVals) ## conductance variable self.h_syn = Compartment(postVals) ## intermediate conductance variable if is_nonplastic: - self.weights.set(self.weights.value * 0 + 1.) + self.weights.set(self.weights.get() * 0 + 1.) - @transition(output_compartments=["outputs", "i_syn", "g_syn", "h_syn"]) - @staticmethod - def advance_state( - dt, tau_decay, tau_rise, g_syn_bar, syn_rest, Rscale, inputs, weights, i_syn, g_syn, h_syn, v - ): - s = inputs + @compilable + def advance_state(self, t, dt): + s = self.inputs.get() #A = tau_decay/(tau_decay - tau_rise) * jnp.power((tau_rise/tau_decay), tau_rise/(tau_rise - tau_decay)) - A = 1. + A = 1. ## FIXME: scale factor to use? ## advance conductance variable(s) - _out = jnp.matmul(s, weights) ## sum all pre-syn spikes at t going into post-neuron) - dhsyn_dt = -h_syn/tau_rise + ((_out * g_syn_bar) * (1. / tau_rise - 1. / tau_decay) * A) * (1./dt) - h_syn = h_syn + dhsyn_dt * dt ## run Euler step to move intermediate conductance h + _out = jnp.matmul(s, self.weights.get()) ## sum all pre-syn spikes at t going into post-neuron) + dhsyn_dt = (-self.h_syn.get()/self.tau_rise + + ((_out * self.g_syn_bar) * (1. / self.tau_rise - 1. / self.tau_decay) * A) * (1./dt)) + h_syn = self.h_syn.get() + dhsyn_dt * dt ## run Euler step to move intermediate conductance h - dgsyn_dt = -g_syn/tau_decay + h_syn * (1./dt) - g_syn = g_syn + dgsyn_dt * dt ## run Euler step to move conductance g + dgsyn_dt = -self.g_syn.get()/self.tau_decay + h_syn * (1./dt) + g_syn = self.g_syn.get() + dgsyn_dt * dt ## run Euler step to move conductance g ## compute derive electrical current variable - i_syn = -g_syn * Rscale - if syn_rest is not None: - i_syn = -(g_syn * Rscale) * (v - syn_rest) + i_syn = -g_syn * self.resist_scale + if self.syn_rest is not None: + i_syn = -(g_syn * self.resist_scale) * (self.v.get() - self.syn_rest) outputs = i_syn #jnp.matmul(inputs, Wdyn * Rscale) + biases - return outputs, i_syn, g_syn, h_syn - - @transition(output_compartments=["inputs", "outputs", "i_syn", "g_syn", "h_syn", "v"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - i_syn = postVals - g_syn = postVals - h_syn = postVals - v = postVals - return inputs, outputs, i_syn, g_syn, h_syn, v - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - if self.bias_init != None: - jnp.savez(file_name, weights=self.weights.value, biases=self.biases.value) - else: - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - if "biases" in data.keys(): - self.biases.set(data['biases']) + + self.outputs.set(outputs) + self.i_syn.set(i_syn) + self.g_syn.set(g_syn) + self.h_syn.set(h_syn) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.i_syn.set(postVals) + self.g_syn.set(postVals) + self.h_syn.set(postVals) + self.v.set(postVals) @classmethod def help(cls): ## component help function @@ -176,17 +158,3 @@ def help(cls): ## component help function "dgsyn_dt = -g_syn/tau_decay + h_syn", "hyperparameters": hyperparams} return info - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/synapses/exponentialSynapse.py b/ngclearn/components/synapses/exponentialSynapse.py index a873baf9..dc20c362 100644 --- a/ngclearn/components/synapses/exponentialSynapse.py +++ b/ngclearn/components/synapses/exponentialSynapse.py @@ -1,12 +1,8 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngclearn.components.synapses import DenseSynapse -from ngclearn.utils import tensorstats class ExponentialSynapse(DenseSynapse): ## dynamic exponential synapse cable """ @@ -61,10 +57,9 @@ class ExponentialSynapse(DenseSynapse): ## dynamic exponential synapse cable """ - # Define Functions def __init__( - self, name, shape, tau_decay, g_syn_bar, syn_rest, weight_init=None, bias_init=None, resist_scale=1., p_conn=1., - is_nonplastic=True, **kwargs + self, name, shape, tau_decay, g_syn_bar, syn_rest, weight_init=None, bias_init=None, resist_scale=1., + p_conn=1., is_nonplastic=True, **kwargs ): super().__init__(name, shape, weight_init, bias_init, resist_scale, p_conn, **kwargs) ## dynamic synapse meta-parameters @@ -80,50 +75,35 @@ def __init__( self.i_syn = Compartment(postVals) ## electrical current output self.g_syn = Compartment(postVals) ## conductance variable if is_nonplastic: - self.weights.set(self.weights.value * 0 + 1.) + self.weights.set(self.weights.get() * 0 + 1.) - @transition(output_compartments=["outputs", "i_syn", "g_syn"]) - @staticmethod - def advance_state( - dt, tau_decay, g_syn_bar, syn_rest, Rscale, inputs, weights, i_syn, g_syn, v - ): - s = inputs + @compilable + def advance_state(self, t, dt): + s = self.inputs.get() ## advance conductance variable - _out = jnp.matmul(s, weights) ## sum all pre-syn spikes at t going into post-neuron) - dgsyn_dt = -g_syn/tau_decay + (_out * g_syn_bar) * (1./dt) - g_syn = g_syn + dgsyn_dt * dt ## run Euler step to move conductance + _out = jnp.matmul(s, self.weights.get()) ## sum all pre-syn spikes at t going into post-neuron) + dgsyn_dt = -self.g_syn.get()/self.tau_decay + (_out * self.g_syn_bar) * (1./dt) + g_syn = self.g_syn.get() + dgsyn_dt * dt ## run Euler step to move conductance ## compute derive electrical current variable - i_syn = -g_syn * Rscale - if syn_rest is not None: - i_syn = -(g_syn * Rscale) * (v - syn_rest) - outputs = i_syn #jnp.matmul(inputs, Wdyn * Rscale) + biases - return outputs, i_syn, g_syn - - @transition(output_compartments=["inputs", "outputs", "i_syn", "g_syn", "v"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - i_syn = postVals - g_syn = postVals - v = postVals - return inputs, outputs, i_syn, g_syn, v - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - if self.bias_init != None: - jnp.savez(file_name, weights=self.weights.value, biases=self.biases.value) - else: - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - if "biases" in data.keys(): - self.biases.set(data['biases']) + i_syn = -g_syn * self.resist_scale + if self.syn_rest is not None: + i_syn = -(g_syn * self.resist_scale) * (self.v.get() - self.syn_rest) + outputs = i_syn #jnp.matmul(inputs, Wdyn * self.resist_scale) + biases + + self.outputs.set(outputs) + self.i_syn.set(i_syn) + self.g_syn.set(g_syn) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.i_syn.set(postVals) + self.g_syn.set(postVals) + self.v.set(postVals) @classmethod def help(cls): ## component help function @@ -162,17 +142,3 @@ def help(cls): ## component help function "dgsyn_dt = (W * inputs) * g_syn_bar - g_syn/tau_decay ", "hyperparameters": hyperparams} return info - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/synapses/hebbian/BCMSynapse.py b/ngclearn/components/synapses/hebbian/BCMSynapse.py index 6b391335..ff669a07 100755 --- a/ngclearn/components/synapses/hebbian/BCMSynapse.py +++ b/ngclearn/components/synapses/hebbian/BCMSynapse.py @@ -1,10 +1,8 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment -from ngclearn.components.synapses import DenseSynapse -from ngclearn.utils import tensorstats +from ngclearn.components.synapses.denseSynapse import DenseSynapse class BCMSynapse(DenseSynapse): # BCM-adjusted synaptic cable """ @@ -66,13 +64,11 @@ class BCMSynapse(DenseSynapse): # BCM-adjusted synaptic cable this to < 1. will result in a sparser synaptic structure """ - # Define Functions def __init__( self, name, shape, tau_w, tau_theta, theta0=-1., w_bound=0., w_decay=0., weight_init=None, resist_scale=1., p_conn=1., batch_size=1, **kwargs ): - super().__init__(name, shape, weight_init, None, resist_scale, p_conn, - batch_size=batch_size, **kwargs) + super().__init__(name, shape, weight_init, None, resist_scale, p_conn, batch_size=batch_size, **kwargs) ## Synapse and BCM hyper-parameters self.shape = shape ## shape of synaptic efficacy matrix @@ -90,48 +86,51 @@ def __init__( self.post = Compartment(postVals) ## post-synaptic statistic self.post_term = Compartment(postVals) self.theta = Compartment(postVals + self.theta0) ## synaptic modification thresholds - self.dWeights = Compartment(self.weights.value * 0) + self.dWeights = Compartment(self.weights.get() * 0) - @transition(output_compartments=["weights", "theta", "dWeights", "post_term"]) - @staticmethod - def evolve(t, dt, tau_w, tau_theta, w_bound, w_decay, pre, post, theta, weights): + @compilable + def evolve(self, t, dt): #t, dt, tau_w, tau_theta, w_bound, w_decay, pre, post, theta, weights): eps = 1e-7 - post_term = post * (post - theta) # post - theta - post_term = post_term * (1. / (theta + eps)) - dWeights = jnp.matmul(pre.T, post_term) - if w_bound > 0.: - dWeights = dWeights * (w_bound - jnp.abs(weights)) + post_term = self.post.get() * (self.post.get() - self.theta.get()) # post - theta + post_term = post_term * (1. / (self.theta.get() + eps)) + dWeights = jnp.matmul(self.pre.get().T, post_term) + if self.w_bound > 0.: + dWeights = dWeights * (self.w_bound - jnp.abs(self.weights.get())) ## update synaptic efficacies according to a leaky ODE - dWeights = -weights * w_decay + dWeights - _W = weights + dWeights * dt / tau_w + dWeights = -self.weights.get() * self.w_decay + dWeights + _W = self.weights.get() + dWeights * dt / self.tau_w ## update synaptic modification threshold as a leaky ODE - dtheta = jnp.mean(jnp.square(post), axis=0, keepdims=True) ## batch avg - theta = theta + (-theta + dtheta) * dt / tau_theta - return weights, theta, dWeights, post_term - - @transition(output_compartments=["inputs", "outputs", "pre", "post", "dWeights", "post_term"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - pre = preVals - post = postVals - dWeights = jnp.zeros(shape) - post_term = postVals - return inputs, outputs, pre, post, dWeights, post_term - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - jnp.savez(file_name, - weights=self.weights.value, theta=self.theta.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - self.theta.set(data['theta']) + dtheta = jnp.mean(jnp.square(self.post.get()), axis=0, keepdims=True) ## batch avg + theta = self.theta.get() + (-self.theta.get() + dtheta) * dt / self.tau_theta + + #self.weights.set(weights) + self.theta.set(theta) + self.dWeights.set(dWeights) + self.post_term.set(post_term) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.pre.set(preVals) + self.post.set(postVals) + self.dWeights.set(jnp.zeros(self.shape.get())) + self.post_term.set(postVals) + + # def save(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # jnp.savez(file_name, + # weights=self.weights.value, theta=self.theta.value) + # + # def load(self, directory, **kwargs): + # file_name = directory + "/" + self.name + ".npz" + # data = jnp.load(file_name) + # self.weights.set(data['weights']) + # self.theta.set(data['theta']) @classmethod def help(cls): ## component help function @@ -175,21 +174,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/synapses/hebbian/eventSTDPSynapse.py b/ngclearn/components/synapses/hebbian/eventSTDPSynapse.py index fde8758a..826b9ff9 100755 --- a/ngclearn/components/synapses/hebbian/eventSTDPSynapse.py +++ b/ngclearn/components/synapses/hebbian/eventSTDPSynapse.py @@ -1,10 +1,7 @@ -from jax import numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from ngclearn.components.synapses import DenseSynapse -from ngclearn.utils import tensorstats +from jax import random, numpy as jnp, jit +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +from ngclearn.components.synapses.denseSynapse import DenseSynapse class EventSTDPSynapse(DenseSynapse): # event-driven, post-synaptic STDP """ @@ -56,12 +53,11 @@ class EventSTDPSynapse(DenseSynapse): # event-driven, post-synaptic STDP this to < 1. will result in a sparser synaptic structure """ - # Define Functions - def __init__(self, name, shape, eta, lmbda=0.01, A_plus=1., A_minus=1., - presyn_win_len=2., w_bound=1., weight_init=None, resist_scale=1., - p_conn=1., batch_size=1, **kwargs): - super().__init__(name, shape, weight_init, None, resist_scale, p_conn, - batch_size=batch_size, **kwargs) + def __init__( + self, name, shape, eta, lmbda=0.01, A_plus=1., A_minus=1., presyn_win_len=2., w_bound=1., + weight_init=None, resist_scale=1., p_conn=1., batch_size=1, **kwargs + ): + super().__init__(name, shape, weight_init, None, resist_scale, p_conn, batch_size=batch_size, **kwargs) ## Synaptic hyper-parameters self.eta = eta ## global learning rate governing plasticity @@ -78,53 +74,47 @@ def __init__(self, name, shape, eta, lmbda=0.01, A_plus=1., A_minus=1., postVals = jnp.zeros((self.batch_size, shape[1])) self.pre_tols = Compartment(preVals) self.postSpike = Compartment(postVals) - self.dWeights = Compartment(self.weights.value * 0) + self.dWeights = Compartment(self.weights.get() * 0) self.eta = Compartment(jnp.ones((1, 1)) * eta) ## global learning rate governing plasticity - @staticmethod - def _compute_update( - t, lmbda, presyn_win_len, Aminus, Aplus, w_bound, pre_tols, postSpike, weights - ): ## synaptic adjustment calculation co-routine + def _compute_update(self, t, dt): ## synaptic adjustment calculation co-routine ## check if a spike occurred in window of (t - presyn_win_len, t] - m = (pre_tols > 0.) * 1. ## ignore default value of tols = 0 ms - if presyn_win_len > 0.: - lbound = ((t - presyn_win_len) < pre_tols) * 1. + m = (self.pre_tols.get() > 0.) * 1. ## ignore default value of tols = 0 ms + if self.presyn_win_len > 0.: + lbound = ((t - self.presyn_win_len) < self.pre_tols.get()) * 1. preSpike = lbound * m else: - check_spike = (pre_tols == t) * 1. + check_spike = (self.pre_tols.get() == t) * 1. preSpike = check_spike * m ## this implements a generalization of the rule in eqn 18 of the paper - pos_shift = w_bound - (weights * (1. + lmbda)) - pos_shift = pos_shift * Aplus - neg_shift = -weights * (1. + lmbda) - neg_shift = neg_shift * Aminus + pos_shift = self.w_bound - (self.weights.get() * (1. + self.lmbda)) + pos_shift = pos_shift * self.Aplus + neg_shift = -self.weights.get() * (1. + self.lmbda) + neg_shift = neg_shift * self.Aminus dW = jnp.where(preSpike.T, pos_shift, neg_shift) # at pre-spikes => LTP, else decay - dW = (dW * postSpike) ## gate to make sure only post-spikes trigger updates + dW = (dW * self.postSpike.get()) ## gate to make sure only post-spikes trigger updates return dW - @transition(output_compartments=["weights", "dWeights"]) - @staticmethod - def evolve( - t, lmbda, presyn_win_len, Aminus, Aplus, w_bound, pre_tols, postSpike, weights, eta - ): - dWeights = EventSTDPSynapse._compute_update( - t, lmbda, presyn_win_len, Aminus, Aplus, w_bound, pre_tols, postSpike, weights - ) - weights = weights + dWeights * eta # * (1. - w) * eta - weights = jnp.clip(weights, 0.01, w_bound) ## Note: this step not in source paper - return weights, dWeights - - @transition(output_compartments=["inputs", "outputs", "pre_tols", "postSpike", "dWeights"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - pre_tols = preVals ## pre-synaptic time-of-last-spike(s) record - postSpike = postVals - dWeights = jnp.zeros(shape) - return inputs, outputs, pre_tols, postSpike, dWeights + @compilable + def evolve(self, t, dt): + dWeights = self._compute_update(t, dt) + weights = self.weights.get() + dWeights * self.eta # * (1. - w) * eta + weights = jnp.clip(weights, 0.01, self.w_bound) ## Note: this step not in source paper + + self.weights.set(weights) + self.dWeights.set(dWeights) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.pre_tols.set(preVals) ## pre-synaptic time-of-last-spike(s) record + self.postSpike.set(postVals) + self.dWeights.set(jnp.zeros(self.shape.get())) @classmethod def help(cls): ## component help function @@ -166,20 +156,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/synapses/hebbian/expSTDPSynapse.py b/ngclearn/components/synapses/hebbian/expSTDPSynapse.py index ff184b9c..bb481512 100644 --- a/ngclearn/components/synapses/hebbian/expSTDPSynapse.py +++ b/ngclearn/components/synapses/hebbian/expSTDPSynapse.py @@ -1,10 +1,7 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from ngclearn.components.synapses import DenseSynapse -from ngclearn.utils import tensorstats +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +from ngclearn.components.synapses.denseSynapse import DenseSynapse class ExpSTDPSynapse(DenseSynapse): """ @@ -61,16 +58,19 @@ class ExpSTDPSynapse(DenseSynapse): this to < 1. will result in a sparser synaptic structure w_bound: maximum value/magnitude any synaptic efficacy can be (default: 1) + + tau_w: synaptic weight decay coefficient to apply to STDP update + + weight_mask: synaptic binary masking matrix to apply (to enforce a constant sparse structure; default: None) """ - # Define Functions def __init__( self, name, shape, A_plus, A_minus, exp_beta, eta=1., pretrace_target=0., weight_init=None, resist_scale=1., - p_conn=1., w_bound=1., batch_size=1, **kwargs + p_conn=1., w_bound=1., tau_w=0., weight_mask=None, batch_size=1, **kwargs ): - super().__init__(name, shape, weight_init, None, resist_scale, - p_conn, batch_size=batch_size, **kwargs) + super().__init__(name, shape, weight_init, None, resist_scale, p_conn, batch_size=batch_size, **kwargs) + self.tau_w = tau_w ## Exp-STDP meta-parameters self.shape = shape ## shape of synaptic efficacy matrix self.eta = eta ## global learning rate governing plasticity @@ -81,6 +81,12 @@ def __init__( self.Rscale = resist_scale ## post-transformation scale factor self.w_bound = w_bound #1. ## soft weight constraint + if weight_mask is None: + self.weight_mask = jnp.ones((1, 1)) + else: + self.weight_mask = weight_mask + self.weights.set(self.weights.get() * self.weight_mask) + ## Compartment setup preVals = jnp.zeros((self.batch_size, shape[0])) postVals = jnp.zeros((self.batch_size, shape[1])) @@ -88,64 +94,61 @@ def __init__( self.postSpike = Compartment(postVals) self.preTrace = Compartment(preVals) self.postTrace = Compartment(postVals) - self.dWeights = Compartment(self.weights.value * 0) + self.dWeights = Compartment(self.weights.get() * 0) self.eta = Compartment(jnp.ones((1, 1)) * eta) ## global learning rate governing plasticity - @staticmethod - def _compute_update( - dt, w_bound, preTrace_target, exp_beta, Aplus, Aminus, preSpike, postSpike, preTrace, postTrace, weights - ): - pre = preSpike - x_pre = preTrace - post = postSpike - x_post = postTrace - W = weights - x_tar = preTrace_target + def _compute_update(self): # dt, w_bound, preTrace_target, exp_beta, Aplus, Aminus, preSpike, postSpike, preTrace, postTrace, weights + pre = self.preSpike.get() + x_pre = self.preTrace.get() + post = self.postSpike.get() + x_post = self.postTrace.get() + W = self.weights.get() + x_tar = self.preTrace_target ## equations 4 from Diehl and Cook - full exponential weight-dependent STDP ## calculate post-synaptic term - post_term1 = jnp.exp(-exp_beta * W) * jnp.matmul(x_pre.T, post) + post_term1 = jnp.exp(-self.exp_beta * W) * jnp.matmul(x_pre.T, post) x_tar_vec = x_pre * 0 + x_tar # need to broadcast scalar x_tar to mat/vec form - post_term2 = jnp.exp(-exp_beta * (w_bound - W)) * jnp.matmul(x_tar_vec.T, - post) - dWpost = (post_term1 - post_term2) * Aplus + post_term2 = jnp.exp(-self.exp_beta * (self.w_bound - W)) * jnp.matmul(x_tar_vec.T, post) + dWpost = (post_term1 - post_term2) * self.Aplus ## calculate pre-synaptic term dWpre = 0. - if Aminus > 0.: - dWpre = -jnp.exp(-exp_beta * W) * jnp.matmul(pre.T, x_post) * Aminus + if self.Aminus > 0.: + dWpre = -jnp.exp(-self.exp_beta * W) * jnp.matmul(pre.T, x_post) * self.Aminus ## calc final weighted adjustment dW = (dWpost + dWpre) return dW - @transition(output_compartments=["weights", "dWeights"]) - @staticmethod - def evolve( - dt, w_bound, preTrace_target, exp_beta, Aplus, Aminus, preSpike, postSpike, preTrace, postTrace, - weights, eta - ): - dW = ExpSTDPSynapse._compute_update( - dt, w_bound, preTrace_target, exp_beta, Aplus, Aminus, - preSpike, postSpike, preTrace, postTrace, weights - ) + @compilable + def evolve(self): + dWeights = self._compute_update() + if self.tau_w > 0.: + decayTerm = self.weights.get() / self.tau_w + else: + decayTerm = 0. + ## do a gradient ascent update/shift - _W = weights + dW * eta + _W = self.weights.get() + (dWeights * self.eta) #- decayTerm ## enforce non-negativity eps = 0.01 - _W = jnp.clip(_W, eps, w_bound - eps) - return weights, dW - - @transition(output_compartments=["inputs", "outputs", "preSpike", "postSpike", "preTrace", "postTrace", "dWeights"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - preSpike = preVals - postSpike = postVals - preTrace = preVals - postTrace = postVals - dWeights = jnp.zeros(shape) - return inputs, outputs, preSpike, postSpike, preTrace, postTrace, dWeights + _W = jnp.clip(_W, eps, self.w_bound - eps) + _W = jnp.where(self.weight_mask != 0., _W, 0.) + + self.weights.set(_W) + self.dWeights.set(dWeights) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.preSpike.set(preVals) + self.postSpike.set(postVals) + self.preTrace.set(preVals) + self.postTrace.set(postVals) + self.dWeights.set(jnp.zeros(self.shape.get())) @classmethod def help(cls): ## component help function @@ -183,6 +186,7 @@ def help(cls): ## component help function "exp_beta": "Controls effect of exponential Hebbian shift / dependency (B)", "eta": "Global learning rate initial condition", "pretrace_target": "Pre-synaptic disconnecting/decay factor (x_tar)", + "weight_mask" : "Binary synaptic weight mask to apply to enforce a sparsity structure" } info = {cls.__name__: properties, "compartments": compartment_props, @@ -192,20 +196,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: diff --git a/ngclearn/components/synapses/hebbian/hebbianSynapse.py b/ngclearn/components/synapses/hebbian/hebbianSynapse.py index faaee5c9..f0814443 100644 --- a/ngclearn/components/synapses/hebbian/hebbianSynapse.py +++ b/ngclearn/components/synapses/hebbian/hebbianSynapse.py @@ -1,16 +1,23 @@ +# %% + +import jax +import pickle from jax import random, numpy as jnp, jit from functools import partial from ngclearn.utils.optim import get_opt_init_fn, get_opt_step_fn -from ngclearn import resolver, Component, Compartment -from ngcsimlib.compilers.process import transition + +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment from ngclearn.components.synapses import DenseSynapse from ngclearn.utils import tensorstats -from ngcsimlib.deprecators import deprecate_args +from ngcsimlib import deprecate_args +from ngclearn.utils.io_utils import save_pkl, load_pkl @partial(jit, static_argnums=[3, 4, 5, 6, 7, 8, 9]) -def _calc_update(pre, post, W, w_bound, is_nonnegative=True, signVal=1., - prior_type=None, prior_lmbda=0., - pre_wght=1., post_wght=1.): +def _calc_update( + pre, post, W, w_bound, is_nonnegative=True, signVal=1., prior_type=None, prior_lmbda=0., pre_wght=1., + post_wght=1. +): """ Compute a tensor of adjustments to be applied to a synaptic value matrix. @@ -160,15 +167,13 @@ class HebbianSynapse(DenseSynapse): this to < 1. will result in a sparser synaptic structure """ - # Define Functions @deprecate_args(_rebind=False, w_decay='prior') def __init__( self, name, shape, eta=0., weight_init=None, bias_init=None, w_bound=1., is_nonnegative=False, - prior=("constant", 0.), w_decay=0., sign_value=1., optim_type="sgd", pre_wght=1., post_wght=1., p_conn=1., - resist_scale=1., batch_size=1, **kwargs + prior=("constant", 0.), w_decay=0., sign_value=1., optim_type="sgd", pre_wght=1., post_wght=1., + p_conn=1., resist_scale=1., batch_size=1, **kwargs ): - super().__init__(name, shape, weight_init, bias_init, resist_scale, - p_conn, batch_size=batch_size, **kwargs) + super().__init__(name, shape, weight_init, bias_init, resist_scale, p_conn, batch_size=batch_size, **kwargs) if w_decay > 0.: prior = ('l2', w_decay) @@ -204,13 +209,26 @@ def __init__( self.dBiases = Compartment(jnp.zeros(shape[1])) #key, subkey = random.split(self.key.value) - self.opt_params = Compartment(get_opt_init_fn(optim_type)( - [self.weights.value, self.biases.value] - if bias_init else [self.weights.value])) + # NOTE: we don't save this compartment directly because it is a tuple can cannot be saved directly by numpy + self.opt_params = Compartment( + get_opt_init_fn(optim_type)([self.weights.get(), self.biases.get()] if bias_init else [self.weights.get()]), + auto_save=False + ) + + def save(self, directory: str): + super().save(directory) + # Also save the optimizer parameters + save_pkl(directory, self.name + "_opt_params", self.opt_params.get()) + + def load(self, directory: str): + super().load(directory) + # load the optimizer parameters in a custom way + self.opt_params.set(load_pkl(directory, self.name + "_opt_params")) @staticmethod - def _compute_update(w_bound, is_nonnegative, sign_value, prior_type, prior_lmbda, pre_wght, - post_wght, pre, post, weights): + def _compute_update( + w_bound, is_nonnegative, sign_value, prior_type, prior_lmbda, pre_wght, post_wght, pre, post, weights + ): ## calculate synaptic update values dW, db = _calc_update( pre, post, weights, w_bound, is_nonnegative=is_nonnegative, @@ -218,38 +236,65 @@ def _compute_update(w_bound, is_nonnegative, sign_value, prior_type, prior_lmbda post_wght=post_wght) return dW, db - @transition(output_compartments=["opt_params", "weights", "biases", "dWeights", "dBiases"]) - @staticmethod - def evolve(opt, w_bound, is_nonnegative, sign_value, prior_type, prior_lmbda, pre_wght, - post_wght, bias_init, pre, post, weights, biases, opt_params): + @compilable + def calc_update(self): + # Get the variables + pre = self.pre.get() + post = self.post.get() + weights = self.weights.get() + biases = self.biases.get() + opt_params = self.opt_params.get() + ## calculate synaptic update values dWeights, dBiases = HebbianSynapse._compute_update( - w_bound, is_nonnegative, sign_value, prior_type, prior_lmbda, pre_wght, post_wght, + self.w_bound, self.is_nonnegative, self.sign_value, self.prior_type, self.prior_lmbda, self.pre_wght, self.post_wght, + pre, post, weights + ) + + self.dWeights.set(dWeights) + self.dBiases.set(dBiases) + + @compilable + def evolve(self): + # Get the variables + pre = self.pre.get() + post = self.post.get() + weights = self.weights.get() + biases = self.biases.get() + opt_params = self.opt_params.get() + + ## calculate synaptic update values + dWeights, dBiases = HebbianSynapse._compute_update( + self.w_bound, self.is_nonnegative, self.sign_value, self.prior_type, self.prior_lmbda, self.pre_wght, self.post_wght, pre, post, weights ) ## conduct a step of optimization - get newly evolved synaptic weight value matrix - if bias_init != None: - opt_params, [weights, biases] = opt(opt_params, [weights, biases], [dWeights, dBiases]) + if self.bias_init != None: + opt_params, [weights, biases] = self.opt(opt_params, [weights, biases], [dWeights, dBiases]) else: # ignore db since no biases configured - opt_params, [weights] = opt(opt_params, [weights], [dWeights]) + opt_params, [weights] = self.opt(opt_params, [weights], [dWeights]) ## ensure synaptic efficacies adhere to constraints - weights = _enforce_constraints(weights, w_bound, is_nonnegative=is_nonnegative) - return opt_params, weights, biases, dWeights, dBiases - - @transition(output_compartments=["inputs", "outputs", "pre", "post", "dWeights", "dBiases"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - return ( - preVals, # inputs - postVals, # outputs - preVals, # pre - postVals, # post - jnp.zeros(shape), # dW - jnp.zeros(shape[1]), # db - ) + weights = _enforce_constraints(weights, self.w_bound, is_nonnegative=self.is_nonnegative) + + # Update compartments + self.opt_params.set(opt_params) + self.weights.set(weights) + self.biases.set(biases) + self.dWeights.set(dWeights) + self.dBiases.set(dBiases) + + @compilable + def reset(self): #, batch_size, shape): + preVals = jnp.zeros((self.batch_size, self.shape[0])) + postVals = jnp.zeros((self.batch_size, self.shape[1])) + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) # outputs + self.pre.set(preVals) # pre + self.post.set(postVals) # post + self.dWeights.set(jnp.zeros(self.shape)) # dW + self.dBiases.set(jnp.zeros(self.shape[1])) # db @classmethod def help(cls): ## component help function @@ -296,23 +341,10 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: Wab = HebbianSynapse("Wab", (2, 3), 0.0004, optim_type='adam', sign_value=-1.0, prior=("l1l2", 0.001)) print(Wab) + print(Wab.opt_params.get()) diff --git a/ngclearn/components/synapses/hebbian/traceSTDPSynapse.py b/ngclearn/components/synapses/hebbian/traceSTDPSynapse.py index 777c26cc..1c7ac3ab 100755 --- a/ngclearn/components/synapses/hebbian/traceSTDPSynapse.py +++ b/ngclearn/components/synapses/hebbian/traceSTDPSynapse.py @@ -1,10 +1,7 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment - -from ngclearn.components.synapses import DenseSynapse -from ngclearn.utils import tensorstats +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +from ngclearn.components.synapses.denseSynapse import DenseSynapse class TraceSTDPSynapse(DenseSynapse): # power-law / trace-based STDP @@ -57,36 +54,37 @@ class TraceSTDPSynapse(DenseSynapse): # power-law / trace-based STDP initialization to use resist_scale: a fixed scaling factor to apply to synaptic transform - (Default: 1.), i.e., yields: out = ((W * Rscale) * in) + (Default: 1.), i.e., yields: out = ((W * resistance) * in) p_conn: probability of a connection existing (default: 1); setting this to < 1. will result in a sparser synaptic structure w_bound: maximum value/magnitude any synaptic efficacy can be (default: 1) + + tau_w: synaptic weight decay coefficient to apply to STDP update + + weight_mask: synaptic binary masking matrix to apply (to enforce a constant sparse structure; default: None) """ - # Define Functions def __init__( self, name, shape, A_plus, A_minus, eta=1., mu=0., pretrace_target=0., weight_init=None, resist_scale=1., p_conn=1., w_bound=1., tau_w=0., weight_mask=None, batch_size=1, **kwargs ): - super().__init__(name, shape, weight_init, None, resist_scale, - p_conn, batch_size=batch_size, **kwargs) + super().__init__(name, shape, weight_init, None, resist_scale, p_conn, batch_size=batch_size, **kwargs) - ## Synaptic hyper-parameters - self.shape = shape ## shape of synaptic efficacy matrix self.tau_w = tau_w self.mu = mu ## controls power-scaling of STDP rule self.preTrace_target = pretrace_target ## target (pre-synaptic) trace activity value # 0.7 self.Aplus = A_plus ## LTP strength self.Aminus = A_minus ## LTD strength - self.Rscale = resist_scale ## post-transformation scale factor self.w_bound = w_bound #1. ## soft weight constraint self.w_eps = 0. ## w_eps = 0.01 - self.weight_mask = weight_mask - if self.weight_mask is None: + + if weight_mask is None: self.weight_mask = jnp.ones((1, 1)) - self.weights.set(self.weights.value * self.weight_mask) + else: + self.weight_mask = weight_mask + self.weights.set(self.weights.get() * self.weight_mask) ## Compartment setup preVals = jnp.zeros((self.batch_size, shape[0])) @@ -95,80 +93,59 @@ def __init__( self.postSpike = Compartment(postVals) self.preTrace = Compartment(preVals) self.postTrace = Compartment(postVals) - self.dWeights = Compartment(self.weights.value * 0) - self.eta = Compartment(jnp.ones((1, 1)) * eta) ## global learning rate - - #@transition(output_compartments=["outputs"]) - #@staticmethod - #def advance_state(Rscale, inputs, weights, biases, weight_mask): - # outputs = (jnp.matmul(inputs, weights * weight_mask) * Rscale) + biases - # return outputs - - @staticmethod - def _compute_update( - dt, w_bound, preTrace_target, mu, Aplus, Aminus, preSpike, postSpike, preTrace, postTrace, weights - ): - pre = preSpike - x_pre = preTrace - post = postSpike - x_post = postTrace - W = weights - x_tar = preTrace_target - if mu > 0.: - ## equations 3, 5, & 6 from Diehl and Cook - full power-law STDP - post_shift = jnp.power(w_bound - W, mu) - pre_shift = jnp.power(W, mu) - dWpost = (post_shift * jnp.matmul((x_pre - x_tar).T, post)) * Aplus - dWpre = 0. - if Aminus > 0.: - dWpre = -(pre_shift * jnp.matmul(pre.T, x_post)) * Aminus + self.dWeights = Compartment(self.weights.get() * 0) + self.eta = eta ## global learning rate + + def _compute_update(self): + if self.mu > 0.: + post_shift = jnp.power(self.w_bound - self.weights.get(), self.mu) + pre_shift = jnp.power(self.weights.get(), self.mu) + dWpost = (post_shift * jnp.matmul((self.preTrace.get() - self.preTrace_target).T, self.postSpike.get())) * self.Aplus + + if self.Aminus > 0.: + dWpre = -(pre_shift * jnp.matmul(self.preSpike.get().T, self.postTrace.get())) * self.Aminus + else: + dWpre = 0. + else: - ## calculate post-synaptic term - dWpost = jnp.matmul((x_pre - x_tar).T, post * Aplus) - - dWpre = 0. - if Aminus > 0.: - ## calculate pre-synaptic term - dWpre = -jnp.matmul(pre.T, x_post * Aminus) - ## calc final weighted adjustment + dWpost = jnp.matmul((self.preTrace.get() - self.preTrace_target).T, self.postSpike.get() * self.Aplus) + if self.Aminus > 0.: + dWpre = -jnp.matmul(self.preSpike.get().T, self.postTrace.get() * self.Aminus) + else: + dWpre = 0. + dW = (dWpost + dWpre) return dW - @transition(output_compartments=["weights", "dWeights"]) - @staticmethod - def evolve( - dt, w_bound, w_eps, preTrace_target, mu, Aplus, Aminus, tau_w, preSpike, postSpike, preTrace, - postTrace, weights, eta, weight_mask - ): - #_wm = weight_mask # - _wm = (weight_mask != 0.) - dWeights = TraceSTDPSynapse._compute_update( - dt, w_bound, preTrace_target, mu, Aplus, Aminus, preSpike, postSpike, preTrace, postTrace, weights - ) - ## do a gradient ascent update/shift - decayTerm = 0. - if tau_w > 0.: - decayTerm = weights / tau_w - weights = weights + (dWeights * eta) - decayTerm #weight_mask * eta) - ## enforce non-negativity - #w_eps = 0. # 0.01 # 0.001 - weights = jnp.clip(weights, w_eps, w_bound - w_eps) # jnp.abs(w_bound)) - weights = weights * _wm # weight_mask - return weights, dWeights - - @transition(output_compartments=["inputs", "outputs", "preSpike", "postSpike", "preTrace", "postTrace", "dWeights"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - inputs = preVals - outputs = postVals - preSpike = preVals - postSpike = postVals - preTrace = preVals - postTrace = postVals - dWeights = jnp.zeros(shape) - return inputs, outputs, preSpike, postSpike, preTrace, postTrace, dWeights + @compilable + def evolve(self): + dWeights = self._compute_update() + if self.tau_w > 0.: + decayTerm = self.weights.get() / self.tau_w + else: + decayTerm = 0. + + # print(jnp.nonzero(dWeights)) + w = self.weights.get() + (dWeights * self.eta) - decayTerm + w = jnp.clip(w, self.w_eps, self.w_bound - self.w_eps) + w = jnp.where(self.weight_mask != 0., w, 0.) + self.weights.set(w) + self.dWeights.set(dWeights) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.preSpike.set(preVals) + self.postSpike.set(postVals) + self.preTrace.set(preVals) + self.postTrace.set(postVals) + self.dWeights.set(jnp.zeros(self.shape.get())) + @classmethod def help(cls): ## component help function @@ -206,6 +183,7 @@ def help(cls): ## component help function "eta": "Global learning rate initial condition", "mu": "Power factor for STDP adjustment", "pretrace_target": "Pre-synaptic disconnecting/decay factor (x_tar)", + "weight_mask" : "Binary synaptic weight mask to apply to enforce a sparsity structure" } info = {cls.__name__: properties, "compartments": compartment_props, @@ -214,19 +192,6 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines if __name__ == '__main__': from ngcsimlib.context import Context diff --git a/ngclearn/components/synapses/modulated/MSTDPETSynapse.py b/ngclearn/components/synapses/modulated/MSTDPETSynapse.py index 6e5dd8c4..150ebc9b 100755 --- a/ngclearn/components/synapses/modulated/MSTDPETSynapse.py +++ b/ngclearn/components/synapses/modulated/MSTDPETSynapse.py @@ -1,12 +1,8 @@ from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info from ngclearn.components.synapses.hebbian import TraceSTDPSynapse -from ngclearn.utils import tensorstats class MSTDPETSynapse(TraceSTDPSynapse): # modulated trace-based STDP w/ eligility traces """ @@ -72,78 +68,69 @@ class MSTDPETSynapse(TraceSTDPSynapse): # modulated trace-based STDP w/ eligilit p_conn: probability of a connection existing (default: 1.); setting this to < 1. will result in a sparser synaptic structure + + w_bound: maximum value/magnitude any synaptic efficacy can be (default: 1) """ - # Define Functions def __init__( - self, name, shape, A_plus, A_minus, eta=1., mu=0., pretrace_target=0., tau_elg=0., elg_decay=1., tau_w=0., - weight_init=None, resist_scale=1., p_conn=1., w_bound=1., batch_size=1, **kwargs + self, name, shape, A_plus, A_minus, eta=1., mu=0., pretrace_target=0., tau_elg=0., elg_decay=1., + tau_w=0., weight_init=None, resist_scale=1., p_conn=1., w_bound=1., batch_size=1, **kwargs ): - super().__init__( + super().__init__( # call to parent trace-stdp component name, shape, A_plus, A_minus, eta=eta, mu=mu, pretrace_target=pretrace_target, weight_init=weight_init, resist_scale=resist_scale, p_conn=p_conn, w_bound=w_bound, batch_size=batch_size, **kwargs ) self.w_eps = 0. self.tau_w = tau_w ## MSTDP/MSTDP-ET meta-parameters - self.tau_elg = tau_elg - self.elg_decay = elg_decay + self.tau_elg = tau_elg ## time constant for eligibility trace + self.elg_decay = elg_decay ## decay factor eligibility trace ## MSTDP/MSTDP-ET compartments self.modulator = Compartment(jnp.zeros((self.batch_size, 1))) self.eligibility = Compartment(jnp.zeros(shape)) self.outmask = Compartment(jnp.zeros((1, shape[1]))) - @transition(output_compartments=["weights", "dWeights", "eligibility"]) - @staticmethod - def evolve( - dt, w_bound, w_eps, preTrace_target, mu, Aplus, Aminus, tau_elg, elg_decay, tau_w, preSpike, postSpike, - preTrace, postTrace, weights, dWeights, eta, modulator, eligibility, outmask - ): - # dW_dt = TraceSTDPSynapse._compute_update( ## use Hebbian/STDP rule to obtain a non-modulated update - # dt, w_bound, preTrace_target, mu, Aplus, Aminus, preSpike, postSpike, preTrace, postTrace, weights - # ) + @compilable + def evolve(self, dt, t): + # dW_dt = self._compute_update() # dWeights = dW_dt ## can think of this as eligibility at time t - if tau_elg > 0.: ## perform dynamics of M-STDP-ET - eligibility = eligibility * jnp.exp(-dt / tau_elg) * elg_decay + dWeights/tau_elg + if self.tau_elg > 0.: ## perform dynamics of M-STDP-ET + eligibility = self.eligibility.get() * jnp.exp(-dt / self.tau_elg) * self.elg_decay + self.dWeights.get()/self.tau_elg else: ## otherwise, just do M-STDP - eligibility = dWeights ## dynamics of M-STDP had no eligibility tracing + eligibility = self.dWeights.get() ## dynamics of M-STDP had no eligibility tracing ## do a gradient ascent update/shift decayTerm = 0. - if tau_w > 0.: - decayTerm = weights * (1. / tau_w) - weights = weights + (eligibility * modulator * eta) * outmask - decayTerm ## do modulated update + if self.tau_w > 0.: + decayTerm = self.weights.get() * (1. / self.tau_w) + ## do modulated update + weights = self.weights.get() + (eligibility * self.modulator.get() * self.eta) * self.outmask.get() - decayTerm - dW_dt = TraceSTDPSynapse._compute_update( ## use Hebbian/STDP rule to obtain a non-modulated update - dt, w_bound, preTrace_target, mu, Aplus, Aminus, preSpike, postSpike, preTrace, postTrace, weights - ) + dW_dt = self._compute_update() ## apply a Hebbian/STDP rule to obtain a non-modulated update dWeights = dW_dt ## can think of this as eligibility at time t #w_eps = 0.01 - weights = jnp.clip(weights, w_eps, w_bound - w_eps) # jnp.abs(w_bound)) - - return weights, dWeights, eligibility - - @transition( - output_compartments=[ - "inputs", "outputs", "preSpike", "postSpike", "preTrace", "postTrace", "dWeights", "eligibility", "outmask" - ] - ) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - synVals = jnp.zeros(shape) - inputs = preVals - outputs = postVals - preSpike = preVals - postSpike = postVals - preTrace = preVals - postTrace = postVals - dWeights = synVals - eligibility = synVals - outmask = postVals + 1. - return inputs, outputs, preSpike, postSpike, preTrace, postTrace, dWeights, eligibility, outmask + weights = jnp.clip(weights, self.w_eps, self.w_bound - self.w_eps) # jnp.abs(w_bound)) + self.weights.set(weights) + self.dWeights.set(dWeights) + self.eligibility.set(eligibility) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size.get(), self.shape.get()[0])) + postVals = jnp.zeros((self.batch_size.get(), self.shape.get()[1])) + synVals = jnp.zeros(self.shape.get()) + + if not self.inputs.targeted: + self.inputs.set(preVals) + self.outputs.set(postVals) + self.preSpike.set(preVals) + self.postSpike.set(postVals) + self.preTrace.set(preVals) + self.postTrace.set(postVals) + self.dWeights.set(synVals) + self.eligibility.set(synVals) + self.outmask.set(postVals + 1.) @classmethod def help(cls): ## component help function @@ -195,17 +182,3 @@ def help(cls): ## component help function "dW^{stdp}_{ij}/dt = A_plus * (z_j - x_tar) * s_i - A_minus * s_j * z_i", "hyperparameters": hyperparams} return info - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines diff --git a/ngclearn/components/synapses/modulated/REINFORCESynapse.py b/ngclearn/components/synapses/modulated/REINFORCESynapse.py index 92b72d88..9219e930 100644 --- a/ngclearn/components/synapses/modulated/REINFORCESynapse.py +++ b/ngclearn/components/synapses/modulated/REINFORCESynapse.py @@ -1,27 +1,76 @@ +# %% + from jax import random, numpy as jnp, jit -from ngcsimlib.compilers.process import transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment +from ngclearn import compilable, Compartment + from ngclearn.utils.model_utils import clip, d_clip import jax -import jax.numpy as jnp -import numpy as np +#import numpy as np from ngclearn.components.synapses import DenseSynapse from ngclearn.utils import tensorstats from ngclearn.utils.model_utils import create_function -def gaussian_logpdf(event, mean, stddev): +def _gaussian_logpdf(event, mean, stddev): scale_sqrd = stddev ** 2 log_normalizer = jnp.log(2 * jnp.pi * scale_sqrd) quadratic = (event - mean)**2 / scale_sqrd return - 0.5 * (log_normalizer + quadratic) + +def _compute_update( + dt, inputs, rewards, act_fx, weights, seed, mu_act_fx, dmu_act_fx, mu_out_min, mu_out_max, scalar_stddev +): + learning_stddev_mask = jnp.asarray(scalar_stddev <= 0.0, dtype=jnp.float32) + # (input_dim, output_dim * 2) => (input_dim, output_dim), (input_dim, output_dim) + W_mu, W_logstd = jnp.split(weights, 2, axis=-1) + # Forward pass + activation = act_fx(inputs) + mean = activation @ W_mu + fx_mean = mu_act_fx(mean) + logstd = activation @ W_logstd + clip_logstd = clip(logstd, -10.0, 2.0) + std = jnp.exp(clip_logstd) + std = learning_stddev_mask * std + (1.0 - learning_stddev_mask) * scalar_stddev # masking trick + # Sample using reparameterization trick + epsilon = jax.random.normal(seed, fx_mean.shape) + sample = epsilon * std + fx_mean + sample = jnp.clip(sample, mu_out_min, mu_out_max) + outputs = sample # the actual action that we take + # Compute log probability density of the Gaussian + log_prob = _gaussian_logpdf(sample, fx_mean, std).sum(-1) + # Compute objective (negative REINFORCE objective) + objective = (-log_prob * rewards).mean() * 1e-2 + + # Backward pass + batch_size = inputs.shape[0] # B + dL_dlogp = -rewards[:, None] * 1e-2 / batch_size # (B, 1) + + # Compute gradients manually based on the derivation + # dL/dmu = -(r-r_hat) * dlog_prob/dmu = -(r-r_hat) * -(sample-mu)/sigma^2 + dlog_prob_dfxmean = (sample - fx_mean) / (std ** 2) + dL_dmean = dL_dlogp * dlog_prob_dfxmean * dmu_act_fx(mean) # (B, A) + dL_dWmu = activation.T @ dL_dmean + + # dL/dlog(sigma) = -(r-r_hat) * dlog_prob/dlog(sigma) = -(r-r_hat) * (((sample-mu)/sigma)^2 - 1) + dlog_prob_dlogstd = - 1.0 / std + (sample - fx_mean)**2 / std**3 + dL_dstd = dL_dlogp * dlog_prob_dlogstd + # Apply gradient clipping for logstd + dL_dlogstd = d_clip(logstd, -10.0, 2.0) * dL_dstd * std + dL_dWlogstd = activation.T @ dL_dlogstd # (I, B) @ (B, A) = (I, A) + dL_dWlogstd = dL_dWlogstd * learning_stddev_mask # there is no learning for the scalar stddev + + # Update weights, negate the gradient because gradient ascent in ngc-learn + dW = jnp.concatenate([-dL_dWmu, -dL_dWlogstd], axis=-1) + # Finally, return metrics if needed + return dW, objective, outputs + + class REINFORCESynapse(DenseSynapse): """ A stochastic synapse implementing the REINFORCE algorithm (policy gradient method). This synapse uses Gaussian distributions for generating actions and performs gradient-based updates. - + | --- Synapse Compartments: --- | inputs - input (takes in external signals) | outputs - output signals (sampled actions from Gaussian distribution) @@ -73,8 +122,10 @@ def __init__( ) -> None: # This is because we have weights mu and weight log sigma input_dim, output_dim = shape - super().__init__(name, (input_dim, output_dim * 2), weight_init, None, resist_scale, - p_conn, batch_size=batch_size, **kwargs) + super().__init__( + name, (input_dim, output_dim * 2), weight_init, None, resist_scale, p_conn, + batch_size=batch_size, **kwargs + ) ## Synaptic hyper-parameters self.shape = shape ## shape of synaptic efficacy matrix @@ -89,7 +140,7 @@ def __init__( self.scalar_stddev = scalar_stddev ## Compartment setup - self.dWeights = Compartment(self.weights.value * 0) + self.dWeights = Compartment(self.weights.get() * 0) # self.eta = Compartment(jnp.ones((1, 1)) * eta) ## global learning rate # For eligiblity traces later self.objective = Compartment(jnp.zeros(())) self.outputs = Compartment(jnp.zeros((batch_size, output_dim))) @@ -101,83 +152,63 @@ def __init__( self.learning_mask = Compartment(jnp.zeros(())) self.seed = Compartment(jax.random.PRNGKey(seed if seed is not None else 42)) - @staticmethod - def _compute_update(dt, inputs, rewards, act_fx, weights, seed, mu_act_fx, dmu_act_fx, mu_out_min, mu_out_max, scalar_stddev): - learning_stddev_mask = jnp.asarray(scalar_stddev <= 0.0, dtype=jnp.float32) - # (input_dim, output_dim * 2) => (input_dim, output_dim), (input_dim, output_dim) - W_mu, W_logstd = jnp.split(weights, 2, axis=-1) - # Forward pass - activation = act_fx(inputs) - mean = activation @ W_mu - fx_mean = mu_act_fx(mean) - logstd = activation @ W_logstd - clip_logstd = clip(logstd, -10.0, 2.0) - std = jnp.exp(clip_logstd) - std = learning_stddev_mask * std + (1.0 - learning_stddev_mask) * scalar_stddev # masking trick - # Sample using reparameterization trick - epsilon = jax.random.normal(seed, fx_mean.shape) - sample = epsilon * std + fx_mean - sample = jnp.clip(sample, mu_out_min, mu_out_max) - outputs = sample # the actual action that we take - # Compute log probability density of the Gaussian - log_prob = gaussian_logpdf(sample, fx_mean, std).sum(-1) - # Compute objective (negative REINFORCE objective) - objective = (-log_prob * rewards).mean() * 1e-2 - - # Backward pass - batch_size = inputs.shape[0] # B - dL_dlogp = -rewards[:, None] * 1e-2 / batch_size # (B, 1) - - # Compute gradients manually based on the derivation - # dL/dmu = -(r-r_hat) * dlog_prob/dmu = -(r-r_hat) * -(sample-mu)/sigma^2 - dlog_prob_dfxmean = (sample - fx_mean) / (std ** 2) - dL_dmean = dL_dlogp * dlog_prob_dfxmean * dmu_act_fx(mean) # (B, A) - dL_dWmu = activation.T @ dL_dmean - - # dL/dlog(sigma) = -(r-r_hat) * dlog_prob/dlog(sigma) = -(r-r_hat) * (((sample-mu)/sigma)^2 - 1) - dlog_prob_dlogstd = - 1.0 / std + (sample - fx_mean)**2 / std**3 - dL_dstd = dL_dlogp * dlog_prob_dlogstd - # Apply gradient clipping for logstd - dL_dlogstd = d_clip(logstd, -10.0, 2.0) * dL_dstd * std - dL_dWlogstd = activation.T @ dL_dlogstd # (I, B) @ (B, A) = (I, A) - dL_dWlogstd = dL_dWlogstd * learning_stddev_mask # there is no learning for the scalar stddev - - # Update weights, negate the gradient because gradient ascent in ngc-learn - dW = jnp.concatenate([-dL_dWmu, -dL_dWlogstd], axis=-1) - # Finally, return metrics if needed - return dW, objective, outputs - - @transition(output_compartments=["weights", "dWeights", "objective", "outputs", "accumulated_gradients", "step_count", "seed"]) - @staticmethod - def evolve(dt, w_bound, inputs, rewards, act_fx, weights, eta, learning_mask, decay, accumulated_gradients, step_count, seed, mu_act_fx, dmu_act_fx, mu_out_min, mu_out_max, scalar_stddev): + @compilable + def evolve(self, dt): + # Get compartment values + weights = self.weights.get() + dWeights = self.dWeights.get() + objective = self.objective.get() + outputs = self.outputs.get() + accumulated_gradients = self.accumulated_gradients.get() + step_count = self.step_count.get() + seed = self.seed.get() + inputs = self.inputs.get() + rewards = self.rewards.get() + + # Main logic main_seed, sub_seed = jax.random.split(seed) - dWeights, objective, outputs = REINFORCESynapse._compute_update( - dt, inputs, rewards, act_fx, weights, sub_seed, mu_act_fx, dmu_act_fx, mu_out_min, mu_out_max, scalar_stddev + dWeights, objective, outputs = _compute_update( + dt, inputs, rewards, self.act_fx, weights, sub_seed, self.mu_act_fx, self.dmu_act_fx, self.mu_out_min, self.mu_out_max, self.scalar_stddev ) ## do a gradient ascent update/shift - weights = (weights + dWeights * eta) * learning_mask + weights * (1.0 - learning_mask) # update the weights only where learning_mask is 1.0 + weights = (weights + dWeights * self.eta) * self.learning_mask + weights * (1.0 - self.learning_mask.get()) # update the weights only where learning_mask is 1.0 ## enforce non-negativity eps = 0.0 # 0.01 # 0.001 - weights = jnp.clip(weights, eps, w_bound - eps) # jnp.abs(w_bound)) + weights = jnp.clip(weights, eps, self.w_bound - eps) # jnp.abs(w_bound)) step_count += 1 - accumulated_gradients = (step_count - 1) / step_count * accumulated_gradients * decay + 1.0 / step_count * dWeights # EMA update of accumulated gradients - step_count = step_count * (1 - learning_mask) # reset the step count to 0 when we have learned - return weights, dWeights, objective, outputs, accumulated_gradients, step_count, main_seed - - @transition(output_compartments=["inputs", "outputs", "objective", "rewards", "dWeights", "accumulated_gradients", "step_count", "seed"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) + accumulated_gradients = (step_count - 1) / step_count * accumulated_gradients * self.decay + 1.0 / step_count * dWeights # EMA update of accumulated gradients + step_count = step_count * (1 - self.learning_mask.get()) # reset the step count to 0 when we have learned + + # Set updated compartment values + self.weights.set(weights) + self.dWeights.set(dWeights) + self.objective.set(objective) + self.outputs.set(outputs) + self.accumulated_gradients.set(accumulated_gradients) + self.step_count.set(step_count) + self.seed.set(main_seed) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size, self.shape[0])) + postVals = jnp.zeros((self.batch_size, self.shape[1])) inputs = preVals outputs = postVals objective = jnp.zeros(()) - rewards = jnp.zeros((batch_size,)) - dWeights = jnp.zeros(shape) - accumulated_gradients = jnp.zeros((shape[0], shape[1] * 2)) + rewards = jnp.zeros((self.batch_size,)) + dWeights = jnp.zeros(self.shape) + accumulated_gradients = jnp.zeros((self.shape[0], self.shape[1] * 2)) step_count = jnp.zeros(()) seed = jax.random.PRNGKey(42) - return inputs, outputs, objective, rewards, dWeights, accumulated_gradients, step_count, seed + + hasattr(self.inputs, 'targeted') and not self.inputs.targeted and self.inputs.set(inputs) + self.outputs.set(outputs) + self.objective.set(objective) + self.rewards.set(rewards) + self.dWeights.set(dWeights) + self.accumulated_gradients.set(accumulated_gradients) + self.step_count.set(step_count) + self.seed.set(seed) @classmethod def help(cls): ## component help function @@ -222,16 +253,14 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines + +if __name__ == '__main__': + from ngcsimlib.context import Context + with Context("Bar") as bar: + syn = REINFORCESynapse( + name="reinforce_syn", + shape=(3, 2) + ) + # Wab = syn.weights.get() + print(syn) + diff --git a/ngclearn/components/synapses/patched/hebbianPatchedSynapse.py b/ngclearn/components/synapses/patched/hebbianPatchedSynapse.py index 1415f51a..ae58c6ac 100644 --- a/ngclearn/components/synapses/patched/hebbianPatchedSynapse.py +++ b/ngclearn/components/synapses/patched/hebbianPatchedSynapse.py @@ -1,16 +1,22 @@ +# %% + import matplotlib.pyplot as plt from jax import random, numpy as jnp, jit from functools import partial from ngclearn.utils.optim import get_opt_init_fn, get_opt_step_fn -from ngclearn import resolver, Component, Compartment + +from ngcsimlib.logger import info +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment + from ngclearn.components.synapses.patched import PatchedSynapse from ngclearn.utils import tensorstats -from ngcsimlib.compilers.process import transition -@partial(jit, static_argnums=[3, 4, 5, 6, 7, 8, 9]) -def _calc_update(pre, post, W, mask, w_bound, is_nonnegative=True, signVal=1., - prior_type=None, prior_lmbda=0., - pre_wght=1., post_wght=1.): +# @partial(jit, static_argnums=[3, 4, 5, 6, 7, 8, 9]) +def _calc_update( + pre, post, W, mask, w_bound, is_nonnegative=True, signVal=1., prior_type=None, prior_lmbda=0., pre_wght=1., + post_wght=1. +): """ Compute a tensor of adjustments to be applied to a synaptic value matrix. @@ -64,12 +70,12 @@ def _calc_update(pre, post, W, mask, w_bound, is_nonnegative=True, signVal=1., dW = dW + prior_lmbda * dW_reg - if mask!=None: + if mask != None: dW = dW * mask return dW * signVal, db * signVal -@partial(jit, static_argnums=[1,2, 3]) +# @partial(jit, static_argnums=[1,2, 3]) def _enforce_constraints(W, block_mask, w_bound, is_nonnegative=True): """ Enforces constraints that the (synaptic) efficacies/values within matrix @@ -89,12 +95,12 @@ def _enforce_constraints(W, block_mask, w_bound, is_nonnegative=True): """ _W = W if w_bound > 0.: - if is_nonnegative == True: + if is_nonnegative: _W = jnp.clip(_W, 0., w_bound) else: _W = jnp.clip(_W, -w_bound, w_bound) - if block_mask!=None: + if block_mask != None: _W = _W * block_mask return _W @@ -185,12 +191,15 @@ class HebbianPatchedSynapse(PatchedSynapse): batch_size: the size of each mini batch """ - def __init__(self, name, shape, n_sub_models=1, stride_shape=(0,0), eta=0., weight_init=None, bias_init=None, - block_mask=None, w_bound=1., is_nonnegative=False, prior=(None, 0.), sign_value=1., - optim_type="sgd", pre_wght=1., post_wght=1., p_conn=1., - resist_scale=1., batch_size=1, **kwargs): - super().__init__(name, shape, n_sub_models, stride_shape, block_mask, weight_init, bias_init, resist_scale, - p_conn, batch_size=batch_size, **kwargs) + def __init__( + self, name, shape, n_sub_models=1, stride_shape=(0,0), eta=0., weight_init=None, bias_init=None, + block_mask=None, w_bound=1., is_nonnegative=False, prior=(None, 0.), sign_value=1., optim_type="sgd", + pre_wght=1., post_wght=1., p_conn=1., resist_scale=1., batch_size=1, **kwargs + ): + super().__init__( + name, shape, n_sub_models, stride_shape, block_mask, weight_init, bias_init, resist_scale, p_conn, + batch_size=batch_size, **kwargs + ) prior_type, prior_lmbda = prior self.prior_type = prior_type @@ -225,10 +234,10 @@ def __init__(self, name, shape, n_sub_models=1, stride_shape=(0,0), eta=0., weig self.dWeights = Compartment(jnp.zeros(self.shape)) self.dBiases = Compartment(jnp.zeros(self.shape[1])) - #key, subkey = random.split(self.key.value) + #key, subkey = random.split(self.key.get()) self.opt_params = Compartment(get_opt_init_fn(optim_type)( - [self.weights.value, self.biases.value] - if bias_init else [self.weights.value])) + [self.weights.get(), self.biases.get()] + if bias_init else [self.weights.get()])) @staticmethod def _compute_update(block_mask, w_bound, is_nonnegative, sign_value, prior_type, prior_lmbda, pre_wght, @@ -241,38 +250,48 @@ def _compute_update(block_mask, w_bound, is_nonnegative, sign_value, prior_type, return dW * jnp.where(0 != jnp.abs(weights), 1, 0) , db - @transition(output_compartments=["opt_params", "weights", "biases", "dWeights", "dBiases"]) - @staticmethod - def evolve(block_mask, opt, w_bound, is_nonnegative, sign_value, prior_type, prior_lmbda, pre_wght, - post_wght, bias_init, pre, post, weights, biases, opt_params): + @compilable + def evolve(self): + # Get the variables + pre = self.pre.get() + post = self.post.get() + weights = self.weights.get() + biases = self.biases.get() + opt_params = self.opt_params.get() + ## calculate synaptic update values dWeights, dBiases = HebbianPatchedSynapse._compute_update( - block_mask, w_bound, is_nonnegative, sign_value, prior_type, prior_lmbda, - pre_wght, post_wght, pre, post, weights + self.block_mask, self.w_bound, self.is_nonnegative, self.sign_value, self.prior_type, self.prior_lmbda, + self.pre_wght, self.post_wght, pre, post, weights ) ## conduct a step of optimization - get newly evolved synaptic weight value matrix - if bias_init != None: - opt_params, [weights, biases] = opt(opt_params, [weights, biases], [dWeights, dBiases]) + if self.bias_init != None: + opt_params, [weights, biases] = self.opt(opt_params, [weights, biases], [dWeights, dBiases]) else: # ignore db since no biases configured - opt_params, [weights] = opt(opt_params, [weights], [dWeights]) + opt_params, [weights] = self.opt(opt_params, [weights], [dWeights]) ## ensure synaptic efficacies adhere to constraints - weights = _enforce_constraints(weights, block_mask, w_bound, is_nonnegative=is_nonnegative) - return opt_params, weights, biases, dWeights, dBiases - - @transition(output_compartments=["inputs", "outputs", "pre", "post", "dWeights", "dBiases"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) - return ( - preVals, # inputs - postVals, # outputs - preVals, # pre - postVals, # post - jnp.zeros(shape), # dW - jnp.zeros(shape[1]), # db - ) + weights = _enforce_constraints(weights, self.block_mask, self.w_bound, is_nonnegative=self.is_nonnegative) + + # Update compartments + self.opt_params.set(opt_params) + self.weights.set(weights) + self.biases.set(biases) + self.dWeights.set(dWeights) + self.dBiases.set(dBiases) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size, self.shape[0])) + postVals = jnp.zeros((self.batch_size, self.shape[1])) + # BUG: the self.inputs here does not have the targeted field + # NOTE: Quick workaround is to check if targeted is in the input or not + hasattr(self.inputs, "targeted") and not self.inputs.targeted and self.inputs.set(preVals) # inputs + self.outputs.set(postVals) # outputs + self.pre.set(preVals) # pre + self.post.set(postVals) # post + self.dWeights.set(jnp.zeros(self.shape)) # dW + self.dBiases.set(jnp.zeros(self.shape[1])) # db @classmethod @@ -323,35 +342,12 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - - - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - - - - - - - - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: Wab = HebbianPatchedSynapse("Wab", (9, 30), 3, (0, 0), optim_type='adam', sign_value=-1.0, prior=("l1l2", 0.001)) print(Wab) - plt.imshow(Wab.weights.value, cmap='gray') + plt.imshow(Wab.weights.get(), cmap='gray') plt.show() diff --git a/ngclearn/components/synapses/patched/patchedSynapse.py b/ngclearn/components/synapses/patched/patchedSynapse.py index 43d1dc16..540bd30a 100644 --- a/ngclearn/components/synapses/patched/patchedSynapse.py +++ b/ngclearn/components/synapses/patched/patchedSynapse.py @@ -1,21 +1,55 @@ +# %% + import matplotlib.pyplot as plt from jax import random, numpy as jnp, jit -from ngclearn import resolver, Component, Compartment from ngclearn.components.jaxComponent import JaxComponent -from ngclearn.utils import tensorstats -from ngcsimlib.compilers.process import transition -from ngclearn.utils.weight_distribution import initialize_params -from ngcsimlib.logger import info -import math - +from ngclearn.utils.distribution_generator import DistributionGenerator -def create_multi_patch_synapses(key, shape, n_sub_models, sub_stride, weight_init): +from ngcsimlib.logger import info +from ngclearn import compilable #from ngcsimlib.parser import compilable +from ngclearn import Compartment #from ngcsimlib.compartment import Compartment +# from ngclearn.utils.weight_distribution import initialize_params + + +# def _create_multi_patch_synapses(key, shape, n_sub_models, sub_stride, weight_init): +# sub_shape = (shape[0] // n_sub_models, shape[1] // n_sub_models) +# di, dj = sub_shape +# si, sj = sub_stride + +# weight_shape = ((n_sub_models * di) + 2 * si, (n_sub_models * dj) + 2 * sj) +# #weights = initialize_params(key[2], {"dist": "constant", "value": 0.}, weight_shape, use_numpy=True) +# large_weight_init = DistributionGenerator.constant(value=0.) +# weights = large_weight_init(weight_shape, key[2]) + +# for i in range(n_sub_models): +# start_i = i * di +# end_i = (i + 1) * di + 2 * si +# start_j = i * dj +# end_j = (i + 1) * dj + 2 * sj + +# shape_ = (end_i - start_i, end_j - start_j) # (di + 2 * si, dj + 2 * sj) + +# ## FIXME: this line below might be wonky... +# weights.at[start_i: end_i, start_j: end_j].set( weight_init(shape_, key[2]) ) +# # weights[start_i : end_i, +# # start_j : end_j] = initialize_params(key[2], init_kernel=weight_init, shape=shape_, use_numpy=True) +# if si != 0: +# weights.at[:si,:].set(0.) ## FIXME: this setter line might be wonky... +# weights.at[-si:,:].set(0.) ## FIXME: this setter line might be wonky... +# if sj != 0: +# weights.at[:,:sj].set(0.) ## FIXME: this setter line might be wonky... +# weights.at[:, -sj:].set(0.) ## FIXME: this setter line might be wonky... + +# return weights + +def _create_multi_patch_synapses(key, shape, n_sub_models, sub_stride, weight_init): sub_shape = (shape[0] // n_sub_models, shape[1] // n_sub_models) di, dj = sub_shape si, sj = sub_stride weight_shape = ((n_sub_models * di) + 2 * si, (n_sub_models * dj) + 2 * sj) - weights = initialize_params(key[2], {"dist": "constant", "value": 0.}, weight_shape, use_numpy=True) + # weights = initialize_params(key[2], {"dist": "constant", "value": 0.}, weight_shape, use_numpy=True) + weights = DistributionGenerator.constant(value=0.)(weight_shape, key[2]) for i in range(n_sub_models): start_i = i * di @@ -25,22 +59,23 @@ def create_multi_patch_synapses(key, shape, n_sub_models, sub_stride, weight_ini shape_ = (end_i - start_i, end_j - start_j) # (di + 2 * si, dj + 2 * sj) - weights[start_i : end_i, - start_j : end_j] = initialize_params(key[2], - init_kernel=weight_init, - shape=shape_, - use_numpy=True) + # weights[start_i : end_i, + # start_j : end_j] = initialize_params(key[2], + # init_kernel=weight_init, + # shape=shape_, + # use_numpy=True) + weights = weights.at[start_i : end_i, + start_j : end_j].set(weight_init(shape_, key[2])) if si!=0: - weights[:si,:] = 0. - weights[-si:,:] = 0. + weights = weights.at[:si,:].set(0.) + weights = weights.at[-si:,:].set(0.) if sj!=0: - weights[:,:sj] = 0. - weights[:, -sj:] = 0. + weights = weights.at[:,:sj].set(0.) + weights = weights.at[:, -sj:].set(0.) return weights - class PatchedSynapse(JaxComponent): ## base patched synaptic cable """ A patched dense synaptic cables that creates multiple small dense synaptic cables; no form of synaptic evolution/adaptation @@ -66,7 +101,7 @@ class PatchedSynapse(JaxComponent): ## base patched synaptic cable with number of inputs by number of outputs) n_sub_models: The number of submodels in each layer (Default: 1 similar functionality as DenseSynapse) - + stride_shape: Stride shape of overlapping synaptic weight value matrix (Default: (0, 0)) @@ -92,8 +127,10 @@ class PatchedSynapse(JaxComponent): ## base patched synaptic cable this to < 1. will result in a sparser synaptic structure """ - def __init__(self, name, shape, n_sub_models=1, stride_shape=(0,0), block_mask=None, weight_init=None, bias_init=None, - resist_scale=1., p_conn=1., batch_size=1, **kwargs): + def __init__( + self, name, shape, n_sub_models=1, stride_shape=(0,0), block_mask=None, weight_init=None, bias_init=None, + resist_scale=1., p_conn=1., batch_size=1, **kwargs + ): super().__init__(name, **kwargs) self.Rscale = resist_scale @@ -104,13 +141,16 @@ def __init__(self, name, shape, n_sub_models=1, stride_shape=(0,0), block_mask=N self.n_sub_models = n_sub_models self.sub_stride = stride_shape - tmp_key, *subkeys = random.split(self.key.value, 4) + tmp_key, *subkeys = random.split(self.key.get(), 4) if self.weight_init is None: info(self.name, "is using default weight initializer!") - self.weight_init = {"dist": "fan_in_gaussian"} + #self.weight_init = {"dist": "fan_in_gaussian"} + self.weight_init = DistributionGenerator.fan_in_gaussian() - weights = create_multi_patch_synapses(key=subkeys, shape=shape, n_sub_models=self.n_sub_models, sub_stride=self.sub_stride, - weight_init=self.weight_init) + weights = _create_multi_patch_synapses( + key=subkeys, shape=shape, n_sub_models=self.n_sub_models, sub_stride=self.sub_stride, + weight_init=self.weight_init + ) self.block_mask = jnp.where(weights!=0, 1, 0) self.sub_shape = (shape[0]//n_sub_models, shape[1]//n_sub_models) @@ -133,39 +173,31 @@ def __init__(self, name, shape, n_sub_models=1, stride_shape=(0,0), block_mask=N if self.bias_init is None: info(self.name, "is using default bias value of zero (no bias " "kernel provided)!") - self.biases = Compartment(initialize_params(subkeys[2], bias_init, - (1, self.shape[1])) - if bias_init else 0.0) - - @transition(output_compartments=["outputs"]) - @staticmethod - def advance_state(Rscale, inputs, weights, biases): - outputs = (jnp.matmul(inputs, weights) * Rscale) + biases - return outputs - - @transition(output_compartments=["inputs", "outputs"]) - @staticmethod - def reset(batch_size, shape): - preVals = jnp.zeros((batch_size, shape[0])) - postVals = jnp.zeros((batch_size, shape[1])) + self.biases = Compartment(self.bias_init((1, self.shape[1]), subkeys[2]) if bias_init else 0.0) + #elf.biases = Compartment(initialize_params(subkeys[2], bias_init, (1, self.shape[1])) if bias_init else 0.0) + + @compilable + def advance_state(self): + # Get the variables + inputs = self.inputs.get() + weights = self.weights.get() + biases = self.biases.get() + + outputs = (jnp.matmul(inputs, weights) * self.Rscale) + biases + + # Update compartment + self.outputs.set(outputs) + + @compilable + def reset(self): + preVals = jnp.zeros((self.batch_size, self.shape[0])) + postVals = jnp.zeros((self.batch_size, self.shape[1])) inputs = preVals outputs = postVals - return inputs, outputs - - def save(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - if self.bias_init != None: - jnp.savez(file_name, weights=self.weights.value, - biases=self.biases.value) - else: - jnp.savez(file_name, weights=self.weights.value) - - def load(self, directory, **kwargs): - file_name = directory + "/" + self.name + ".npz" - data = jnp.load(file_name) - self.weights.set(data['weights']) - if "biases" in data.keys(): - self.biases.set(data['biases']) + # BUG: the self.inputs here does not have the targeted field + # NOTE: Quick workaround is to check if targeted is in the input or not + hasattr(self.inputs, "targeted") and not self.inputs.targeted and self.inputs.set(inputs) + self.outputs.set(outputs) @classmethod def help(cls): ## component help function @@ -201,36 +233,11 @@ def help(cls): ## component help function "hyperparameters": hyperparams} return info - def __repr__(self): - comps = [varname for varname in dir(self) if Compartment.is_compartment(getattr(self, varname))] - maxlen = max(len(c) for c in comps) + 5 - lines = f"[{self.__class__.__name__}] PATH: {self.name}\n" - for c in comps: - stats = tensorstats(getattr(self, c).value) - if stats is not None: - line = [f"{k}: {v}" for k, v in stats.items()] - line = ", ".join(line) - else: - line = "None" - lines += f" {f'({c})'.ljust(maxlen)}{line}\n" - return lines - - - - - - if __name__ == '__main__': from ngcsimlib.context import Context with Context("Bar") as bar: Wab = PatchedSynapse("Wab", (9, 30), 3) print(Wab) - plt.imshow(Wab.weights.value, cmap='gray') + plt.imshow(Wab.weights.get(), cmap='gray') plt.show() - - - - - - diff --git a/ngclearn/modules/__init__.py b/ngclearn/modules/__init__.py index b18f84b7..38866e21 100644 --- a/ngclearn/modules/__init__.py +++ b/ngclearn/modules/__init__.py @@ -2,7 +2,3 @@ from .regression.lasso import Iterative_Lasso from .regression.ridge import Iterative_Ridge - - - - diff --git a/ngclearn/modules/regression/__init__.py b/ngclearn/modules/regression/__init__.py index 064d5303..bc45b6b2 100644 --- a/ngclearn/modules/regression/__init__.py +++ b/ngclearn/modules/regression/__init__.py @@ -2,8 +2,3 @@ from .lasso import Iterative_Lasso from .ridge import Iterative_Ridge - - - - - diff --git a/ngclearn/modules/regression/elastic_net.py b/ngclearn/modules/regression/elastic_net.py index 9cec8948..5860d2bc 100644 --- a/ngclearn/modules/regression/elastic_net.py +++ b/ngclearn/modules/regression/elastic_net.py @@ -1,18 +1,17 @@ -from jax import random, jit import numpy as np -from ngclearn.utils import weight_distribution as dist -from ngclearn import Context, numpy as jnp -from ngclearn.components import (RateCell, - HebbianSynapse, - GaussianErrorCell, - StaticSynapse) -from ngclearn.utils.model_utils import scanner +from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn import numpy as jnp +from jax import numpy as jnp, random, jit +from ngclearn import Context, MethodProcess +from ngclearn.components.synapses.hebbian.hebbianSynapse import HebbianSynapse +from ngclearn.components.neurons.graded.gaussianErrorCell import GaussianErrorCell +from ngcsimlib.global_state import stateManager class Iterative_ElasticNet(): """ A neural circuit implementation of the iterative Elastic Net (L1 and L2) algorithm - using Hebbian learning update rule. + using a Hebbian learning update rule. The circuit implements sparse regression through Hebbian synapses with Elastic Net regularization. @@ -22,8 +21,6 @@ class Iterative_ElasticNet(): | dW_reg = (jnp.sign(W) * l1_ratio) + (W * (1-l1_ratio)/2) | dW/dt = dW + lmbda * dW_reg - - | --- Circuit Components: --- | W - HebbianSynapse for learning regularized dictionary weights | err - GaussianErrorCell for computing prediction errors @@ -77,54 +74,43 @@ def __init__(self, key, name, sys_dim, dict_dim, batch_size, weight_fill=0.05, l feature_dim = dict_dim with Context(self.name) as self.circuit: - self.W = HebbianSynapse("W", shape=(feature_dim, sys_dim), eta=self.lr, - sign_value=-1, weight_init=dist.constant(weight_fill), - prior=('elastic_net', (lmbda, l1_ratio)), w_bound=0., - optim_type=optim_type, key=subkeys[0]) + self.W = HebbianSynapse( + "W", shape=(feature_dim, sys_dim), eta=self.lr, sign_value=-1, + weight_init=dist.constant(value=weight_fill), prior=('elastic_net', (lmbda, l1_ratio)), w_bound=0., + optim_type=optim_type, key=subkeys[0] + ) self.err = GaussianErrorCell("err", n_units=sys_dim) # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ self.W.batch_size = batch_size self.err.batch_size = batch_size # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - self.err.mu << self.W.outputs - self.W.post << self.err.dmu + self.W.outputs >> self.err.mu + self.err.dmu >> self.W.post # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - advance_cmd, advance_args =self.circuit.compile_by_key(self.W, ## execute prediction synapses - self.err, ## finally, execute error neurons - compile_key="advance_state") - evolve_cmd, evolve_args =self.circuit.compile_by_key(self.W, compile_key="evolve") - reset_cmd, reset_args =self.circuit.compile_by_key(self.err, self.W, compile_key="reset") - # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - self.dynamic() - def dynamic(self): ## create dynamic commands forself.circuit - W, err = self.circuit.get_components("W", "err") - self.self = W - self.err = err - - @Context.dynamicCommand - def batch_set(batch_size): - self.W.batch_size = batch_size - self.err.batch_size = batch_size + advance = (MethodProcess(name="advance_state") + >> self.W.advance_state + >> self.err.advance_state) + self.advance = advance - @Context.dynamicCommand - def clamps(y_scaled, X): - self.W.inputs.set(X) - self.W.pre.set(X) - self.err.target.set(y_scaled) + evolve = (MethodProcess(name="evolve") + >> self.W.evolve) + self.evolve = evolve - self.circuit.wrap_and_add_command(jit(self.circuit.evolve), name="evolve") - self.circuit.wrap_and_add_command(jit(self.circuit.advance_state), name="advance") - self.circuit.wrap_and_add_command(jit(self.circuit.reset), name="reset") + reset = (MethodProcess(name="reset") + >> self.err.reset + >> self.W.reset) + self.reset = reset + def batch_set(self, batch_size): + self.W.batch_size = batch_size + self.err.batch_size = batch_size - @scanner - def _process(compartment_values, args): - _t, _dt = args - compartment_values = self.circuit.advance_state(compartment_values, t=_t, dt=_dt) - return compartment_values, compartment_values[self.W.weights.path] - + def clamp(self, y_scaled, X): + self.W.inputs.set(X) + self.W.pre.set(X) + self.err.target.set(y_scaled) def thresholding(self, scale=1.): coef_old = self.coef_ @@ -138,18 +124,15 @@ def thresholding(self, scale=1.): def fit(self, y, X): - self.circuit.reset() - self.circuit.clamps(y_scaled=y, X=X) + self.reset.run() + self.clamp(y_scaled=y, X=X) for i in range(self.epochs): - self.circuit._process(jnp.array([[self.dt * i, self.dt] for i in range(self.T)])) - self.circuit.evolve(t=self.T, dt=self.dt) - - self.coef_ = np.array(self.W.weights.value) - - return self.coef_, self.err.mu.value, self.err.L.value - - + inputs = jnp.array(self.advance.pack_rows(self.T, t=lambda x: x, dt=self.dt)) + stateManager.state, outputs = self.advance.scan(inputs) + self.evolve.run(t=self.T, dt=self.dt) + self.coef_ = np.array(self.W.weights.get()) + return self.coef_, self.err.mu.get(), self.err.L.get() diff --git a/ngclearn/modules/regression/lasso.py b/ngclearn/modules/regression/lasso.py index c0d8c8ef..15a014bb 100644 --- a/ngclearn/modules/regression/lasso.py +++ b/ngclearn/modules/regression/lasso.py @@ -1,26 +1,19 @@ -import jax -import pandas as pd -from jax import random, jit import numpy as np -from scipy.integrate import solve_ivp -import matplotlib.pyplot as plt -from ngcsimlib.utils import Get_Compartment_Batch -from ngclearn.utils.model_utils import normalize_matrix -from ngclearn.utils import weight_distribution as dist -from ngclearn import Context, numpy as jnp -from ngclearn.components import (RateCell, - HebbianSynapse, - GaussianErrorCell, - StaticSynapse) -from ngclearn.utils.model_utils import scanner +from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn import numpy as jnp +from jax import numpy as jnp, random, jit +from ngclearn import Context, MethodProcess +from ngclearn.components.synapses.hebbian.hebbianSynapse import HebbianSynapse +from ngclearn.components.neurons.graded.gaussianErrorCell import GaussianErrorCell +from ngcsimlib.global_state import stateManager class Iterative_Lasso(): """ A neural circuit implementation of the iterative Lasso (L1) algorithm - using Hebbian learning update rule. + using a Hebbian learning update rule. - The circuit implements sparse coding through Hebbian synapses with L1 regularization. + The circuit implements sparse coding-like regression through Hebbian synapses with L1 regularization. The specific differential equation that characterizes this model is adding lmbda * sign(W) to the dW (the gradient of loss/energy function): @@ -80,52 +73,42 @@ def __init__(self, key, name, sys_dim, dict_dim, batch_size, weight_fill=0.05, l feature_dim = dict_dim with Context(self.name) as self.circuit: - self.W = HebbianSynapse("W", shape=(feature_dim, sys_dim), eta=self.lr, - sign_value=-1, weight_init=dist.constant(weight_fill), - prior=('lasso', lasso_lmbda), w_bound=0., - optim_type=optim_type, key=subkeys[0]) + self.W = HebbianSynapse( + "W", shape=(feature_dim, sys_dim), eta=self.lr, sign_value=-1, + weight_init=dist.constant(value=weight_fill), prior=('lasso', lasso_lmbda), w_bound=0., + optim_type=optim_type, key=subkeys[0] + ) self.err = GaussianErrorCell("err", n_units=sys_dim) # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ self.W.batch_size = batch_size self.err.batch_size = batch_size # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - self.err.mu << self.W.outputs - self.W.post << self.err.dmu + self.W.outputs >> self.err.mu + self.err.dmu >> self.W.post # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - advance_cmd, advance_args =self.circuit.compile_by_key(self.W, ## execute prediction synapses - self.err, ## finally, execute error neurons - compile_key="advance_state") - evolve_cmd, evolve_args =self.circuit.compile_by_key(self.W, compile_key="evolve") - reset_cmd, reset_args =self.circuit.compile_by_key(self.err, self.W, compile_key="reset") - # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - self.dynamic() - - def dynamic(self): ## create dynamic commands for self.circuit - W, err = self.circuit.get_components("W", "err") - self.self = W - self.err = err - - @Context.dynamicCommand - def batch_set(batch_size): - self.W.batch_size = batch_size - self.err.batch_size = batch_size - - @Context.dynamicCommand - def clamps(y_scaled, X): - self.W.inputs.set(X) - self.W.pre.set(X) - self.err.target.set(y_scaled) - - self.circuit.wrap_and_add_command(jit(self.circuit.evolve), name="evolve") - self.circuit.wrap_and_add_command(jit(self.circuit.advance_state), name="advance") - self.circuit.wrap_and_add_command(jit(self.circuit.reset), name="reset") - - @scanner - def _process(compartment_values, args): - _t, _dt = args - compartment_values = self.circuit.advance_state(compartment_values, t=_t, dt=_dt) - return compartment_values, compartment_values[self.W.weights.path] - + + advance = (MethodProcess(name="advance_state") + >> self.W.advance_state + >> self.err.advance_state) + self.advance = advance + + evolve = (MethodProcess(name="evolve") + >> self.W.evolve) + self.evolve = evolve + + reset = (MethodProcess(name="reset") + >> self.err.reset + >> self.W.reset) + self.reset = reset + + def batch_set(self, batch_size): + self.W.batch_size = batch_size + self.err.batch_size = batch_size + + def clamp(self, y_scaled, X): + self.W.inputs.set(X) + self.W.pre.set(X) + self.err.target.set(y_scaled) def thresholding(self, scale=2): coef_old = self.coef_ @@ -136,23 +119,16 @@ def thresholding(self, scale=2): return self.coef_, coef_old - def fit(self, y, X): - - self.circuit.reset() - self.circuit.clamps(y_scaled=y, X=X) + self.reset.run() + self.clamp(y_scaled=y, X=X) for i in range(self.epochs): - self.circuit._process(jnp.array([[self.dt * i, self.dt] for i in range(self.T)])) - self.circuit.evolve(t=self.T, dt=self.dt) - - self.coef_ = np.array(self.W.weights.value) - - return self.coef_, self.err.mu.value, self.err.L.value - - - - + inputs = jnp.array(self.advance.pack_rows(self.T, t=lambda x: x, dt=self.dt)) + stateManager.state, outputs = self.advance.scan(inputs) + self.evolve.run(t=self.T, dt=self.dt) + self.coef_ = np.array(self.W.weights.get()) + return self.coef_, self.err.mu.get(), self.err.L.get() diff --git a/ngclearn/modules/regression/ridge.py b/ngclearn/modules/regression/ridge.py index b1698aba..dfbacb03 100644 --- a/ngclearn/modules/regression/ridge.py +++ b/ngclearn/modules/regression/ridge.py @@ -1,21 +1,19 @@ -from jax import random, jit import numpy as np -from ngclearn.utils import weight_distribution as dist -from ngclearn import Context, numpy as jnp -from ngclearn.components import (RateCell, - HebbianSynapse, - GaussianErrorCell, - StaticSynapse) -from ngclearn.utils.model_utils import scanner - +from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn import numpy as jnp +from jax import numpy as jnp, random, jit +from ngclearn import Context, MethodProcess +from ngclearn.components.synapses.hebbian.hebbianSynapse import HebbianSynapse +from ngclearn.components.neurons.graded.gaussianErrorCell import GaussianErrorCell +from ngcsimlib.global_state import stateManager class Iterative_Ridge(): """ A neural circuit implementation of the iterative Ridge (L2) algorithm - using Hebbian learning update rule. + using a Hebbian learning update rule. - The circuit implements sparse regression through Hebbian synapses with L2 regularization. + This circuit implements sparse regression through Hebbian synapses with L2 regularization. The specific differential equation that characterizes this model is adding lmbda * W to the dW (the gradient of loss/energy function): @@ -75,54 +73,43 @@ def __init__(self, key, name, sys_dim, dict_dim, batch_size, weight_fill=0.05, l feature_dim = dict_dim with Context(self.name) as self.circuit: - self.W = HebbianSynapse("W", shape=(feature_dim, sys_dim), eta=self.lr, - sign_value=-1, weight_init=dist.constant(weight_fill), - prior=('ridge', ridge_lmbda), w_bound=0., - optim_type=optim_type, key=subkeys[0]) + self.W = HebbianSynapse( + "W", shape=(feature_dim, sys_dim), eta=self.lr, sign_value=-1, + weight_init=dist.constant(value=weight_fill), prior=('ridge', ridge_lmbda), w_bound=0., + optim_type=optim_type, key=subkeys[0] + ) self.err = GaussianErrorCell("err", n_units=sys_dim) # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ self.W.batch_size = batch_size self.err.batch_size = batch_size # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - self.err.mu << self.W.outputs - self.W.post << self.err.dmu + self.W.outputs >> self.err.mu + self.err.dmu >> self.W.post # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - advance_cmd, advance_args =self.circuit.compile_by_key(self.W, ## execute prediction synapses - self.err, ## finally, execute error neurons - compile_key="advance_state") - evolve_cmd, evolve_args =self.circuit.compile_by_key(self.W, compile_key="evolve") - reset_cmd, reset_args =self.circuit.compile_by_key(self.err, self.W, compile_key="reset") - # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - self.dynamic() - - def dynamic(self): ## create dynamic commands forself.circuit - W, err = self.circuit.get_components("W", "err") - self.self = W - self.err = err - - @Context.dynamicCommand - def batch_set(batch_size): - self.W.batch_size = batch_size - self.err.batch_size = batch_size - - @Context.dynamicCommand - def clamps(y_scaled, X): - self.W.inputs.set(X) - self.W.pre.set(X) - self.err.target.set(y_scaled) - - self.circuit.wrap_and_add_command(jit(self.circuit.evolve), name="evolve") - self.circuit.wrap_and_add_command(jit(self.circuit.advance_state), name="advance") - self.circuit.wrap_and_add_command(jit(self.circuit.reset), name="reset") - - - @scanner - def _process(compartment_values, args): - _t, _dt = args - compartment_values = self.circuit.advance_state(compartment_values, t=_t, dt=_dt) - return compartment_values, compartment_values[self.W.weights.path] + advance = (MethodProcess(name="advance_state") + >> self.W.advance_state + >> self.err.advance_state) + self.advance = advance + + evolve = (MethodProcess(name="evolve") + >> self.W.evolve) + self.evolve = evolve + + reset = (MethodProcess(name="reset") + >> self.err.reset + >> self.W.reset) + self.reset = reset + + def batch_set(self, batch_size): + self.W.batch_size = batch_size + self.err.batch_size = batch_size + + def clamp(self, y_scaled, X): + self.W.inputs.set(X) + self.W.pre.set(X) + self.err.target.set(y_scaled) def thresholding(self, scale=2): coef_old = self.coef_ #self.W.weights.value @@ -135,21 +122,15 @@ def thresholding(self, scale=2): def fit(self, y, X): - self.circuit.reset() - self.circuit.clamps(y_scaled=y, X=X) + self.reset.run() + self.clamp(y_scaled=y, X=X) for i in range(self.epochs): - self.circuit._process(jnp.array([[self.dt * i, self.dt] for i in range(self.T)])) - self.circuit.evolve(t=self.T, dt=self.dt) - - self.coef_ = np.array(self.W.weights.value) - - return self.coef_, self.err.mu.value, self.err.L.value - - - - - + inputs = jnp.array(self.advance.pack_rows(self.T, t=lambda x: x, dt=self.dt)) + stateManager.state, outputs = self.advance.scan(inputs) + self.evolve.run(t=self.T, dt=self.dt) + self.coef_ = np.array(self.W.weights.get()) + return self.coef_, self.err.mu.get(), self.err.L.get() diff --git a/ngclearn/utils/JaxProcessesMixin.py b/ngclearn/utils/JaxProcessesMixin.py new file mode 100644 index 00000000..ae1a655c --- /dev/null +++ b/ngclearn/utils/JaxProcessesMixin.py @@ -0,0 +1,41 @@ +from ngcsimlib import JointProcess, MethodProcess +from ngcsimlib.global_state import stateManager +import jax +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from ngcsimlib._src.process.baseProcess import BaseProcess + +class JaxProcessesMixin: + def __init__(self: "BaseProcess"): + self._previous_result = None + self._previous_state = None + + @property + def previous_result(self): + return self._previous_result + + @property + def previous_state(self): + return self._previous_state + + def clear(self): + self._previous_result = None + self._previous_state = None + + + def scan(self: "BaseProcess", inputs, current_state=None, save_state: bool = True, store_results: bool = True): + state = current_state or stateManager.state + final_state, result = jax.lax.scan(self.run.compiled, state, inputs) + if save_state: + self._previous_state = final_state + if store_results: + self._previous_result = result + return final_state, result + + + +class JaxJointProcess(JointProcess, JaxProcessesMixin): + pass + +class JaxMethodProcess(MethodProcess, JaxProcessesMixin): + pass diff --git a/ngclearn/utils/__init__.py b/ngclearn/utils/__init__.py old mode 100755 new mode 100644 index 9c9f984c..1d8c114e --- a/ngclearn/utils/__init__.py +++ b/ngclearn/utils/__init__.py @@ -1,10 +1,4 @@ +from .distribution_generator import DistributionGenerator +from .JaxProcessesMixin import JaxJointProcess as JointProcess, JaxMethodProcess as MethodProcess from .model_utils import tensorstats -from .jaxProcess import JaxProcess -## forward imports from core ngc-learn utility sub-packages -from . import viz -from . import io_utils -from . import metric_utils -from . import model_utils -from . import patch_utils -from . import weight_distribution -from . import surrogate_fx + diff --git a/ngclearn/utils/analysis/linear_probe.py b/ngclearn/utils/analysis/linear_probe.py index e6eb2a31..a5546073 100644 --- a/ngclearn/utils/analysis/linear_probe.py +++ b/ngclearn/utils/analysis/linear_probe.py @@ -4,7 +4,7 @@ from ngclearn.utils.model_utils import drop_out, softmax, layer_normalize from jax import jit, random, numpy as jnp, lax, nn from functools import partial as bind -import ngclearn.utils.weight_distribution as dist +from ngclearn.utils.distribution_generator import DistributionGenerator from ngclearn.utils.optim import adam, sgd @bind(jax.jit, static_argnums=[2, 3]) @@ -88,10 +88,10 @@ def __init__( ## set up classifier flat_input_dim = input_dim * source_seq_length - weight_init = dist.fan_in_gaussian() # dist.gaussian(mu=0., sigma=0.05) # 0.02) + weight_init = DistributionGenerator.fan_in_gaussian() #dist.fan_in_gaussian() # dist.gaussian(mu=0., sigma=0.05) # 0.02) Wln_mu = jnp.zeros((1, flat_input_dim)) Wln_scale = jnp.ones((1, flat_input_dim)) - W = dist.initialize_params(subkeys[0], weight_init, (flat_input_dim, out_dim)) + W = weight_init((flat_input_dim, out_dim), subkeys[0]) #dist.initialize_params(subkeys[0], weight_init, (flat_input_dim, out_dim)) b = jnp.zeros((1, out_dim)) self.probe_params = [Wln_mu, Wln_scale, W, b] diff --git a/ngclearn/utils/data_loader.py b/ngclearn/utils/data_loader.py index 8bb1cf88..e90df8d9 100644 --- a/ngclearn/utils/data_loader.py +++ b/ngclearn/utils/data_loader.py @@ -6,24 +6,24 @@ class DataLoader(object): """ - A data loader object, meant to allow sampling w/o replacement of one or - more named design matrices. Note that this object is iterable (and - implements an __iter__() method). + A data loader object, meant to allow sampling w/o replacement of one or + more named design matrices. Note that this object is iterable (and + implements an __iter__() method). - Args: - design_matrices: list of named data design matrices - [("name", matrix), ...] + Args: + design_matrices: list of named data design matrices - [("name", matrix), ...] - batch_size: number of samples to place inside a mini-batch + batch_size: number of samples to place inside a mini-batch - disable_shuffle: if True, turns off sample shuffling (thus no sampling w/o replacement) + disable_shuffle: if True, turns off sample shuffling (thus no sampling w/o replacement) - ensure_equal_batches: if True, ensures sampled batches are equal in size (Default = True). - Note that this means the very last batch, if it's not the same size as the rest, will - reuse random samples from previously seen batches (yielding a batch with a mix of - vectors sampled with and without replacement). + ensure_equal_batches: if True, ensures sampled batches are equal in size (Default = True). + Note that this means the very last batch, if it's not the same size as the rest, will + reuse random samples from previously seen batches (yielding a batch with a mix of + vectors sampled with and without replacement). - key: PRNG key to control determinism of any underlying random values - associated with this synaptic cable + key: PRNG key to control determinism of any underlying random values + associated with this synaptic cable """ def __init__(self, design_matrices, batch_size, disable_shuffle=False, ensure_equal_batches=True, key=None): @@ -47,7 +47,7 @@ def __init__(self, design_matrices, batch_size, disable_shuffle=False, def __iter__(self): """ - Yields a mini-batch of the form: [("name", batch),("name",batch),...] + Yields a mini-batch of the form: [("name", batch),("name",batch),...] """ if self.disable_shuffle == False: self.key, *subkeys = random.split(self.key, 2) diff --git a/ngclearn/utils/density/__init__.py b/ngclearn/utils/density/__init__.py index e69de29b..f5ebbc56 100644 --- a/ngclearn/utils/density/__init__.py +++ b/ngclearn/utils/density/__init__.py @@ -0,0 +1,6 @@ +from .mixture import Mixture ## general mixture template parent class +## point to supported density estimator models +from .gaussianMixture import GaussianMixture ## mixture-of-Gaussians +from .bernoulliMixture import BernoulliMixture ## mixture-of-Bernoullis +from .exponentialMixture import ExponentialMixture ## mixture-of-exponentials + diff --git a/ngclearn/utils/density/bernoulliMixture.py b/ngclearn/utils/density/bernoulliMixture.py new file mode 100644 index 00000000..7957aea6 --- /dev/null +++ b/ngclearn/utils/density/bernoulliMixture.py @@ -0,0 +1,221 @@ +from jax import numpy as jnp, random, jit, scipy +from functools import partial +import time, sys +import numpy as np + +from ngclearn.utils.density.mixture import Mixture + +######################################################################################################################## +## internal routines for mixture model +######################################################################################################################## + +@jit +def _log_bernoulli_pdf(X, p): + """ + Calculates the multivariate Bernoulli log likelihood of a design matrix/dataset `X`, under a given parameter + probability `p`. + + Args: + X: a design matrix (dataset) to compute the log likelihood of + + p: a parameter mean vector (positive case probability) + + Returns: + the log likelihood (scalar) of this design matrix X + """ + #D = X.shape[1] * 1. ## get dimensionality + ## general format: x log(mu_k) + (1-x) log(1 - mu_k) + vec_ll = X * jnp.log(p) + (1. - X) * jnp.log(1. - p) ## binary cross-entropy (log Bernoulli) + log_ll = jnp.sum(vec_ll, axis=1, keepdims=True) ## get per-datapoint LL + return log_ll + +@jit +def _calc_bernoulli_pdf_vals(X, p): + log_ll = _log_bernoulli_pdf(X, p) ## get log-likelihood + ll = jnp.exp(log_ll) ## likelihood + return log_ll, ll + +@jit +def _calc_bernoulli_mixture_stats(raw_likeli, pi): + likeli = raw_likeli * pi + gamma = likeli / jnp.sum(likeli, axis=1, keepdims=True) ## responsibilities + likeli = jnp.sum(likeli, axis=1, keepdims=True) ## Sum_j[ pi_j * pdf_gauss(x_n; mu_j, Sigma_j) ] + log_likeli = jnp.log(likeli) ## vector of individual log p(x_n) values + complete_log_likeli = jnp.sum(log_likeli) ## complete log-likelihood for design matrix X, i.e., log p(X) + return log_likeli, complete_log_likeli, gamma + +@jit +def _calc_priors_and_means(X, weights, pi): ## M-step co-routine + ## calc new means, responsibilities, and priors given current stats + N = X.shape[0] ## get number of samples + ## calc responsibilities + _pi = jnp.sum(weights, axis=0, keepdims=True) / N ## calc new priors + ## calc weighted means (weighted by responsibilities) + Z = jnp.sum(weights, axis=0, keepdims=True) ## partition function + M = (Z > 0.) * 1. + Z = Z * M + (1. + M) ## removes div-by-0 cases + means = jnp.matmul(weights.T, X) / Z.T + return _pi, means + +@partial(jit, static_argnums=[1]) +def _sample_prior_weights(dkey, n_samples, pi): ## samples prior weighting parameters (of mixture) + log_pi = jnp.log(pi) ## calc log(prior) + lats = random.categorical(dkey, logits=log_pi, shape=(n_samples, 1)) ## sample components/latents + return lats + +@partial(jit, static_argnums=[1]) +def _sample_component(dkey, n_samples, mu): ## samples a component (of mixture) + x_s = random.bernoulli(dkey, p=mu, shape=(n_samples, mu.shape[1])) ## draw Bernoulli samples + return x_s + +######################################################################################################################## + +class BernoulliMixture(Mixture): ## Bernoulli mixture model (mixture-of-Bernoullis) + """ + Implements a Bernoulli mixture model (BMM) -- or mixture of Bernoullis (MoB). + Adaptation of parameters is conducted via the Expectation-Maximization (EM) + learning algorithm. Note that this Bernoulli mixture assumes that each component + is a factorizable mutlivariate Bernoulli distribution. (A Categorical distribution + is assumed over the latent variables). + + Args: + K: the number of components/latent variables within this BMM + + max_iter: the maximum number of EM iterations to fit parameters to data (Default = 50) + + init_kmeans: + """ + + def __init__(self, K, max_iter=50, init_kmeans=False, key=None, **kwargs): + super().__init__(K, max_iter, **kwargs) + self.K = K + self.max_iter = int(max_iter) + self.init_kmeans = init_kmeans ## Unsupported currently + self.mu = [] ## component mean parameters + self.pi = None ## prior weight parameters + #self.z_weights = None # variables for parameterizing weights for SGD + self.key = random.PRNGKey(time.time_ns()) if key is None else key + + def init(self, X): + """ + Initializes this BMM in accordance to a supplied design matrix. + + Args: + X: the design matrix to initialize this BMM to + + """ + dim = X.shape[1] + self.key, *skey = random.split(self.key, 3) + self.pi = jnp.ones((1, self.K)) / (self.K * 1.) + ptrs = random.permutation(skey[0], X.shape[0]) + for j in range(self.K): + ptr = ptrs[j] + self.key, *skey = random.split(self.key, 3) + #self.mu.append(X[ptr:ptr+1,:] * 0 + (1./(dim * 1.))) + eps = random.uniform(skey[0], minval=0., maxval=0.9, shape=(1, dim)) ## jitter initial prob params + self.mu.append(eps) + + def calc_log_likelihood(self, X): + """ + Calculates the multivariate Bernoulli log likelihood of a design matrix/dataset `X`, under the current + parameters of this Bernoulli mixture. + + Args: + X: the design matrix to estimate log likelihood values over under this BMM + + Returns: + (column) vector of individual log likelihoods, scalar for the complete log likelihood p(X) + """ + likeli = [] + for j in range(self.K): + _, likeli_j = _calc_bernoulli_pdf_vals(X, self.mu[j]) + likeli.append(likeli_j) + likeli = jnp.concat(likeli, axis=1) + log_likeli_vec, complete_log_likeli, gamma = _calc_bernoulli_mixture_stats(likeli, self.pi) + return log_likeli_vec, complete_log_likeli + + def _E_step(self, X): ## Expectation (E) step, co-routine + likeli = [] + for j in range(self.K): + _, likeli_j = _calc_bernoulli_pdf_vals(X, self.mu[j]) + likeli.append(likeli_j) + likeli = jnp.concat(likeli, axis=1) + log_likeli_vec, complete_log_likeli, gamma = _calc_bernoulli_mixture_stats(likeli, self.pi) + ## gamma => ## data-dependent weights (responsibilities) + return gamma, log_likeli_vec, complete_log_likeli + + def _M_step(self, X, weights): ## Maximization (M) step, co-routine + pi, means = _calc_priors_and_means(X, weights, self.pi) + self.pi = pi ## store new prior parameters + for j in range(self.K): + #r_j = weights[:, j:j + 1] ## get j-th responsibility slice + mu_j = means[j:j + 1, :] + self.mu[j] = mu_j ## store new mean(j) parameter + return pi, means + + def fit(self, X, tol=1e-3, verbose=False): + """ + Run full fitting process of this BMM. + + Args: + X: the dataset to fit this BMM to + + tol: the tolerance value for detecting convergence (via difference-of-means); will engage in early-stopping + if tol >= 0. (Default: 1e-3) + + verbose: if True, this function will print out per-iteration measurements to I/O + """ + means_prev = jnp.concat(self.mu, axis=0) + for i in range(self.max_iter): + gamma, pi, means, complete_loglikeli = self.update(X) ## carry out one E-step followed by an M-step + #means = jnp.concat(self.mu, axis=0) + dom = jnp.linalg.norm(means - means_prev) ## norm of difference-of-means + if verbose: + print(f"{i}: Mean-diff = {dom} log(p(X)) = {complete_loglikeli} nats") + #print(jnp.linalg.norm(means - means_prev)) + if tol >= 0. and dom < tol: + print(f"Converged after {i + 1} iterations.") + break + means_prev = means + + def update(self, X): + """ + Performs a single iterative update (E-step followed by M-step) of parameters (assuming model initialized) + + Args: + X: the dataset / design matrix to fit this BMM to + """ + gamma, _, complete_likeli = self._E_step(X) ## carry out E-step + pi, means = self._M_step(X, gamma) ## carry out M-step + return gamma, pi, means, complete_likeli + + def sample(self, n_samples, mode_j=-1): + """ + Draw samples from the current underlying BMM model + + Args: + n_samples: the number of samples to draw from this BMM + + mode_j: if >= 0, will only draw samples from a specific component of this BMM + (Default = -1), ignoring the Categorical prior over latent variables/components + + Returns: + Design matrix of samples drawn under the distribution defined by this BMM + """ + self.key, *skey = random.split(self.key, 3) + if mode_j >= 0: ## sample from a particular mode + mu_j = self.mu[mode_j] ## directly select a specific component + Xs = _sample_component(skey[0], n_samples=n_samples, mu=mu_j) + else: ## sample from full mixture distribution + ## sample (prior) components/latents + lats = _sample_prior_weights(skey[0], n_samples=n_samples, pi=self.pi) + ## then sample chosen component Bernoulli(s) + Xs = [] + for j in range(self.K): + freq_j = int(jnp.sum((lats == j))) ## compute frequency over mode + self.key, *skey = random.split(self.key, 3) + x_s = _sample_component(skey[0], n_samples=freq_j, mu=self.mu[j]) + Xs.append(x_s) + Xs = jnp.concat(Xs, axis=0) + return Xs + diff --git a/ngclearn/utils/density/exponentialMixture.py b/ngclearn/utils/density/exponentialMixture.py new file mode 100644 index 00000000..f718d57f --- /dev/null +++ b/ngclearn/utils/density/exponentialMixture.py @@ -0,0 +1,216 @@ +from jax import numpy as jnp, random, jit, scipy +from functools import partial +import time, sys + +from ngclearn.utils.density.mixture import Mixture + +######################################################################################################################## +## internal routines for mixture model +######################################################################################################################## +@jit +def _log_exponential_pdf(X, lmbda): + """ + Calculates the multivariate exponential log likelihood of a design matrix/dataset `X`, under a given parameter + probability `p`. + + Args: + X: a design matrix (dataset) to compute the log likelihood of + + lmbda: a parameter rate vector + + Returns: + the log likelihood (scalar) of this design matrix X + """ + log_pdf = -jnp.matmul(X, lmbda.T) + jnp.sum(jnp.log(lmbda.T), axis=0) + return log_pdf + +@jit +def _calc_exponential_mixture_stats(X, lmbda, pi): + log_exp_pdf = _log_exponential_pdf(X, lmbda) + log_likeli = log_exp_pdf + jnp.log(pi) ## raw log-likelihood + likeli = jnp.exp(log_likeli) ## raw likelihood + gamma = likeli / jnp.sum(likeli, axis=1, keepdims=True) ## responsibilities + weighted_log_likeli = jnp.sum(log_likeli * gamma, axis=1, keepdims=True) ## get weighted EMM log-likelihood + complete_loglikeli = jnp.sum(weighted_log_likeli) ## complete log-likelihood for design matrix X, i.e., log p(X) + return log_likeli, likeli, gamma, weighted_log_likeli, complete_loglikeli + +@jit +def _calc_priors_and_rates(X, weights, pi): ## M-step co-routine + ## compute updates to pi params + Zk = jnp.sum(weights, axis=0, keepdims=True) ## summed weights/responsibilities; 1 x K + Z = jnp.sum(Zk) ## partition function + pi = Zk / Z + ## compute updates to lmbda params + Z = jnp.matmul(weights.T, X) + lmbda = Zk.T / Z + return pi, lmbda + +@partial(jit, static_argnums=[1]) +def _sample_prior_weights(dkey, n_samples, pi): ## samples prior weighting parameters (of mixture) + log_pi = jnp.log(pi) ## calc log(prior) + lats = random.categorical(dkey, logits=log_pi, shape=(n_samples, 1)) ## sample components/latents + return lats + +@partial(jit, static_argnums=[1]) +def _sample_component(dkey, n_samples, rate): ## samples a component (of mixture) + ## sampling ~[exp(rx)] is same as r * [~exp(x)] + x_s = random.exponential(dkey, shape=(n_samples, rate.shape[1])) * rate ## draw exponential samples + return x_s + +######################################################################################################################## + +class ExponentialMixture(Mixture): ## Exponential mixture model (mixture-of-exponentials) + """ + Implements an exponential mixture model (EMM) -- or mixture of exponentials (MoExp). Adaptation of parameters is + conducted via the Expectation-Maximization (EM) learning algorithm. Note that this exponential mixture assumes that + each component is a factorizable mutlivariate exponential distribution. (A Categorical distribution is assumed over + the latent variables). + + The exponential distribution of each component (dimension `d`) is assumed to be: + + | pdf(x_d; lmbda_d) = lmbda_d * exp(-lmbda_d x_d) for x >= 0, else 0 for x < 0; + | where lbmda is the rate parameter vector + + Args: + K: the number of components/latent variables within this EMM + + max_iter: the maximum number of EM iterations to fit parameters to data (Default = 50) + + init_kmeans: + """ + + def __init__(self, K, max_iter=50, init_kmeans=False, key=None, **kwargs): + super().__init__(K, max_iter, **kwargs) + self.K = K + self.max_iter = int(max_iter) + self.init_kmeans = init_kmeans ## Unsupported currently + self.rate = [] ## component rate parameters + self.pi = None ## prior weight parameters + #self.z_weights = None # variables for parameterizing weights for SGD + self.key = random.PRNGKey(time.time_ns()) if key is None else key + + def init(self, X): + """ + Initializes this EMM in accordance to a supplied design matrix. + + Args: + X: the design matrix to initialize this EMM to + + """ + dim = X.shape[1] + self.key, *skey = random.split(self.key, 4) + ## Computed jittered initial phi param values + #self.pi = jnp.ones((1, self.K)) / (self.K * 1.) + pi = jnp.ones((1, self.K)) + eps = random.uniform(skey[0], minval=0.99, maxval=1.01, shape=(1, self.K)) + pi = pi * eps + self.pi = pi / jnp.sum(pi) + + ## Computed jittered initial rate (lmbda) param values + lmbda_h = 1.0/jnp.mean(X, axis=0, keepdims=True) + lmbda = random.uniform(skey[1], minval=0.99, maxval=1.01, shape=(self.K, dim)) * lmbda_h + self.rate = [] + for j in range(self.K): ## set rates/lmbdas + self.rate.append(lmbda[j:j+1, :]) + + def calc_log_likelihood(self, X): + """ + Calculates the multivariate exponential log likelihood of a design matrix/dataset `X`, under the current + parameters of this exponential mixture. + + Args: + X: the design matrix to estimate log likelihood values over under this EMM + + Returns: + (column) vector of individual log likelihoods, scalar for the complete log likelihood p(X) + """ + pi = self.pi ## get prior weight values + lmbda = jnp.concat(self.rate, axis=0) ## get rates as a block matrix + ## compute relevant log-likelihoods/likelihoods + log_ll, ll, gamma, weighted_loglikeli, complete_likeli = _calc_exponential_mixture_stats(X, lmbda, pi) + return weighted_loglikeli, complete_likeli + + def _E_step(self, X): ## Expectation (E) step, co-routine + pi = self.pi ## get prior weight values + lmbda = jnp.concat(self.rate, axis=0) ## get rates as a block matrix + _, _, gamma, weighted_loglikeli, complete_likeli = _calc_exponential_mixture_stats(X, lmbda, pi) + ## Note: responsibility weights gamma have shape => N x K + return gamma, weighted_loglikeli, complete_likeli + + def _M_step(self, X, weights): ## Maximization (M) step, co-routine + ## compute updates to pi and lmbda params + pi, lmbda = _calc_priors_and_rates(X, weights, self.pi) + self.pi = pi ## store new prior parameters + for j in range(self.K): ## store new rate/lmbda parameters + self.rate[j] = lmbda[j:j+1, :] + return pi, lmbda + + def fit(self, X, tol=1e-3, verbose=False): + """ + Run full fitting process of this EMM. + + Args: + X: the dataset to fit this EMM to + + tol: the tolerance value for detecting convergence (via difference-of-means); will engage in early-stopping + if tol >= 0. (Default: 1e-3) + + verbose: if True, this function will print out per-iteration measurements to I/O + """ + rates_prev = jnp.concat(self.rate, axis=0) + for i in range(self.max_iter): + gamma, pi, rates, complete_loglikeli = self.update(X) ## carry out one E-step followed by an M-step + #rates = jnp.concat(self.rate, axis=0) + dor = jnp.linalg.norm(rates - rates_prev) ## norm of difference-of-rates + if verbose: + print(f"{i}: Rate-diff = {dor} log(p(X)) = {complete_loglikeli} nats") + #print(jnp.linalg.norm(rates - rates_prev)) + if tol >= 0. and dor < tol: + print(f"Converged after {i + 1} iterations.") + break + rates_prev = rates + + def update(self, X): + """ + Performs a single iterative update (E-step followed by M-step) of parameters (assuming model initialized) + + Args: + X: the dataset / design matrix to fit this BMM to + + Returns: + responsibilities (gamma), priors (pi), rates (lambda), EMM log-likelihood + """ + gamma, _, complete_log_likeli = self._E_step(X) ## carry out E-step + pi, rates = self._M_step(X, gamma) ## carry out M-step + return gamma, pi, rates, complete_log_likeli + + def sample(self, n_samples, mode_j=-1): + """ + Draw samples from the current underlying EMM model + + Args: + n_samples: the number of samples to draw from this EMM + + mode_j: if >= 0, will only draw samples from a specific component of this EMM + (Default = -1), ignoring the Categorical prior over latent variables/components + + Returns: + Design matrix of samples drawn under the distribution defined by this EMM + """ + self.key, *skey = random.split(self.key, 3) + if mode_j >= 0: ## sample from a particular mode + rate_j = self.rate[mode_j] ## directly select a specific component + Xs = _sample_component(skey[0], n_samples=n_samples, rate=rate_j) + else: ## sample from full mixture distribution + ## sample (prior) components/latents + lats = _sample_prior_weights(skey[0], n_samples=n_samples, pi=self.pi) + ## then sample chosen component exponential(s) + Xs = [] + for j in range(self.K): + freq_j = int(jnp.sum((lats == j))) ## compute frequency over mode + self.key, *skey = random.split(self.key, 3) + x_s = _sample_component(skey[0], n_samples=freq_j, rate=self.rate[j]) + Xs.append(x_s) + Xs = jnp.concat(Xs, axis=0) + return Xs + diff --git a/ngclearn/utils/density/gaussianMixture.py b/ngclearn/utils/density/gaussianMixture.py new file mode 100644 index 00000000..506f2032 --- /dev/null +++ b/ngclearn/utils/density/gaussianMixture.py @@ -0,0 +1,277 @@ +from jax import numpy as jnp, random, jit, scipy +from functools import partial +import time, sys +import numpy as np + +from ngclearn.utils.density.mixture import Mixture + +######################################################################################################################## +## internal routines for mixture model +######################################################################################################################## + +@partial(jit, static_argnums=[3]) +def _log_gaussian_pdf(X, mu, Sigma, use_chol_prec=True): + """ + Calculates the multivariate Gaussian log likelihood of a design matrix/dataset `X`, under a given parameter mean + `mu` and parameter covariance `Sigma`. + + Args: + X: a design matrix (dataset) to compute the log likelihood of + mu: a parameter mean vector + Sigma: a parameter covariance matrix + use_chol_prec: should this routine use Cholesky-factor computation of the precision (Default: True) + + Returns: + the log likelihood (scalar) of this design matrix X + """ + D = mu.shape[1] * 1. ## get dimensionality + if use_chol_prec: ## use Cholesky-factor calc of precision + C = jnp.linalg.cholesky(Sigma) # calc_prec_chol(mu, cov) + inv_C = jnp.linalg.pinv(C) + precision = jnp.matmul(inv_C.T, inv_C) + else: ## use Moore-Penrose pseudo-inverse calc of precision + precision = jnp.linalg.pinv(Sigma) + ## finish computing log-likelihood + sign_ld, abs_ld = jnp.linalg.slogdet(Sigma) + log_det_sigma = abs_ld * sign_ld ## log-determinant of precision + Z = X - mu ## calc deltas + quad_term = jnp.sum((jnp.matmul(Z, precision) * Z), axis=1, keepdims=True) ## LL quadratic term + return -(jnp.log(2. * np.pi) * D + log_det_sigma + quad_term) * 0.5 + +@partial(jit, static_argnums=[3]) +def _calc_gaussian_pdf_vals(X, mu, Sigma, use_chol_prec=True): + log_likeli = _log_gaussian_pdf(X, mu, Sigma, use_chol_prec) + likeli = jnp.exp(log_likeli) + return log_likeli, likeli + +@jit +def _calc_gaussian_mixture_stats(raw_likeli, pi): + likeli = raw_likeli * pi + gamma = likeli / jnp.sum(likeli, axis=1, keepdims=True) ## responsibilities + likeli = jnp.sum(likeli, axis=1, keepdims=True) ## Sum_j[ pi_j * pdf_gauss(x_n; mu_j, Sigma_j) ] + log_likeli = jnp.log(likeli) ## vector of individual log p(x_n) values + complete_log_likeli = jnp.sum(log_likeli) ## complete log-likelihood for design matrix X, i.e., log p(X) + return log_likeli, complete_log_likeli, gamma + +@partial(jit, static_argnums=[3]) +def _calc_weighted_cov(X, mu, weights, assume_diag_cov=False): ## M-step co-routine + ## calc new covariance Sigma given data, means, and responsibilities + diff = X - mu + sigma_j = jnp.matmul((weights * diff).T, diff) / jnp.sum(weights) + if assume_diag_cov: + sigma_j = sigma_j * jnp.eye(sigma_j.shape[1]) + return sigma_j + +@jit +def _calc_priors_and_means(X, weights, pi): ## M-step co-routine + ## calc new means, responsibilities, and priors given current stats + N = X.shape[0] ## get number of samples + ## calc responsibilities + _pi = jnp.sum(weights, axis=0, keepdims=True) / N ## calc new priors + ## calc weighted means (weighted by responsibilities) + Z = jnp.sum(weights, axis=0, keepdims=True) ## partition function + M = (Z > 0.) * 1. + Z = Z * M + (1. + M) ## removes div-by-0 cases + means = jnp.matmul(weights.T, X) / Z.T + return _pi, means + +@partial(jit, static_argnums=[1]) +def _sample_prior_weights(dkey, n_samples, pi): ## samples prior weighting parameters (of mixture) + log_pi = jnp.log(pi) ## calc log(prior) + lats = random.categorical(dkey, logits=log_pi, shape=(n_samples, 1)) ## sample components/latents + return lats + +@partial(jit, static_argnums=[1, 4]) +def _sample_component(dkey, n_samples, mu, Sigma, assume_diag_cov=False): ## samples a component (of mixture) + eps = random.normal(dkey, shape=(n_samples, mu.shape[1])) ## draw unit Gaussian noise + ## apply scale-shift transformation + if assume_diag_cov: + R = jnp.sum(jnp.sqrt(Sigma), axis=0, keepdims=True) + x_s = mu + eps * R + else: + R = jnp.linalg.cholesky(Sigma) ## decompose covariance via Cholesky + x_s = mu + jnp.matmul(eps, R) # tf.matmul(eps, R) + return x_s + +# def _log_gaussian_pdf(X, mu, sigma): +# C = jnp.linalg.cholesky(sigma) #calc_prec_chol(mu, cov) +# inv_C = jnp.linalg.pinv(C) +# prec_chol = jnp.matmul(inv_C, inv_C.T) +# #prec_chol = jnp.linalg.inv(sigma) +# +# N, D = X.shape ## n_samples x dimensionality +# # det(precision_chol) is half of det(precision) +# sign_ld, abs_ld = jnp.linalg.slogdet(prec_chol) +# log_det = abs_ld * sign_ld ## log determinant of Cholesky precision +# y = jnp.matmul(X, prec_chol) - jnp.matmul(mu, prec_chol) +# log_prob = jnp.sum(y * y, axis=1, keepdims=True) +# #return -0.5 * (D * jnp.log(np.pi * 2) + log_prob) + log_det +# #return -0.5 * (D * jnp.log(np.pi * 2) + log_det + log_prob) +# return -jnp.log(np.pi * 2) * (D * 0.5) - log_det * 0.5 - log_prob * 0.5 + +######################################################################################################################## + +class GaussianMixture(Mixture): ## Gaussian mixture model (mixture-of-Gaussians) + """ + Implements a Gaussian mixture model (GMM) -- or mixture of Gaussians (MoG). + Adaptation of parameters is conducted via the Expectation-Maximization (EM) + learning algorithm and leverages full covariance matrices in the component + multivariate Gaussians. (A Categorical distribution is assumed over the + latent variables). + + Args: + K: the number of components/latent variables within this GMM + + max_iter: the maximum number of EM iterations to fit parameters to data (Default = 50) + + assume_diag_cov: if True, assumes a diagonal covariance for each component (Default = False) + + init_kmeans: + """ + # init_kmeans: if True, first learn use the K-Means algorithm to initialize + # the component Gaussians of this GMM (Default = False) + + def __init__(self, K, max_iter=50, assume_diag_cov=False, init_kmeans=False, key=None, **kwargs): + super().__init__(K, max_iter, **kwargs) + self.K = K + self.max_iter = int(max_iter) + self.assume_diag_cov = assume_diag_cov + self.init_kmeans = init_kmeans ## Unsupported currently + self.mu = [] ## component mean parameters + self.Sigma = [] ## component covariance parameters + self.pi = None ## prior weight parameters + #self.z_weights = None # variables for parameterizing weights for SGD + self.key = random.PRNGKey(time.time_ns()) if key is None else key + + def init(self, X): + """ + Initializes this GMM in accordance to a supplied design matrix. + + Args: + X: the design matrix to initialize this GMM to + + """ + dim = X.shape[1] + self.key, *skey = random.split(self.key, 3) + self.pi = jnp.ones((1, self.K)) / (self.K * 1.) + ptrs = random.permutation(skey[0], X.shape[0]) + for j in range(self.K): + ptr = ptrs[j] + #self.key, *skey = random.split(self.key, 3) + self.mu.append(X[ptr:ptr+1,:]) + Sigma_j = jnp.eye(dim) + #sigma_j = random.uniform(skey[0], minval=0.01, maxval=0.9, shape=(dim, dim)) + self.Sigma.append(Sigma_j) + + def calc_log_likelihood(self, X): + """ + Calculates the multivariate Gaussian log likelihood of a design matrix/dataset `X`, under the current + parameters of this Gaussian mixture model. + + Args: + X: the design matrix to estimate log likelihood values over under this GMM + + Returns: + (column) vector of individual log likelihoods, scalar for the complete log likelihood p(X) + """ + likeli = [] + for j in range(self.K): + _, likeli_j = _calc_gaussian_pdf_vals(X, self.mu[j], self.Sigma[j]) + likeli.append(likeli_j) + likeli = jnp.concat(likeli, axis=1) + log_likeli_vec, complete_log_likeli, gamma = _calc_gaussian_mixture_stats(likeli, self.pi) + return log_likeli_vec, complete_log_likeli + + def _E_step(self, X): ## Expectation (E) step, co-routine + likeli = [] + for j in range(self.K): + _, likeli_j = _calc_gaussian_pdf_vals(X, self.mu[j], self.Sigma[j]) + likeli.append(likeli_j) + likeli = jnp.concat(likeli, axis=1) + log_likeli_vec, complete_log_likeli, gamma = _calc_gaussian_mixture_stats(likeli, self.pi) + ## gamma => ## data-dependent weights (responsibilities) + return gamma, log_likeli_vec, complete_log_likeli + + def _M_step(self, X, weights): ## Maximization (M) step, co-routine + pi, means = _calc_priors_and_means(X, weights, self.pi) + self.pi = pi ## store new prior parameters + # calc weighted covariances + for j in range(self.K): + r_j = weights[:, j:j + 1] ## get j-th responsibility slice + mu_j = means[j:j + 1, :] + sigma_j = _calc_weighted_cov(X, mu_j, r_j, assume_diag_cov=self.assume_diag_cov) + self.mu[j] = mu_j ## store new mean(j) parameter + self.Sigma[j] = sigma_j ## store new covariance(j) parameter + return pi, means + + def fit(self, X, tol=1e-3, verbose=False): + """ + Run full fitting process of this GMM. + + Args: + X: the dataset to fit this GMM to + + tol: the tolerance value for detecting convergence (via difference-of-means); will engage in early-stopping + if tol >= 0. (Default: 1e-3) + + verbose: if True, this function will print out per-iteration measurements to I/O + """ + means_prev = jnp.concat(self.mu, axis=0) + for i in range(self.max_iter): + gamma, pi, means, complete_loglikeli = self.update(X) ## carry out one E-step followed by an M-step + #means = jnp.concat(self.mu, axis=0) + dom = jnp.linalg.norm(means - means_prev) ## norm of difference-of-means + if verbose: + print(f"{i}: Mean-diff = {dom} log(p(X)) = {complete_loglikeli} nats") + #print(jnp.linalg.norm(means - means_prev)) + if tol >= 0. and dom < tol: + print(f"Converged after {i + 1} iterations.") + break + means_prev = means + + def update(self, X): + """ + Performs a single iterative update (E-step followed by M-step) of parameters (assuming model initialized) + + Args: + X: the dataset / design matrix to fit this GMM to + """ + gamma, _, complete_likeli = self._E_step(X) ## carry out E-step + pi, means = self._M_step(X, gamma) ## carry out M-step + return gamma, pi, means, complete_likeli + + def sample(self, n_samples, mode_j=-1): + """ + Draw samples from the current underlying GMM model + + Args: + n_samples: the number of samples to draw from this GMM + + mode_j: if >= 0, will only draw samples from a specific component of this GMM + (Default = -1), ignoring the Categorical prior over latent variables/components + + Returns: + Design matrix of samples drawn under the distribution defined by this GMM + """ + self.key, *skey = random.split(self.key, 3) + if mode_j >= 0: ## sample from a particular mode + mu_j = self.mu[mode_j] ## directly select a specific component + Sigma_j = self.Sigma[mode_j] + Xs = _sample_component( + skey[0], n_samples=n_samples, mu=mu_j, Sigma=Sigma_j, assume_diag_cov=self.assume_diag_cov + ) + else: ## sample from full mixture distribution + ## sample (prior) components/latents + lats = _sample_prior_weights(skey[0], n_samples=n_samples, pi=self.pi) + ## then sample chosen component Gaussian(s) + Xs = [] + for j in range(self.K): + freq_j = int(jnp.sum((lats == j))) ## compute frequency over mode + self.key, *skey = random.split(self.key, 3) + x_s = _sample_component( ## now physically sample component + skey[0], n_samples=freq_j, mu=self.mu[j], Sigma=self.Sigma[j], assume_diag_cov=self.assume_diag_cov + ) + Xs.append(x_s) + Xs = jnp.concat(Xs, axis=0) + return Xs + diff --git a/ngclearn/utils/density/gmm.py b/ngclearn/utils/density/gmm.py deleted file mode 100644 index 6d2ed813..00000000 --- a/ngclearn/utils/density/gmm.py +++ /dev/null @@ -1,82 +0,0 @@ -from jax import numpy as jnp, random, jit -from functools import partial -import time, sys -import numpy as np -#from sklearn import mixture -#from sklearn.cluster import KMeans -from scipy.stats import multivariate_normal -#from ngclearn.utils.stat_utils import calc_log_gauss_pdf -from ngclearn.utils.model_utils import softmax -#from kmeans import K_Means -from sklearn import mixture - -#seed = 69 -#tf.random.set_seed(seed=seed) - -class GMM: - """ - Implements a Gaussian mixture model (GMM) -- or mixture of Gaussians, MoG. - Adaptation of parameters is conducted via the Expectation-Maximization (EM) - learning algorithm and leverages full covariance matrices in the component - multivariate Gaussians. - - Note this is a (JAX) wrapper model that houses the sklearn implementation for learning. - The sampling process has been rewritten to utilize GPU matrix computation. - - Args: - k: the number of components/latent variables within this GMM - - max_iter: the maximum number of EM iterations to fit parameters to data - (Default = 5) - - assume_diag_cov: if True, assumes a diagonal covariance for each component - (Default = False) - - init_kmeans: if True, first learn use the K-Means algorithm to initialize - the component Gaussians of this GMM (Default = True) - """ - def __init__(self, k, max_iter=5, assume_diag_cov=False, init_kmeans=True): - self.use_sklearn = True - self.k = k - self.max_iter = int(max_iter) - self.assume_diag_cov = assume_diag_cov - self.init_kmeans = init_kmeans - self.mu = [] - self.sigma = [] - self.prec = [] - self.weights = None - self.z_weights = None # variables for parameterizing weights for SGD - - def fit(self, data): - """ - Run full fitting process of this GMM. - - Args: - data: the dataset to fit this GMM to - """ - pass - - def update(self, X): - """ - Performs a single iterative update of parameters (assuming model initialized) - - Args: - X: the dataset / design matrix to fit this GMM to - """ - pass - - def sample(self, n_s, mode_i=-1, samples_modes_evenly=False): - """ - (Efficiently) Draw samples from the current underlying GMM model - - Args: - n_s: the number of samples to draw from this GMM - - mode_i: if >= 0, will only draw samples from a specific component of this GMM - (Default = -1), ignoring the Categorical prior over latent variables/components - - samples_modes_evenly: if True, will ignore the Categorical prior over latent - variables/components and draw an approximately equal number of samples from - each component - """ - pass diff --git a/ngclearn/utils/density/mixture.py b/ngclearn/utils/density/mixture.py new file mode 100644 index 00000000..107df7c7 --- /dev/null +++ b/ngclearn/utils/density/mixture.py @@ -0,0 +1,33 @@ + + +class Mixture: ## General mixture structure + """ + Implements a general mixture model template/structure. Effectively, this is the parent + class/template for mixtures of distributions. + + Args: + K: the number of components/latent variables within this mixture model + + max_iter: the maximum number of iterations to fit parameters to data (Default = 50) + + """ + + def __init__(self, K, max_iter=50, **kwargs): + self.K = K + self.max_iter = max_iter + + def init(self, X): ## model data-dependent initialization function + pass + + def calc_log_likelihood(self, X): ## log-likelihood calculation routine + pass + + def fit(self, X, tol=1e-3, verbose=False): ## outer fitting process + pass + + def update(self, X): ## inner/iterative adjustment/update step + pass + + def sample(self, n_samples, mode_j=-1): ## model sampling routine + pass + diff --git a/ngclearn/utils/diffeq/ode_utils.py b/ngclearn/utils/diffeq/ode_utils.py index 30ddb2d4..55a70ace 100755 --- a/ngclearn/utils/diffeq/ode_utils.py +++ b/ngclearn/utils/diffeq/ode_utils.py @@ -1,12 +1,13 @@ """ Routines and co-routines for ngc-learn's differential equation integration backend. -Currently supported back-end forms of integration in ngc-learn include: -0) Euler integration (RK-1); -1) Midpoint method (RK-2); -2) Heun's method (error-corrector RK-2); -3) Ralston's method (error-corrector RK-2); -4) 4th-order Runge-Kutta method (RK-4); +| Currently supported back-end forms of integration in ngc-learn include: +| 0) Euler integration (RK-1); +| 1) Midpoint method (RK-2); +| 2) Heun's method (error-corrector RK-2); +| 3) Ralston's method (error-corrector RK-2); +| 4) 4th-order Runge-Kutta method (RK-4); + """ from jax import numpy as jnp, random, jit #, nn diff --git a/ngclearn/utils/diffeq/odes.py b/ngclearn/utils/diffeq/odes.py index b37e2408..733f1082 100644 --- a/ngclearn/utils/diffeq/odes.py +++ b/ngclearn/utils/diffeq/odes.py @@ -1,3 +1,16 @@ +""" +In-built dynamical systems built on differential equations. Note that these systems are designed such that they +directly operzte with ngc-learn's ODE integration backend. + +| Currently in-built dynamical systems include: +| 0) A continuous linear 2D system; +| 1) A continuous cubic 2D system; +| 2) A Lorenz attractor system; +| 3) A continuous linear 3D system; +| 4) A continuous oscillator system. + +""" + import jax.numpy as jnp def linear_2D(t, x, params): diff --git a/ngclearn/utils/distribution_generator.py b/ngclearn/utils/distribution_generator.py new file mode 100644 index 00000000..0af4d6c6 --- /dev/null +++ b/ngclearn/utils/distribution_generator.py @@ -0,0 +1,383 @@ +import time +from typing import TypedDict, List, Protocol, Sequence +from typing_extensions import Unpack +import jax +import numpy + +from ngcsimlib.logger import error + + +class DistributionParams(TypedDict, total=False): + """ + Extra parameters to be used when generating distributions. (Attributes listed below) + + Args: + amin: sets the lower bound of the distribution + + amax: sets the upper bound of the distribution + + lower_triangle: keeps the lower triangle, sets the rest to zero + + upper_triangle: keeps the upper triangle, sets the rest to zero + + hollow: produces a hollow distribution (zeros along the diagonal) + + eye: produces an eye distribution (zeros the off-diagonal) + + col_mask: single value, keeps n random columns; list values, keeps the provided column indices + + row_mask: single value, keeps n random rows; list values, keeps the provided row indices + + use_numpy: use default numpy + + """ + amin: float + amax: float + lower_triangle: bool + upper_triangle: bool + hollow: bool + eye: bool + col_mask: int | List[int] + row_mask: int | List[int] + use_numpy: bool + dtype: numpy.dtype + + +class DistributionInitializer(Protocol): + def __call__(self, shape: Sequence[int], dkey: jax.dtypes.prng_key | int | None = None) -> jax.Array: ... + + +class DistributionGenerator(object): + @staticmethod + def constant(value: float, **params: Unpack[DistributionParams]) -> DistributionInitializer: + """ + Produces a distribution initializer for a constant distribution. + + Args: + value: the constant value to fill the array with + **params: the extra distribution parameters + + Returns: + a distribution initializer + """ + using_np = params.get("use_numpy", False) + if using_np: + def constant_generator(shape: Sequence[int], seed: int | None = None) -> numpy.ndarray: + matrix = numpy.ones(shape, params.get("dtype", numpy.float32)) * value + matrix = DistributionGenerator._process_params_numpy(matrix, params, seed) + return matrix + else: + def constant_generator(shape: Sequence[int], dKey: jax.dtypes.prng_key | None = None) -> jax.Array: + matrix = jax.numpy.ones(shape, params.get("dtype", jax.numpy.float32)) * value + matrix = DistributionGenerator._process_params_jax(matrix, params, dKey) + return matrix + return constant_generator + + @staticmethod + def uniform(low: float = 0.0, high: float = 1.0, **params: Unpack[DistributionParams]) -> DistributionInitializer: + """ + Produces a distribution initializer for a uniform distribution. + + Args: + low: lower bound of the uniform distribution (inclusive) + high: upper bound of the uniform distribution (exclusive) + **params: the extra distribution parameters + + Returns: + a distribution initializer + """ + using_np = params.get("use_numpy", False) + + if using_np: + def uniform_generator(shape: Sequence[int], seed: int | None = None) -> numpy.ndarray: + rng = numpy.random.default_rng(seed) + matrix = rng.uniform(low=low, high=high, size=shape).astype( + params.get("dtype", numpy.float32)) + matrix = DistributionGenerator._process_params_numpy(matrix, params, seed) + return matrix + else: + def uniform_generator(shape: Sequence[int], dKey: jax.Array | None = None) -> jax.Array: + if dKey is None: + dKey = jax.random.PRNGKey(time.time_ns()) + dKey, subKey = jax.random.split(dKey, 2) + + matrix = jax.random.uniform( + dKey, + shape=shape, + minval=low, + maxval=high, + dtype=params.get("dtype", jax.numpy.float32) + ) + matrix = DistributionGenerator._process_params_jax(matrix, params, subKey) + return matrix + + return uniform_generator + + @staticmethod + def gaussian(mean: float = 0.0, std: float = 1.0, **params: Unpack[DistributionParams]) -> DistributionInitializer: + """ + Produces a distribution initializer for a Gaussian (normal) distribution. + + Args: + mean: the mean of the normal distribution + std: the standard deviation of the normal distribution + **params: the extra distribution parameters + + Returns: + a distribution initializer + """ + using_numpy = params.get("use_numpy", False) + + if using_numpy: + def gaussian_generator(shape: Sequence[int], seed: int | None = None) -> numpy.ndarray: + rng = numpy.random.default_rng(seed) + matrix = rng.normal(loc=mean, scale=std, size=shape).astype( + params.get("dtype", numpy.float32)) + matrix = DistributionGenerator._process_params_numpy(matrix, params, seed) + return matrix + else: + def gaussian_generator(shape: Sequence[int], dKey: jax.Array | None = None) -> jax.Array: + if dKey is None: + dKey = jax.random.PRNGKey(time.time_ns()) + dKey, subKey = jax.random.split(dKey, 2) + matrix = jax.random.normal( + dKey, + shape=shape, + dtype=params.get("dtype", jax.numpy.float32) + ) + matrix = mean + std * matrix + matrix = DistributionGenerator._process_params_jax(matrix, params, subKey) + return matrix + + return gaussian_generator + + @staticmethod + def fan_in_uniform(**params: Unpack[DistributionParams]) -> DistributionInitializer: + """ + Produces a distribution initializer using a fan-in uniform strategy. + The values are sampled from a uniform distribution in the range [-limit, limit], + where limit = sqrt(1 / fan_in), and fan_in is inferred from the shape. + + | Glorot, Xavier, and Yoshua Bengio. "Understanding the difficulty of training deep feedforward neural + | networks." Proceedings of the thirteenth international conference on artificial intelligence and statistics. + | JMLR Workshop and Conference Proceedings, 2010. + + Args: + **params: extra distribution parameters + + Returns: + a distribution initializer + """ + using_numpy = params.get("use_numpy", False) + + def compute_limit(fan_in: int) -> float: + return float(numpy.sqrt(1.0 / fan_in)) + + if using_numpy: + def fan_in_uniform_generator(shape: Sequence[int], seed: int | None = None) -> numpy.ndarray: + if len(shape) < 2: + error("fan_in_uniform requires shape with at least 2 dimensions") + fan_in = shape[1] + limit = compute_limit(fan_in) + + rng = numpy.random.default_rng(seed) + matrix = rng.uniform(low=-limit, high=limit, size=shape).astype( + params.get("dtype", numpy.float32)) + matrix = DistributionGenerator._process_params_numpy(matrix, params, seed) + return matrix + else: + def fan_in_uniform_generator(shape: Sequence[int], dKey: jax.Array | None = None) -> jax.Array: + if len(shape) < 2: + error("fan_in_uniform requires shape with at least 2 dimensions") + fan_in = shape[1] + limit = compute_limit(fan_in) + + if dKey is None: + dKey = jax.random.PRNGKey(time.time_ns()) + dKey, subKey = jax.random.split(dKey, 2) + + matrix = jax.random.uniform( + dKey, + shape=shape, + minval=-limit, + maxval=limit, + dtype=params.get("dtype", jax.numpy.float32) + ) + matrix = DistributionGenerator._process_params_jax(matrix, params, subKey) + return matrix + + return fan_in_uniform_generator + + @staticmethod + def fan_in_gaussian(**params: Unpack[DistributionParams]) -> DistributionInitializer: + """ + Produces a distribution initializer using a fan-in Gaussian (normal) strategy. + The values are sampled from a normal distribution with mean 0 and stddev = sqrt(1 / fan_in), + where fan_in is inferred from the shape. + + | He, Kaiming, et al. "Delving deep into rectifiers: Surpassing human-level performance on imagenet + | classification." Proceedings of the IEEE international conference on computer vision. 2015. + + Args: + **params: extra distribution parameters + + Returns: + a distribution initializer + """ + using_numpy = params.get("use_numpy", False) + + def compute_std(fan_in: int) -> float: + return float(numpy.sqrt(1.0 / fan_in)) + + if using_numpy: + def fan_in_gaussian_generator(shape: Sequence[int], seed: int | None) -> numpy.ndarray: + if len(shape) < 2: + error("fan_in_gaussian requires shape with at least 2 dimensions") + fan_in = shape[0] + std = compute_std(fan_in) + + rng = numpy.random.default_rng(seed) + matrix = rng.normal(loc=0.0, scale=std, size=shape).astype( + params.get("dtype", numpy.float32)) + matrix = DistributionGenerator._process_params_numpy(matrix, params, seed) + return matrix + else: + def fan_in_gaussian_generator(shape: Sequence[int], dKey: jax.Array | None) -> jax.Array: + if len(shape) < 2: + error("fan_in_gaussian requires shape with at least 2 dimensions") + fan_in = shape[0] + std = compute_std(fan_in) + + if dKey is None: + dKey = jax.random.PRNGKey(time.time_ns()) + dKey, subKey = jax.random.split(dKey, 2) + + matrix = jax.random.normal( + dKey, + shape=shape, + dtype=params.get("dtype", jax.numpy.float32) + ) + matrix = matrix * std + matrix = DistributionGenerator._process_params_jax(matrix, params, subKey) + return matrix + + return fan_in_gaussian_generator + + @staticmethod + def _process_params_jax(ary: jax.Array, params: DistributionParams, dKey: jax.dtypes.prng_key | None) -> jax.Array: + if dKey is None: + dKey = jax.random.PRNGKey(time.time_ns()) + + amin = params.get("amin", None) + if amin is not None: + ary = jax.numpy.maximum(ary, amin) + + amax = params.get("amax", None) + if amax is not None: + ary = jax.numpy.minimum(ary, amax) + + lower_triangle = params.get("lower_triangle", False) + upper_triangle = params.get("upper_triangle", False) + if lower_triangle and upper_triangle: + error("lower_triangle and upper_triangle are mutually exclusive when initializing a distribution") + + if lower_triangle: + ary = jax.numpy.tril(ary) + if upper_triangle: + ary = jax.numpy.triu(ary) + + if params.get("hollow", False): + ary = (1.0 - jax.numpy.eye(*ary.shape)) * ary + + if params.get("eye", False): + ary = jax.numpy.eye(*ary.shape) * ary + + col_mask = params.get("col_mask", None) + if col_mask is not None: + if isinstance(col_mask, int): + dKey, subKey = jax.random.split(dKey, 2) + keep_indices = jax.random.choice(subKey, ary.shape[1], shape=(col_mask,), replace=False) + mask = jax.numpy.zeros(ary.shape[1], dtype=bool).at[ + keep_indices].set(True) + mask = jax.numpy.broadcast_to(mask, ary.shape) + ary = jax.numpy.where(mask, ary, 0) + elif isinstance(col_mask, Sequence): + mask = jax.numpy.zeros(ary.shape[1], dtype=bool).at[ + col_mask].set(True) + mask = jax.numpy.broadcast_to(mask, ary.shape) + ary = jax.numpy.where(mask, ary, 0) + + row_mask = params.get("row_mask", None) + if row_mask is not None: + if isinstance(row_mask, int): + dKey, subKey = jax.random.split(dKey, 2) + keep_indices = jax.random.choice(subKey, ary.shape[0], shape=(row_mask,), replace=False) + mask = jax.numpy.zeros(ary.shape[0], dtype=bool).at[ + keep_indices].set(True) + mask = jax.numpy.broadcast_to(mask, ary.shape) + ary = jax.numpy.where(mask, ary, 0) + elif isinstance(row_mask, Sequence): + mask = jax.numpy.zeros(ary.shape[0], dtype=bool).at[ + row_mask].set(True) + mask = jax.numpy.broadcast_to(mask, ary.shape) + ary = jax.numpy.where(mask, ary, 0) + + return ary.astype(params.get("dtype", jax.numpy.float32)) + + @staticmethod + def _process_params_numpy(ary: numpy.ndarray, params: DistributionParams, seed: int | None) -> numpy.ndarray: + amin = params.get("amin", None) + if amin is not None: + ary = numpy.maximum(ary, amin) + + amax = params.get("amax", None) + if amax is not None: + ary = numpy.minimum(ary, amax) + + lower_triangle = params.get("lower_triangle", False) + upper_triangle = params.get("upper_triangle", False) + if lower_triangle and upper_triangle: + error("lower_triangle and upper_triangle are mutually exclusive when initializing a distribution") + + if lower_triangle: + ary = numpy.tril(ary) + if upper_triangle: + ary = numpy.triu(ary) + + if params.get("hollow", False): + ary = (1.0 - numpy.eye(*ary.shape)) * ary + + if params.get("eye", False): + ary = numpy.eye(*ary.shape) * ary + + col_mask = params.get("col_mask", None) + if col_mask is not None: + if isinstance(col_mask, int): + rng = numpy.random.default_rng(seed) + keep_indices = rng.choice(ary.shape[1], size=col_mask, replace=False) + mask = numpy.zeros(ary.shape[1], dtype=bool) + mask[keep_indices] = True + mask = numpy.broadcast_to(mask, ary.shape) + ary = numpy.where(mask, ary, 0) + elif isinstance(col_mask, Sequence): + mask = numpy.zeros(ary.shape[1], dtype=bool) + mask[list(col_mask)] = True + mask = numpy.broadcast_to(mask, ary.shape) + ary = numpy.where(mask, ary, 0) + + row_mask = params.get("row_mask", None) + if row_mask is not None: + if isinstance(row_mask, int): + rng = numpy.random.default_rng(seed) + keep_indices = rng.choice(ary.shape[0], size=row_mask, replace=False) + mask = numpy.zeros(ary.shape[0], dtype=bool) + mask[keep_indices] = True + mask = numpy.broadcast_to(mask, ary.shape) + ary = numpy.where(mask, ary, 0) + elif isinstance(row_mask, Sequence): + mask = numpy.zeros(ary.shape[0], dtype=bool) + mask[list(row_mask)] = True + mask = numpy.broadcast_to(mask, ary.shape) + ary = numpy.where(mask, ary, 0) + + return ary diff --git a/ngclearn/utils/feature_dictionaries/__init__.py b/ngclearn/utils/feature_dictionaries/__init__.py new file mode 100644 index 00000000..ad4ea443 --- /dev/null +++ b/ngclearn/utils/feature_dictionaries/__init__.py @@ -0,0 +1 @@ +from .polynomialLibrary import PolynomialLibrary diff --git a/ngclearn/utils/feature_dictionaries/polynomialLibrary.py b/ngclearn/utils/feature_dictionaries/polynomialLibrary.py index f50686ef..42e13780 100644 --- a/ngclearn/utils/feature_dictionaries/polynomialLibrary.py +++ b/ngclearn/utils/feature_dictionaries/polynomialLibrary.py @@ -1,19 +1,16 @@ -import jax.numpy as jnp -from jax import jit, random -import jax.numpy as jnp +from jax import jit, random, numpy as jnp from typing import List, Tuple, Union from dataclasses import dataclass - - @dataclass class PolynomialLibrary: """ A class for creating polynomial feature libraries in 1D, 2D, or 3D. - Attributes: - poly_order (int): Maximum order of polynomial terms - include_bias (bool): Whether to include the bias term in the output + Args: + poly_order (int): Maximum order of polynomial terms (Attribute) + + include_bias (bool): Whether to include the bias term in the output (Attribute) """ poly_order: int = None @@ -65,6 +62,15 @@ def _create_library(self, *arrays: jnp.ndarray) -> Tuple[jnp.ndarray, List[str]] def fit(self, X: List[jnp.ndarray]) -> Tuple[jnp.ndarray, List[str]]: + """ + Fits this library to a design matrix X + + Args: + X: the design matrix to fit this library to + + Returns: + the data-fit/retro-fit library + """ if not 1 <= len(X) <=3: raise ValueError("Input must be 1D, 2D, or 3D; e.g. len(X) >= 1 ") @@ -72,7 +78,6 @@ def fit(self, X: List[jnp.ndarray]) -> Tuple[jnp.ndarray, List[str]]: arrays = [jnp.array(x).reshape(-1, 1) for x in X] lib, names = self._create_library(*arrays) - start_idx = 1 if not self.include_bias else 0 return lib[:, start_idx+1:], names[start_idx:] diff --git a/ngclearn/utils/io_utils.py b/ngclearn/utils/io_utils.py index 7422ebe0..8553af44 100755 --- a/ngclearn/utils/io_utils.py +++ b/ngclearn/utils/io_utils.py @@ -1,9 +1,10 @@ """ File and OS input/output (reading/writing) utilities. """ -import jax -from jax import numpy as jnp, grad, jit, vmap, random, lax +# import jax +# from jax import numpy as jnp, grad, jit, vmap, random, lax import os, sys, pickle +from typing import Any def serialize(fname, object): ## object "saving" routine """ @@ -65,3 +66,15 @@ def makedirs(directories): """ for dir in directories: makedir(dir) + + +def save_pkl(directory: str, name: str, value: Any) -> None: + file_name = directory + "/" + name + ".pkl" + with open(file_name, 'wb') as f: + pickle.dump(value, f) + +def load_pkl(directory: str, name: str) -> Any: + file_name = directory + "/" + name + ".pkl" + with open(file_name, 'rb') as f: + data = pickle.load(f) + return data diff --git a/ngclearn/utils/jaxProcess.py b/ngclearn/utils/jaxProcess.py deleted file mode 100644 index dd1dabc3..00000000 --- a/ngclearn/utils/jaxProcess.py +++ /dev/null @@ -1,171 +0,0 @@ -from ngcsimlib.compartment import Compartment -from ngcsimlib.compilers.process import Process -from jax.lax import scan as _scan -from ngcsimlib.logger import warn -from jax import numpy as jnp - - -class JaxProcess(Process): - """ - The JaxProcess is a subclass of the ngcsimlib Process class. The - functionality added by this subclass is the use of the jax scanner to run a - process quickly through the use of jax's JIT compiler. - """ - - def __init__(self, name): - super().__init__(name) - self._process_scan_method = None - self._monitoring = [] - - def _make_scanner(self): - arg_order = self.get_required_args() - - def _pure(current_state, x): - v = self.pure(current_state, - **{key: value for key, value in zip(arg_order, x)}) - return v, [v[m] for m in self._monitoring] - - return _pure - - def watch(self, compartment): - """ - Adds a compartment to the process to watch during a scan - - Args: - compartment: the compartment to watch - """ - if not isinstance(compartment, Compartment): - warn( - "Jax Process trying to watch a value that is not a compartment") - - self._monitoring.append(compartment.path) - self._process_scan_method = self._make_scanner() - - def clear_watch_list(self): - """ - Clears the watch list so no values are watched - """ - self._monitoring = [] - self._process_scan_method = self._make_scanner() - - def transition(self, transition_call): - """ - Appends to the base transition call to create pure method for use by its - scanner - - Args: - transition_call: the transition being passed into the default process - - Returns: - this JaxProcess instance for chaining - """ - super().transition(transition_call) - self._process_scan_method = self._make_scanner() - return self - - def scan(self, save_state=True, scan_length=None, **kwargs): - """ - There a quite a few ways to initialize the scan method for the - jaxProcess. To start the straight forward arguments is "save_state". - The save_state flag is simply there to note if the state - of the model should reflect the final state of the model after the scan - is complete. - - This scan method can also watch and report intermediate compartment - values defined through calling the JaxProcess.watch() method watching a - compartment means at the end of each process cycle record the value of - the compartment and then at the end a tuple of concatenated values will - be returned that correspond to each compartment the process is watching. - - Where there are options for the arguments is when defining the keyword - arguments for the process. The process will do its best to broadcast all - the inputs to the largest size, so they can be scanned over. This means - that is one is a (2, 3) and the other is a constant, it will broadcast - constant to a (2, 3). This does mean that every keyword value that is - passed to a method in the process will be the same size. This is a - limitation of the jax scanner as all the values have to be concatenated - into a single jax array to be passed into the scanner. The accepted - types for arguments, are lists, tuples, numpy arrays, jax arrays, ints, - and floats. If all the keyword arguments are passed as ints or floats - the scan_length flag must be set so the scanner knows how many - iterations to run. If any of the arguments are iterable it will - automatically assume that the leading axis is the number of iterations - to run. - - - Args: - save_state: A boolean flag to indicate if the model state should be saved - - scan_length: a value to be used to denote the number of iterations of the scanner if all keyword - arguments are passed as ints or floats - - **kwargs: the required keyword arguments for the process to run - - Returns: the final state of the model, the stacked output of the scan method - - """ - arg_order = list(self.get_required_args()) - - args = [] - max_axis = 1 - max_next_axis = 0 - - for kwarg in arg_order: - if kwarg not in kwargs.keys(): - warn("Missing kwarg in Process", self.name) - return - - kval = kwargs.get(kwarg, None) - if isinstance(kval, (float, int, list, tuple)): - val = jnp.array(kval) - else: - val = kval - - max_axis = max(max_axis, len(val.shape)) - if max_axis == len(val.shape): - max_next_axis = max(max_next_axis, val.shape[0]) - args.append(val) - - # Check axis && get max_next_axis - - if max_next_axis == 0: - if scan_length is None: - warn("scan_length must be defined if all keyword arguments are " - "constants") - return - elif scan_length > 0: - max_next_axis = scan_length - else: - warn("scan_length must be greater than 0") - return - - for axis in range(max_axis): - current_axis = max_next_axis - max_next_axis = 0 - new_args = [] - for a in args: - if len(a.shape) >= axis + 1: - if a.shape[axis] == current_axis: - new_args.append(a) - else: - warn("Keyword arguments must all be able to be " - "broadcasted to the largest shape") - return - else: - new_args.append(jnp.zeros(list(a.shape) + [current_axis], - dtype=a.dtype) + a.reshape( - *a.shape, 1)) - - if len(a.shape) > axis + 1: - max_next_axis = max(max_next_axis, a.shape[axis + 1]) - - args = new_args - - args = jnp.array(args).transpose( - [1, 0] + [i for i in range(2, max_axis + 1)]) - state, stacked = _scan(self._process_scan_method, - init=self.get_required_state( - include_special_compartments=True), xs=args) - if save_state: - self.updated_modified_state(state) - return state, stacked diff --git a/ngclearn/utils/masks/__init__.py b/ngclearn/utils/masks/__init__.py new file mode 100644 index 00000000..dd79c3d8 --- /dev/null +++ b/ngclearn/utils/masks/__init__.py @@ -0,0 +1 @@ +from .multiblock2d import MaskCollator diff --git a/ngclearn/utils/masks/multiblock2d.py b/ngclearn/utils/masks/multiblock2d.py index 3588d684..e146b534 100644 --- a/ngclearn/utils/masks/multiblock2d.py +++ b/ngclearn/utils/masks/multiblock2d.py @@ -1,163 +1,159 @@ # %% - -# Adapted from meta jepa - import math import numpy as np from multiprocessing import Value -class MaskCollator(object): +class MaskCollator(object): # Adapted from the Meta JEPA code-base to ngc-learn compliance + """ + A mechanism for generating/creating patch masks, generally for self-supervised learning. - def __init__( - self, - cfgs_mask, - crop_size=(224, 224), - patch_size=(16, 16), - ): - super(MaskCollator, self).__init__() + Args: + cfgs_mask: configuration masks to apply - self.mask_generators = [] - for m in cfgs_mask: - mask_generator = _MaskGenerator( - crop_size=crop_size, - patch_size=patch_size, - pred_mask_scale=m.get('spatial_scale'), - aspect_ratio=m.get('aspect_ratio'), - npred=m.get('num_blocks'), - max_keep=m.get('max_keep', None), - ) - self.mask_generators.append(mask_generator) + crop_size: dimensions of crop - def step(self): - for mask_generator in self.mask_generators: - mask_generator.step() + patch_size: dimensions of patches to create + """ - def __call__(self, batch): + def __init__(self, cfgs_mask, crop_size=(224, 224), patch_size=(16, 16),): + super(MaskCollator, self).__init__() - batch_size = len(batch) + self.mask_generators = [] + for m in cfgs_mask: + mask_generator = _MaskGenerator( + crop_size=crop_size, + patch_size=patch_size, + pred_mask_scale=m.get('spatial_scale'), + aspect_ratio=m.get('aspect_ratio'), + npred=m.get('num_blocks'), + max_keep=m.get('max_keep', None), + ) + self.mask_generators.append(mask_generator) - collated_masks_pred, collated_masks_enc = [], [] - for i, mask_generator in enumerate(self.mask_generators): - masks_enc, masks_pred = mask_generator(batch_size) - collated_masks_enc.append(masks_enc) - collated_masks_pred.append(masks_pred) + def step(self): + """ + Steps this generator forward one step. - return collated_masks_enc, collated_masks_pred + Returns: + next set of collated encoder masks, next set of predictor masks + """ + for mask_generator in self.mask_generators: + mask_generator.step() + def __call__(self, batch): + batch_size = len(batch) + collated_masks_pred, collated_masks_enc = [], [] + for i, mask_generator in enumerate(self.mask_generators): + masks_enc, masks_pred = mask_generator(batch_size) + collated_masks_enc.append(masks_enc) + collated_masks_pred.append(masks_pred) -class _MaskGenerator(object): + return collated_masks_enc, collated_masks_pred - def __init__( - self, - crop_size=(224, 224), - patch_size=(16, 16), - pred_mask_scale=(0.2, 0.8), - aspect_ratio=(0.3, 3.0), - npred=1, - max_keep=None, - ): - super(_MaskGenerator, self).__init__() - if not isinstance(crop_size, tuple): - crop_size = (crop_size, ) * 2 - self.crop_size = crop_size - self.height, self.width = crop_size[0] // patch_size[0], crop_size[1] // patch_size[1] - - self.patch_size = patch_size - self.aspect_ratio = aspect_ratio - self.pred_mask_scale = pred_mask_scale - self.npred = npred - self.max_keep = max_keep - self._itr_counter = Value('i', -1) # collator is shared across worker processes - - def step(self): - i = self._itr_counter - with i.get_lock(): - i.value = (i.value + 1) % 2**16 - v = i.value - return v - - def _sample_block_size( - self, - rng: np.random.RandomState, - scale, - aspect_ratio_scale - ): - # -- Sample spatial block mask scale - _rand = rng.random() - min_s, max_s = scale - spatial_mask_scale = min_s + _rand * (max_s - min_s) - spatial_num_keep = int(self.height * self.width * spatial_mask_scale) - - # -- Sample block aspect-ratio - _rand = rng.random() - min_ar, max_ar = aspect_ratio_scale - aspect_ratio = min_ar + _rand * (max_ar - min_ar) - - # -- Compute block height and width (given scale and aspect-ratio) - h = int(round(math.sqrt(spatial_num_keep * aspect_ratio))) - w = int(round(math.sqrt(spatial_num_keep / aspect_ratio))) - h = min(h, self.height) - w = min(w, self.width) - - return (h, w) - - def _sample_block_mask(self, b_size, rng: np.random.RandomState): - h, w = b_size - top = rng.randint(0, self.height - h + 1) - left = rng.randint(0, self.width - w + 1) - - mask = np.ones((self.height, self.width), dtype=np.int32) - mask[top:top+h, left:left+w] = 0 - - return mask - - def __call__(self, batch_size): - """ - Create encoder and predictor masks when collating imgs into a batch - # 1. sample pred block size using seed - # 2. sample several pred block locations for each image (w/o seed) - # 3. return pred masks and complement (enc mask) - """ - seed = self.step() - rng = np.random.RandomState(seed) - p_size = self._sample_block_size( - rng=rng, - scale=self.pred_mask_scale, - aspect_ratio_scale=self.aspect_ratio, - ) - - collated_masks_pred, collated_masks_enc = [], [] - min_keep_enc = min_keep_pred = self.height * self.width - for _ in range(batch_size): - - empty_context = True - while empty_context: - # Create a mask for this sample - mask_e = np.ones((self.height, self.width), dtype=np.int32) - for _ in range(self.npred): - mask_e *= self._sample_block_mask(p_size, rng) - mask_e = mask_e.flatten() - mask_p = np.where(mask_e == 0)[0] - mask_e = np.where(mask_e != 0)[0] +class _MaskGenerator(object): - empty_context = len(mask_e) == 0 - if not empty_context: - min_keep_pred = min(min_keep_pred, len(mask_p)) - min_keep_enc = min(min_keep_enc, len(mask_e)) - collated_masks_pred.append(mask_p) - collated_masks_enc.append(mask_e) + def __init__( + self,crop_size=(224, 224), patch_size=(16, 16), pred_mask_scale=(0.2, 0.8), aspect_ratio=(0.3, 3.0), + npred=1,max_keep=None + ): + super(_MaskGenerator, self).__init__() + if not isinstance(crop_size, tuple): + crop_size = (crop_size, ) * 2 + self.crop_size = crop_size + self.height, self.width = crop_size[0] // patch_size[0], crop_size[1] // patch_size[1] + + self.patch_size = patch_size + self.aspect_ratio = aspect_ratio + self.pred_mask_scale = pred_mask_scale + self.npred = npred + self.max_keep = max_keep + self._itr_counter = Value('i', -1) # collator is shared across worker processes + + def step(self): + i = self._itr_counter + with i.get_lock(): + i.value = (i.value + 1) % 2**16 + v = i.value + return v + + def _sample_block_size(self,rng: np.random.RandomState,scale, aspect_ratio_scale): + # -- Sample spatial block mask scale + _rand = rng.random() + min_s, max_s = scale + spatial_mask_scale = min_s + _rand * (max_s - min_s) + spatial_num_keep = int(self.height * self.width * spatial_mask_scale) + + # -- Sample block aspect-ratio + _rand = rng.random() + min_ar, max_ar = aspect_ratio_scale + aspect_ratio = min_ar + _rand * (max_ar - min_ar) + + # -- Compute block height and width (given scale and aspect-ratio) + h = int(round(math.sqrt(spatial_num_keep * aspect_ratio))) + w = int(round(math.sqrt(spatial_num_keep / aspect_ratio))) + h = min(h, self.height) + w = min(w, self.width) + + return (h, w) + + def _sample_block_mask(self, b_size, rng: np.random.RandomState): + h, w = b_size + top = rng.randint(0, self.height - h + 1) + left = rng.randint(0, self.width - w + 1) + + mask = np.ones((self.height, self.width), dtype=np.int32) + mask[top:top+h, left:left+w] = 0 + + return mask + + def __call__(self, batch_size): + """ + Create encoder and predictor masks when collating imgs into a batch: + + | # 1. sample pred block size using seed + | # 2. sample several pred block locations for each image (w/o seed) + | # 3. return pred masks and complement (enc mask) + + Args: + batch_size: number of samples to place w/in a generate batch + + Returns: + collated encoder masks, collated predictor masks + """ + seed = self.step() + rng = np.random.RandomState(seed) + p_size = self._sample_block_size(rng=rng, scale=self.pred_mask_scale, aspect_ratio_scale=self.aspect_ratio,) + + collated_masks_pred, collated_masks_enc = [], [] + min_keep_enc = min_keep_pred = self.height * self.width + for _ in range(batch_size): + empty_context = True + while empty_context: + # Create a mask for this sample + mask_e = np.ones((self.height, self.width), dtype=np.int32) + for _ in range(self.npred): + mask_e *= self._sample_block_mask(p_size, rng) + mask_e = mask_e.flatten() - if self.max_keep is not None: - min_keep_enc = min(min_keep_enc, self.max_keep) + mask_p = np.where(mask_e == 0)[0] + mask_e = np.where(mask_e != 0)[0] - # Truncate arrays to the minimum length to create uniform arrays - collated_masks_pred = [cm[:min_keep_pred] for cm in collated_masks_pred] - collated_masks_pred = np.array(collated_masks_pred) + empty_context = len(mask_e) == 0 + if not empty_context: + min_keep_pred = min(min_keep_pred, len(mask_p)) + min_keep_enc = min(min_keep_enc, len(mask_e)) + collated_masks_pred.append(mask_p) + collated_masks_enc.append(mask_e) - collated_masks_enc = [cm[:min_keep_enc] for cm in collated_masks_enc] - collated_masks_enc = np.array(collated_masks_enc) + if self.max_keep is not None: + min_keep_enc = min(min_keep_enc, self.max_keep) - return collated_masks_enc, collated_masks_pred + # Truncate arrays to the minimum length to create uniform arrays + collated_masks_pred = [cm[:min_keep_pred] for cm in collated_masks_pred] + collated_masks_pred = np.array(collated_masks_pred) + collated_masks_enc = [cm[:min_keep_enc] for cm in collated_masks_enc] + collated_masks_enc = np.array(collated_masks_enc) + return collated_masks_enc, collated_masks_pred diff --git a/ngclearn/utils/metric_utils.py b/ngclearn/utils/metric_utils.py index 0ab3a078..e5a61eb4 100755 --- a/ngclearn/utils/metric_utils.py +++ b/ngclearn/utils/metric_utils.py @@ -1,6 +1,6 @@ """ -Metric and measurement routines and co-routines. These functions are useful -for model-level/simulation analysis as well as experimental inspection and probing. +Metric and measurement routines and co-routines. These functions are useful for model-level/simulation analysis as well +as experimental inspection and probing (many of these are neuroscience-oriented measurement functions). """ from jax import numpy as jnp, jit from functools import partial @@ -26,7 +26,7 @@ def measure_fanoFactor(spikes, preserve_batch=False): mu = jnp.mean(spikes, axis=0, keepdims=True) sigSqr = jnp.square(jnp.std(spikes, axis=0, keepdims=True)) fano = sigSqr/mu - if preserve_batch is False: + if not preserve_batch: fano = jnp.mean(fano) return fano @@ -49,7 +49,7 @@ def measure_firingRate(spikes, preserve_batch=False): counts = jnp.sum(spikes, axis=0, keepdims=True) T = spikes.shape[0] * 1. fireRates = counts/T - if preserve_batch is False: + if not preserve_batch: fireRates = jnp.mean(fireRates) return fireRates @@ -78,7 +78,7 @@ def measure_breadth_TC(spikes, preserve_batch=False): sigSqr = jnp.square(jnp.std(spikes, axis=0, keepdims=True)) C = sigSqr/mu BTC = 1./(1 + jnp.square(C)) - if preserve_batch is False: + if not preserve_batch: BTC = jnp.mean(BTC) return BTC @@ -104,24 +104,24 @@ def measure_sparsity(codes, tolerance=0.): #@partial(jit, static_argnums=[2]) def analyze_scores(mu, y, extract_label_indx=True): ## examines classifcation statistics """ - Analyzes a set of prediction matrix and target/ground-truth matrix or vector. + Analyzes a set of prediction matrix and target/ground-truth matrix or vector. - Args: - mu: prediction (design) matrix; shape is (N x C) where C is number of classes - and N is the number of patterns examined + Args: + mu: prediction (design) matrix; shape is (N x C) where C is number of classes + and N is the number of patterns examined - y: target / ground-truth (design) matrix; shape is (N x C) OR an array - of class integers of length N (with "extract_label_indx = True") + y: target / ground-truth (design) matrix; shape is (N x C) OR an array + of class integers of length N (with "extract_label_indx = True") - extract_label_indx: run an argmax to pull class integer indices from - "y", assuming y is a one-hot binary encoding matrix (Default: True), - otherwise, this assumes "y" is an array of class integer indices - of length N + extract_label_indx: run an argmax to pull class integer indices from + "y", assuming y is a one-hot binary encoding matrix (Default: True), + otherwise, this assumes "y" is an array of class integer indices + of length N - Returns: - confusion matrix, precision, recall, misses (empty predictions/all-zero rows), - accuracy, adjusted-accuracy (counts all misses as incorrect) - """ + Returns: + confusion matrix, precision, recall, misses (empty predictions/all-zero rows), + accuracy, adjusted-accuracy (counts all misses as incorrect) + """ miss_mask = (jnp.sum(mu, axis=1) == 0.) * 1. misses = jnp.sum(miss_mask) ## how many misses? labels = y @@ -167,13 +167,46 @@ def measure_ACC(mu, y, extract_label_indx=True): ## measures/calculates accuracy acc = jnp.sum( jnp.equal(guess, lab) )/(y.shape[0] * 1.) return acc +@partial(jit, static_argnums=[3]) +def measure_BIC(X, n_model_params, max_model_score, is_log=True): + """ + Measures the Bayesian information criterion (BIC) with respect to the final + score obtained by the model on a given dataset. + + | BIC = -2 ln(L) + K * ln(N); + | where N is number of data-points/rows of design matrix X, + | K is total number parameters of the model of interest, and + | L is the max/best-found value of a likelihood-like score L of the model + + Args: + X: dataset/design matrix that a model was fit to (max-likelihood optimized) + + n_model_params: total number of model parameters (int) + + max_model_score: max likelihood-like score obtained by model on X + + is_log: is supplied `max_model_score` a log-likelihood? if this is False, + this metric will apply a natural logarithm of the score (Default: True) + + Returns: + scalar for the Bayesian information criterion score + """ + ## BIC = K * ln(N) - 2 ln(L) + L_hat = max_model_score ## model's likelihood-like score (at max point) + K = n_model_params ## number of model params + N = X.shape[0] ## number of data-points + if not is_log: + L_hat = jnp.log(L_hat) ## get log likelihood + bic = -L_hat * 2. + jnp.log(N * 1.) * K + return bic + @partial(jit, static_argnums=[2]) def measure_KLD(p_xHat, p_x, preserve_batch=False): """ - Measures the (raw) Kullback-Leibler divergence (KLD), assuming that the two - input arguments contain valid probability distributions (in each row, if - they are matrices). Note: If batch is preserved, this returns a column - vector where each row is the KLD(x_pred, x_true) for that row's datapoint. + Measures the (raw) Kullback-Leibler divergence (KLD), assuming that the two input arguments contain valid + probability distributions (in each row, if they are matrices). Note: If batch is preserved, this returns a column + vector where each row is the KLD(x_pred, x_true) for that row's datapoint. (Further note that this function + does not assume any particular distribution when calculating KLD) | Formula: | KLD(p_xHat, p_x) = (1/N) [ sum_i(p_x * jnp.log(p_x)) - sum_i(p_x * jnp.log(p_xHat)) ] @@ -198,17 +231,62 @@ def measure_KLD(p_xHat, p_x, preserve_batch=False): N = p_x.shape[1] term1 = jnp.sum(_p_x * jnp.log(_p_x), axis=1, keepdims=True) # * (1/N) term2 = -jnp.sum(_p_x * jnp.log(_p_xHat), axis=1, keepdims=True) # * (1/N) - kld = (term1 + term2) * (1/N) - if preserve_batch is False: + kld = (term1 + term2) * (1/N) ## KLD-per-datapoint + if not preserve_batch: kld = jnp.mean(kld) return kld +def measure_gaussian_KLD(mu1, Sigma1, mu2, Sigma2, use_chol_prec=True): + """ + Calculates the Kullback-Leibler (KL) divergence between two multivariate Gaussian distributions, i.e., + KL(N(mu1, Sigma1) || N(mu2, Sigma2)). + Formally, this means this routine calculates: + + | KL(N1 || N2) = [log(det(Sigma2)/det(Sigma1)) + trace(Prec2 * Sigma1) + (z * Prec2 * z) - D] * (1/2) + | where N1 is the 1st Gaussian, i.e., N(mu1,Sigma1), and N2 is the 2nd Gaussian, i.e., N(mu2,Sigma2); + | and where: Prec2 = (Sigma2)^{-1}, z = mu2 - mu1, and D is the data dimensionality + + Args: + mu1: mean vector of first Gaussian distribution + + Sigma1: covariance matrix of first Gaussian distribution + + mu2: mean vector of second Gaussian distribution + + Sigma2: covariance matrix of second Gaussian distribution + + use_chol_prec: should this routine use Cholesky-factor computation of the precision of Sigma2 (Default: True) + + Returns: + scalar representing KL-divergence between N(mu1, Sigma1) and N(mu2, Sigma2) + """ + D = mu1.shape[1] ## dimensionality of data + ## log(|Sigma2|/|Sigma1|) = log(|Sigma2|) - log(|Sigma1|) + sgn_s1, val_s1 = jnp.linalg.slogdet(Sigma1) + log_detSigma1 = val_s1 * sgn_s1 + sgn_s2, val_s2 = jnp.linalg.slogdet(Sigma2) + log_detSigma2 = val_s2 * sgn_s2 + + if use_chol_prec: ## use Cholesky-factor calc of (Sigma2)^{-1} + C = jnp.linalg.cholesky(Sigma2) ## cholesky factor matrix + inv_C = jnp.linalg.pinv(C) + Prec2 = jnp.matmul(inv_C.T, inv_C) + else: + Prec2 = jnp.linalg.pinv(Sigma2) ## pseudo-inverse calc of (Sigma2)^{-1} + + trace_term = jnp.trace(jnp.dot(Prec2, Sigma1)) ## trace term of KL divergence + delta_mu = mu2 - mu1 + quadratic_term = jnp.sum((jnp.matmul(delta_mu, Prec2) * delta_mu), axis=1, keepdims=True) + #quadratic_term = jnp.matmul(jnp.matmul(delta_mu.T, Prec2), delta_mu) ## quadratic term of KL divergence + # calc full KL divergence + kld = ((log_detSigma2 - log_detSigma1) + quadratic_term + trace_term + quadratic_term - D) * 0.5 + return kld + @partial(jit, static_argnums=[3]) def measure_CatNLL(p, x, offset=1e-7, preserve_batch=False): """ - Measures the negative Categorical log likelihood (Cat.NLL). Note: If batch is - preserved, this returns a column vector where each row is the - Cat.NLL(p, x) for that row's datapoint. + Measures the negative Categorical log likelihood (Cat.NLL). Note: If batch is preserved, this returns a column + vector where each row is the Cat.NLL(p, x) for that row's datapoint. Args: p: predicted probabilities; (N x C matrix, where C is number of categories) @@ -225,17 +303,36 @@ def measure_CatNLL(p, x, offset=1e-7, preserve_batch=False): """ p_ = jnp.clip(p, offset, 1.0 - offset) loss = -(x * jnp.log(p_)) - nll = jnp.sum(loss, axis=1, keepdims=True) #/(y_true.shape[0] * 1.0) - if preserve_batch is False: + nll = jnp.sum(loss, axis=1, keepdims=True) #/(y_true.shape[0] * 1.0) ## CatNLL-per-datapoint + if not preserve_batch: nll = jnp.mean(nll) return nll #tf.reduce_mean(nll) +@jit +def measure_RMSE(mu, x, preserve_batch=False): + """ + Measures root mean squared error (RMSE). Note: If batch is preserved, this returns a column vector where each + row is the MSE(mu, x) for that row's datapoint. (THis is a simple wrapper/extension of the in-built MSE.) + + Args: + mu: predicted values (mean); (N x D matrix) + + x: target values (data); (N x D matrix) + + preserve_batch: if True, will return one score per sample in batch + (Default: False), otherwise, returns scalar mean score + + Returns: + an (N x 1) column vector (if preserve_batch=True) OR (1,1) scalar otherwise + """ + mse = measure_MSE(mu, x, preserve_batch=preserve_batch) + return jnp.sqrt(mse) ## sqrt(MSE) is the root-mean-squared-error + @jit def measure_MSE(mu, x, preserve_batch=False): """ - Measures mean squared error (MSE), or the negative Gaussian log likelihood - with variance of 1.0. Note: If batch is preserved, this returns a column - vector where each row is the MSE(mu, x) for that row's datapoint. + Measures mean squared error (MSE), or the negative Gaussian log likelihood with variance of 1.0. Note: If batch + is preserved, this returns a column vector where each row is the MSE(mu, x) for that row's datapoint. Args: mu: predicted values (mean); (N x D matrix) @@ -250,17 +347,40 @@ def measure_MSE(mu, x, preserve_batch=False): """ diff = mu - x se = jnp.square(diff) ## squared error - mse = jnp.sum(se, axis=1, keepdims=True) # technically se at this point - if preserve_batch is False: + mse = jnp.sum(se, axis=1, keepdims=True) ## technically squared-error per data-point + if not preserve_batch: mse = jnp.mean(mse) # this is proper mse return mse +@jit +def measure_MAE(shift, x, preserve_batch=False): + """ + Measures mean absolute error (MAE), or the negative Laplacian log likelihood with scale of 1.0. Note: If batch + is preserved, this returns a column vector where each row is the MSE(mu, x) for that row's datapoint. + + Args: + shift: predicted values (mean); (N x D matrix) + + x: target values (data); (N x D matrix) + + preserve_batch: if True, will return one score per sample in batch + (Default: False), otherwise, returns scalar mean score + + Returns: + an (N x 1) column vector (if preserve_batch=True) OR (1,1) scalar otherwise + """ + diff = shift - x + se = jnp.abs(diff) ## squared error + mae = jnp.sum(se, axis=1, keepdims=True) ## technically abs-error per data-point + if not preserve_batch: + mae = jnp.mean(mae) # this is proper mae + return mae + @jit def measure_BCE(p, x, offset=1e-7, preserve_batch=False): #1e-10 """ - Calculates the negative Bernoulli log likelihood or binary cross entropy (BCE). - Note: If batch is preserved, this returns a column vector where each row is - the BCE(p, x) for that row's datapoint. + Calculates the negative Bernoulli log likelihood or binary cross entropy (BCE). Note: If batch is preserved, + this returns a column vector where each row is the BCE(p, x) for that row's datapoint. Args: p: predicted probabilities of shape; (N x D matrix) @@ -276,7 +396,7 @@ def measure_BCE(p, x, offset=1e-7, preserve_batch=False): #1e-10 an (N x 1) column vector (if preserve_batch=True) OR (1,1) scalar otherwise """ p_ = jnp.clip(p, offset, 1 - offset) - bce = -jnp.sum(x * jnp.log(p_) + (1.0 - x) * jnp.log(1.0 - p_),axis=1, keepdims=True) - if preserve_batch is False: + bce = -jnp.sum(x * jnp.log(p_) + (1.0 - x) * jnp.log(1.0 - p_),axis=1, keepdims=True) ## BCE-per-datapoint + if not preserve_batch: bce = jnp.mean(bce) return bce diff --git a/ngclearn/utils/model_utils.py b/ngclearn/utils/model_utils.py index facad87e..0ba13ece 100755 --- a/ngclearn/utils/model_utils.py +++ b/ngclearn/utils/model_utils.py @@ -6,7 +6,6 @@ import jax from jax import numpy as jnp, grad, jit, vmap, random, lax, nn from jax.lax import scan as _scan -from ngcsimlib.utils import Get_Compartment_Batch, Set_Compartment_Batch, get_current_context import os, sys from functools import partial import numpy as np @@ -299,8 +298,14 @@ def d_relu(x): @jit def telu(x): """ - Proposed by Fernandez and Mali 24, https://arxiv.org/abs/2412.20269 and https://arxiv.org/abs/2402.02790 - TeLU activation: f(x) = x * tanh(e^x) + The hyperbolic tangent exponential linear (TeLU) function: + + | f(x) = x * tanh(e^x) + + This was proposed by Fernandez and Mali 24 in: + + | https://arxiv.org/abs/2412.20269 and in, + | https://arxiv.org/abs/2402.02790 Args: x: input (tensor) value @@ -313,8 +318,10 @@ def telu(x): @jit def d_telu(x): """ - - Derivative of TeLU: f'(x) = tanh(e^x) + x * e^x * (1 - tanh^2(e^x)) + Derivative of the hyperbolic tangent exponential linear (TeLU) function. + Effectively, this is formally: + + | f'(x) = tanh(e^x) + x * e^x * (1 - tanh^2(e^x)) Args: x: input (tensor) value @@ -719,39 +726,39 @@ def d_clip(x, min_val, max_val): return jnp.where((x < min_val) | (x > max_val), 0.0, 1.0) -def scanner(fn): - """ - A wrapper for Jax's scanner that handles the "getting" of the current - state and "setting" of the final state to and from the model. - - | @scanner - | def process(current_state, args): - | t = args[0] - | dt = args[1] - | current_state = model.advance_state(current_state, t, dt) - | current_state = model.evolve(current_state, t, dt) - | return current_state, (current_state[COMPONENT.COMPARTMENT.path], ...) - | - | outputs = models.process(jnp.array([[ARG0, ARG1] for i in range(NUM_LOOPS)])) - - | Notes on the scanner function call: - | 1) `current_state` is a hash-map mapped to all compartment values by path - | 2) `args` is the external arguments defined in the passed Jax array - | 3) `outputs` is a tuple containing time-concatenated Jax arrays of the - | compartment statistics you want tracked - - Args: - fn: function that is executed at every time step of a Jax-unrolled loop, - it must take in the current state and external arguments - - Returns: - wrapped (fast) function that is Jax-scanned/jit-i-fied - """ - def _scanned(_xs): - vals, stacked = _scan(fn, init=Get_Compartment_Batch(), xs=_xs) - Set_Compartment_Batch(vals) - return stacked - - if get_current_context() is not None: - get_current_context().__setattr__(fn.__name__, _scanned) - return _scanned +# def scanner(fn): +# """ +# A wrapper for Jax's scanner that handles the "getting" of the current +# state and "setting" of the final state to and from the model. +# +# | @scanner +# | def process(current_state, args): +# | t = args[0] +# | dt = args[1] +# | current_state = model.advance_state(current_state, t, dt) +# | current_state = model.evolve(current_state, t, dt) +# | return current_state, (current_state[COMPONENT.COMPARTMENT.path], ...) +# | +# | outputs = models.process(jnp.array([[ARG0, ARG1] for i in range(NUM_LOOPS)])) +# +# | Notes on the scanner function call: +# | 1) `current_state` is a hash-map mapped to all compartment values by path +# | 2) `args` is the external arguments defined in the passed Jax array +# | 3) `outputs` is a tuple containing time-concatenated Jax arrays of the +# | compartment statistics you want tracked +# +# Args: +# fn: function that is executed at every time step of a Jax-unrolled loop, +# it must take in the current state and external arguments +# +# Returns: +# wrapped (fast) function that is Jax-scanned/jit-i-fied +# """ +# def _scanned(_xs): +# vals, stacked = _scan(fn, init=Get_Compartment_Batch(), xs=_xs) +# Set_Compartment_Batch(vals) +# return stacked +# +# if get_current_context() is not None: +# get_current_context().__setattr__(fn.__name__, _scanned) +# return _scanned diff --git a/ngclearn/utils/optim/adam.py b/ngclearn/utils/optim/adam.py index 12b1d756..4fb5c87a 100644 --- a/ngclearn/utils/optim/adam.py +++ b/ngclearn/utils/optim/adam.py @@ -1,16 +1,11 @@ # %% -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.resolver import resolver - import numpy as np from jax import jit, numpy as jnp, random, nn, lax from functools import partial -import time -def step_update(param, update, g1, g2, lr, beta1, beta2, time, eps): +def step_update(param, update, g1, g2, eta, beta1, beta2, time_step, eps): """ Runs one step of Adam over a set of parameters given updates. The dynamics for any set of parameters is as follows: @@ -33,24 +28,24 @@ def step_update(param, update, g1, g2, lr, beta1, beta2, time, eps): g2: second moment factor/correction factor to use in parameter update (must be same shape as "update") - lr: global step size value to be applied to updates to parameters + eta: global step size value to be applied to updates to parameters beta1: 1st moment control factor beta2: 2nd moment control factor - time: current time t or iteration step/call to this Adam update + time_step: current time t or iteration step/call to this Adam update eps: numberical stability coefficient (for calculating final update) Returns: - adjusted parameter tensor (same shape as "param") + adjusted parameter tensor (same shape as "param"), adjusted g1, adjusted g2 """ _g1 = beta1 * g1 + (1. - beta1) * update _g2 = beta2 * g2 + (1. - beta2) * jnp.square(update) - g1_unb = _g1 / (1. - jnp.power(beta1, time)) - g2_unb = _g2 / (1. - jnp.power(beta2, time)) - _param = param - lr * g1_unb/(jnp.sqrt(g2_unb) + eps) + g1_unb = _g1 / (1. - jnp.power(beta1, time_step)) + g2_unb = _g2 / (1. - jnp.power(beta2, time_step)) + _param = param - eta * g1_unb/(jnp.sqrt(g2_unb) + eps) return _param, _g1, _g2 @jit @@ -83,9 +78,7 @@ def adam_step(opt_params, theta, updates, eta=0.001, beta1=0.9, beta2=0.999, eps new_g1 = [] new_g2 = [] for i in range(len(theta)): - px_i, g1_i, g2_i = step_update(theta[i], updates[i], g1[i], - g2[i], eta, beta1, - beta2, time_step, eps) + px_i, g1_i, g2_i = step_update(theta[i], updates[i], g1[i], g2[i], eta, beta1, beta2, time_step, eps) new_theta.append(px_i) new_g1.append(g1_i) new_g2.append(g2_i) diff --git a/ngclearn/utils/optim/nag.py b/ngclearn/utils/optim/nag.py new file mode 100644 index 00000000..045be116 --- /dev/null +++ b/ngclearn/utils/optim/nag.py @@ -0,0 +1,84 @@ +# %% + +import numpy as np +from jax import jit, numpy as jnp, random, nn, lax +from functools import partial +import time + + +def step_update(param, update, phi_old, eta, mu, time_step): + """ + Runs one step of Nesterov's accelerated gradient (NAG) over a set of parameters given updates. + The dynamics for any set of parameters is as follows: + + | phi = param - update * lr + | param = phi + (phi - phi_previous) * mu, where mu = 0 iff t <= 1 (first iteration) + + Args: + param: parameter tensor to change/adjust + + update: update tensor to be applied to parameter tensor (must be same + shape as "param") + + phi_old: previous friction/momentum parameter + + eta: global step size value to be applied to updates to parameters + + mu: friction/momentum control factor + + time_step: current time t or iteration step/call to this NAG update + + Returns: + adjusted parameter tensor (same shape as "param"), adjusted momentum/friction variable + """ + phi = param - update * eta ## do a phantom gradient adjustment step + _param = phi + (phi - phi_old) * (mu * (time_step > 1.)) ## NAG-step + _phi_old = phi + return _param, _phi_old + +@jit +def nag_step(opt_params, theta, updates, eta=0.01, mu=0.9): ## apply adjustment to theta + """ + Implements Nesterov's accelerated gradient (NAG) algorithm as a decoupled update rule given adjustments produced + by a credit assignment algorithm/process. + + Args: + opt_params: (ArrayLike) parameters of the optimization algorithm + + theta: (ArrayLike) the weights of neural network + + updates: (ArrayLike) the updates of neural network + + eta: (float, optional) step size coefficient for NAG update (Default: 0.001) + + mu: (float, optional) friction/momentum control factor. (Default: 0.9) + + Returns: + ArrayLike: opt_params. New opt params, ArrayLike: theta. The updated weights + """ + phi, time_step = opt_params + time_step = time_step + 1 + new_theta = [] + new_phi = [] + for i in range(len(theta)): + px_i, phi_i = step_update(theta[i], updates[i], phi[i], eta, mu, time_step) + new_theta.append(px_i) + new_phi.append(phi_i) + return (new_phi, time_step), new_theta + +@jit +def nag_init(theta): + time_step = jnp.asarray(0.0) + phi = [jnp.zeros(theta[i].shape) for i in range(len(theta))] + return phi, time_step + +if __name__ == '__main__': + weights = [jnp.asarray([3.0, 3.0]), jnp.asarray([3.0, 3.0])] + updates = [jnp.asarray([3.0, 3.0]), jnp.asarray([3.0, 3.0])] + opt_params = nag_init(weights) + opt_params, theta = nag_step(opt_params, weights, updates) + print(f"opt_params: {opt_params}, theta: {theta}") + weights = theta + print("##################") + opt_params, theta = nag_step(opt_params, weights, updates) + print(f"opt_params: {opt_params}, theta: {theta}") diff --git a/ngclearn/utils/optim/optim_utils.py b/ngclearn/utils/optim/optim_utils.py index f02de676..e521c07b 100755 --- a/ngclearn/utils/optim/optim_utils.py +++ b/ngclearn/utils/optim/optim_utils.py @@ -1,17 +1,20 @@ import functools from .sgd import sgd_step, sgd_init +from .nag import nag_step, nag_init from .adam import adam_step, adam_init def get_opt_init_fn(opt='adam'): return { 'adam': adam_init, + 'nag': nag_init, 'sgd': sgd_init }[opt] def get_opt_step_fn(opt='adam', **kwargs): - # **kwargs here is the hyper parameters you want to pass in the optimization function + ## **kwargs here is the hyper-parameters you want to pass in the optimization function return { 'adam': functools.partial(adam_step, **kwargs), + 'nag': functools.partial(nag_step, **kwargs), 'sgd': functools.partial(sgd_step, **kwargs), }[opt] diff --git a/ngclearn/utils/optim/sgd.py b/ngclearn/utils/optim/sgd.py index 68594d4a..dfde125c 100755 --- a/ngclearn/utils/optim/sgd.py +++ b/ngclearn/utils/optim/sgd.py @@ -1,30 +1,22 @@ -# %% +from jax import jit, numpy as jnp -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.resolver import resolver - -import numpy as np -from jax import jit, numpy as jnp, random, nn, lax -from functools import partial -import time - -def step_update(param, update, lr): +def step_update(param, update, eta): """ Runs one step of SGD over a set of parameters given updates. Args: - lr: global step size to apply when adjusting parameters + eta: global step size to apply when adjusting parameters Returns: adjusted parameter tensor (same shape as "param") """ - _param = param - lr * update + _param = param - update * eta return _param @jit def sgd_step(opt_params, theta, updates, eta=0.001): ## apply adjustment to theta - """Return a params update + """ + Returns updated parameters in accordance to a stochastic gradient descent (SGD) recipe Args: opt_params: (ArrayLike) parameters of the optimization algorithm @@ -51,7 +43,6 @@ def sgd_step(opt_params, theta, updates, eta=0.001): ## apply adjustment to thet def sgd_init(theta): return jnp.asarray(0.0) - if __name__ == '__main__': opt_params, theta = sgd_step((2.0), [1.0, 1.0], [3.0, 4.0], 3e-2) print(f"opt_params: {opt_params}, theta: {theta}") diff --git a/ngclearn/utils/patch.py b/ngclearn/utils/patch.py new file mode 100644 index 00000000..94ad9af6 --- /dev/null +++ b/ngclearn/utils/patch.py @@ -0,0 +1,101 @@ +from typing import Literal + +from jax import numpy as jnp + +from ngcsimlib.logger import error, warn + + +class PatchGenerator(object): + def __init__(self, + patch_height: int, + patch_width: int, + horizontal_alignment: Literal['left', 'right', 'center', 'fit']=None, + vertical_alignment: Literal['top', 'bottom', 'center', 'fit']=None, + horizontal_stride: int | None = None, + vertical_stride: int | None = None): + self.horizontal_alignment = horizontal_alignment or 'left' + self.horizontal_stride = horizontal_stride or 0 + self.patch_height = patch_height + + self.vertical_alignment = vertical_alignment or 'top' + self.vertical_stride = vertical_stride or 0 + self.patch_width = patch_width + + self.idx_cache = {} + + self._current_height = None + self._current_width = None + + self._max_patch = None + self._current_idx = -1 + self._current_img = None + + def __iter__(self): + if self._current_img is None: + error("Attempting to generate patches but no image has been provided") + + self._current_idx = 0 + return self + + def target(self, img: jnp.ndarray): + height, width = img.shape[:2] + if height == self._current_height and width == self._current_width: + self._current_img = img + return + + if self.patch_height > height or self.patch_width > width: + warn("Image to small for patches to be extracted, aborting") + return + + horizontal_idxs = [] + vertical_idxs = [] + + actual_patch_width = self.patch_width - self.horizontal_stride + if self.horizontal_alignment == 'left': + horizontal_idxs += range(0, width-self.patch_width, actual_patch_width) + elif self.horizontal_alignment == 'right': + horizontal_idxs += [i - self.patch_width for i in range(width, self.patch_width, -actual_patch_width)] + elif self.horizontal_alignment == 'center': + centerx = width // 2 + horizontal_idxs += range(centerx, width-self.patch_width, actual_patch_width) + horizontal_idxs += [i - self.patch_width for i in range(centerx, self.patch_width, -actual_patch_width)] + elif self.horizontal_alignment == 'fit': + extra = ((width - self.patch_width) % actual_patch_width) // 2 + horizontal_idxs += range(extra, width - self.patch_width + 1, + actual_patch_width) + else: + pass + + actual_patch_height = self.patch_height - self.vertical_stride + if self.vertical_alignment == 'left': + horizontal_idxs += range(0, height-self.patch_height, actual_patch_height) + elif self.vertical_alignment == 'right': + horizontal_idxs += [i - self.patch_height for i in range(height, self.patch_width, -actual_patch_height)] + elif self.vertical_alignment == 'center': + centery = height // 2 + horizontal_idxs += range(centery, height-self.patch_height, actual_patch_height) + horizontal_idxs += [i - self.patch_width for i in range(centery, self.patch_height, -actual_patch_height)] + elif self.vertical_alignment == 'fit': + extra = ((height - self.patch_height) % actual_patch_height) // 2 + horizontal_idxs += range(extra, height - self.patch_height + 1, + actual_patch_height) + + print(horizontal_idxs) + + img = jnp.zeros((len(horizontal_idxs), width)) + for row, idx in enumerate(horizontal_idxs): + img = img.at[row, idx:idx + self.patch_width].set( + img[row, idx:idx + self.patch_width] + 50) + + import matplotlib.pyplot as plt + + plt.imshow(img) + plt.show() + + +## testing code +# gen = PatchGenerator(patch_width=5, patch_height=5, horizontal_alignment='center', horizontal_stride=1) +# +# test_img = jnp.zeros((32, 32)) +# +# gen.target(test_img) diff --git a/ngclearn/utils/patch_utils.py b/ngclearn/utils/patch_utils.py index f3116e84..a558e82e 100755 --- a/ngclearn/utils/patch_utils.py +++ b/ngclearn/utils/patch_utils.py @@ -39,17 +39,19 @@ class Create_Patches: Args: img: jax array of size (H, W) - patched: (height_patch, width_patch) - overlap: (height_overlap, width_overlap) - add_frame: increases the img size by (height_patch - height_overlap, width_patch - width_overlap) - create_patches: creates small patches out of the image based on the provided attributes. + patch_shape: (height_patch, width_patch) + + overlap_shape: (height_overlap, width_overlap) Returns: - jnp.array: Array containing the patches - shape: (num_patches, patch_height, patch_width) + jnp.array: Array containing the patches, shape: (num_patches, patch_height, patch_width) """ + #patched: (height_patch, width_patch) + #overlap: (height_overlap, width_overlap) + #add_frame: increases the img size by (height_patch - height_overlap, width_patch - width_overlap) + #create_patches: creates small patches out of the image based on the provided attributes. def __init__(self, img, patch_shape, overlap_shape): self.img = img @@ -90,6 +92,8 @@ def create_patches(self, add_frame=False, center=True): Keyword Args: add_frame: If true the function will add zero frames (increase the dimension) to the image + center: + Returns: jnp.array: Array containing the patches shape: (num_patches, patch_height, patch_width) diff --git a/ngclearn/utils/viz/compartment_plot.py b/ngclearn/utils/viz/compartment_plot.py new file mode 100644 index 00000000..639d813a --- /dev/null +++ b/ngclearn/utils/viz/compartment_plot.py @@ -0,0 +1,38 @@ +""" +Raster visualization functions/utilities. +""" +import matplotlib.pyplot as plt +import jax +from typing import Sequence + +def create_plot(history: jax.Array, ax: plt.Axes | None = None, + indices: Sequence[int] | None = None): + """ + Generates a raster plot of a given (binary) spike train (row dimension + corresponds to the discrete time dimension). + + Args: + history: a numpy binary array of shape (T x number_of_neurons) + + ax: a hook/pointer to a currently external plot that this raster plot + should be made a sub-figure of + + indices: optional indices of neurons (row integer indices) to focus on + plotting + + s: size of the spike scatter points (Default = 0.5) + + c: color of the spike scatter points (Default = black) + + """ + n_count = history.shape[0] + if ax is None: + nc = n_count if indices is None else len(indices) + fig_size = 5 if nc < 25 else int(nc / 5) + plt.figure(figsize=(fig_size, fig_size)) + + _ax = ax if ax is not None else plt + + for k in range(history.shape[1]): + if indices is None or k in indices: + _ax.plot(history[:, k]) \ No newline at end of file diff --git a/ngclearn/utils/viz/compartment_raster.py b/ngclearn/utils/viz/compartment_raster.py new file mode 100755 index 00000000..d66a73eb --- /dev/null +++ b/ngclearn/utils/viz/compartment_raster.py @@ -0,0 +1,49 @@ +""" +Raster visualization functions/utilities. +""" +import matplotlib.pyplot as plt +import jax +from typing import Sequence + +def create_raster_plot(spike_train: jax.Array, ax: plt.Axes | None = None, + indices: Sequence[int] | None = None, s=0.5, c="black"): + """ + Generates a raster plot of a given (binary) spike train (row dimension + corresponds to the discrete time dimension). + + Args: + spike_train: a numpy binary array of shape (T x number_of_neurons) + + ax: a hook/pointer to a currently external plot that this raster plot + should be made a sub-figure of + + indices: optional indices of neurons (row integer indices) to focus on + plotting + + s: size of the spike scatter points (Default = 0.5) + + c: color of the spike scatter points (Default = black) + + """ + step_count = spike_train.shape[0] + n_count = spike_train.shape[1] + if ax is None: + nc = n_count if indices is None else len(indices) + fig_size = 5 if nc < 25 else int(nc / 5) + plt.figure(figsize=(fig_size, fig_size)) + + _ax = ax if ax is not None else plt + + events = [] + for t in range(n_count): + if indices is None or t in indices: + e = spike_train[:, t].nonzero() + events.append(e[0]) + _ax.eventplot(events, linelengths=s, colors=c) + if ax is None: + _ax.yticks(ticks=[i for i in (range(n_count if indices is None else len(indices)))], + labels=["N" + str(i) for i in (range(n_count) if indices is None else indices)]) + _ax.xticks(ticks=[i for i in range(0, step_count+1, max(int(step_count / 5), 1))]) + else: + _ax.set_yticks(ticks=[i for i in (range(n_count if indices is None else len(indices)))], + labels=["N" + str(i) for i in (range(n_count) if indices is None else indices)]) diff --git a/ngclearn/utils/viz/dim_reduce.py b/ngclearn/utils/viz/dim_reduce.py index 4fd8c244..3f32057d 100755 --- a/ngclearn/utils/viz/dim_reduce.py +++ b/ngclearn/utils/viz/dim_reduce.py @@ -3,8 +3,8 @@ default_cmap = plt.cm.jet import numpy as np -from sklearn.decomposition import IncrementalPCA -from sklearn.manifold import TSNE +from sklearn.decomposition import IncrementalPCA ## sci-kit learning dependency +from sklearn.manifold import TSNE ## sci-kit learning dependency def extract_pca_latents(vectors): ## PCA mapping routine """ @@ -20,7 +20,6 @@ def extract_pca_latents(vectors): ## PCA mapping routine """ batch_size = 50 z_dim = vectors.shape[1] - z_2D = None if z_dim != 2: ipca = IncrementalPCA(n_components=2, batch_size=batch_size) ipca.fit(vectors) @@ -31,26 +30,25 @@ def extract_pca_latents(vectors): ## PCA mapping routine def extract_tsne_latents(vectors, perplexity=30, n_pca_comp=32, batch_size=500): ## tSNE mapping routine """ - Projects collection of K vectors (stored in a matrix) to a two-dimensional (2D) - visualization space via the t-distributed stochastic neighbor embedding - algorithm (t-SNE). This algorithm also uses PCA to produce an - intermediate project to speed up the t-SNE final mapping step. Note that - if the input already has a 2D dimensionality, the original input is returned. + Projects collection of K vectors (stored in a matrix) to a two-dimensional (2D) visualization space via the + t-distributed stochastic neighbor embedding algorithm (t-SNE). This algorithm also uses PCA to produce an + intermediate project to speed up the t-SNE final mapping step. Note that if the input already has a 2D + dimensionality, the original input is returned. Args: vectors: a matrix/codebook of (K x D) vectors to project perplexity: the perplexity control factor for t-SNE (Default: 30) - batch_size: number of sampled embedding vectors to use per iteration - of online internal PCA + n_pca_comp: number of PCA top components (sorted by eigen-values) to retain/extract before continuing + with t-SNE dimensionality reduction + + batch_size: number of sampled embedding vectors to use per iteration of online internal PCA Returns: a matrix (K x 2) of projected vectors (to 2D space) """ - #batch_size = 500 #50 z_dim = vectors.shape[1] - z_2D = None if z_dim != 2: print(" > Projecting latents via iPCA...") n_comp = n_pca_comp #32 #10 #16 #50 @@ -69,11 +67,10 @@ def extract_tsne_latents(vectors, perplexity=30, n_pca_comp=32, batch_size=500): z_2D = vectors return z_2D -def plot_latents(code_vectors, labels, plot_fname="2Dcode_plot.jpg", alpha=1., - cmap=None): +def plot_latents(code_vectors, labels, plot_fname="2Dcode_plot.jpg", alpha=1., cmap=None): """ - Produces a label-overlaid (label map to distinct colors) scatterplot for - visualizing two-dimensional latent codes (produced by either PCA or t-SNE). + Produces a label-overlaid (label map to distinct colors) scatterplot for visualizing two-dimensional latent codes + (produced by either PCA or t-SNE). Args: code_vectors: a matrix of shape (K x 2) with vectors to plot/visualize @@ -92,8 +89,7 @@ def plot_latents(code_vectors, labels, plot_fname="2Dcode_plot.jpg", alpha=1., matplotlib.use('Agg') ## temporarily go in Agg plt backend for tsne plotting print(" > Plotting 2D latent encodings...") curr_backend = plt.rcParams["backend"] - matplotlib.use( - 'Agg') ## temporarily go in Agg plt backend for tsne plotting + matplotlib.use('Agg') ## temporarily go in Agg plt backend for tsne plotting lab = labels if lab.shape[1] > 1: ## extract integer class labels from a one-hot matrix lab = np.argmax(lab, 1) diff --git a/ngclearn/utils/weight_distribution.py b/ngclearn/utils/weight_distribution.py deleted file mode 100755 index c3c20893..00000000 --- a/ngclearn/utils/weight_distribution.py +++ /dev/null @@ -1,269 +0,0 @@ -""" -Weight distribution initialization routines and co-routines, including -parameter mapping functions for standard initializers. -""" -import numpy as np -import jax -from jax import numpy as jnp, jit, vmap, lax, nn, random -from ngcsimlib.logger import critical - -################################################################################ -## supported distribution initializer configuration generator routines - -def constant(value, **kwargs): - """ - Produce a configuration for a constant weight distribution initializer. - - Args: - value: magnitude of the weight values (shared across all) - - Returns: - a constant weight initializer configuration - """ - dist_dict = {"dist": "constant", "value": value} - return {**kwargs, **dist_dict} - -def fan_in_gaussian(**kwargs): - """ - Produce a configuration for a fan-in scaled (centered) Gaussian - distribution initializer. - - Returns: - a fan-in scaled Gaussian distribution configuration - """ - dist_dict = {"dist": "fan_in_gaussian"} - return {**kwargs, **dist_dict} - -def gaussian(mu=0., sigma=1., **kwargs): - """ - Produce a configuration for a Gaussian distribution initializer. - - Args: - mu: mean of the weight values (default: 0) - - sigma: standard deviation of the weight values (default: 1) - - Returns: - a Gaussian distribution configuration - """ - assert sigma >= 0. - dist_dict = {"dist": "gaussian", "mu": mu, "sigma": sigma} - return {**kwargs, **dist_dict} - -def uniform(amin=0., amax=1., **kwargs): - """ - Produce a configuration for a uniform distribution initializer. - - Args: - amin: minimum value/bound of weight values (default: 0) - - amax: maximum value/bound of weight values (default: 1) - - Returns: - a uniform distribution configuration - """ - assert amin < amax - dist_dict = {"dist": "uniform", "amin": amin, "amax": amax} - return {**kwargs, **dist_dict} - -def fan_in_uniform(**kwargs): - """ - Produce a configuration for a fan-in scaled unit uniform - distribution initializer. - - Returns: - a fan-in scaled (unit) uniform distribution configuration - """ - dist_dict = {"dist": "fan_in_uniform"} - return {**kwargs, **dist_dict} - -def hollow(scale, **kwargs): - """ - Produce a configuration for a constant hollow distribution initializer. - - Args: - scale: magnitude of all off-diagonal values - - Returns: - a constant hollow distribution configuration - """ - dist_dict = {"dist": "hollow", "scale": scale} - return {**kwargs, **dist_dict} - -def eye(scale, **kwargs): - """ - Produce a configuration for a constant diagonal/eye distribution initializer. - - Args: - scale: magnitude of all (on-)diagonal values - - Returns: - a constant diagonal/eye distribution configuration - """ - dist_dict = {"dist": "eye", "scale": scale} - return {**kwargs, **dist_dict} - -################################################################################ -## initializer co-routine(s) - -def initialize_params(dkey, init_kernel, shape, use_numpy=False): - """ - Creates the intiial condition values for a parameter tensor. - - Args: - dkey: PRNG key to control determinism of this routine - - init_kernel: dictionary specifying the distribution type and its - parameters (default: `uniform` dist w/ `amin=0.02`, `amax=0.8`) -- - note that kernel dictionary may contain "post-processing" arguments - that can be "stacked" on top of the base matrix, for example, you - can pass in a dictionary: - {"dist": "uniform", "hollow": True, "lower_triangle": True} which - will create unit-uniform value matrix with upper triangle and main - diagonal values masked to zero (lower-triangle masking applied after - hollow matrix masking) - - :Note: Currently supported distribution (dist) kernel schemes include: - "constant" (value); - "uniform" (amin, amax); - "gaussian" (mu, sigma); - "fan_in_gaussian" (NO params); - "fan_in_uniform" (NO params); - "hollow" (scale); - "eye" (scale); - while currently supported post-processing keyword arguments include: - "amin" (clip weights values to be >= amin); - "amax" (clip weights values to be <= amin); - "lower_triangle" (extract lower triangle of params, set rest to 0); - "upper_triangle" (extract upper triangle of params, set rest to 0); - "hollow" (zero out values along main diagonal); - "eye" (zero out off-diagonal values); - "n_row_active" (keep only n random rows non-masked/zero); - "n_col_active" (keep only n random columns non-masked/zero) - - shape: tuple containing the dimensions/shape of the tensor to initialize - - use_numpy: if true, conducts weight value initialization/post-processing using - exclusively Numpy, disabling Jax calls (default: False) - - Returns: - output (tensor) value - """ - if dkey is None: - use_numpy = True - - _init_kernel = init_kernel - if _init_kernel is None: ## the "universal default distribution" if None provided - critical("No initialization kernel provided!") - dist_type = _init_kernel.get("dist") - params = None - if dist_type == "hollow": ## scaled hollow-matrix init - diag_scale = _init_kernel.get("scale", 1.) - if use_numpy: - params = (1. - np.eye(N=shape[0], M=shape[1])) * diag_scale - else: - params = (1. - jnp.eye(N=shape[0], M=shape[1])) * diag_scale - elif dist_type == "eye": ## scaled diagonal/eye init - off_diag_scale = _init_kernel.get("scale", 1.) - if use_numpy: - params = np.eye(N=shape[0], M=shape[1]) * off_diag_scale - else: - params = jnp.eye(N=shape[0], M=shape[1]) * off_diag_scale - elif dist_type == "gaussian" or dist_type == "normal": ## normal distrib - mu = _init_kernel.get("mu", 0.) - sigma = _init_kernel.get("sigma", 1.) - if use_numpy: - params = np.random.normal(size=shape) * sigma + mu - else: - params = jax.random.normal(dkey, shape) * sigma + mu - elif dist_type == "uniform": ## uniform distrib - amin = _init_kernel.get("amin", 0.) - amax = _init_kernel.get("amax", 1.) - if use_numpy: - params = np.random.uniform(low=amin, high=amax, size=shape) - else: - params = jax.random.uniform(dkey, shape, minval=amin, maxval=amax) - elif dist_type == "fan_in_gaussian": ## fan-in scaled standard normal init - if use_numpy: - phi = np.random.normal(size=shape) - else: - phi = jax.random.normal(dkey, shape) - phi = phi * jnp.sqrt(1.0 / (shape[0] * 1.)) - params = phi.astype(jnp.float32) - elif dist_type == "fan_in_uniform": ## fan-in scaled unit uniform init - phi = jnp.sqrt(1.0 / (shape[0] * 1.)) # sometimes "k" in other libraries - if use_numpy: - params = np.random.uniform(low=-phi, high=phi, size=shape) - else: - params = jax.random.uniform(dkey, shape, minval=-phi, maxval=phi) - params = params.astype(jnp.float32) - elif dist_type == "constant": ## constant value (everywhere) init - scale = _init_kernel.get("value", 1.) - if use_numpy: - params = np.ones(shape) * scale - else: - params = jnp.ones(shape) * scale - else: - critical("Initialization scheme (" + dist_type + ") is not recognized/supported!") - ## check for any additional distribution post-processing kwargs (e.g., clipping) - clip_min = _init_kernel.get("amin") - clip_max = _init_kernel.get("amax") - lower_triangle = init_kernel.get("lower_triangle", False) - upper_triangle = init_kernel.get("upper_triangle", False) - is_hollow = _init_kernel.get("hollow", False) - is_eye = _init_kernel.get("eye", False) - n_row_active = _init_kernel.get("n_row_active", None) - n_col_active = _init_kernel.get("n_col_active", None) - block_diag_mask_width = _init_kernel.get("block_diag_mask_width", None) - ## run any configured post-processing to condition the final value matrix - if clip_min is not None: ## bound all values to be > clip_min - if use_numpy: - params = np.maximum(params, clip_min) - else: - params = jnp.maximum(params, clip_min) - if clip_max is not None: ## bound all values to be < clip_max - if use_numpy: - params = np.minimum(params, clip_max) - else: - params = jnp.minimum(params, clip_max) - if block_diag_mask_width is not None: - k = int(params.shape[0] / block_diag_mask_width) #5 - n = block_diag_mask_width #2 - source = jnp.eye(k, k) - block_mask = jnp.repeat(jnp.repeat(source, n, axis=1), n, axis=0) - if block_mask.shape[0] == params.shape[0] and block_mask.shape[1] == params.shape[1]: - params = params * block_mask - else: - critical( - "Initialization block matrix w/ width (" + block_diag_mask_width + - ") is not recognized/supported!" - ) - if lower_triangle: ## extract lower triangle of params matrix - ltri_params = jax.numpy.tril(params.shape[0]) - params = ltri_params - if upper_triangle: ## extract upper triangle of params matrix - ltri_params = jax.numpy.triu(params.shape[0]) - params = ltri_params - if is_hollow: ## apply a hollow mask - if use_numpy: - params = (1. - np.eye(N=shape[0], M=shape[1])) * params - else: - params = (1. - jnp.eye(N=shape[0], M=shape[1])) * params - if is_eye: ## apply an eye/diagonal mask - if use_numpy: - params = np.eye(N=shape[0], M=shape[1]) * params - else: - params = jnp.eye(N=shape[0], M=shape[1]) * params - if n_row_active is not None: ## keep only n rows active (rest are zero) - row_ind = random.permutation(dkey, shape[0])[0:n_row_active] - mask = jnp.zeros(shape) - mask = mask.at[row_ind, :].set(jnp.ones((shape[0], 1))) ## only set keep rows to ones - params = params * mask - if n_col_active is not None: ## keep only n cols active (rest are zero) - row_col = random.permutation(dkey, shape[1])[0:n_col_active] - mask = jnp.zeros(shape) - mask = mask.at[:, row_col].set(jnp.zeros((1, shape[0]))) ## only set keep cols to ones - params = params * mask - - return params ## return initial distribution conditions - diff --git a/pyproject.toml b/pyproject.toml index 71681a99..b50245fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,8 +8,8 @@ build-backend = "setuptools.build_meta" # using setuptool building engine [project] name = "ngclearn" -version = "2.0.3" -description = "Simulation software for building and analyzing arbitrary predictive coding, spiking network, and biomimetic neural systems." +version = "3.0.0" +description = "Simulation software for building and analyzing computational neuroscience models, brain-inspired computing systems, and NeuroAI agents." authors = [ {name = "Alexander Ororbia", email = "ago@cs.rit.edu"}, {name = "William Gebhardt", email = "wdg1351@rit.edu"}, diff --git a/requirements.txt b/requirements.txt index 36285e9d..1e871c1b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ -numpy>=1.22.0 +numpy>=1.26.4 scikit-learn>=1.6.1 -scipy>=1.7.0 -matplotlib>=3.8.0 -patchify +scipy>=1.15.2 +matplotlib>=3.10.1 +# patchify # patchify has issues with pip installation jax>=0.4.28 jaxlib>=0.4.28 -ngcsimlib>=1.0.1 -imageio>=2.31.5 +ngcsimlib>=3.0.0 +imageio>=2.37.0 pandas>=2.2.3 diff --git a/tests/components/input_encoders/test_bernoulliCell.py b/tests/components/input_encoders/test_bernoulliCell.py index f73951b7..43c616e7 100644 --- a/tests/components/input_encoders/test_bernoulliCell.py +++ b/tests/components/input_encoders/test_bernoulliCell.py @@ -1,15 +1,13 @@ +# %% + from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import BernoulliCell #from ngcsimlib.compilers import compile_command, wrap_command from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngclearn.utils import JaxProcess -from ngcsimlib.context import Context -#from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context def test_bernoulliCell1(): @@ -23,16 +21,13 @@ def test_bernoulliCell1(): with Context(name) as ctx: a = BernoulliCell(name="a", n_units=1, key=subkeys[0]) - advance_process = (JaxProcess("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") ## set up non-compiled utility commands - @Context.dynamicCommand def clamp(x): a.inputs.set(x) @@ -40,12 +35,12 @@ def clamp(x): x_seq = jnp.asarray([[1., 1., 0., 0., 1.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0,ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts*1., dt=dt) - outs.append(a.outputs.value) + clamp(x_t) + advance_process.run(t=ts*1., dt=dt) + outs.append(a.outputs.get()) outs = jnp.concatenate(outs, axis=1) ## output should equal input diff --git a/tests/components/input_encoders/test_latencyCell.py b/tests/components/input_encoders/test_latencyCell.py index 19843e54..4abf0552 100644 --- a/tests/components/input_encoders/test_latencyCell.py +++ b/tests/components/input_encoders/test_latencyCell.py @@ -1,17 +1,11 @@ +# %% + from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import LatencyCell -from ngcsimlib.compilers import compile_command, wrap_command from numpy.testing import assert_array_equal - -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch - +from ngclearn import MethodProcess, Context def test_latencyCell1(): name = "latency_ctx" @@ -29,23 +23,19 @@ def test_latencyCell1(): ) ## create and compile core simulation commands - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="advance") - calc_spike_times_process = (Process("calc_sptimes_proc") + calc_spike_times_process = (MethodProcess("calc_sptimes_proc") >> a.calc_spike_times) - ctx.wrap_and_add_command(jit(calc_spike_times_process.pure), name="calc_spike_times") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") ## set up non-compiled utility commands - @Context.dynamicCommand def clamp(x): a.inputs.set(x) ## input spike train - inputs = jnp.asarray([[0.02, 0.5, 1., 0.0]]) + x_t = jnp.asarray([[0.02, 0.5, 1., 0.0]]) targets = np.zeros((T, 4)) targets[0, 2] = 1. @@ -55,14 +45,14 @@ def clamp(x): targets = jnp.array(targets) ## gold-standard solution to check against outs = [] - ctx.reset() - ctx.clamp(inputs) - ctx.calc_spike_times() + reset_process.run() + clamp(x_t) + calc_spike_times_process.run() for ts in range(T): - ctx.clamp(inputs) - ctx.advance(t=ts * dt, dt=dt) + clamp(x_t) + advance_process.run(t=ts * dt, dt=dt) ## naively extract simple statistics at time ts and print them to I/O - s = a.outputs.value + s = a.outputs.get() outs.append(s) #print(" {}: s {} ".format(ts, jnp.squeeze(s))) outs = jnp.concatenate(outs, axis=0) diff --git a/tests/components/input_encoders/test_phasorCell.py b/tests/components/input_encoders/test_phasorCell.py index 2f4735ac..d9091888 100644 --- a/tests/components/input_encoders/test_phasorCell.py +++ b/tests/components/input_encoders/test_phasorCell.py @@ -1,16 +1,9 @@ from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import PhasorCell -#from ngcsimlib.compilers import compile_command, wrap_command from numpy.testing import assert_array_equal - -from ngcsimlib.compilers.process import Process, transition -#from ngcsimlib.component import Component -#from ngcsimlib.compartment import Compartment -#from ngcsimlib.context import Context -#from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context def test_phasorCell1(): @@ -24,16 +17,13 @@ def test_phasorCell1(): with Context(name) as ctx: a = PhasorCell(name="a", n_units=1, target_freq=1000., disable_phasor=True, key=subkeys[0]) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") ## set up non-compiled utility commands - @Context.dynamicCommand def clamp(x): a.inputs.set(x) @@ -41,12 +31,12 @@ def clamp(x): x_seq = jnp.asarray([[1., 1., 0., 0., 1.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.outputs.value) + clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.outputs.get()) #print(a.outputs.value) outs = jnp.concatenate(outs, axis=1) #print(outs) diff --git a/tests/components/input_encoders/test_poissonCell.py b/tests/components/input_encoders/test_poissonCell.py index 10c05867..fd29a13b 100644 --- a/tests/components/input_encoders/test_poissonCell.py +++ b/tests/components/input_encoders/test_poissonCell.py @@ -1,16 +1,10 @@ from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import PoissonCell -from ngcsimlib.compilers import compile_command, wrap_command +from ngclearn.components.input_encoders.poissonCell import PoissonCell from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context def test_poissonCell1(): @@ -24,16 +18,13 @@ def test_poissonCell1(): with Context(name) as ctx: a = PoissonCell(name="a", n_units=1, target_freq=1000., key=subkeys[0]) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") ## set up non-compiled utility commands - @Context.dynamicCommand def clamp(x): a.inputs.set(x) @@ -41,12 +32,12 @@ def clamp(x): x_seq = jnp.asarray([[1., 1., 0., 0., 1.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.outputs.value) + clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.outputs.get()) outs = jnp.concatenate(outs, axis=1) ## output should equal input diff --git a/tests/components/neurons/graded/test_RateCell.py b/tests/components/neurons/graded/test_RateCell.py index bbd91d2b..ecd1ce9a 100644 --- a/tests/components/neurons/graded/test_RateCell.py +++ b/tests/components/neurons/graded/test_RateCell.py @@ -1,18 +1,12 @@ # %% from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import RateCell -from ngcsimlib.compilers import compile_command, wrap_command +from ngclearn.components.neurons.graded.rateCell import RateCell from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess def test_RateCell1(): @@ -26,19 +20,11 @@ def test_RateCell1(): threshold=("none", 0.), integration_type="euler", batch_size=1, resist_scale=1., shape=None, is_stateful=True ) - advance_process = (Process("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) - # reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - # ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - # advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - # ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.ones((1, 10)) @@ -46,15 +32,16 @@ def clamp(x): y_seq = jnp.asarray([[0.02, 0.04, 0.06, 0.08, 0.09999999999999999, 0.11999999999999998, 0.13999999999999999, 0.15999999999999998, 0.17999999999999998, 0.19999999999999998]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.z.value) + clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.z.get()) outs = jnp.concatenate(outs, axis=1) # print(outs) ## output should equal input # assert_array_equal(outs, y_seq, tol=1e-3) np.testing.assert_allclose(outs, y_seq, atol=1e-3) +#test_RateCell1() diff --git a/tests/components/neurons/graded/test_bernoulliErrorCell.py b/tests/components/neurons/graded/test_bernoulliErrorCell.py index 897c6ef3..11d25c5f 100644 --- a/tests/components/neurons/graded/test_bernoulliErrorCell.py +++ b/tests/components/neurons/graded/test_bernoulliErrorCell.py @@ -1,19 +1,10 @@ # %% from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import BernoulliErrorCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal - -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch - +from ngclearn import MethodProcess, Context def test_bernoulliErrorCell(): np.random.seed(42) @@ -25,21 +16,12 @@ def test_bernoulliErrorCell(): a = BernoulliErrorCell( name="a", n_units=1, batch_size=1, input_logits=False, shape=None ) - advance_process = (Process("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - - # reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - # ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - # advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - # ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) - @Context.dynamicCommand def clamp(x): a.p.set(x) - @Context.dynamicCommand def clamp_target(x): a.target.set(x) @@ -50,14 +32,14 @@ def clamp_target(x): y_seq = jnp.asarray([[-2.8193381, -4976.9263, -2.1224928, -2939.0425, -1233.3916, -0.24662945, -708.30042, 0.28213939, 3550.8477, 1.3651246]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) + clamp(x_t) target_xt = jnp.array([[target_seq[0, ts]]]) - ctx.clamp_target(target_xt) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.dp.value) + clamp_target(target_xt) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.dp.get()) outs = jnp.concatenate(outs, axis=1) # print(outs) ## output should equal input diff --git a/tests/components/neurons/graded/test_gaussianErrorCell.py b/tests/components/neurons/graded/test_gaussianErrorCell.py index 1dd2a2e1..9c52746b 100644 --- a/tests/components/neurons/graded/test_gaussianErrorCell.py +++ b/tests/components/neurons/graded/test_gaussianErrorCell.py @@ -1,18 +1,11 @@ # %% from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import GaussianErrorCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context def test_gaussianErrorCell(): @@ -25,21 +18,12 @@ def test_gaussianErrorCell(): a = GaussianErrorCell( name="a", n_units=1, batch_size=1, sigma=1.0, shape=None ) - advance_process = (Process("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) - # reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - # ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - # advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - # ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - - @Context.dynamicCommand def clamp_mu(x): a.mu.set(x) - @Context.dynamicCommand def clamp_target(x): a.target.set(x) @@ -53,15 +37,15 @@ def clamp_target(x): dmu_outs = [] L_outs = [] - ctx.reset() + reset_process.run() for ts in range(mu_seq.shape[1]): mu_t = jnp.array([[mu_seq[0, ts]]]) ## get data at time t - ctx.clamp_mu(mu_t) + clamp_mu(mu_t) target_t = jnp.array([[target_seq[0, ts]]]) - ctx.clamp_target(target_t) - ctx.run(t=ts * 1., dt=dt) - dmu_outs.append(a.dmu.value) - L_outs.append(a.L.value) + clamp_target(target_t) + advance_process.run(t=ts * 1., dt=dt) + dmu_outs.append(a.dmu.get()) + L_outs.append(a.L.get()) dmu_outs = jnp.concatenate(dmu_outs, axis=1) L_outs = jnp.array(L_outs)[None] # (1, 10) @@ -74,4 +58,4 @@ def clamp_target(x): np.testing.assert_allclose(dmu_outs, expected_dmu, atol=1e-5) np.testing.assert_allclose(L_outs, expected_L, atol=1e-5) -# test_gaussianErrorCell() \ No newline at end of file +# test_gaussianErrorCell() diff --git a/tests/components/neurons/graded/test_laplacianErrorCell.py b/tests/components/neurons/graded/test_laplacianErrorCell.py index 4167bad9..16cd8539 100644 --- a/tests/components/neurons/graded/test_laplacianErrorCell.py +++ b/tests/components/neurons/graded/test_laplacianErrorCell.py @@ -1,21 +1,12 @@ # %% from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import LaplacianErrorCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal +from ngclearn import MethodProcess, Context -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch - - -def test_laplacianErrorCell(): +def test_laplacianErrorCell1(): np.random.seed(42) name = "laplacian_error_ctx" dkey = random.PRNGKey(42) @@ -25,27 +16,18 @@ def test_laplacianErrorCell(): a = LaplacianErrorCell( name="a", n_units=1, batch_size=1, scale=1.0, shape=None ) - advance_process = (Process("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - - # reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - # ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - # advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - # ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") + + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) - @Context.dynamicCommand - def clamp_modulator(x): - a.modulator.set(x) + def clamp_modulator(x): + a.modulator.set(x) - @Context.dynamicCommand - def clamp_shift(x): - a.shift.set(x) + def clamp_shift(x): + a.shift.set(x) - @Context.dynamicCommand - def clamp_target(x): - a.target.set(x) + def clamp_target(x): + a.target.set(x) ## input sequence modulator_seq = jnp.ones((1, 10)) @@ -59,22 +41,22 @@ def clamp_target(x): dshift_outs = [] L_outs = [] - ctx.reset() + reset_process.run() for ts in range(shift_seq.shape[1]): shift_t = jnp.array([[shift_seq[0, ts]]]) ## get data at time t - ctx.clamp_shift(shift_t) + clamp_shift(shift_t) modulator_t = jnp.array([[modulator_seq[0, ts]]]) - ctx.clamp_modulator(modulator_t) + clamp_modulator(modulator_t) target_t = jnp.array([[target_seq[0, ts]]]) - ctx.clamp_target(target_t) - ctx.run(t=ts * 1., dt=dt) - dshift_outs.append(a.dshift.value) + clamp_target(target_t) + advance_process.run(t=ts * 1., dt=dt) + dshift_outs.append(a.dshift.get()) # print(f"a.L.value: {a.L.value}") # print(f"a.shift.value: {a.shift.value}") # print(f"a.target.value: {a.target.value}") # print(f"a.Scale.value: {a.Scale.value}") # print(f"a.mask.value: {a.mask.value}") - L_outs.append(a.L.value) + L_outs.append(a.L.get()) dshift_outs = jnp.concatenate(dshift_outs, axis=1) L_outs = jnp.array(L_outs)[None] # (1, 10) @@ -87,3 +69,4 @@ def clamp_target(x): np.testing.assert_allclose(dshift_outs, expected_dshift, atol=1e-5) np.testing.assert_allclose(L_outs, expected_L, atol=1e-5) +#test_laplacianErrorCell1() diff --git a/tests/components/neurons/graded/test_leakyNoiseCell.py b/tests/components/neurons/graded/test_leakyNoiseCell.py new file mode 100644 index 00000000..096c4f68 --- /dev/null +++ b/tests/components/neurons/graded/test_leakyNoiseCell.py @@ -0,0 +1,47 @@ +# %% + +from jax import numpy as jnp, random, jit +import numpy as np +np.random.seed(42) +from ngclearn.components.neurons.graded.leakyNoiseCell import LeakyNoiseCell +from numpy.testing import assert_array_equal + +from ngclearn import Context, MethodProcess + + +def test_LeakyNoiseCell1(): + name = "leaky_noise_ctx" + dkey = random.PRNGKey(42) + dkey, *subkeys = random.split(dkey, 100) + dt = 1. # ms + with Context(name) as ctx: + a = LeakyNoiseCell( + name="a", n_units=1, tau_x=50., act_fx="identity", integration_type="euler", batch_size=1, sigma_rec=0., + leak_scale=0. + ) + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) + + def clamp(x): + a.j_input.set(x) + + ## input spike train + x_seq = jnp.ones((1, 10)) + ## desired output/epsp pulses + y_seq = jnp.asarray([[0.02, 0.04, 0.06, 0.08, 0.09999999999999999, 0.11999999999999998, 0.13999999999999999, 0.15999999999999998, 0.17999999999999998, 0.19999999999999998]], dtype=jnp.float32) + + outs = [] + reset_process.run() + for ts in range(x_seq.shape[1]): + x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t + clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.x.get()) + outs = jnp.concatenate(outs, axis=1) + # print(outs) + # print(y_seq) + ## output should approximately equal input + # assert_array_equal(outs, y_seq, tol=1e-3) + np.testing.assert_allclose(outs, y_seq, atol=1e-3) + +#test_LeakyNoiseCell1() diff --git a/tests/components/neurons/graded/test_rewardErrorCell.py b/tests/components/neurons/graded/test_rewardErrorCell.py index 6ecb7710..e465d07c 100644 --- a/tests/components/neurons/graded/test_rewardErrorCell.py +++ b/tests/components/neurons/graded/test_rewardErrorCell.py @@ -1,18 +1,11 @@ # %% from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import RewardErrorCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context def test_rewardErrorCell(): @@ -27,21 +20,10 @@ def test_rewardErrorCell(): name="a", n_units=1, alpha=alpha, ema_window_len=10, use_online_predictor=True, batch_size=1 ) - advance_process = (Process("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - evolve_process = (Process("evolve_proc") >> a.evolve) - ctx.wrap_and_add_command(jit(evolve_process.pure), name="evolve") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) + evolve_process = (MethodProcess("evolve_proc") >> a.evolve) - # reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - # ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - # advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - # ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - # evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - # ctx.add_command(wrap_command(jit(ctx.evolve)), name="evolve") - - @Context.dynamicCommand def clamp_reward(x): a.reward.set(x) @@ -71,18 +53,18 @@ def clamp_reward(x): mu_outs = [] rpe_outs = [] accum_reward_outs = [] - ctx.reset() + reset_process.run() for ts in range(reward_seq.shape[1]): reward_t = jnp.array([[reward_seq[0, ts]]]) ## get reward at time t - ctx.clamp_reward(reward_t) - ctx.run(t=ts * 1., dt=dt) - mu_outs.append(a.mu.value) - rpe_outs.append(a.rpe.value) - accum_reward_outs.append(a.accum_reward.value) + clamp_reward(reward_t) + advance_process.run(t=ts * 1., dt=dt) + mu_outs.append(a.mu.get()) + rpe_outs.append(a.rpe.get()) + accum_reward_outs.append(a.accum_reward.get()) # Test evolve function - ctx.evolve(t=10 * 1., dt=dt) - final_mu = a.mu.value + evolve_process.run(t=10 * 1., dt=dt) + final_mu = a.mu.get() # print(f"final_mu: {final_mu}") mu_outs = jnp.concatenate(mu_outs, axis=1) @@ -103,4 +85,4 @@ def clamp_reward(x): expected_final_mu = (1 - 1/10) * mu_outs[0, -1] + (1/10) * (accum_reward_outs[0, -1] / 10) np.testing.assert_allclose(final_mu, expected_final_mu, atol=1e-5) -# test_rewardErrorCell() \ No newline at end of file +#test_rewardErrorCell() diff --git a/tests/components/neurons/spiking/test_IFCell.py b/tests/components/neurons/spiking/test_IFCell.py index 28f3d8c0..3db38d72 100644 --- a/tests/components/neurons/spiking/test_IFCell.py +++ b/tests/components/neurons/spiking/test_IFCell.py @@ -2,15 +2,10 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import IFCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.IFCell import IFCell +from numpy.testing import assert_array_equal def test_IFCell1(): name = "if_ctx" @@ -18,35 +13,28 @@ def test_IFCell1(): dkey = random.PRNGKey(1234) dkey, *subkeys = random.split(dkey, 6) dt = 1. # ms - trace_increment = 0.1 # ---- build a simple Poisson cell system ---- with Context(name) as ctx: a = IFCell( name="a", n_units=1, tau_m=5., resist_m=10., key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + # """ + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - #ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + # ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ - + # ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + # """ ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) + + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.asarray([[1., 1., 1., 1., 1., 0., 0., 1., 1., 1., 1., 1., 1., 1., 0.]], dtype=jnp.float32) @@ -54,15 +42,16 @@ def clamp(x): y_seq = jnp.asarray([[0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() # ctx.reset() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) + clamp(x_t) # ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) outs = jnp.concatenate(outs, axis=1) - print(outs) - + # print(outs) + # print(y_seq) + ## output should equal input assert_array_equal(outs, y_seq) diff --git a/tests/components/neurons/spiking/test_LIFCell.py b/tests/components/neurons/spiking/test_LIFCell.py index 6f5f7c1a..b918d9a1 100644 --- a/tests/components/neurons/spiking/test_LIFCell.py +++ b/tests/components/neurons/spiking/test_LIFCell.py @@ -2,15 +2,10 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import LIFCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.LIFCell import LIFCell +from numpy.testing import assert_array_equal def test_LIFCell1(): name = "lif_ctx" @@ -26,27 +21,21 @@ def test_LIFCell1(): ) #""" - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - #ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + #ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + #ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) + + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.asarray([[1., 1., 1., 1., 1., 0., 0., 1., 1., 1., 1., 1., 1., 0.]], dtype=jnp.float32) @@ -54,15 +43,16 @@ def clamp(x): y_seq = jnp.asarray([[0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() #ctx.reset() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) + clamp(x_t) #ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) outs = jnp.concatenate(outs, axis=1) - #print(outs) - + # print(outs) + # print(y_seq) + ## output should equal input assert_array_equal(outs, y_seq) diff --git a/tests/components/neurons/spiking/test_RAFCell.py b/tests/components/neurons/spiking/test_RAFCell.py index a8a7fbfc..3a076ba6 100644 --- a/tests/components/neurons/spiking/test_RAFCell.py +++ b/tests/components/neurons/spiking/test_RAFCell.py @@ -1,17 +1,11 @@ from jax import numpy as jnp, random, jit from ngcsimlib.context import Context import numpy as np - np.random.seed(42) -from ngclearn.components import RAFCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.RAFCell import RAFCell +from numpy.testing import assert_array_equal def test_RAFCell1(): @@ -26,28 +20,22 @@ def test_RAFCell1(): name="a", n_units=1, tau_v=20., resist_v=1., key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + # """ + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + # ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ - + # ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + # """ ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) + + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.asarray([[0., 1., 0., 0., 0., 0., 1., 0., 0.]], dtype=jnp.float32) @@ -55,14 +43,13 @@ def clamp(x): y_seq = jnp.asarray([[0., 0., 0., 1., 0., 0., 0., 0., 1.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() # ctx.reset() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) + clamp(x_t) # ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) outs = jnp.concatenate(outs, axis=1) - #print(outs) ## output should equal input assert_array_equal(outs, y_seq) diff --git a/tests/components/neurons/spiking/test_WTASCell.py b/tests/components/neurons/spiking/test_WTASCell.py index b56b87e5..82384701 100644 --- a/tests/components/neurons/spiking/test_WTASCell.py +++ b/tests/components/neurons/spiking/test_WTASCell.py @@ -1,17 +1,11 @@ from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import WTASCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.WTASCell import WTASCell +from numpy.testing import assert_array_equal def test_WTASCell1(): @@ -27,27 +21,22 @@ def test_WTASCell1(): ) #""" - advance_process = (Process("advance_proc") + advance_process = (MethodProcess(name="advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + #ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess(name="reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + #ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") #""" - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ + # ## set up non-compiled utility commands + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.asarray([[0., 1.], [0., 1.], [1., 0.], [1., 0.]], dtype=jnp.float32) @@ -55,14 +44,15 @@ def clamp(x): y_seq = x_seq outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[0]): x_t = x_seq[ts:ts+1, :] ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) + clamp(x_t) #ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) outs = jnp.concatenate(outs, axis=0) - #print(outs) + # print(outs) + # print(y_seq) #exit() ## output should equal input assert_array_equal(outs, y_seq) diff --git a/tests/components/neurons/spiking/test_adExCell.py b/tests/components/neurons/spiking/test_adExCell.py index 2c0b9338..cb1dd528 100644 --- a/tests/components/neurons/spiking/test_adExCell.py +++ b/tests/components/neurons/spiking/test_adExCell.py @@ -1,17 +1,11 @@ from jax import numpy as jnp, random, jit from ngcsimlib.context import Context import numpy as np - np.random.seed(42) -from ngclearn.components import AdExCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.adExCell import AdExCell +from numpy.testing import assert_array_equal def test_adExCell1(): @@ -26,28 +20,22 @@ def test_adExCell1(): name="a", n_units=1, tau_m=50., resist_m=30., thr=-66., key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + # """ + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + # ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ - + # ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + # """ ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) + + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.ones((1, 10)) @@ -55,16 +43,18 @@ def clamp(x): y_seq = jnp.asarray([[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() # ctx.reset() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) + clamp(x_t) # ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) + outs = jnp.concatenate(outs, axis=1) - #print(outs) + # print(outs) + # print(y_seq) ## output should equal input assert_array_equal(outs, y_seq) -#test_adExCell1() +test_adExCell1() diff --git a/tests/components/neurons/spiking/test_fitzhughNagumoCell.py b/tests/components/neurons/spiking/test_fitzhughNagumoCell.py index eecc28e5..5ca0f489 100644 --- a/tests/components/neurons/spiking/test_fitzhughNagumoCell.py +++ b/tests/components/neurons/spiking/test_fitzhughNagumoCell.py @@ -1,17 +1,11 @@ from jax import numpy as jnp, random, jit from ngcsimlib.context import Context import numpy as np - np.random.seed(42) -from ngclearn.components import FitzhughNagumoCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.fitzhughNagumoCell import FitzhughNagumoCell +from numpy.testing import assert_array_equal def test_fitzhughNagumoCell1(): @@ -26,28 +20,22 @@ def test_fitzhughNagumoCell1(): name="a", n_units=1, tau_m=1., resist_m=5., v_thr=2.1, key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + # """ + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + # ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ - + # ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + # """ ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) + + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.asarray([[0., 0., 1., 1., 1., 1., 0., 0., 0., 0.]], dtype=jnp.float32) @@ -55,14 +43,16 @@ def clamp(x): y_seq = jnp.asarray([[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() # ctx.reset() for ts in range(x_seq.shape[1]): - x_t = x_seq[:, ts:ts+1] ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) + x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t + clamp(x_t) # ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) + outs = jnp.concatenate(outs, axis=1) - #print(outs) + # print(outs) + # print(y_seq) ## output should equal input assert_array_equal(outs, y_seq) diff --git a/tests/components/neurons/spiking/test_hodgkinHuxleyCell.py b/tests/components/neurons/spiking/test_hodgkinHuxleyCell.py index d86c3fd0..aeb80c48 100644 --- a/tests/components/neurons/spiking/test_hodgkinHuxleyCell.py +++ b/tests/components/neurons/spiking/test_hodgkinHuxleyCell.py @@ -1,17 +1,11 @@ from jax import numpy as jnp, random, jit from ngcsimlib.context import Context import numpy as np - np.random.seed(42) -from ngclearn.components import HodgkinHuxleyCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_almost_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.hodgkinHuxleyCell import HodgkinHuxleyCell +from numpy.testing import assert_array_almost_equal import matplotlib.pyplot as plt @@ -30,27 +24,21 @@ def test_hodgkinHuxleyCell1(): ) # """ - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + # ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + # ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") # """ - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ - ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) + + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.zeros((1, 20)) @@ -61,12 +49,15 @@ def clamp(x): 0.40085957, 0.42394499, 0.44698984, 0.46999594]], dtype=jnp.float32) v = [] - ctx.reset() + reset_process.run() # ctx.reset() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - v.append(a.v.value[0, 0]) + clamp(x_t) # ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + v.append(a.v.get()[0, 0]) + # print(outs) + # print(y_seq) + outs = jnp.array(v) diff = np.abs(outs - y_seq) ## delta/error should be approximately zero diff --git a/tests/components/neurons/spiking/test_izhikevichCell.py b/tests/components/neurons/spiking/test_izhikevichCell.py index 165752d9..04ec6bcb 100644 --- a/tests/components/neurons/spiking/test_izhikevichCell.py +++ b/tests/components/neurons/spiking/test_izhikevichCell.py @@ -1,17 +1,11 @@ from jax import numpy as jnp, random, jit from ngcsimlib.context import Context import numpy as np - np.random.seed(42) -from ngclearn.components import IzhikevichCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.izhikevichCell import IzhikevichCell +from numpy.testing import assert_array_equal def test_izhikevichCell1(): @@ -26,28 +20,22 @@ def test_izhikevichCell1(): name="a", n_units=1, tau_m=1., resist_m=4., v_thr=30., key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + # """ + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + # ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ - + # ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + # """ ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) + + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.asarray([[0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0.]], dtype=jnp.float32) @@ -55,16 +43,16 @@ def clamp(x): y_seq = jnp.asarray([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() # ctx.reset() for ts in range(x_seq.shape[1]): - x_t = x_seq[:, ts:ts+1] ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) - print(a.v.value) + x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t + clamp(x_t) # ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) outs = jnp.concatenate(outs, axis=1) - print(outs) - #exit() + # print(outs) + # print(y_seq) + ## output should equal input assert_array_equal(outs, y_seq) diff --git a/tests/components/neurons/spiking/test_quadLIFCell.py b/tests/components/neurons/spiking/test_quadLIFCell.py index d79418ff..58756dba 100644 --- a/tests/components/neurons/spiking/test_quadLIFCell.py +++ b/tests/components/neurons/spiking/test_quadLIFCell.py @@ -2,15 +2,10 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import QuadLIFCell -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import Context, MethodProcess +from ngclearn.components.neurons.spiking.quadLIFCell import QuadLIFCell +from numpy.testing import assert_array_equal def test_quadLIFCell1(): name = "quadlif_ctx" @@ -18,35 +13,29 @@ def test_quadLIFCell1(): dkey = random.PRNGKey(1234) dkey, *subkeys = random.split(dkey, 6) dt = 1. # ms - trace_increment = 0.1 + critical_V = 1. # ---- build a simple Poisson cell system ---- with Context(name) as ctx: a = QuadLIFCell( - name="a", n_units=1, tau_m=30., resist_m=1., key=subkeys[0] + name="a", n_units=1, tau_m=30., resist_m=1., critical_V=critical_V, key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + # """ + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - #ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") + # ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ - + # ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + # """ ## set up non-compiled utility commands - @Context.dynamicCommand - def clamp(x): - a.j.set(x) + # @Context.dynamicCommand + # def clamp(x): + # a.j.set(x) + + def clamp(x): + a.j.set(x) ## input spike train x_seq = jnp.asarray([[1., 1., 1., 1., 1., 0., 0., 0., 1., 1., 1., 1., 1., 1., 0., 0.]], dtype=jnp.float32) @@ -54,14 +43,13 @@ def clamp(x): y_seq = jnp.asarray([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() # ctx.reset() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) + clamp(x_t) # ctx.clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) outs = jnp.concatenate(outs, axis=1) - #print(outs) ## output should equal input assert_array_equal(outs, y_seq) diff --git a/tests/components/neurons/spiking/test_sLIFCell.py b/tests/components/neurons/spiking/test_sLIFCell.py index b1b5f517..697f1790 100644 --- a/tests/components/neurons/spiking/test_sLIFCell.py +++ b/tests/components/neurons/spiking/test_sLIFCell.py @@ -1,16 +1,11 @@ from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import SLIFCell -from ngcsimlib.compilers import compile_command, wrap_command from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context + def test_sLIFCell1(): name = "slif_ctx" @@ -25,26 +20,12 @@ def test_sLIFCell1(): name="a", n_units=1, tau_m=50., resist_m=10., thr=0.3, key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - #ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ ## set up non-compiled utility commands - @Context.dynamicCommand def clamp(x): a.j.set(x) @@ -54,12 +35,12 @@ def clamp(x): y_seq = jnp.asarray([[0., 1., 0., 0., 0., 1., 0.]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.s.value) + clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.s.get()) outs = jnp.concatenate(outs, axis=1) ## output should equal input diff --git a/tests/components/other/test_expKernel.py b/tests/components/other/test_expKernel.py index 0ece0bad..9375da66 100644 --- a/tests/components/other/test_expKernel.py +++ b/tests/components/other/test_expKernel.py @@ -1,16 +1,8 @@ from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import ExpKernel -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal - -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context def test_expKernel1(): name = "expKernel_ctx" @@ -25,16 +17,12 @@ def test_expKernel1(): name="a", n_units=1, dt=1., tau_w=500., nu=4., key=subkeys[0] ) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") ## set up non-compiled utility commands - @Context.dynamicCommand def clamp(x): a.inputs.set(x) @@ -44,16 +32,16 @@ def clamp(x): y_seq = jnp.asarray([[0., 1., 0.998002, 0.996008, 1.9940181]], dtype=jnp.float32) outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.epsp.value) + clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.epsp.get()) outs = jnp.concatenate(outs, axis=1) #print(outs) ## output should equal input np.testing.assert_allclose(outs, y_seq, atol=1e-8) -#test_expKernel1() +test_expKernel1() diff --git a/tests/components/other/test_varTrace.py b/tests/components/other/test_varTrace.py index 88444588..8b8ba84d 100644 --- a/tests/components/other/test_varTrace.py +++ b/tests/components/other/test_varTrace.py @@ -1,16 +1,11 @@ from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) from ngclearn.components import VarTrace -from ngcsimlib.compilers import compile_command, wrap_command from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context + def test_varTrace1(): name = "trace_ctx" @@ -26,35 +21,32 @@ def test_varTrace1(): key=subkeys[0] ) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") ## set up non-compiled utility commands - @Context.dynamicCommand def clamp(x): a.inputs.set(x) ## input spike train x_seq = jnp.asarray([[1., 1., 0., 0., 1.]], dtype=jnp.float32) ## desired output pulses - y_seq = x_seq * trace_increment + y_seq = x_seq * trace_increment outs = [] - ctx.reset() + reset_process.run() for ts in range(x_seq.shape[1]): x_t = jnp.array([[x_seq[0, ts]]]) ## get data at time t - ctx.clamp(x_t) - ctx.run(t=ts * 1., dt=dt) - outs.append(a.outputs.value) + clamp(x_t) + advance_process.run(t=ts * 1., dt=dt) + outs.append(a.outputs.get()) outs = jnp.concatenate(outs, axis=1) #print(outs) ## output should equal input assert_array_equal(outs, y_seq) -#test_varTrace1() +test_varTrace1() diff --git a/tests/components/synapses/convolution/test_hebbianConvSynapse.py b/tests/components/synapses/convolution/test_hebbianConvSynapse.py index db6cd662..e5ee3d74 100644 --- a/tests/components/synapses/convolution/test_hebbianConvSynapse.py +++ b/tests/components/synapses/convolution/test_hebbianConvSynapse.py @@ -1,16 +1,11 @@ from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import HebbianConvSynapse -import ngclearn.utils.weight_distribution as dist -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn.components.synapses.convolution.hebbianConvSynapse import HebbianConvSynapse +from numpy.testing import assert_array_equal def test_HebbianConvSynapse1(): name = "hebb_conv_ctx" @@ -36,41 +31,24 @@ def test_HebbianConvSynapse1(): stride=stride, padding=padding_style, batch_size=batch_size, key=subkeys[0] ) - #""" - evolve_process = (Process("evolve_proc") + evolve_process = (MethodProcess("evolve_process") >> a.evolve) - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") - backtransmit_process = (Process("btransmit_proc") - >> a.backtransmit) - ctx.wrap_and_add_command(jit(backtransmit_process.pure), name="backtransmit") + backtransmit_process = (MethodProcess("backtransmit_process") + >> a.backtransmit) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - backpass_cmd, backpass_args = ctx.compile_by_key(a, compile_key="backtransmit") - ctx.add_command(wrap_command(jit(ctx.backtransmit)), name="backtransmit") - """ x = jnp.ones(x_shape) - ctx.reset() + reset_process.run() # ctx.reset() a.inputs.set(x) - ctx.run(t=1., dt=dt) - y = a.outputs.value + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + y = a.outputs.get() y_truth = jnp.array( [[[[4.],[2.]], @@ -79,17 +57,16 @@ def test_HebbianConvSynapse1(): assert_array_equal(y, y_truth) # print(y) + # print("y.Tr:\n", y_truth) # print("======") - # print("NGC-Learn.shape = ", node.outputs.value.shape) + # print("NGC-Learn.shape = ", node.outputs.get().shape) a.pre.set(x) a.post.set(y) - ctx.adapt(t=1., dt=dt) - dK = a.dWeights.value - #print(dK) - ctx.backtransmit(t=1., dt=dt) - dx = a.dInputs.value - #print(dx) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + dK = a.dWeights.get() + backtransmit_process.run(t=1., dt=dt) # ctx.backtransmit(t=1., dt=dt) + dx = a.dInputs.get() dK_truth = jnp.array( [[[[9.]], [[6.]]], @@ -102,6 +79,10 @@ def test_HebbianConvSynapse1(): [[6.], [9.]]]] ) + # print(dK) + # print("dK.Tr:\n", dK_truth) + # print(dx) + # print("dx.Tr:\n", dx_truth) assert_array_equal(dK, dK_truth) assert_array_equal(dx, dx_truth) diff --git a/tests/components/synapses/convolution/test_hebbianDeconvSynapse.py b/tests/components/synapses/convolution/test_hebbianDeconvSynapse.py index a91e69d4..57ed9756 100644 --- a/tests/components/synapses/convolution/test_hebbianDeconvSynapse.py +++ b/tests/components/synapses/convolution/test_hebbianDeconvSynapse.py @@ -1,16 +1,11 @@ from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import HebbianDeconvSynapse -import ngclearn.utils.weight_distribution as dist -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn.components.synapses.convolution.hebbianDeconvSynapse import HebbianDeconvSynapse +from numpy.testing import assert_array_equal def test_HebbianDeconvSynapse1(): name = "hebb_deconv_ctx" @@ -36,43 +31,24 @@ def test_HebbianDeconvSynapse1(): stride=stride, padding=padding_style, batch_size=batch_size, key=subkeys[0] ) - #""" - evolve_process = (Process("evolve_proc") - >> a.evolve) - #ctx.wrap_and_add_command(evolve_process.pure, name="run") - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") + evolve_process = (MethodProcess("evolve_process") + >> a.evolve) - backtransmit_process = (Process("btransmit_proc") + backtransmit_process = (MethodProcess("backtransmit_process") >> a.backtransmit) - ctx.wrap_and_add_command(jit(backtransmit_process.pure), name="backtransmit") - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - backpass_cmd, backpass_args = ctx.compile_by_key(a, compile_key="backtransmit") - ctx.add_command(wrap_command(jit(ctx.backtransmit)), name="backtransmit") - """ x = jnp.ones(x_shape) - ctx.reset() + reset_process.run() # ctx.reset() a.inputs.set(x) - ctx.run(t=1., dt=dt) - y = a.outputs.value + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + y = a.outputs.get() y_truth = jnp.array( [[[[1.],[2.]], @@ -80,18 +56,17 @@ def test_HebbianDeconvSynapse1(): ) assert_array_equal(y, y_truth) - #print(y) - #print("======") + # print(y) + # print("y.Tr:\n", y_truth) + # print("======") - # print("NGC-Learn.shape = ", node.outputs.value.shape) + # print("NGC-Learn.shape = ", node.outputs.get().shape) a.pre.set(x) a.post.set(y) - ctx.adapt(t=1., dt=dt) - dK = a.dWeights.value - #print(dK) - ctx.backtransmit(t=1., dt=dt) - dx = a.dInputs.value - #print(dx) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + dK = a.dWeights.get() + backtransmit_process.run(t=1., dt=dt) # ctx.backtransmit(t=1., dt=dt) + dx = a.dInputs.get() dK_truth = jnp.array( [[[[4.]], [[6.]]], @@ -104,6 +79,10 @@ def test_HebbianDeconvSynapse1(): [[6.], [4.]]]] ) + # print(dK) + # print("dK.Tr:\n", dK_truth) + # print(dx) + # print("dx.Tr:\n", dx_truth) assert_array_equal(dK, dK_truth) assert_array_equal(dx, dx_truth) diff --git a/tests/components/synapses/convolution/test_traceSTDPConvSynapse.py b/tests/components/synapses/convolution/test_traceSTDPConvSynapse.py index bf113760..2df6a7cc 100644 --- a/tests/components/synapses/convolution/test_traceSTDPConvSynapse.py +++ b/tests/components/synapses/convolution/test_traceSTDPConvSynapse.py @@ -2,15 +2,11 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import TraceSTDPConvSynapse -import ngclearn.utils.weight_distribution as dist -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn.components.synapses.convolution.traceSTDPConvSynapse import TraceSTDPConvSynapse +from numpy.testing import assert_array_equal def test_TraceSTDPConvSynapse1(): name = "stdp_conv_ctx" @@ -36,34 +32,17 @@ def test_TraceSTDPConvSynapse1(): stride=stride, padding=padding_style, batch_size=batch_size, key=subkeys[0] ) - #""" - evolve_process = (Process("evolve_proc") + evolve_process = (MethodProcess("evolve_process") >> a.evolve) - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") - backtransmit_process = (Process("btransmit_proc") + backtransmit_process = (MethodProcess("backtransmit_process") >> a.backtransmit) - ctx.wrap_and_add_command(jit(backtransmit_process.pure), name="backtransmit") - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - backpass_cmd, backpass_args = ctx.compile_by_key(a, compile_key="backtransmit") - ctx.add_command(wrap_command(jit(ctx.backtransmit)), name="backtransmit") - """ ## fake out a mix of pre-synaptic spikes/no-spikes x = np.ones(x_shape) @@ -75,25 +54,25 @@ def test_TraceSTDPConvSynapse1(): [[1.], [0.]]]] ) - ctx.reset() + reset_process.run() # ctx.reset() a.inputs.set(x) - ctx.run(t=1., dt=dt) - y = (a.outputs.value > 0.) * 1. ## fake out post-syn spikes + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + y = (a.outputs.get() > 0.) * 1. ## fake out post-syn spikes assert_array_equal(y, y_truth) - #print(y) - #print("======") + # print(y) + # print("y.Tr:\n", y_truth) + # print("======") - # print("NGC-Learn.shape = ", node.outputs.value.shape) + # print("NGC-Learn.shape = ", node.outputs.get().shape) a.preSpike.set(x) a.postSpike.set(y) a.preTrace.set(x * 0.4) ## fake out pre-syn trace values a.postTrace.set(y * 1.3) ## fake out post-syn trace values - ctx.adapt(t=1., dt=dt) - dK = a.dWeights.value - #print(dK) - ctx.backtransmit(t=1., dt=dt) - dx = a.dInputs.value - #print(dx) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + dK = a.dWeights.get() + + backtransmit_process.run(t=1., dt=dt) # ctx.backtransmit(t=1., dt=dt) + dx = a.dInputs.get() dK_truth = jnp.array( [[[[-1.8]], [[-0.9]]], @@ -106,6 +85,10 @@ def test_TraceSTDPConvSynapse1(): [[2.], [3.]]]] ) + # print(dK) + # print("dK.Tr:\n", dK_truth) + # print(dx) + # print("dx.Tr:\n", dx_truth) assert_array_equal(dK, dK_truth) assert_array_equal(dx, dx_truth) diff --git a/tests/components/synapses/convolution/test_traceSTDPDeconvSynapse.py b/tests/components/synapses/convolution/test_traceSTDPDeconvSynapse.py index 76be1c2a..03753a22 100644 --- a/tests/components/synapses/convolution/test_traceSTDPDeconvSynapse.py +++ b/tests/components/synapses/convolution/test_traceSTDPDeconvSynapse.py @@ -2,15 +2,11 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import TraceSTDPDeconvSynapse -import ngclearn.utils.weight_distribution as dist -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn.components.synapses.convolution.traceSTDPDeconvSynapse import TraceSTDPDeconvSynapse +from numpy.testing import assert_array_equal def test_TraceSTDPDeconvSynapse1(): name = "stdp_deconv_ctx" @@ -37,36 +33,17 @@ def test_TraceSTDPDeconvSynapse1(): stride=stride, padding=padding_style, batch_size=batch_size, key=subkeys[0] ) - #""" - evolve_process = (Process("evolve_proc") - >> a.evolve) - #ctx.wrap_and_add_command(evolve_process.pure, name="run") - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") + evolve_process = (MethodProcess("evolve_process") + >> a.evolve) - backtransmit_process = (Process("btransmit_proc") + backtransmit_process = (MethodProcess("backtransmit_process") >> a.backtransmit) - ctx.wrap_and_add_command(jit(backtransmit_process.pure), name="backtransmit") - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - backpass_cmd, backpass_args = ctx.compile_by_key(a, compile_key="backtransmit") - ctx.add_command(wrap_command(jit(ctx.backtransmit)), name="backtransmit") - """ ## fake out a mix of pre-synaptic spikes/no-spikes x = np.ones(x_shape) @@ -78,25 +55,24 @@ def test_TraceSTDPDeconvSynapse1(): [[1.], [1.]]]] ) - ctx.reset() + reset_process.run() #ctx.reset() a.inputs.set(x) - ctx.run(t=1., dt=dt) - y = (a.outputs.value > 0.) * 1. ## fake out post-syn spikes + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + y = (a.outputs.get() > 0.) * 1. ## fake out post-syn spikes assert_array_equal(y, y_truth) - #print(y) - #print("======") + # print(y) + # print("y.Tr:\n", y_truth) + # print("======") - # print("NGC-Learn.shape = ", node.outputs.value.shape) + # print("NGC-Learn.shape = ", node.outputs.get().shape) a.preSpike.set(x) a.postSpike.set(y) a.preTrace.set(x * 0.4) ## fake out pre-syn trace values a.postTrace.set(y * 1.3) ## fake out post-syn trace values - ctx.adapt(t=1., dt=dt) - dK = a.dWeights.value - #print(dK) - ctx.backtransmit(t=1., dt=dt) - dx = a.dInputs.value - #print(dx) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + dK = a.dWeights.get() + backtransmit_process.run(t=1., dt=dt) # ctx.backtransmit(t=1., dt=dt) + dx = a.dInputs.get() dK_truth = jnp.array( [[[[0.]], [[-0.9]]], @@ -109,6 +85,10 @@ def test_TraceSTDPDeconvSynapse1(): [[2.], [1.]]]] ) + # print(dK) + # print("dK.Tr:\n", dK_truth) + # print(dx) + # print("dx.Tr:\n", dx_truth) assert_array_equal(dK, dK_truth) assert_array_equal(dx, dx_truth) diff --git a/tests/components/synapses/hebbian/test_BCMSynapse.py b/tests/components/synapses/hebbian/test_BCMSynapse.py index 7597f549..7dbff4de 100644 --- a/tests/components/synapses/hebbian/test_BCMSynapse.py +++ b/tests/components/synapses/hebbian/test_BCMSynapse.py @@ -2,14 +2,11 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import BCMSynapse -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +#from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn.components.synapses.hebbian.BCMSynapse import BCMSynapse +from numpy.testing import assert_array_equal def test_BCMSynapse1(): name = "bcm_stdp_ctx" @@ -23,42 +20,26 @@ def test_BCMSynapse1(): name="a", shape=(1,1), tau_w=40., tau_theta=20., key=subkeys[0] ) - #""" - evolve_process = (Process("evolve_proc") + evolve_process = (MethodProcess("evolve_process") >> a.evolve) - #ctx.wrap_and_add_command(evolve_process.pure, name="run") - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - """ pre_value = jnp.ones((1, 1)) * 0.425 post_value = jnp.ones((1, 1)) * 1.55 truth = jnp.array([[-1.6798127]]) - ctx.reset() + reset_process.run() # ctx.reset() a.pre.set(pre_value) a.post.set(post_value) - ctx.run(t=1., dt=dt) - ctx.adapt(t=1., dt=dt) - #print(a.dWeights.value) - assert_array_equal(a.dWeights.value, truth) - + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + # print(a.dWeights.get()) + # print(truth) + assert_array_equal(a.dWeights.get(), truth) -#test_BCMSynapse1() +test_BCMSynapse1() diff --git a/tests/components/synapses/hebbian/test_eventSTDPSynapse.py b/tests/components/synapses/hebbian/test_eventSTDPSynapse.py index b51c16de..a3c9a371 100644 --- a/tests/components/synapses/hebbian/test_eventSTDPSynapse.py +++ b/tests/components/synapses/hebbian/test_eventSTDPSynapse.py @@ -2,14 +2,11 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import EventSTDPSynapse -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +#from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn.components.synapses.hebbian.eventSTDPSynapse import EventSTDPSynapse +from numpy.testing import assert_array_equal def test_eventSTDPSynapse1(): name = "event_stdp_ctx" @@ -24,46 +21,32 @@ def test_eventSTDPSynapse1(): name="a", shape=(1,1), eta=0., presyn_win_len=2., key=subkeys[0] ) - #""" - evolve_process = (Process("evolve_proc") - >> a.evolve) - #ctx.wrap_and_add_command(evolve_process.pure, name="run") - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") + evolve_process = (MethodProcess("evolve_process") + >> a.evolve) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - """ a.weights.set(jnp.ones((1, 1)) * 0.1) t = 12. ## fake out current time - ## Case 1: outside of pre-syn time window + ## Case 1: outside pre-syn time window input_tols = jnp.ones((1, 1,)) * 9. out_spike = jnp.ones((1, 1)) ## check pre-synaptic STDP only truth = jnp.array([[-0.101]]) - ctx.reset() + reset_process.run() # ctx.reset() a.pre_tols.set(input_tols) a.postSpike.set(out_spike) - ctx.run(t=t, dt=dt) - ctx.adapt(t=t, dt=dt) - #print(a.dWeights.value) - assert_array_equal(a.dWeights.value, truth) + advance_process.run(t=t, dt=dt) # ctx.run(t=t, dt=dt) + evolve_process.run(t=t, dt=dt) # ctx.adapt(t=t, dt=dt) + # print(a.dWeights.get()) + # print(truth) + assert_array_equal(a.dWeights.get(), truth) ## Case 2: within pre-syn time window input_tols = jnp.ones((1, 1,)) * 11. @@ -71,13 +54,14 @@ def test_eventSTDPSynapse1(): ## check pre-synaptic STDP only truth = jnp.array([[0.899]]) - ctx.reset() + reset_process.run() # ctx.reset() a.pre_tols.set(input_tols) a.postSpike.set(out_spike) - ctx.run(t=t, dt=dt) - ctx.adapt(t=t, dt=dt) - #print(a.dWeights.value) - assert_array_equal(a.dWeights.value, truth) + advance_process.run(t=t, dt=dt) # ctx.run(t=t, dt=dt) + evolve_process.run(t=t, dt=dt) # ctx.adapt(t=t, dt=dt) + # print(a.dWeights.get()) + # print(truth) + assert_array_equal(a.dWeights.get(), truth) #test_eventSTDPSynapse1() diff --git a/tests/components/synapses/hebbian/test_expSTDPSynapse.py b/tests/components/synapses/hebbian/test_expSTDPSynapse.py index 9765315d..ca18d89f 100644 --- a/tests/components/synapses/hebbian/test_expSTDPSynapse.py +++ b/tests/components/synapses/hebbian/test_expSTDPSynapse.py @@ -1,15 +1,13 @@ + from jax import numpy as jnp, random, jit from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import ExpSTDPSynapse -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +#from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn.components.synapses.hebbian.expSTDPSynapse import ExpSTDPSynapse +from numpy.testing import assert_array_equal def test_expSTDPSynapse1(): name = "exp_stdp_ctx" @@ -20,33 +18,18 @@ def test_expSTDPSynapse1(): # ---- build a simple Poisson cell system ---- with Context(name) as ctx: a = ExpSTDPSynapse( - name="a", shape=(1,1), A_plus=1., A_minus=1., exp_beta=1.25, key=subkeys[0] + name="a", shape=(1,1), A_plus=1., A_minus=1., exp_beta=1.25, eta=0., key=subkeys[0] ) - #""" - evolve_process = (Process("evolve_proc") - >> a.evolve) - #ctx.wrap_and_add_command(evolve_process.pure, name="run") - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") + evolve_process = (MethodProcess("evolve_process") + >> a.evolve) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - """ a.weights.set(jnp.ones((1, 1)) * 0.1) in_spike = jnp.ones((1, 1)) @@ -56,26 +39,30 @@ def test_expSTDPSynapse1(): ## check pre-synaptic STDP only truth = jnp.array([[1.1031212]]) - ctx.reset() + reset_process.run() # ctx.reset() a.preSpike.set(in_spike * 0) a.preTrace.set(in_trace) a.postSpike.set(out_spike) a.postTrace.set(out_trace) - ctx.run(t=1., dt=dt) - ctx.adapt(t=1., dt=dt) - #print(a.dWeights.value) - assert_array_equal(a.dWeights.value, truth) + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + # print("W: ",a.weights.get()) + # print(a.dWeights.get()) + # print(truth) + assert_array_equal(a.dWeights.get(), truth) truth = jnp.array([[-0.57362294]]) - ctx.reset() + reset_process.run() # ctx.reset() a.preSpike.set(in_spike) a.preTrace.set(in_trace) a.postSpike.set(out_spike * 0) a.postTrace.set(out_trace) - ctx.run(t=1., dt=dt) - ctx.adapt(t=1., dt=dt) - #print(a.dWeights.value) - assert_array_equal(a.dWeights.value, truth) + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + # print("W: ", a.weights.get()) + # print(a.dWeights.get()) + # print(truth) + assert_array_equal(a.dWeights.get(), truth) #test_expSTDPSynapse1() diff --git a/tests/components/synapses/hebbian/test_hebbianSynapse.py b/tests/components/synapses/hebbian/test_hebbianSynapse.py index 35a2b191..ba5dc463 100644 --- a/tests/components/synapses/hebbian/test_hebbianSynapse.py +++ b/tests/components/synapses/hebbian/test_hebbianSynapse.py @@ -1,18 +1,13 @@ # %% from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context + import numpy as np np.random.seed(42) -from ngclearn.components import HebbianSynapse -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal +from ngclearn.components.synapses.hebbian.hebbianSynapse import HebbianSynapse -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from numpy.testing import assert_array_equal +from ngclearn import Context, MethodProcess def test_hebbianSynapse(): @@ -29,37 +24,23 @@ def test_hebbianSynapse(): with Context(name) as ctx: a = HebbianSynapse( - name="a", - shape=shape, + name="a", + shape=shape, resist_scale=resist_scale, batch_size=batch_size, prior = ("gaussian", 0.01) ) - advance_process = (Process("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - evolve_process = (Process("evolve_proc") >> a.evolve) - ctx.wrap_and_add_command(jit(evolve_process.pure), name="evolve") - - # Compile and add commands - # reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - # ctx.add_command(wrap_command(jit(reset_cmd)), name="reset") - # advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - # ctx.add_command(wrap_command(jit(advance_cmd)), name="run") - # evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - # ctx.add_command(wrap_command(jit(evolve_cmd)), name="evolve") - - @Context.dynamicCommand + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) + evolve_process = (MethodProcess("evolve_proc") >> a.evolve) + def clamp_inputs(x): a.inputs.set(x) - @Context.dynamicCommand def clamp_pre(x): a.pre.set(x) - @Context.dynamicCommand def clamp_post(x): a.post.set(x) @@ -70,16 +51,17 @@ def clamp_post(x): in_pre = jnp.ones((1, 10)) * 1.0 in_post = jnp.ones((1, 5)) * 0.75 - ctx.reset() + reset_process.run() clamp_pre(in_pre) clamp_post(in_post) - ctx.run(t=1. * dt, dt=dt) - ctx.evolve(t=1. * dt, dt=dt) + advance_process.run(t=1. * dt, dt=dt) + evolve_process.run(t=1. * dt, dt=dt) - print(a.weights.value) + #print(a.weights.get()) # Basic assertions to check learning dynamics - assert a.weights.value.shape == (10, 5), "" - assert a.weights.value[0, 0] == 0.5, "" + assert a.weights.get().shape == (10, 5), "" + assert a.weights.get()[0, 0] == 0.5, "" + +#test_hebbianSynapse() -# test_hebbianSynapse() \ No newline at end of file diff --git a/tests/components/synapses/hebbian/test_traceSTDPSynapse.py b/tests/components/synapses/hebbian/test_traceSTDPSynapse.py index 4e1e42de..a7d94d45 100644 --- a/tests/components/synapses/hebbian/test_traceSTDPSynapse.py +++ b/tests/components/synapses/hebbian/test_traceSTDPSynapse.py @@ -2,14 +2,11 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import TraceSTDPSynapse -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess +#from ngclearn.utils.distribution_generator import DistributionGenerator as dist +from ngclearn.components.synapses.hebbian.traceSTDPSynapse import TraceSTDPSynapse +from numpy.testing import assert_array_equal def test_traceSTDPSynapse1(): name = "trace_stdp_ctx" @@ -20,33 +17,18 @@ def test_traceSTDPSynapse1(): # ---- build a simple Poisson cell system ---- with Context(name) as ctx: a = TraceSTDPSynapse( - name="a", shape=(1,1), A_plus=1., A_minus=1., key=subkeys[0] + name="a", shape=(1,1), A_plus=1., A_minus=1., eta=0., key=subkeys[0] ) - #""" - evolve_process = (Process("evolve_proc") - >> a.evolve) - #ctx.wrap_and_add_command(evolve_process.pure, name="run") - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") + evolve_process = (MethodProcess("evolve_process") + >> a.evolve) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - """ a.weights.set(jnp.ones((1, 1)) * 0.1) in_spike = jnp.ones((1, 1)) @@ -56,25 +38,29 @@ def test_traceSTDPSynapse1(): ## check pre-synaptic STDP only truth = jnp.array([[1.25]]) - ctx.reset() + reset_process.run() # ctx.reset() a.preSpike.set(in_spike * 0) a.preTrace.set(in_trace) a.postSpike.set(out_spike) a.postTrace.set(out_trace) - ctx.run(t=1., dt=dt) - ctx.adapt(t=1., dt=dt) - #print(a.dWeights.value) - assert_array_equal(a.dWeights.value, truth) + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + # print("W: ", a.weights.get()) + # print(a.dWeights.get()) + # print(truth) + assert_array_equal(a.dWeights.get(), truth) truth = jnp.array([[-0.65]]) - ctx.reset() + reset_process.run() # ctx.reset() a.preSpike.set(in_spike) a.preTrace.set(in_trace) a.postSpike.set(out_spike * 0) a.postTrace.set(out_trace) - ctx.run(t=1., dt=dt) - ctx.adapt(t=1., dt=dt) - #print(a.dWeights.value) - assert_array_equal(a.dWeights.value, truth) + advance_process.run(t=1., dt=dt) # ctx.run(t=1., dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1., dt=dt) + # print("W: ", a.weights.get()) + # print(a.dWeights.get()) + # print(truth) + assert_array_equal(a.dWeights.get(), truth) #test_traceSTDPSynapse1() diff --git a/tests/components/synapses/modulated/test_MSTDPETSynapse.py b/tests/components/synapses/modulated/test_MSTDPETSynapse.py index e1c7ce36..8726c5be 100644 --- a/tests/components/synapses/modulated/test_MSTDPETSynapse.py +++ b/tests/components/synapses/modulated/test_MSTDPETSynapse.py @@ -2,15 +2,11 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import MSTDPETSynapse -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -import ngclearn.utils.weight_distribution as dist +from ngclearn import Context, MethodProcess +#import ngclearn.utils.weight_distribution as dist +from ngclearn.components.synapses.modulated.MSTDPETSynapse import MSTDPETSynapse +from numpy.testing import assert_array_equal def test_MSTDPETSynapse1(): name = "mstdpet_ctx" @@ -24,30 +20,14 @@ def test_MSTDPETSynapse1(): name="a", shape=(1,1), A_plus=1., A_minus=1., eta=0.1, key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + evolve_process = (MethodProcess("evolve_process") + >> a.evolve) + + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - evolve_process = (Process("evolve_proc") - >> a.evolve) - #ctx.wrap_and_add_command(evolve_process.pure, name="run") - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") - - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - ctx.add_command(wrap_command(jit(ctx.evolve)), name="adapt") - """ a.weights.set(jnp.ones((1, 1)) * 0.75) @@ -59,28 +39,28 @@ def test_MSTDPETSynapse1(): r_pos = jnp.ones((1, 1)) #print(a.weights.value) - ctx.reset() + reset_process.run() # ctx.reset() a.preSpike.set(in_spike * 0) a.preTrace.set(in_trace) a.postSpike.set(out_spike) a.postTrace.set(out_trace) a.modulator.set(r_pos) - ctx.run(t=1. * dt, dt=dt) - ctx.adapt(t=1. * dt, dt=dt) - ctx.adapt(t=1. * dt, dt=dt) - #print(a.weights.value) - assert_array_equal(a.weights.value, jnp.array([[0.875]])) + advance_process.run(t=1., dt=dt) # ctx.run(t=1. * dt, dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1. * dt, dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1. * dt, dt=dt) + #print(a.weights.get()) + assert_array_equal(a.weights.get(), jnp.array([[0.875]])) - ctx.reset() + reset_process.run() # ctx.reset() a.preSpike.set(in_spike * 0) a.preTrace.set(in_trace) a.postSpike.set(out_spike) a.postTrace.set(out_trace) a.modulator.set(r_neg) - ctx.run(t=1. * dt, dt=dt) - ctx.adapt(t=1. * dt, dt=dt) - ctx.adapt(t=1. * dt, dt=dt) - #print(a.weights.value) - assert_array_equal(a.weights.value, jnp.array([[0.75]])) + advance_process.run(t=1., dt=dt) # ctx.run(t=1. * dt, dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1. * dt, dt=dt) + evolve_process.run(t=1., dt=dt) # ctx.adapt(t=1. * dt, dt=dt) + #print(a.weights.get()) + assert_array_equal(a.weights.get(), jnp.array([[0.75]])) #test_MSTDPETSynapse1() diff --git a/tests/components/synapses/modulated/test_REINFORCESynapse.py b/tests/components/synapses/modulated/test_REINFORCESynapse.py index b81c909d..f0235789 100644 --- a/tests/components/synapses/modulated/test_REINFORCESynapse.py +++ b/tests/components/synapses/modulated/test_REINFORCESynapse.py @@ -2,17 +2,12 @@ import jax from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components.synapses.modulated.REINFORCESynapse import REINFORCESynapse, gaussian_logpdf -from ngcsimlib.compilers import compile_command, wrap_command +from ngclearn.components.synapses.modulated.REINFORCESynapse import REINFORCESynapse, _gaussian_logpdf from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context +from ngclearn import Context, MethodProcess import jax import jax.numpy as jnp @@ -39,22 +34,16 @@ def test_REINFORCESynapse1(): scalar_stddev=-1.0 ) - evolve_process = (Process("evolve_proc") >> a.evolve) - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") + evolve_process = (MethodProcess("evolve_proc") >> a.evolve) + reset_process = (MethodProcess("reset_proc") >> a.reset) - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - - @Context.dynamicCommand def clamp_inputs(x): a.inputs.set(x) - @Context.dynamicCommand def clamp_rewards(x): assert x.ndim == 1, "Rewards must be a 1D array" a.rewards.set(x) - @Context.dynamicCommand def clamp_weights(x): a.weights.set(x) @@ -69,7 +58,7 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): std = jnp.exp(logstd.clip(-10.0, 2.0)) sample = jax.random.normal(seed, mean.shape) * std + mean sample = jnp.clip(sample, mu_out_min, mu_out_max) - logp = gaussian_logpdf(jax.lax.stop_gradient(sample), mean, std).sum(-1) + logp = _gaussian_logpdf(jax.lax.stop_gradient(sample), mean, std).sum(-1) return (-logp * outputs).mean() * 1e-2 grad_fn = jax.value_and_grad(fn) @@ -80,7 +69,7 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): expected_weights = jnp.concatenate([expected_weights_mu, expected_weights_logstd], axis=-1) initial_ngclearn_weights = jnp.concatenate([expected_weights_mu, expected_weights_logstd], axis=-1)[None] expected_gradient_list = [] - ctx.reset() + reset_process.run() # Loop through 3 steps for step in range(10): @@ -94,12 +83,12 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): clamp_weights(initial_ngclearn_weights) clamp_rewards(outputs) clamp_inputs(inputs) - ctx.adapt(t=1., dt=dt) - print(f"[ngclearn] objective: {a.objective.value}") - print(f"[ngclearn] weights: {a.weights.value}") - print(f"[ngclearn] dWeights: {a.dWeights.value}") - print(f"[ngclearn] step_count: {a.step_count.value}") - print(f"[ngclearn] accumulated_gradients: {a.accumulated_gradients.value}") + evolve_process.run(t=1., dt=dt) + print(f"[ngclearn] objective: {a.objective.get()}") + print(f"[ngclearn] weights: {a.weights.get()}") + print(f"[ngclearn] dWeights: {a.dWeights.get()}") + print(f"[ngclearn] step_count: {a.step_count.get()}") + print(f"[ngclearn] accumulated_gradients: {a.accumulated_gradients.get()}") # -------- Expectation --------- print("--------------") expected_objective, expected_grads = grad_fn( @@ -116,12 +105,12 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): print(f"[Expectation] dWeights: {expected_grads}") print(f"[Expectation] objective: {expected_objective}") np.testing.assert_allclose( - a.dWeights.value[0], + a.dWeights.get()[0], expected_grads, atol=1e-8 ) np.testing.assert_allclose( - a.objective.value, + a.objective.get(), expected_objective, atol=1e-8 ) @@ -131,7 +120,7 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): decay_list = jnp.asarray([decay**i for i in range(len(expected_gradient_list))])[::-1] expected_accumulated_gradients = jnp.mean(jnp.stack(expected_gradient_list, 0) * decay_list[:, None, None], axis=0) np.testing.assert_allclose( - a.accumulated_gradients.value[0], + a.accumulated_gradients.get()[0], expected_accumulated_gradients, atol=1e-9 ) @@ -163,22 +152,16 @@ def test_REINFORCESynapse2(): scalar_stddev=scalar_stddev ) - evolve_process = (Process("evolve_proc") >> a.evolve) - ctx.wrap_and_add_command(jit(evolve_process.pure), name="adapt") - - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") + evolve_process = (MethodProcess("evolve_proc") >> a.evolve) + reset_process = (MethodProcess("reset_proc") >> a.reset) - @Context.dynamicCommand def clamp_inputs(x): a.inputs.set(x) - @Context.dynamicCommand def clamp_rewards(x): assert x.ndim == 1, "Rewards must be a 1D array" a.rewards.set(x) - @Context.dynamicCommand def clamp_weights(x): a.weights.set(x) @@ -194,7 +177,7 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): std = scalar_stddev sample = jax.random.normal(seed, mean.shape) * std + mean sample = jnp.clip(sample, mu_out_min, mu_out_max) - logp = gaussian_logpdf(jax.lax.stop_gradient(sample), mean, std).sum(-1) + logp = _gaussian_logpdf(jax.lax.stop_gradient(sample), mean, std).sum(-1) return (-logp * outputs).mean() * 1e-2 grad_fn = jax.value_and_grad(fn) @@ -205,7 +188,7 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): expected_weights = jnp.concatenate([expected_weights_mu, expected_weights_logstd], axis=-1) initial_ngclearn_weights = jnp.concatenate([expected_weights_mu, expected_weights_logstd], axis=-1)[None] expected_gradient_list = [] - ctx.reset() + reset_process.run() # Loop through 3 steps for step in range(10): @@ -219,12 +202,12 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): clamp_weights(initial_ngclearn_weights) clamp_rewards(outputs) clamp_inputs(inputs) - ctx.adapt(t=1., dt=dt) - print(f"[ngclearn] objective: {a.objective.value}") - print(f"[ngclearn] weights: {a.weights.value}") - print(f"[ngclearn] dWeights: {a.dWeights.value}") - print(f"[ngclearn] step_count: {a.step_count.value}") - print(f"[ngclearn] accumulated_gradients: {a.accumulated_gradients.value}") + evolve_process.run(t=1., dt=dt) + print(f"[ngclearn] objective: {a.objective.get()}") + print(f"[ngclearn] weights: {a.weights.get()}") + print(f"[ngclearn] dWeights: {a.dWeights.get()}") + print(f"[ngclearn] step_count: {a.step_count.get()}") + print(f"[ngclearn] accumulated_gradients: {a.accumulated_gradients.get()}") # -------- Expectation --------- print("--------------") expected_objective, expected_grads = grad_fn( @@ -241,12 +224,12 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): print(f"[Expectation] dWeights: {expected_grads}") print(f"[Expectation] objective: {expected_objective}") np.testing.assert_allclose( - a.dWeights.value[0], + a.dWeights.get()[0], expected_grads, atol=1e-8 ) np.testing.assert_allclose( - a.objective.value, + a.objective.get(), expected_objective, atol=1e-8 ) @@ -256,7 +239,7 @@ def fn(params: dict, inputs: jax.Array, outputs: jax.Array, seed: jax.Array): decay_list = jnp.asarray([decay**i for i in range(len(expected_gradient_list))])[::-1] expected_accumulated_gradients = jnp.mean(jnp.stack(expected_gradient_list, 0) * decay_list[:, None, None], axis=0) np.testing.assert_allclose( - a.accumulated_gradients.value[0], + a.accumulated_gradients.get()[0], expected_accumulated_gradients, atol=1e-9 ) diff --git a/tests/components/synapses/patched/test_hebbianPatchedSynapse.py b/tests/components/synapses/patched/test_hebbianPatchedSynapse.py index d0997c82..4a33ae6f 100644 --- a/tests/components/synapses/patched/test_hebbianPatchedSynapse.py +++ b/tests/components/synapses/patched/test_hebbianPatchedSynapse.py @@ -1,19 +1,13 @@ # %% from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) +from ngclearn.utils.distribution_generator import DistributionGenerator as dist from ngclearn.components import HebbianPatchedSynapse -from ngcsimlib.compilers import compile_command, wrap_command from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch - +from ngclearn import MethodProcess, Context def test_hebbianPatchedSynapse(): np.random.seed(42) @@ -31,58 +25,45 @@ def test_hebbianPatchedSynapse(): with Context(name) as ctx: a = HebbianPatchedSynapse( - name="a", - shape=shape, - n_sub_models=n_sub_models, + name="a", + shape=shape, + n_sub_models=n_sub_models, stride_shape=stride_shape, resist_scale=resist_scale, batch_size=batch_size ) - advance_process = (Process("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - evolve_process = (Process("evolve_proc") >> a.evolve) - ctx.wrap_and_add_command(jit(evolve_process.pure), name="evolve") - - # Compile and add commands - # reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - # ctx.add_command(wrap_command(jit(reset_cmd)), name="reset") - # advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - # ctx.add_command(wrap_command(jit(advance_cmd)), name="run") - # evolve_cmd, evolve_args = ctx.compile_by_key(a, compile_key="evolve") - # ctx.add_command(wrap_command(jit(evolve_cmd)), name="evolve") - - @Context.dynamicCommand + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) + evolve_process = (MethodProcess("evolve_proc") >> a.evolve) + def clamp_inputs(x): a.inputs.set(x) - @Context.dynamicCommand def clamp_pre(x): a.pre.set(x) - @Context.dynamicCommand def clamp_post(x): a.post.set(x) - a.weights.set(jnp.ones((12, 12)) * 0.5) + a.weights.set(jnp.ones((12, 12)) * 0.5) in_pre = jnp.ones((10, 12)) * 1.0 in_post = jnp.ones((10, 12)) * 0.75 - ctx.reset() + reset_process.run() clamp_pre(in_pre) clamp_post(in_post) - ctx.run(t=1. * dt, dt=dt) - ctx.evolve(t=1. * dt, dt=dt) + advance_process.run(t=1. * dt, dt=dt) + evolve_process.run(t=1. * dt, dt=dt) - print(a.weights.value) + print(a.weights.get()) # Basic assertions to check learning dynamics - assert a.weights.value.shape == (12, 12), "" - assert a.weights.value[0, 0] == 0.5, "" + assert a.weights.get().shape == (12, 12), "" + assert a.weights.get()[0, 0] == 0.5, "" + +test_hebbianPatchedSynapse() -# test_hebbianPatchedSynapse() \ No newline at end of file diff --git a/tests/components/synapses/patched/test_patchedSynapse.py b/tests/components/synapses/patched/test_patchedSynapse.py index 8dd99d06..e9b96d80 100644 --- a/tests/components/synapses/patched/test_patchedSynapse.py +++ b/tests/components/synapses/patched/test_patchedSynapse.py @@ -1,18 +1,13 @@ # %% from jax import numpy as jnp, random, jit -from ngcsimlib.context import Context import numpy as np np.random.seed(42) +from ngclearn.utils.distribution_generator import DistributionGenerator as dist from ngclearn.components import PatchedSynapse -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -from ngcsimlib.utils.compartment import Get_Compartment_Batch +from ngclearn import MethodProcess, Context + def test_patchedSynapse(): @@ -35,35 +30,29 @@ def test_patchedSynapse(): stride_shape=stride_shape, resist_scale=resist_scale, batch_size=batch_size, - weight_init={"dist": "gaussian", "std": 0.1}, - bias_init={"dist": "constant", "value": 0.0} + weight_init=dist.gaussian(std=0.1), #{"dist": "gaussian", "std": 0.1}, + bias_init=dist.constant(value=0.) #{"dist": "constant", "value": 0.0} ) - advance_process = (Process("advance_proc") >> a.advance_state) - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - - # Compile and add commands - # reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - # ctx.add_command(wrap_command(jit(reset_cmd)), name="reset") - # advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - # ctx.add_command(wrap_command(jit(advance_cmd)), name="run") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) + reset_process = (MethodProcess("reset_proc") >> a.reset) - @Context.dynamicCommand def clamp_inputs(x): a.inputs.set(x) inputs_seq = jnp.asarray(np.random.randn(1, 12)) - weights = a.weights.value - biases = a.biases.value + weights = a.weights.get() + biases = a.biases.get() expected_outputs = (jnp.matmul(inputs_seq, weights) * resist_scale) + biases outputs_outs = [] - ctx.reset() - ctx.clamp_inputs(inputs_seq) - ctx.run(t=0., dt=dt) - outputs_outs.append(a.outputs.value) + reset_process.run() + clamp_inputs(inputs_seq) + advance_process.run(t=0., dt=dt) + outputs_outs.append(a.outputs.get()) outputs_outs = jnp.concatenate(outputs_outs, axis=1) # Verify outputs match expected values np.testing.assert_allclose(outputs_outs, expected_outputs, atol=1e-5) + +test_patchedSynapse() + diff --git a/tests/components/synapses/test_STPDenseSynapse.py b/tests/components/synapses/test_STPDenseSynapse.py index 78ac2e12..32607959 100644 --- a/tests/components/synapses/test_STPDenseSynapse.py +++ b/tests/components/synapses/test_STPDenseSynapse.py @@ -2,15 +2,10 @@ from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import STPDenseSynapse -from ngcsimlib.compilers import compile_command, wrap_command -from numpy.testing import assert_array_equal -from ngcsimlib.compilers.process import Process, transition -from ngcsimlib.component import Component -from ngcsimlib.compartment import Compartment -from ngcsimlib.context import Context -import ngclearn.utils.weight_distribution as dist +from ngclearn import Context, MethodProcess +from ngclearn.utils.distribution_generator import DistributionGenerator +from ngclearn.components.synapses.STPDenseSynapse import STPDenseSynapse def test_STPDenseSynapse1(): name = "stp_ctx" @@ -21,26 +16,15 @@ def test_STPDenseSynapse1(): # ---- build a simple Poisson cell system ---- with Context(name) as ctx: a = STPDenseSynapse( - name="a", shape=(1,1), resources_init=dist.constant(value=1.),key=subkeys[0] + name="a", shape=(1,1), resources_init=DistributionGenerator.constant(value=1.),key=subkeys[0] ) - #""" - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") - #""" - """ - reset_cmd, reset_args = ctx.compile_by_key(a, compile_key="reset") - ctx.add_command(wrap_command(jit(ctx.reset)), name="reset") - advance_cmd, advance_args = ctx.compile_by_key(a, compile_key="advance_state") - ctx.add_command(wrap_command(jit(ctx.advance_state)), name="run") - """ a.weights.set(jnp.ones((1, 1))) in_pulse = jnp.ones((1, 1)) * 0.425 @@ -49,16 +33,19 @@ def test_STPDenseSynapse1(): outs = [] Wdyn = [] - ctx.reset() + reset_process.run() # ctx.reset() for t in range(3): a.inputs.set(in_pulse) - ctx.run(t=t * dt, dt=dt) - outs.append(a.outputs.value) - Wdyn.append(a.Wdyn.value) + advance_process.run(t=t * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + outs.append(a.outputs.get()) + Wdyn.append(a.Wdyn.get()) outs = jnp.concatenate(outs, axis=1) Wdyn = jnp.concatenate(Wdyn, axis=1) # print(outs) + # print(outs_truth) + # print("...") # print(Wdyn) + # print(Wdyn_truth) np.testing.assert_allclose(outs, outs_truth, atol=1e-8) np.testing.assert_allclose(Wdyn, Wdyn_truth, atol=1e-8) diff --git a/tests/components/synapses/test_exponentialSynapse.py b/tests/components/synapses/test_exponentialSynapse.py index 83ad19ee..9217932f 100644 --- a/tests/components/synapses/test_exponentialSynapse.py +++ b/tests/components/synapses/test_exponentialSynapse.py @@ -1,11 +1,11 @@ from jax import numpy as jnp, random, jit +from ngcsimlib.context import Context import numpy as np np.random.seed(42) -from ngclearn.components import ExponentialSynapse -from ngcsimlib.compilers.process import Process -from ngcsimlib.context import Context -import ngclearn.utils.weight_distribution as dist +from ngclearn import Context, MethodProcess +from ngclearn.utils.distribution_generator import DistributionGenerator +from ngclearn.components.synapses.exponentialSynapse import ExponentialSynapse def test_exponentialSynapse1(): name = "expsyn_ctx" @@ -19,18 +19,15 @@ def test_exponentialSynapse1(): # ---- build a single exp-synapse system ---- with Context(name) as ctx: a = ExponentialSynapse( - name="a", shape=(1,1), tau_decay=tau_syn, g_syn_bar=2.4, syn_rest=E_rest, weight_init=dist.constant(value=1.), - key=subkeys[0] + name="a", shape=(1,1), tau_decay=tau_syn, g_syn_bar=2.4, syn_rest=E_rest, + weight_init=DistributionGenerator.constant(value=1.), key=subkeys[0] ) - advance_process = (Process("advance_proc") + advance_process = (MethodProcess("advance_proc") >> a.advance_state) - # ctx.wrap_and_add_command(advance_process.pure, name="run") - ctx.wrap_and_add_command(jit(advance_process.pure), name="run") - reset_process = (Process("reset_proc") + reset_process = (MethodProcess("reset_proc") >> a.reset) - ctx.wrap_and_add_command(jit(reset_process.pure), name="reset") sp_train = jnp.array([1., 0., 1.], dtype=jnp.float32) post_syn_neuron_volt = jnp.ones((1, 1)) * -65. ## post-syn neuron is at rest @@ -38,15 +35,16 @@ def test_exponentialSynapse1(): outs_truth = jnp.array([[156., 78., 195.]]) outs = [] - ctx.reset() + reset_process.run() # ctx.reset() for t in range(3): in_pulse = jnp.expand_dims(sp_train[t], axis=0) a.inputs.set(in_pulse) a.v.set(post_syn_neuron_volt) - ctx.run(t=t * dt, dt=dt) - #print("g: ",a.g_syn.value) - #print("i: ", a.i_syn.value) - outs.append(a.outputs.value) + advance_process.run(t=t * 1., dt=dt) # ctx.run(t=ts * 1., dt=dt) + # print("in: ", a.inputs.get()) + # print("g: ",a.g_syn.get()) + # print("i: ", a.i_syn.get()) + outs.append(a.outputs.get()) outs = jnp.concatenate(outs, axis=1) #print(outs) From 91cd96d04ec11ee94822266d9cc8d5f2f1673c12 Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Sat, 6 Dec 2025 17:22:15 -0500 Subject: [PATCH 11/15] update to rbm/harmonium doc --- docs/images/museum/harmonium/rbm_recon.jpg | Bin 120969 -> 119420 bytes .../museum/harmonium/receptive_fields.jpg | Bin 307653 -> 320234 bytes docs/images/museum/harmonium/samples_0.jpg | Bin 102083 -> 94571 bytes docs/images/museum/harmonium/samples_1.jpg | Bin 112003 -> 94856 bytes docs/images/museum/harmonium/samples_2.jpg | Bin 113008 -> 92862 bytes docs/museum/harmonium.md | 82 ++++++++++-------- 6 files changed, 45 insertions(+), 37 deletions(-) diff --git a/docs/images/museum/harmonium/rbm_recon.jpg b/docs/images/museum/harmonium/rbm_recon.jpg index 4bbce8837931de9feb0d2a41628929d0f1f8e32e..d0033939dea6426cb4587e6e79c432aac163883a 100644 GIT binary patch delta 85526 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Ǐ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%0Df$c=D%Mful7AJ`5ZeX8BX59TvA_ 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 F{|9$gt~LMw delta 86130 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

pRn8zt?;Cs;0U0Xt z5HhtdW+%79eSPJ3Ilwuw8F?mM8F-&V1!(Ti;k{?I$`J@&ioim!8op>4EEjFhVI2T>ef>Y41$szza0_zAQMI6~7j~OD zS3KjCO#>v6_c!CP{`-MHQmD{xzMt?xr2p+GS$lQWlHybY$@^-EiPKOS;~mZEBT8dN(1 zXYTjB&CjLV#sR&wR>Ugr6aZq?PZJ)Ues5VhIRPO0d#Jb4+<&U$@q&~pcp&_c+O*+x z9C#DeITCiU1jT%;9d9!bq^$u+J$xNoCmKx4NxUEdApcF_IUKO+$VIQw_)assf~A-Z zQ&DlMeoDa;agul43vD0nyge3h5C5+7D@=hydZX%~haSJz28Ii$VtcM9C*j5q?Bi|w7i6kSomA<5_HSrtFvkqGZg0-Hgo_J)*=o#=roy!y zp3Jxms*{n?W=*rFlE1(zGPio)_nI7Q=B;;|_gx!z<@>L38*$mp3Ixp)GXGDNDNuLE ztvv#u{+f7~X8`jQB3yaN#>ivU%U}_1u3Ytsv0k>PA9FHoKOvuD<+Aygone?O?Fk+5 zAq)wTD7w*h32}D2XdJH2wR$r?Y%uX92UHJ>D;&nwOS)D@Q}ZO29uoZ!B=K(9+G#G9 zmIQNaSH!0aPxF+~^s3t7r_&PJ-urX1idvhRoy7(TnRRcS*z5WVB`PD8l|*>@Fnf2j zWLqWlOI)y*KG!t>X$sa(t>9ZB4D=rzS^fLtbO*u`?xp1}qv2TL#CUs`1ErsZ?ODVt z!(9xfrXg$EPJXO86Y%jH>PR8$e%r52{czz<%zAim9ec}8jlysjFa_}g@BLdZkU!T^vfV19&S-ldsINN~#F{<$;&rrTF;VMWC6QK6lAF(x7M zK1wmkNIEFNbMyCi>?n%S-vZ?L@u8P0yJ5FqL{`0Rz5{dKQdgPu2&6N8Ie~hr`Gjht z9IL@G{Zl}H7Ui6V?9W7lUZmEuv9h$1QpH5R_bmp=nDtP`^8Gn~(hiY|$OT2GQG+iE zu5wVbH9rAvbLTt>cW0t~+Ix(XaoBD{)6uJ8N zV0O!cKQX+zYx1LvO@JL|(#2C`I=oN0q^<(~*nPzEp;TleqSg&--7tu0yIeF`bZnhf z>wvD0_k@EE2wGkKLd%tb`>AR!=w96E`3Gg~dL-a;OgMI~iW0H|x9U&-{9QRiY^yCL zBhP{V+!%1dGIM_^K!b@~%{gyeYK!%Q58oWa=0EvJFx~ig+taL?DsH4Eo3F|0w*Y{} z+un;YNU&l?O3VjWWleKVKa<;q7IoNeY3ZapW~omXeKN4V(ph%mloujS@OMovd5z_d z;cQ5msIj^{uvpHYP9N358vL=pHLmX0GZLQ`<2`QB(v#nE=Kd`diH8|*c{MDNe>X~l zLM7xq8G}UGEzrtCJIR;o`GC(gP@9c{m~{*?C-6Jq+8!qA?kQjF**CrKFUoSR`aa!Q zMW$B3+Eu7C2z(tf;p2I_m-h;3YoC6n85z%CPdr2iw2m>B>)Q$m?Z^Ejl09+HxrKb@ zf96x!Dy!l^%|3}1eEYh9fjr@4YFo;+AgiJ~uVawrdZlM4>Iu{69xE6cl-fo6=;pi0 z;QV2?Cr7(p9|+_#rB|=NmHUSC&S<4Ke5#oCV+*UINmUi1EWvnP6eC=TafZXs7O(NN zIBca4u9zt45!2?3AD$4MZ15aXyq;9#SfQc$tuk1MYk;k_43J0DLO0wa7F6q z|CXZhTbIt)o+2QX3_flkg?Fa^Q|IW9$S#T&{Z0`6_<=Cv=e#|lJF7K0oiNwttxF@u zey-8G=K5-EdSyCZ42K>5YiG-;y9>QzA4c8F#U1(P>~bt7*R4AbEQ+u;ph_HQP^H+fZ~C8XH!(|A$h7}^&r9lGZ@PP62rG-IVpHohw~ zRdiJpjmL#?4q*_bQKbBBcSDoVqJ(D{p;=JbI#138X>yYUGVwGO)ya-ks>Irkim@;G z2C4)J{y56FVlW_J7IWT|OQ*iftg%K5n zY;z*|>{|ZPHc|;BHBEJcv#WA7n%V2krLqe8C#*Y#L_A#EJ(O-^8Q-w@**kMX@jtR} zsO)$M_&o72MmQelnp+dVUm8%H6HE!)X=B9&l$e_lFyHk=2h`0CzGvN9F4|v#6#l-9 zEVS39FEc}yozY_%4Ren2WWD^!kovj4_!-(;w(#pNXwLIeqE83#pbDOYI8ncy*;HS| zLU^?{7E`%RMV`2uyDDUfHu9)7#fjwUmo?aSVc}2>^d6`moAFFOdqqn*X`ajPmctL9 zH~odCcXFfC=$m|XuW?)iw1}xKAg6e`z}YU2S0|w8t?~@fukHfZJ$e41M2rpfVJ)sx z^qRQHS+P!|4bY>`DT*kwG{Cww6sFGZ&AunJ z#(Ri8H;CEclq~4BUoJ$m7}8j|eCtTs9kDy(^3yIrWUv%i?)Kb!6MuYRJ4G2C#G#`# zb4O?au)KbTn>R0i(RUWy4Ldo`b@S^ki6%zY`4g2C#eZ65IPeK>SXc)x-(qimZZ5cE2(OfAaT1czn z>+DxZGeg1#N$G6hcVSx+gO{}j6$xfZqX~;k%gh8z=e@>ek0mUEgIhnW6^?z+EZ|B! z8jIyB=iuX^H5H>p(Q$4i-n}%}J#7Ia5L6KwT$oEbE&J9PWdNChou>08qA~S-Z-X7; zBT$uy>wDvLPWh$!)pG>!PRSen#dlRsM|>(h75Ry^*w%jf1A#}y(q-Xxto>JLh8C^en)I`o8sB>3v$Nr(I&AEY0nB{nnJt=)3ED*8Kk+0#O zS?yO-qUSA2HdYc-uqq>3H4@3F(qYhkA1LmZt7~_%bqlcXs0Av5x!LArBL$SRn9{8_ zd{J9kS~jdvt`tRMIarf^+9$?h>6#ZNf#HD_b#6wWl}e@gN33Dqcf2bvR)lg~kHbUy z0MG=;d+@WqDWPcE1mxHkaTHPYDW13nwO{peuSI|`7?Dilk0N)z9H|qx{FnG)KFv9eEm+UP z1|EfG3miPVg;t>zI5bg5kNOkD1}qDr{&x&%ExxKaDwPl>D_XX@l&*p)rK$35aurq#%a%u26C~qEK~Oo) z0fta{;w4jV{rNX=k~9A}UN#~D;u10S_lNZV--n^~92B^acMMZriDQK`tpS)kqr zYHk+4o-6lTZ)tL~>ksS-?3h{G-z{S+)qcc3qZFuiP?;F_%AIs?IYfMrV^k$zChcCH zxG(0`Udq>YC+(--JETgse5j%%nWv`WLI;=`e?G;Kn&`P{=jxaew|Ngvg6a! ziZJ0j%=dU`b`uqMR0_VY(qPc4CVNl~BzbxkTD`x^f&TTU!rf)B8MiSea~rG9*>NWQ z{lbs=a{lTC`HStXlXf-io&9IIz0Z3`!Wdbf2Jr}7jdira2>M;~aQJwibe2|D1`!HB zc%g^s0mn02w%l80O`4gS8;bKJPRX-quCvv66@JG^la;sEv~55o%i?VA{}$vuf2cE$ zrT=XO7f5)#OCwxOVCYBER={uUjm(F(dIi+Mjd`{<2s^%$iSujI!Vnw53{9`>sN-v2 zoZG>CW{=t%D`tuJgY71+Xf2rq%qmFUVspbo)mfz4KO;*>8&|;>s(w?4sYG|FqMVXZ z=JZxx^dQGc%MPz$thNuTd=e&aF-Ry(q!j^xwalTq@pr|DmTE;w^+b;q7v9a(jSYqE zz%G6Mt4fRRHhk>F@4Ja`*>nT5dV|*=WL*2~x6OO^JoLsVzslc36Hcr_4gQ5@K3kW- zGvtY;_p`e}w>?TL#n$*vKjnZ>Vm0D{%&qU^cOgt3}2us2mB$GKFrWr{G^B)u7Of~W}=1k`G zpBjbTx*j~MFT2;Dt>1Ubvy85W3-(tPN0XEhDrHB!0L;vylgn}bjNhHTtE^fvbiO;9 zT3I{78etnn9TVrC?`yl?zPTbiAsk)b|HSEjdoAP>0Bma+T)to=xG7AMZ=LFl9uzA@HuHoBKLFtu_kAb!X`Zt6HK9+dOgVSA@UpE`*`(^Fb z-1<_XW9byt<#O*j(P(YNDa(rPG=@kspkL*W9~2moc+|oSZbm zlR=oD^S?9lj^;}nkpyOe5*+VpbctJ#vti_<%U7F7mvfxNt2JS@hK15h+B2oYiU92{ zJK{8IZnCyVa`;rcWOs{^vVKnTkL3FMSOmr6aV|-T zMS`s34Oh)2K95wtjkxGt=MV$5tnx232L+cN(Qm0isYjSpHuG>daOkef7xkGmJbeBS zwx1ie4aO(y+!lt_{4A$yG#emGTQaJlzA>|z-&{1h7bjPFpT$_*LD91#-_&UD(8jal zkLOE03G|5RilTA@b*n~RT~c|-M_H@V_<}CeI`vpr`g=+V9k+fO>J=v1$4!hpu~Iw3 zyik4S%*wXYVK4JSO2sm-W(fnDTd`k={0KJq0&odJ8uJb(&k12`>CUr+AoJI1xUs5U zXHKBXMZ^LjL-)nPhcr%xfXEGFR7J_>V4Trim1(C$lJ*r7I;XAP2gk@h2G z>$vb6hk0%oHF(|LPS83-(SZlwmKS84nG^d(3jL#H^nvhTynNZVtV}Yqu!;QRbFDnv zq|W}!A`~I#Xxfv=kNR(Joyu!yzyoOYh9m%K$$7;(vrMzRESyBV2NF9L{p(x2MSYj~ zs%0bErKh{fozu)>?c|PS&)l2?rc2KNC1vYYc(LbJ&z^IygKYO*u|q;R)#zuc{1$)A)9 zwK_8+bms?bUreOx%=fCCEv%q;6tK&ap^ZTuZCz1xI3umi`L^d~1|t2Nq$ngb zVtl}pakv!9`Eq;F?w2@5!xfdA;<>zHbjU-YL-c!?k??f2QBLL17ZdJI zmsjK5r%|?a@9ZU*Gvu|U=Wye<;;jEI@#jdv{+8;AxCC(l40-5jX(3(x4&2T_CtAOb zyS?G?#T*=1;ngmu_DB@- zD9Q9W}vXT;!-^P$&8Gl9s80p5d6c7v>{zEYAM)EG{ z{u2#=nY=P+J15?l$rr`8Dm4W3X)JVx`lxW6x7=Zx1})cYoBJEVF=KCn?_ypMYCpiK z@wq35izyf#Xq&3BDZA47J^E8W#>TXAkbFkRYx@1>L5km)1Tnr<#^U=KA?a*d&+_z@ zNFEG6h1&o2%$d#3eps(Wd%KBPPE1~XNUH|Hf-U};h`>~AA zq25piF+`65sozIUj$eHh|69S=K3*bg3TKA^a@O2`JI|FcB4gBJsY2;NfUHYG9`gw{ z(-nt4{{bQYJojsa<)MOB(w2&WhkDyi&Bah{@W3%|W6mp9<`Y@kQmLQZSDB!fJo1j% zNRPdPYB2w;$W$fG!DZYk^ZU3B@9qb9Zi6%?Z4`DoEgYJXV2;Uki{>G-!{NeXcPYZ$%4G1120X8RAY`vcZuDajG(3<7t(G9F+_23bPOxCA_J=lD&AW2aFWlK#Zzhj<#0= zP#)HE=y3dH+-Oi)Bnu*NzRvyy$lR`u)7*w|Ut|yC`+*W5>(k8;r6f1t^XN|dT z0A2_h{bN`z#QDaQ_jmX=LilU22LCz6kniMNp~X39 zhft>%Uc>27KF?f2JA5^U&Sf&I-e}5}5?MU%&}U2-Roo7CdXy&tq6K3?_==v-;r;pJ z0vWaN{JcCfC+|bYrSYwex8r(X-gKc9H@C`o?9(__8sEr!tIRw|(*%aGIr(ua?nirY zsuz7rjW6BD6&KP-W&M|Q)V&qAkPOh=jK~1;4>MlD=5?2(^l9?GKOduJq1JPP zjKz%F7xOfq+lnc^xz1kp6me&1Du^4u{t4V0qL;=F<`G$i@6Wma?N-O5 z&>i`#AFo|0u*lNFxv~^x)tQ`&jn_J?B@X3JN%qZ9B4D!N|9DjTS%ejikq$g3{ zQ{kGLsT$hf*m*|b6+Ot1$A#}NhucOW7%e8Uztq^zE}rRaL$r>)z5%lmY6BlR%#ODNj?M znYLx{d8!f}3Hym~-qVwmt)!92iB!x0yW3!5xpK2za#X7X$I6sz|%ZNGj) zU)Sqyainv-2)iKSw7xt9`^9U{d9Iu{k37xiYQ_GyI8Mn}AA-szbS>s;L1OX}qIKRM zjx~#FO;u4>Nxv3|H6u=}+S)ZQiX!3swOQm}soHgwdjYi(5+;p}%Qn8ro~CSG)38*{m>WaqCASN50m?Q1iRw zMv%w#`93dQ&`FdWu-N+Jx3iN0in_nM%rgB*8mIGrjqNL00vitbP3KOB0m+)vx#986 zYdUk|N&^9jKoZn|B@9!z*8-RM;pJzT#$?T#F>4T}Hr|T^rNOcm4VgGzks0TGY*nF(%5z#5?+Ab|_U~Gdk?tiMclmD@JmLcS7k+-H9pa_R`Qc| zl&ebni65Dtl?#fD{*oiGc{Tm24{M2>wZL3#7?}~)<2jC5*f5lX6dKXc<|20Ter)H9 za5y{7TNWNov(@n1%i3fS=o=Cr;x7V&KkeK`Lp0wX#>3-PEK?p+3E1~qYa~xJtd+fU zVeFH#!kZSo|1z29(R6Kn4R~zQICm5r9(R0&UCNVfaoVD$H$@F;e$2 z{TIoUlW{0N~KvC z_qAdg!_NJL)>9Jc9A1R5cH2Td*Xg4CZuL0^2>LSpF-ykk<5^zj4G|18gJI({)~}(^ zTuAGfMtBi{i9=52e4m=V4{1D%c z1JZd*fjf@(d52kW;TwJ*Yox?E8KrDVO=GogVeWpf>QBdERL8Zt!p;#Rj+hD;D=gEi zAZat#n%q2lAThjqu(1p-LO5;H81;S}ezwri>}M1OWf2D(6w`l-+%NjFoLi&{9Bv|! ze9?{{Uv;HhV zSTJ-Gmaq61nxD0T(BXtO;>y`9pU$uBK6#1h833>fol^#JmCOn8O6VOCh=17~G`KOC+8LO8f1&0Wc8CYI(gr+HpYA|0Cv}_qBovLge43B*C&*7K zL4*Dc!C>m<3!Xoh(gXL`80P2|;S8a3$4(ddao@<_8^flHj-d2*835o&$z3G>VPF>0 z7#=+Y#&dt6g(StTwLJOU^tgx7qFFRO=wjrUa24b2Xa}-+uVJ48P@1B-lhe+4Lwc!Z zyl)j!rj5>EHvffY7(vo1jP@5A8QiTxRd^HttDm*^P#6v8%F)A|=@2IWMG%!r;QpEs zOf_m%=9#TUpZA_zpPFN;1-zjBWergg;4)WI+e&(9VU2fP1KH2p>c`vShFY+=1AoC> zXCyt-*)ux(`;q)@lPj8(f1xcX!Ad-8e9J`HWN(j4Vfvq#AdtRb{wxVN!3;`@QTC_| z(3zj-ztQ!wu_$s)Qg|<`n(hPIecOLczV-e>(>LoGmIO_OM(_-=Hjwu-btlcEx*QE{ zZ;=_v4YhXPpRWCYFbjg-;;t%NdL%Ycgqj0XYn^lxtNdW^`!HR3?T+A`0%otSWuccf z&TINa9W%!Tt`1vAO+{55*LK$XSs}&L&a2e|-DfRl_g#ish%sq>k8TXBpr9sEESV+m z@=b`qv$i(dpdGX(sqhS5LtS%Xr_N-7JLm}b2j!M1!qi9;^6#2NN#o3hleBF3d&Gp6 zdp?MlvWs^NLvW-8cl<#oqnrsvKn7JFH&+9b4x>jzcU8j$YME$e_*xYJ%vGv< zGv|DK48Ts|^&QEWvtRpIb0d;=P{6{77E>XUSXU#+LYdq?TZ$=_$g5bzQtq!yCh{H|I;Qt=uaN>ca2xik#*{HJeGxj&eEE7aB1_ zRL;QqM@a8mWt-PrW1YpHl-X`5RVgrLWcXs(e6_OQYEyOR8F{4SWmE<)J`o?skgBB{ z?*fnW*-%;F+7;W`#;FrnF{)3W8@`&zv?koXga|^0;WsUDG}XxRklddgr^@?avh&Tl zI_V|l4iO$+iXfq2N>x!Irt&Abt)w(Dh8av_-}^3E6YaBLMkXm`0c`b&CtwZjp$PW2 zrS(F?*p7k1(|SLjIdr>6g*6L}ga(7=yl%@3iXl6~6{Il}M6#+6i?%mU+v+-VxLWuN z%_<*7=rjbuZ+ZdKtD`~HiSM9xqz?60oU2APUHFD(q5ElQj{R|~Rfxyk)n+}Uo!{hm z6z~oV>Kx?E+$JaQO-a?zqQOS-H&DIyd}9$gW>Ga=>9Za!r4QVrCKSRi!_sCueppr4 zL27&Wi$%E zyc`A4)uk3i#Ee`YNcWj-O>s7_NbbAG2_xK_yCNoQ7DN`3kssOab}M zuSp|?jXUXBtAd_t!IQ(aI6$OGL1iWOT$SRwK01*(YEdQ1?e`oD)zbC{PzVneeQzsg z^^?Lrg`BKa)?#`&yURh1|tBc zU4G~Lj|TIzV(_-*`)H46x0%R-M1qswWZGD>5O?I;HT*uCJ6f~-J7g0OsBji$KXTzrEY zv`t<wzut#@|i zwBbD|<883O!0Gx^jg8TV+qsX0`vOXL%}ulRqglhL=Q^M_^CPZ~=N42;rTDYTKG8-_ zeh{j8Irtf~+r%B0{)jrTZB~E|bfk2_9+)Jd!$`d=yrr{pAlZB*x8GZ;q7pUT$wC+` zOk#JpgQRh%6S>ue8Q_RYoN!A--I72N=0C5JiLq1N?>wk}v7Ai-&GvYjCTpHudz3UG zBSdm+ZSA(H+w8U#{{v3}++Yb_-P0_>sfzxLHaSvLv|vN*TEGrQFS1IESiAM8iG z90^HR^uh`WSxMv7056;dB!gy}I1&b;>S{~8J39(4U`Dj3C|AI&I>8(C7k;73mn!1J zd;NF&mQdH+=PFVL_q8QTH4~L9{Cixz4W{8?Zw2H{@AoI%KLxT0QBT}MJ)zRdHPkmw z1#7H68Lu`w*=svD)2EDae1Tyh%?kK-UJ*|z#Omy0Nq4S$9_7Cvp~HCumVg-^u69<( zL;+ZlS{gtpS%ZlZu!8RmD{5sq*ROhp9nS}R;pL@8`VLjojuyYVop{!n6O=qt02?TP z?F}pY4Ou@yX@R-q!*bhFWG{Q^X%mNPAb9cXAZq>rDyS`3K7p?X{{imrL`rTaoccO4 zl_u=B3Ng(p=c9>gi6ct-!XiPs(Yr2JALcGe@-)BBxf&KEY7LwOd5C075k-5fpV<{x zPgOm@j(=#|nFHTPn9J0zUwVV>8vw>wGo1RD@e8BI<>c)4>q(=q^LGU_RT!4Tc06iI zaqEWrUO!vmt(jofH86WzP*!c6jFWlBN14+45WX}iX_@?+_%b$>Q!~Wwr^Y4~;rl3) z%4OB(hvsKzcRHg9KHrPPsh^uElouo$d;9*$n~~QbgN-$XHK$S%js^9fGN-_H#=t@; z_7p8$w>{;v*!1pfV8x)rEL_njueO=Z>xQv!Xj8lBs$=}1kpoLv6`b%F7kf3Kh}6y7 z;C%!U*k5_*v5~vsla-~ovqb#=CD{{NVrW@k_?i)eBIM>uPkX(1pYN|`6NvZIOiJbi zv#EXIL38Ge7Rw=*O>i5rsv-n@fP1So01B}L2nf0^k{-T5HjamEDuW>J!1wbD{Ona9 zvOo6GI?d0JWuO=69ly^!%(DD*L-tmga`! z>@jzg>o5Z20l|@=_MdFaydOVaqrmd7ftk7tVsDi3923SLRfZRu!TMcD;ws;h@#q{^Kt+ zOZc(oxa)zyjdLTsACxEScv=XbV{Mh;cCN?M8?ir|>y0*OeWFDT^w`8t3WgUse~g|5 z<}a3($1MsuI&S5&Bg2Z2C6 z+<8A|uQ7WBT+qWL*F_~p)Z;z(p(85(Ws}Rxi9-c=cg<+>qe0GBVVnthuxaZ#!+cU7 z15yWV47#{0&nh6pck@w;z0D4~Hi8lP(F`0R`>?GUa5_2V{`rycMcFJ*uV3JNB-A9i z_+kEUqjJ|!Ux7KniSL04sFIXH?ERY!;4p{7akYiFBU`RMt+{ttelf^q)s9@ENk}R3 zqT3)%NM6)5wJ6=H`Pvqj?V@Llwr3yeGahjbQbOk(XZ$}z#qG7(3AJOEGqDk%@l67&Ap0^!XW{ofnZ?_SDY&}Xy z_Y{oI6M*DrcMfv0Aa6$@8FbG@PPPrM{(KpT;87*F^LA~@Nwtbz&8B)|{y(bDGA^oa z@B1Jkf`l~E2!euiODRYTNH?f7NOum1fFO;4?fk;-aoQ2r2#hKQCZym-{!!e_uRT6Jwuv^%E1D>79#-E-*9n znSZxQ^FfHk!pVJbSD=E}mbW2U<^jUxi2v#$uy1jiB=UMRx>)x`ie7=!!7f$pNyIlW zJI*~kN!LWLh4H+Y@i5>zL>+qDVqh9<)%&9$49LpAWhmq>5i)Ot#tD!1oMAAvV+P^4 zIVbE&mgAVMxQ7rfNi1oca4kJe?t;|*xkF-`{N&^0)@M)>QQgw&=$guMV7?F-6j9*Jul{uoJ*&}M8xi4bKx0;()D$2Ks7;?nQEnhV=co&<)c}Ye+ZEnHqOngVG33_Q30ydQ(0! z?UEb%446TTh5KW4aFYR_iXR1lTEfI#eahPnL<+eJrX=h{Uh$&<@G_bF5z31I{+ z<15VaSxz`g56eEt2>`o^sj>_-fxuot#}c_&fw=-u3a z2LUy8?<8C-tn@TXHdSu9qmdj5odz8|Xi!0;M%+uFm{sZ_K)ZkGBUuJmC>x|q9qI~B zPcWOIAgPq!fXdgCK6MdLAv7IyDEHW);}v+)vjGEzMlbLXAMsXK7BL0c7|XROm&#;H z5+Xb%&9#cA{)Rs`e)TUq!ahve42h;o7_4N_+Wk^A+fOzM1n#Wt_E4!|eGYM3%!TLJ z0#4Z+Z?T0TBLK)DY_J*6v=;57ohlL{@f)xQ?kE#-ihBG9P=rK6@#PT&VDy>~P5!Sb zIZ$G-^@XO+=JR5{N3vC+%B+AJ!cDmTNiekH5V`xl(j8d@i*Q}O-fh&S%j_rstR!X7 zu}z;meC~eVwF=M=m9q91oe)M0&!X|P}C#ApNQ~Q z1Q3f`IM1fI3+FrEa^*mxqTcP377DtXj?rHgu2$L2Hs^}qG5*Q2+8JQy~m-U z9K2p!%k2ODWg%f8)%7>vseS;9o0dP|Js=a(4X{HpOx;eH%2Fs3ch3ZP+2y>;O{T}_ zh<21d6;N>`loxbJ*AOyesy_5vwFh=gY$NDC3|L04lJ|DzDJifk{>brIcXS9+pLcw98RFGq)?1+X*BrS$~`-`Ae=!@ zTyc+`+`7b%w2ilnj-k|z;v|{nM*ROM@F+7nsn?7Z4N0Um9Ct&H$bAuwv9~Vd+E=gU z%x90%bY%r7hs9mGV}v%?y*UR&j9I~NBt*EZq+1|%pOSA=(X)w{Z~EFDNY$Sj0M1UW zq8`O*O?j{gkfb;CN@yk(`q`KrvFo7zosinNQJ_uahzVH77O*Hhna}^^48{GKNo%0e ze{#r@BeHp9eSDGot0Y{;oqB@Q?p68Gp$*#^X9%1vvbS3% zc}U#lYw5R8bZ(5U;!%+h%AtO*-)CA(Z4|25*!H{90xy}6|!6(xK*bgGK6MwiB!cqL*!)8$rrYM;qr43(cF zg18C_Ev@LtqMW1=w43n!%h14k5=|V*QN0a*RU zj(tyT{VQS1*|!7TA3$QU&$31EUHVOmxW%SAy3IfhvNz=Wro#9>O?6-#h9TAdm2&+b zkHJ$W$?U3@*ZTdVT0k=6BrhiZf?tWax=_{s5E~shLF(jlhHa zEp8)PKSzdmtp&Mp2kvi5(4xjJVX(82>J&B}W0jm{=*rFoI+b@pmYqH&oI{}m6?U9o z8WM89F`Dez&3TrTTIq%p=z4H7d5r?v!wA`Aelxu&Pz{~OoNhHu`!!tj749pP~c#QYB5-tYE^TTW-m8YL2esk zYL{OV4g&(E?q8bg5&s|~Z7H`f4;GDaTYM>|0Ye0|P>I31|J6iMl=X8H* zrdXJ0epE}&>bKd*QjWbXbne*Yg~zR_n!hTSXR}E-e8#2srl+Kgc4Vp@*}2b#6zJxTG7m0$ z{BTgg7C}%+lat18*-sZLg0bnr#-7y+790{@q_{V4%)hT|0(8j87;c1mCnNi zLCa&v*}`qhqj=$m-si#Y6QIjjet~d-7ZP=Q%^rKEcfgV&!rGo#bAmpU<0)&n)DrR@ zQ&QQh`OI7tymx(?0hiEE?igFeFF!iI+)lP1n;7zs=^Ot2E!O1|WCHh^FRR-jCO|)B zAlLMCf4x?8(Dn%D&6ZH!=y~Mw-aD?99ExE{?zp^d3Cq;i@7cT#gaN)>EcgB=&Dbn9 z4UACjEu(w^kR5yO9eKeg#I8YFl)`(|O(GPKk{7Yny4YeUNEyt8uR2Ee@-;;m-Vo@d>}dv>$=lg9q~iOf(HY@;{~&?Z_5WtZ5#%Mj(M)~`mGO6N z`|`kEIr6dEyU{Q<-_WMYG#ZQ%Y1%_*U((8)Wgo5ABQWcd@8{e>x(Ag|b z1Xo9indFG>!+WueKyD*c$#lFq?br2VAG9)UXp3-~DP>EWxK z_a~>5Sw2C&*{|uuH>t7HlDV;B5s%;y+NkrAh%}^rCD8l+ho811^~@MA)*Lm(*ckbz zf^E!;_*t^PIvt=+2O(4Kl6E&id%~Hj6_Z6sceN$nmg9f@@S1$_th>3$*0J7XR%R*}VzOAx%wxtR=` zZt@xJ%;^7R^Z0`y-uX%1JlBC*oNfB7H0esX)HFyzB7=#g?1a?!QKd`Myg|O7_>F9? zyxSQ=GbWu4Tw)b5dA#1cyQwGYottV}kbP1|0p(}p6Uwam5NtHR$2?xka2+RZnbWb{ zXBNpT&?DO78(&Gp_hLTz=uKSk=!Z9-Vo_bPG)yI!A*tDJF(#oaIwxWPPEUOXqsXGl zjOy&18O!e5Dcu{%>_)|iIQM+Ua2gg*CvQ&+Aa1+n8PZNykUR~%=RsII^4b{ci^trE`U#Kef zVvTY4LDYP0adlv<9Y@5@o7@Revjt_ZwdV}M7w+~5ID#nj_?K zo>mF+GsG>sOTck}8^MjGiOstv5zw)JK~&hheRwN8#7M`up6OQI(F(^}5zwc22VDYasRrsn+!FGLK%H7EO~R0?M>1!}(~w6zzw zrcK^3&s1G;f!SejvyfeAso@ePR};MUq1%?q)l<0A$8~YWqIRm9oJyRb3DT%b8Myf9 zzTBWxdvacT_0>3YQ@TeL_viJ}C^`<<4G?~BG}(F;Qef2=GWdGYcV=6wI-WTzmgI$R z&1J-mXMU8sX_4_P334ke-h4>Oz$Dj=EHmy+?+w!kf(X*Djren$U|M6-ekt2-Lb$o` z=oKgifXBroQ+bI+AoOtZI^Y9LWCI*osoeH)D1{D9{N1Os49!z_fyj!MegahH=Z*>U zz{6$ZR*Dz5}`1KfQkeoLJJ#iWy!yI{~%btR%JyO(S(Q zq@%A+gwc*xx?Sj-n{pgcFFTLB6UlM)5|-YCVNN51UI72`_2HR^1!ZoFrvJsJ=v@znNm{u z@mSuTNWhb6np*_>kEYgR+wLcHpy>w3zr%2bq5f^LLF!OC;WY>M1i%BRD-HqYw5GmNN$7|-aM_0%rsd=Y}} zKKU3y2vtg0b7jk)#)A|$(nZm~5Yil0$Th3;#lIgkhd39W3$dH0iP@H`jMQjH)!!?E zd`$+`-mRC{FU+!XP%n^z!zGoWS_+Rfru58?+IUK-ZzdVer9ex1lmV)n zFh)%sHX{-v#ff_DC-bkfBOjt=SK2C{>srE}Mbd?1^?AW4f1VY~4m;Rfy473Vmw>jp zhZPDbjn!5}lrIiL3I8OYLqPmDa{WK?-}?0nlJ8wa-vpkZA^66BU&|n!+W|BT;P9bL zD8R(R+FUh1#R{7d~I=2PQu^$!;9t4FuR8xMZ? zHd8~*SGiMYCo~OKtmUC^w6yGn|Fqt>2gp5^uIs$+N)MJUZlya8jFroGgeW^W#b~Yv zK3oI4te$&A0|;!}DTfci0A}#nQNS_x*Cq~=gC{!J6)#H#P+RHq<=Bys%(eNDjXpsJ zP1$$~K2@n;_72)lE^Mn$pU$bHP=_grbd{rPd>CB%9ibUDzjDxiOi*aAXQg7@>k^r& zyNFPYwKXB{AF3d~iciHFUicMEm1)|}0!N`moBytnY-QP>tMXcs^Cp%&i@zwn1{V-$&AMN@Ph#R=Q%H5M}&)=)ZoHv+socZ20 z-i_t|Y5?hDTJiPU@anZzjum6VlT)W;(;ZieJd0gA@rQQAhzrVb`p9L;X*>4x^Vu>#A}}QUV+zq+*pNy5rHoP9NMKC}Pht`Z?`%@pm8 z(k1`k#Vm`xZJs8J%gQMUaCMm&$z%)l>~d>zpRD?v?pdgJD02U>O;*7Z0Boh`#znpz zhH^~}CVqeUT*Sgi(oT`qp3P+4yLg9A?I+|1NN4b~{8NK7DNhv$lc!q%Bt(lc@W)lZ6`9f%souCA;Kv)M!oja@C-OwN;YRSXlRkv|x;m zD)n*A{uvw|_iXwRJ7B>?`0lafnI|Hemnl{@5o=q)*6T_PwU-JqJKGxsBzH_5g%raO0nV%WuJ z5Ep;ha7cazGA~}+w^|peLC3C9)RP%5u?X?2zuD};6{;6$WTfNgq3-X!33Xt_U|v8F zcL|;T@SWDzpah%3z84$Y`@33hnOzgAbAKoi@Oc;GK_-i5akTH-c-K*`#xs(_bu;wF zHJL5NYd(J@|A2`NxpDNfFhEj|Zo~WY@#m$A+s#~m-IqLerbI_!-+Acg@`wJ{J{8Wn zvSK{^b1=SlJ~L>9dV9>J7iCD&NXJ9U>MB{QJ!o5uSRW^M-bp+llth{TN~h@W7@ml! zuD*nG@d(&T9UR2h%Joaf-cKNDE@HmlKyIJc2if!i8H<>}Lae8Sbmr&znRfzLMn&@P z-xQUDaq-Q6nJqC%E(7nJ=(D@}I=@R1xT$~4Lap-q>GKPB^p83NDeiN=qQGbL%qg(7 zA%d0X^_(4Ev~tew_I#qN@4mg}uz@%StqDF^BHLB&I1M$x`1001sj$V7vT`>*%)by$ z7EER{lVsm^X;4$RkKA$(qlJ`g)b30^1t!2^mY(3X)waObQ9leLcv8FI2+%b&OPkB`>-pJDx!N~<_rwHxjM0a(~CFsQi zkY3UaJ0k4Y;X5X|ou$>{H(1UQ`vkJYOCtJh9PBPGTdqJ_t$6M3}`u<+G+QOUU+}2o!_?3r&Z;gxW>8O^cj=-DbWbxae^9n98pABl5@du+aH;Sn)kuhh_1CCk~f`E{(N5G?_+INspMfLb`^ z{P?i0%e+8sFnaSEHKf1_MwtwUrE9ye*gWe}zA4uFJz|{^kKi#Ll!C(v^|pf7R;LNBX?+Q?(0><%;+m6Rq2pP522@rdfY@QSW6eJHw&roOsv4HFs<`*5BJCmz~Yk7-3 z7GYFFaYJw$KSjFdo0!Pa(GUtBv`D7a<-k8G{nYw^JXDHdq|PZ&)9bTO{8}Y5D!0X$ zZgB5fx{Znh$^KhQPZ{kky@TXT`+SKakCtR@UJk2`KZWh~}sP*C0V-_lT;2yXQsv0bA_=-l56^ijpe?A)({>MdC>`Je1S3JuJMxk{>#1uw6H zhMC_jS5lXctMn1zxe5(sk5sPJ{mfx3oV`xdw=Io9t^Pi{wW6LQBwJJ0{LyOB>+fYg zvsdZ{f?p=({{)cS2f)^6CDMg2?WQ}wa8HFZCfX;Z|5k~~xo;8dIXoS+Ch?<6!Fp41 znq44Ph>fuhCv^unT(==I_HBqfXq7UVB?*chqF_*l53*5rY=$(gP-%pnsgSBB3kt3h z=tJeWY6UEGwb3{OgKkysYINNLHR#F6+~cNdv^|ncgPzTGjPu_D(y+7+I!XO{_$kOJ zD6{QqVkG2<{Ls{ZJ#F=qEiol z-9s}LS<74&sb*#;s6PGSH&6m zyZtaL{ZuMdu3w`pnIvpq{gJgN3jx-`*+S#z^R}gZ)~6UVKO{sF+-@xB=NHzfp5HuI zXTj*1Es0+JX2o#Gzps~jP@a|lx3Y8ei(oqW*6zU-{Gi7~;NSxjFO1MfsI?5C{*M3Z z!4#2h{5)_i+U}-0A`L(^g5r~?`BJ4wv^r(_@X{-T9Ie z7uo)}-l673H|(gajH;hg$CNk<%JT9ZjXR-6S>NPVOP};o2r(JRT5?RQ#_YmSo~+@` zg;h5ixx`A;ma8YDdbZ9`@xiHJdeX&P!t})72{_;7P;~#YkwiMYRw;Dg>soI%pPoo~ zRvI+=@qz#=M?Lk@O`YTsQ7>9{p}iLgRMFkVYvyI>+*yzIxny&pW7f-LRHBm1bb9xs zi6#E)?cWU`aDO_UeJ9>&eq8(EIj65);F1DJq<}>JC7H_5r(7#n|CCk_<=l0I*D7#{ z;xqB`?7S*vwd|6gjrE8eov{KRAFb|YVSWRx(Cj03ZqeBiF&)5bMc>r4Ek2)jrRsvT zrN%oulJKw93W*{t(BB0hy`ZpjH!01EeAu;~`)7Nk-E?HfGv^Wh+NH^KS;qMfVvVck zcrZ8C%hPVY-Rk)o4G-&oknlDQT%SIXKzWEbS-{c6vbretU+a$uSMlbfb6&4hU?lac z7UI+zr@ZVWu|oFW*=NXoP*Y3yku!WZsk_l)Tba8sNCF!pq&b3cpzTOzHB7X-QAN#% zFg33%?twJJmc<;r`2uN6yWc&rT$J8V$9x~p)~-%?zJ6v#tA5=rk4 zh}$pcy!0n?a<%#hkKopHBS_XrL<;;#S7YoIzheK5*;O~k?32{D6nLm z|HNEAZ7R&9z6=<65N}@K0HZ^VM zDh|=qyRHkKPah1i%1{HKvBd^bcAqi8WZ*UVJ0$LW#)7 zfEtegMzyaDA@td%{Zcln|9siAB`Jut!)jfaOVspZepGTR!y zS4s=wPJGvWp!vp$_WnH% zU(qXX_b@k#3D}A*CeF(_UOnGtZXIosB5d0WwSlA(30iBb^Ssz^L`$W+*EzM=uXHvY ztS|1j{zZj_=;x90UVr)Uw`yHHCN%i-`Z?1t4_$zMu=W%Nd&lA~puc@7boQ@s62KxNmJ;enCwc@$BsB_9;stR z>iE3Jph~@}aSYc#$QtE})TyIr?jUpIDS6n14d3iGDH3S8tlX_Q)Q;0&X{&kZUUOD7 z(-CBaC%E__Y+ENbV5iTVz1Hdhj{d3N^J_Z#TFuEV#matq$zB2N=1O}TOc_`S_lP+! z4YSjSqXMR+uO2&|rlB3(22&N*7swzggzr)zzA*W|i5hT@=e_m@6H}Leo6XuJ+wC_s zC379CBvM9ybm%bf2}k>R(fh;9ZG@ZJ>SZ<6dse9GAW3gtzL(}X2zZ3b!?qbu=Hb&fUg}?0Ocih@2a=<7}+&xrgM!l`cw~#LfpO3uBW- zW*iSsRBdm%5ylO?ophaoO15XBh(f*EC80Om%#_c+ltqyx|3o|$^4yl*!PBA{{dGUq zZ{<;9ut&2@+}*&9FNQxV(-Kj1BmOMuYs$bh7b<547f2JxkKow{ z19tIpi0sbqUc8zf)kWW%tzE||Io5Z~$LuYXjSm4`WJN3VMp-SoNmX~JDIixE{(e#k zM&Zb^QB0#gD{tq1!!+groL(Afk!@edhOC}vww9~AKSV#%jo8XYvdM8&a6361i9{CZ(UL+jI9=>IC$ip32k-e%}HZ-yhIjC zpqi*tDDPyyA4_tnHVCCCtfR4K@6Hl>Zinam``A*ledk+7hjh=AX9|Tz8XK{8G952{ zoK7Po1=aH{vM##JCJ=jp#YvT)ItsGHG;-_uP78 z5m{gpGBaQFuCpwS;dG?hzE3qO4Nx}&@ooAiF{Kb4f{53-O&6JM(w%qabMl4 zL7bu~y3yd1Q?cq9X~6hURbul{^4e6%S*+|l4;o-T1b zox>+|0kn^y%Q;)&rggg2QJC)o46QI}i}*H#wtto#l6D_mnDB|T@56Jw#_Ifr65qVf zAjcLNk};=F8_rMPBsvS$nUNq20_lkixPROye^R(;ir(vz zCngV5=*opY=@s6HA*8I;NAzVWer9HxojuQ9=6h=KbIIlG;TTRt^LlPE&WII#UA-}b z_g5RwPA9jfIF@3jcbWuz8|W0r8=mHwRl&@h$5BuSqLMsxlT`ApTXUQB1<9U}7Z}w6 z$QaM%0?@Dc7YDo8M1biMzw&>ng8l!b3dR&*^biz&S2FBuAx>q{nK<(b82{zSbnj}( zkipH1#5Mm6dJXkobQJBW-G!2=bZJ|(Jn}dKp^$H?=WBSZ)bL$}V71V+^3v!;Y?W=zHmYb_hwqtF1OQM zgF3wK7Fr)Ijqk)KH^Q?$bVpsg-6bcNO6He8sy4o3el_$R3)4!AZ4xuFvhjRD_fxl8 zlu2l=N*e}cejpBPZ zSN2Wz{)i0LH9vy%berAfr+5Jg1IB!8(l>7` zY7e_0RZE*;<;94v<2?#QNBp_|9kR>xqmLz2y~#mphPFc?J0xgJIJFtnH$Eu^h8d_> z?Z%sxJ-nAxTuUK8*sc<${<8WhuRQt%`u32=rK-gMu~@v4Tn6edd_*SbXm78SW?rPW zP!jisS{14=<8Bf>wkEJ)*Ldc2gRj46Z=l?hlE zHJ^8p@HbUre5L7_ybwnqo{qoGmr!8K~V&*vnJ#OUlSC} zDYJtH|5V$#?Q(b0hfh}(Y_G<4gu3}m3OCDa?*|g?j_y?-rMFs>T3~8BN$(=I)soQV z`_`(WmJBOKV9fZeNO1i(n+m>)Wh2tPA+iuR4oLWEvCI{zo@w9vl4r!Zm!t<_gr?4H zL%6KCeWB~)jd@Qmsu^PTmGi%MpsCckOo%fQ+f0+VfoW^4v6>RU1QH?1Ogp_tBXl8Z zYL094VKt!IUW65@)gE2XdZRI< z6!VN;n~pS*KIVA6Byz>LSy;*G=v#r!IXZcm`D;ubi)@~h`g~-PvJA3;rM-Z64Cc>P zoBm3v7df{{3bU3AgL529m$(C%vNryIPlGM}t`LKRWLc;BrJ2xds?5*l_OG=Q#GQhp zl56#qH8+Xlo&qEAn0wO;zk+It+IKX$d6(Plg(lt=Z8WqkM6i{T;YHN7g_<>&wk4C4 zz$c8YJl98CXde|_COZS#HwK?B9G6_xZnU_CX&udpEu(f7?0uQ%Mq6EdxM6<-Q%cx+ z_Jp(IATji;RQ5O8$L_1jq4Q=<_aqrQGmiVzXK?eaYbukf@j#KIsXD4taaU-lPidoH z7=MW5*20p?T!N9rpyaUE9RJJ6-->6-AVuD+S<7_zKfqXOA80tL=o-+$%Kpl zAfe9>c~x_Irqey3d)Fva>5lknIC`Q{IG2EtCu{&+La81p)G))S=P zC&GUPB7ERV->R_}t27RzAEXq&JhT-#h@Qt@sK0gp8|8sYi@o~gUges~PbII9l0IG?b0YXT7a#P9dlBL*~ z?3LyAIwI+ho4dR6=Etc_11H2XKdl~)9`FO~(HT1#`dkamb{%tHqsTUbhhGQO`eib> zC{&tY*?N#g0f^tT4~m{r8TPDnhl()sL-l`HykXqR z{xtfBQhY*wcGJHn=&ubaQDQ?cffQ zIxM#=gPgSu2KrWG%b!CeC%Fzs^0~l&&;=<6Q38mGKJtHVG`pmvQBG!je#B8V4xOF@ z=?UdH9o?QoGCkh`{QsKc<&!@>b}g1XBv4XF)#)a%rcJ6*dBU(pk?%*UmnO2>wvD*1 zK3DSZ0HKVg_655Ta(CVCg(p`?KicD^=7oQ2o_&Zv;+) zgq}TTfT*cHR|zr7qq+!~Gr4=g6z-M`ZQzj4~Ru8B{0Ltk2i+4#QuB z4H-CsbtJof(VM#P9Ebvv6<-~VOHXN-pFW>y!)G8Ia}k8@1_s=)fkycWg;TwhMy{*k z+j)HLWc;%F>Tx62-K@ZO_aC_Q1@Gzc=SKa03guvRDTp}zn+`aj!<>{|ws74O{no9k-N|L-)pQfONal#{NaS<0qp?xvBko!M{3V~7gnJfj<4a5iGC5y@WSf>%3|@yfD5dqm0(`KoN?AEZ}p<8UfAE}Pm`+7h9>(ox4W z_NsL%I4I~$Wc`C=U@rIT4H!bV;iB{3|MO+mo0GQ4tJ0)j`OHlHZR5Vh?M~Jzkj$9N zz5`BVrESD~^XVzdZ(D!$ci`_?k@F65BWhCj&8780QEYqouLsbl1NdECN;X?>y3h*W zRk1{RbSJwEd^_~qzbU^xH_9LthF|V^SBnk5De?t)o6I}B&B;}+fn|aopXQJ2pjSQ` z*`ni#j~(*&uhGCrv}(ck$g!151p+;7t0P#Q_0O<5RKb;o< zieEz~#d5-U<2cuCtY93T0+_&fL8@Hv1K+;dG@JG4=FgPN<;Y1IWV8Q)(mYbNr2g`e zeNW-@2G+bR_RIyGD`&_-{)?p>Rmtlw#gMyCNE*h>j3jEz7Xwvvh#c@eGypMIPr^Y? zCm3R+56&NuF>u=pA?r-tJnRV$jTz2o!h9?m{Dp}zf$+Xd3SDxg?E9L!Ahe@j4m-8G z+6H3d-EwzCmWAu*o+zr(4`1o-i=2Q~{Ut5k$6?%c_4O7dhM}MA_>U0L=~z33k2N1L zE_$xstIPEu%aOWxrFsh4p4)mN_$0S%msI!QcH}uvj@Z^g>SH9g$Gy%l{?nqYQEJ9e zBp5XFli4(O`KP>enWhgo*H?VIVKRS0u|5(QNH(GYd=G*?O)E~CN2z%RGf2TURD?9g z>ifz)TY&6bmzl7VTFBBn1oPIr2*Ss|D^yx{=hS+0(JM2309cAZD0S#=<(PFMc`3Q`JNF9YG6%igs6&;#?w+HdHNd1I^i z!pq5}G8VDjFycI^+~^n(wyn%Djnx}8%|gFx7sx8 zLA_LlcU9V*$}WIEbQGY%n;me^o}1~K_?)`t6OP}=*Gu6d677VbuTF;TG`-`HuJ&?z z!MC{yI`$bsE<*Zo$#RYy`9?>INVFBR-`VxWEMx(k2pHH&P6|B0Chg|b4i*{B3~~52 z@Ck1Rjg(iLWhqC)*S8fcg;#A9K4xDZlZjrX!sT+ThykM)cuz?^4vpGys^Vh-N}E+1%;0`H_L3=<6z*}r+UK^r_z!>EFZhh zXrJl?5V6#V<;K0cPmR`Z&H*yYN+MIOB$2qPPj8Vy175dWSp^#-w_md;CYeu5sN^pF!)h}G5Ss$co;F)B0L6-fM|3P{` zd^Z?d+9)M>sP{9xPmr{P1UiTqLSNk#sCISf60)CexHfwQQno)G7jC~nPMFeK6^D3= zCOVmff}MrdK(J|QBJS=*f>s$t75 z0gMg7mtf`CXV!s*Ak77Fu(`|wu5Dm1K5JhyDYt7mo(R)a##k_YgXvzF1bS1^?1{^| zVZWGdJmiD5JAspDez9TVB_6aE+^_EoVzzr^bXwO#Ru*M!=3~;DJw} z1EPD39Tani5Coge4kOx$g)7=*uFBz@IuohSy7C#Px+2+rVSa{%y4z1T(!<)O8(?Ts z%^Q-}?jq;P4#lXt)B5PEzl&E^l0QbcQyu0<$)WCq-~`0Wn!WmrCylE%S08*9j1B*F zzSRbMU#Cp|PQ6EURpG36S1%5|xw2Yn`CxSq;OHkWAxpQi-AV?%KrzdL<@2jF#NSxpf1r?A@_98 zxFtb7(@mkReX#g%O9LoDmT;%G3_XdPBaYX=%Qj+2 zQBkqzedvmwz$fmS*CIzdprKw}poO1%?0lr{Xj{W?cb6d!weHJsmj+60&7!(+okWg{ z1YJVl zIUzWq{SmpYRu#m99O`Z-(p5%3j@ygT9kr{Lc`%<%b5XI~en;>kq`H1O9V&S(YmIhO z-^l&xhZ2pnn(7KX7mqF5r&IfTdweADO7X6St`6Wv4sueE{=W=PMF%2AJA(L=A$0Qd zPyJ9(Ks@0o7Jen4BOy}GigtTD#cvN9IA+f6MqZ@3tms}yDm}cIDa}dlRMtvvKxi7sZvytFcl~=#p~LAeGEBB6%Z09%W@^J6JM!DP3Cw*2mJwThlR#wA-P2@ zdsuO%6Q`+Ltbha1y-0-|r zyJHX%28!zZO+Hm`7n=VjU5tNrs7nzNOF_^VsyX6wann3nq{R^XU*Ku zHhi2P>WN%Tc=)nh$Gj{%mR>X5Fq_Ijy{;(1k^GIiR2}Rl04xp6`Wn~O(QOoBIR8aT zWQ$G+_1TB)birep5#!mS_nwRHmy@2^>EaL3!lEUCBH1-Uv`X5;rddfkR@c%efQOh%=ELXq@CHBo<@lm zToufwq2FbApC|Cted#!A8eg9m9MN;7zL~cnp1jF}D`IDoCdCu(LADeAK{^Bw;dt!Q z+_Ko={Yg`*qrLUXnR!2x+Q)Uyf}?MT4Xfih-ebB$_tmXGC+lEj7*N5~sSmR9(eIn_ z-kK1wnbfd-3ql`6K)|^$gdo&n#+94hX(Gmx2PwPHKy7FC5SR9S7}aqPgi})=>*Q*N zYFDI6OXn{^hhQ$`qDxXp+|uH7bigBo0Poc|@4i%8e(vBV>i9Fvn9u)@uD^_ns{8)O zVGtEDKoq1I2}MGb7?2zgX#tUvRzZ-V1f;Q*?aB1dc9Xjpqq)D@8LkyGdDL8AW5c5HATR#Sr|p&_MhJ_WrWIC zK!lUT=4b}DCAmW-mX^_T_q{K<;s%{ka25lkTVwBl6>%B-k4i)Kb4PH&+jJkJ2xpr8 z6vrhg_!(jSR9vi9#37kZRMx~CQ3{-Vv_-7XPwfc~jHEY@%@em{XgJuypgnk+h->_p zvJ@gAWh+(JQteaX%0y+@TN9XJE);;w0KZ7h)*x=N`5uzmyr`|+FAkmuuZ7a;(Jg(@o2&J>47&nd)#pw!1(*y$9|K~tFQdUROFdw|(v`se=p z=;KNKx&H=Y^Z5SmMVe|)=}>xXtOLn$|Ex>l@w#OGJ*lCXZ!X0rUQprBrWxy~ZVbaV ztHsDSAZCLI6kz;EzerGks2xP%KXV5SgZ@nZ2eOx8mhzc=m(75?rJo3ixF`dz-|^gN zeJjwPe=pO&ms)8(EOyma9dog`bN1RpW&GOrm?$ju(Lmj8GrbZ}QwKOl+F2ui9sLy{ zHQHJQ{S2i!lY(^;NN_HCjM0*C(iXOf1+#ewz+K*o9^)Wgu>RgS4@~%Keys(|d~iyv zQue4p1OUAT-tw;jbm1g$Sz!9r*u$H4bN9`03LZ=Q^&bFyJCg>Eh@Mj=6n;i@EA;)| zI71OqqhI^8u_!**=X1cXIi>A+dp{KOi)15Ai0CJhazHp<-T!^A4Q(Si(sGyb%_>-A z5GWx$-+!{fum=14ja5$(lKS3P)c9GFT{DXmXf33jH$;Gn`wJk4q6)n>g5JB9F=Ku< zb0U1zv&PyO{k$@SWn^sejuAoV0a!dM^xnlkYY+Y5wnQ|7ZDfH2ib#`y=&){;%%q41 z#KAtqGTR?|JpX%O-7)-U;x|lZ2v$4CM9D+ISEj)E`SJ zQ@6Sa&ljk`1KtoaK}Zc&{^tStyu8`Z9=A7L^^cTy&!I28+lQE^1H8gW3+y(UgyI(| z0(AR>F<>A8JKlPVe-BKgPpk2hFc08_Z$0laC64x@m$?8ZMGS$r7y*N8e+JgAtoPJ2 zUOAK22Ww0Mye-Z3rljN{LTM(@P*l1ADUTVHt(EEC<()<-|ivHYjMu;=Y1OK|r7x?1=@e{E8oVPo{;S9SVDA_<~yZ=JHF>K&QF7tU-b z%S)$iQ0b@{szu9(OWp062s)c57_Gd18vebc^`wPzhElh)LM=ODk~*R`vpm04gY0b#u7xtzpTs0D0K0?&nfA9iYUvh|G&K( zfk%S??$iR}Cwf%UdMXIO!*)u1s}y7>`ct;jBc;;UJuLsr9{+lVFjZyjSt>H?5u6*pI%A;CY?e#jG`d zcRwF&6Vy6EQ#B09=v57@AZ+O#o7Ilc&sSQ)J{?MKvuQ_&iL)Xo5k&PCo6qUUH z5NJRdF|UTek*5&oOic1>>Ta|ww7W>z<1AHy${dqI0NAvEnf*N~ygn?@`<@5;s_cjY z$RHqgZUfj$g@4XCVB#zPC-9*2YCMX=uUTB$GmC&1om`BR5iOwM#>k)9fgQ3q&-Eb z+o$gc^s%B($#_BAHaSjsYb@1$A^aK_X_8+k5la4#s`FcDl+-=}`bs={4S2M=4JuLh zeViVqzr2*wzV4y%_jUgz#OPh-Y3@9Sm6|TLK>W$Rg?l)?;h*TTbt*jC5b;|!z{=KP z$J!py$A+kHz8BfP;!f*8_z6QgU<2RsZ7^Sb4&kA~dy!5iylKf*-jn+HH|hRW#(uwH zZQlKU_WqcVH^v#^5ZA23f&E8AheNyRku18^tYLqXKPR=iqH1DZgQmvg$c_mT;~qe| zps`@A;rEMV;dkNRdViu#AY+`1IB%FjORp?T=Rz&N!gPsBt`epJO0_@v4sd?eTX+CA zR6sXNg%1Sb%t9ToF3DBKW&QjGq7p(Qu=2eW>{)%p^j$<4WXwZ@aEcGT#RhAswYOT& z=ncx?2uj%zCM3|6Nxj3_s{kS-#Su>)E4&pM;6~~lAS?MY-nu2EJu7|+qC#z;c+USw zbG_SB?*Dz~kLz5|#Uw)sqi>MySfaM$)&0OiAQV<$do(~ee0dG_LdE%QqvnzZ9#y87 zFCTx|U*&CTpRF@(K=1JUMj^Y9`;3V_owrmOqb4nC?upZJzVpoL{Y7so;gnJA|8zI^ z&-p^gDJrZRSckjNM^~|Z^Y^L)a}j@SWZ}OD(1jIi&cKD>t{&w))eNKLS6#Ocb~>4Z zOa_v}2uPq{cHjM@wH-4*F#1=AOHea&xcvC*t=ZQP8?wF$97PR9;jf3^W9{E7-0=QO zjr-r{%3JHuu@vE@J|Ol@ax}8a?)g^YHqv9rQBu4()B9kV!?J##&^+}O8e7iL?2vOp z0$)g+Ifo(yHwtwI0h0D{uz4sSoF9NbSJ^)EA9_3|j`bpzxqvF-OF@Lr$yg*`)bSM7 zD3f}NvseCyhFpM#s7wSP;cpo}6xDh{TF}8D7R%>o9*y7t^5|lcRxhl)tPo2v^3M_d zy;&$mes7i+kgW(dh7L1A9}(JVeR*WX(>Iy@i?9DxlXU5_8`q%^mr4-FG`;*UP5=J0 zn{hevR9pLz<;qp4yS^zs$1VWmlXmgEFa9~jiRbGnLVk(pJ>{6-&2Gko+11HjfotEl z@4lWE4yU=i^3KF?dM1K)5sA_ zoHAyhM>q-W>EH6x&G`rFyjsP9S12ezrCG)(rQlKyhI9Aj{|LhWr`|KCInEJD0y!8^ z^Kpm7+_C@)nMFk%s&-=EI^J?DY*O2|IQhfZ%O<0Sca(oV2@Y!0i{x%Cgtp=(fx|hD z09JTpMG{b(EeO3fj#yUH>Oh7#mDxF?N2^_dH2YU+fuUY*9{p=sK^J|=Us(YtPMEk? zPz1b7jrf;x{$G3crd6cJE9c9mxvr)_|7&CI*_Sc}?2X0#AGHbc-^c8{snds5zY5d9 z-SwcttpasDqIfmszt{ZtRTkFRMV}n?wQol{DPHx|8^%1!40mgeQi^6b8YU`3DtDtB6I3u*r>p#9<&K~y+*T>S3Gi!LB<4rJWu0qrIMh5^k?Rg!V2RVFpa z2WsedhK5mb73N^_4t9#jmk}|JjG_7Kasn-L_%*lmI|}n!QymUMCvW*7>aAmjt_}QT zU@sBMArat~o-%dVFy4=|vf=YulIgYNaP;q|f=_I9`OnoSDBB@P8)F~AL^he*VDwNMe72y>ezZPo9kbsPP|r{;Cey)N(jbj~LCgH0koEUvd| zHuE@Fxt&r{HoAm*|~=)pC?j1XZ)sIC5wa%I#N1A2XH2BmAdHxBvz z0r%ts-6&M1jQR$<|fXNQ>NE=c=NnZ zD&xO0yk{%%aF;>sDHTp}u)33>IUy$M7s=<9V_SW8PnG=2w#4Z!STn57I5yxTlve=M zLG%IMp2f~m;8M>A0=^czztItp?gcVNQ6_P-g-2Hk0Gc)g%QzG}-ln6(nlku_iB8KA z*}0m-9CeuR47Gk)>7vLZ9AiuW^~ZFJprc~X%#F<20rpA#cMQ0x4bn+ex!*$XlCga{ z(;!vMSk!yZr77>&5l2|eVAW{ zP4U62q#RXGil3U^w^+aoy+XRTY%HW)oH?TG5PR414^i^(Q$A?mPY!0iPC*3m)4vp1 zIzn=JQbMTBT3KxV*y|r}Yj!#lp$sCBeXu~!3IyjP?|hP=g$2dl2y1%sDkhT<$7~fh ztnQhb>j9Ub{qoZjr#rB6`!2=L;iVJ<+YgCJ^Hjc;ilAk=tPTFnAj~8aR{=O`qcZ}aH10b+;- za4z}#?U^-_w(z><8QMB@W0q5y!=r=VC?+SOgCQH|gMQTQ4CipXkdx*=F&%YPKOTN5s-j9i|ZF$9@Bopjt$x4wcIYb<%whd*_0_ z{}m@`-R#MizT!U3rpKvkyD{_Nwh|VCG)ijsJLNQ**vykS2O!Pvh0cbX>JEm+S=+qn zs0~S9;>gB&4rO`4dN!F94FlSLijiO4vp6W^*(wi{M$MgbO%QQ&Z2_=wW&xVrMCe{@ zioI?6b7_McGTHMN>gV@a_p)yC!FxRzDyYlupRBMutwGO)9f*HgntbVs^G#pC>cZUh z-qt>Iy3m|=p{2X<#+=)-+osW=|Moep6zwZ{t~H!~LR^o%2|13@pAMuDTIbGxr{lB*pabwgBY8&!C2@s&#tykuF_l4%~^eR%!iy1 z=}oXctJ-AeYEJ3BGS|v&Mj!S$OkeS()5a(=tNX3c)1`)bJMy2uNa*A6@Z7@_jof7F z`%C1JwxmRq$yDp5N%OCKwh{6U_$~m4h8-+&jbC`IOyB(41>60;oVA8U2OUr*p>tC4 zxzb+gi4>>wN5bcO6ikTm9vJy=T1D+^;6o3ax3%GNsYAVPL+HQ7C7SAd+GEM$~R;Ab8{cHhf(_CgRGQCWJKjYWlJ6rt&XjSEmR)9UP9(g84N&;bTD}`n-Z+&@hV+dU_4bbxfkIU z-a7iZhsZuYVSjo>nPG#gqE3(Zrzw{q%R);WZRv%Nl#0*4WbeUU0F6Q-H~ z6uKQpIu8Fmj5G%AZcjD*LB;QdJI8QuT~P5-%W|vq4}~+E2C+Mv%-FMj*srI)Ju@;( z7Fg!q&-0Uxk=Zco0ec}z44}=iBKC~kL%hdl>!d-e-6>)%6@U=rk15X~>+b(D=zV4( z@z!0d9FdvH9Mwgk$Cf#p>LFr5jY}|t-sa)j$AWuHqh+>Uuou$;Vd{!FX|%yR)v~dw z&syV-vU^Bn=(26SyubvIM(DD2>>z4HvR960q2DVl z5Z>LrX|g!RH-?63De|J4XEz)w9P`!uD(8V5iiZXB4I_ZBCl&g1O{pWm2qQ)K3P0q9 zjScFr?E(sw${ngi$dv#{NWZ6Go6iBm6h8kXv~4xj?0OB=mEBBvknq?_^c(m#Qh|LK zk+n-pJ?#971K#q5Pp0T0VuBU*)M5VfU8=@>1IuqePMKSab~0|9q*U5m<+l539uc`)SH?dthR2CU5Xw#dP-KbCq2*x%9$;BXT}0pC?HJr zN=;jwQCE_rUJ2h*^p=G>UZB&$sd$Z5`*vI&A4+$VfUIO7`e1~FTAX6f=qSIYZyO90 zi|ySaKkr?Hr~>s650k2CnVgoLrY^$fVdMl4Q0ai_FsDQfc*y|Cw+_Lq9wz}@cH-p; z%c|2BVXlDMW(Gwn(PKRa-@EGOqD7`~OQ6KkhyyOf)m|WrO@KU1Vw>zOnog;OSKXU& zDz8hXm>#jCsoJC8%M}@Q?soYQOfi(bc{pHynh#rdq}!27LfF)?H_dc5;S{i9)Py+% zk!7WsY9Qr$hIOs)IUb0|MLEsW*_{?oL2TtruHO7Gk?eiJ;qoeyKZ`@iPqds$N)SG~ zYPaEY#Ns)y6Vvum+Of^8P;bi>A5v}#@Q5$uwQLv_Lze11x%|=d+Q2>mjCI*ozkfK} z?gcgrAFv4m_Hn_mJq~4?Tq7Yfmc#vY0|{r(9dW`Z4Z@j0+QBrwGh?Ro2hwG|RqymH zy)6-0V@q!8h+)`_-oo~kq=k|+hSp~sSiLu@vrI?Kr>b6km>EVG3>rJn>S&2sQ8Y|c zcCW-)aeCOiW060QixhVTox0u+qAGpe+m7?9F>Abyu3=IYA30vogEqy31*OQbu^i)N z3SHvqJz9~$7MGveyIhu6g{C2!+H{T`XJef?AF~=xe#n9=OGK-%zV^zR%wEHWH#S9fFK9f1A?WYF@`-Qdy0$Nq=~lTIX}?VKiHF;>7RR`E=CvvO)_ z_|j(`CG6 zA9NY})FEp7x&wmm&C4lrsgH{4lMLu4H{D}D?Ps?9kvpo@&Udc z?9tw~vFRn7A$KuY{~WL5JsVi2JLD}Mk_*4Bfw1L>58S+S^+mSqYEy6Rk)&Fos@n#% zzvk>VZc%cZIN;5dp=RwgU9lT2>QeDh;+@pkV478NW`e6UyrTZ2autqwo%pn5X-Vp6 zBgJ3?bRuon7O>NHe(K4%;N|ofB*1(SGQ4+1aHVlZaYB76$^QBNkGBk0{fk^#V>0ZE z)jN&$x=!6jTz*th3N}f3K}GA-&Ix~Fz1}g8n8TkJn3Xt>g%RJv*K6H@c6A4_wt(2X zlE1M1Nw2X>!t%_U2>SevFxmT`pq!UmwbTaf8P8d{BtG`UGVXSS*=?;+Fe(ZT*9_}&--`7cdPtEGY0HCbC+mlJqGnf+Ce^ydTl5guKxL96AOj?CdA{TDEm!s@%T$_kO$SaYX~kf7Et@~y>hFd)TYUH zeTkzK@HdM>#Xf%X9aSZo8&2;I&myJz^)8Y4Qj#CQL$oaH-|Stus~4ofn@s6?aq26k zpantMani7X-0#&g3ykrjN-UGM!mvNdFA}Occt;LrciZVkk(3$f7)tedF(VC9wlEBo zBhn0lWl@}i9G!1!LG-kOdMUF8E>XrD$dtw+hVHEoaVY2)NgpZDD4-gn!iXlZZ=BTO z@UjPL&NoORsp>Qw$w>y2ql=D$lvt#sR?7w1-pV~i3y@3a!dmi74pj`ZyW$)cm@(R{ zXoFSDWctXBF;H}L!CWn;NJ3}(-I(yZC!WmTwk*=lJ+q(Z7zSY}iyXG@0*?256?RH% zQ7LQ2JSG*f%8%7g3nhH7thFyoJheGI;3UG_8Ksd$NRqv@1Y4iO_OZQ?VaTJqtM|as zTYS*Fy7IkwqW5#MzFJX0>vN_+-UnFgmi%w@+FG~RGf8vg)C<;Y3`2J4X&9EIfLM8p z8aN1CmWaSVkQ(x0{6|6SEl*b2rDCE^)1jZNE$jLvM+9gi^T0N!mGBOq*X8_Z>;YP- zlBXqlu!?AJ~|yN6$5A&j_GfR zQeg>mBfs3Ng{4CpSEOoQTvcoQn9u%+lGuE8Wz(v=Kdmyz*kI=e9@%shTX1}KgIert zJDv!D_+(qu8ComYf4sxtb3;%N!{GH6B_q^@Xe{Kbe^%{)XRrD=*5mA1v$!hmyUYv! zcA$_>h{ES4bbl_BQoRoZgH8(Jg$CiI-UrnK#lbq!zrRXI)V|mIxowgEfFfL=AHh?X zb^2vPiyP4*Z*rThHJhlDnf|5g%9f%g0B_vCR(Fb#SM^r>kJ}WI5Yxt-Rn0QX^|gp< zG3izyRSYWP>@N=I%YI`aho@f>u25Q+{b9v+{lL;;x>6E(U9gq2+zm8Pv<}-253O*e z7IVDq<9uKbUq+&I%Zhd)i(15QNc-14gAbiwtqGP4pE8Jf`BU09|6$*R?zM>Iz@x#z z55P}lcnkXzH03FH+E%JwDQSrv()i2|m0$)@)|Wuddn3Z1W&9u0-3W*|y<7lrFJFT` zZry`gyi66@-#6U*dFfhS0sDP~8^U0%mh`jJ=fm zgDnMH#7}cc;51d~wVxo*RjQf&_#hTXA=xswN85;u{uD`%ZyKz*#i}x8e8dk(UW zbS!^S>i5XMk0!lX!f2qkKJ)%hu&y`^#((usI|n=VN>qORa#jI#^9$b{lJIj>D++Hl8@X$e{XgCR@k5D)YOhdvOZG=8h|E<0 z_`?M(2S^N$*elf75*2Tr!u*`VUh2_$LP*zWsk1@+j=!_wx zt}92tHj}?EavecklRBYLa+Qs^y%ObEtV!iRGgJ8=Bp3Ql)xDjz9JXQ6weKIE73f6PkyQasuk?qP|y z4yoA=Y4W<;sPUr-cxKo00=HYk?ErDs9XbT(X%;zKdC+r4#Q2?#+wSxNPm+^U2jqE2 z60(iqo=JtlApE9&Zhfl_%c z=^;%UqGvO>Pljg<<^)SH+h)DFHdGje@4u&~c@QMIz3k09APl3B&A1m`)+=yNvx#hs z)qfBrZ20`;81zU?5}%R$8cTqeBlFy|I!o^M?4Djz`gw4?8o1Z9w1RCddWEn2HX7|sqd2n#AGM@Q^k~cpiq3MzgR)$|LEN)Q|p;C^bBhNt0*KW)K$FVt5LMXOUP+wfxZ z5T%>OhwfYfx0(FX#aKTfM<@6YRSz0`NVZ#P#;Vlq2F34`kF9Js3f^Tecok3k!=!wX z1gjhI5tpAhB!O_)y}_`ug2_?(IKEQL0(joPNF|xun;;wO_y|+^Q#$Kw5N_Lp*t|U} z;`{G!%j$b_52?ia*(a!%&=}fAYY%Hx&QN-)oZ|qjNuUQwNb%F1&gJtNI|!srIgN3I z=+@5)k&oW&f*f|C$)r-PXp}cg<{A4vOx!_;N^vV$8hfqA*97C*p<-cyH|)157p0LV zX){3?6+Ls4?b;k$uu13zVZY3T`^y`>yb^_y_7d)`tgTobQ|iNFGt}*TE`nib42Enn zqukf-iw;>7UU947^6a&|;jS~M?ru2wIE{E)$zR8?)7gDh<_~L_@;Qf}N`bmGO2*h6 z5M$a`L<3CYxO{+6v(D`sdvm;_^@=lMB6PN3cwY;k4*xOp@k&Ak6I2I?J!(T~av<&a zrZ8Jm*t3JMAoRSH({C{TZu!Uc*DoJZtMnZ__LevC)TmHguw*#EBQh;h?-;RS951NZ zFgb1BnOh*ixqkkxy9Akq1#r9a#i_mgQuO0wa=yla)S86S)_0eOmAj7?G`78^>hekl zC7+g%UEJL+qtx_-AXR4$W6h(LPft^rRPN>0sI2#VTQ>-BctTBLcdZ`1lqu^9q@TG3 zn>%?$F_NiF?kfEfEej^w)8zsAqBqa^ANqFZ!$-&xU*_HBrw|^oJ!#+l$|55$q&V4^ z3m*a;nMm+LRPB65`}zsf=bwt;jvq6Z10PmdOqJ1a6^LJy;%$X8 z*iX*fb4oq(^j-DN8!;*50W+ww@Z3fk1`959V zrwb7z$Bpg2mJePWf3JDn4ZX zJciD;D3DZ^cf#mMc62v4UTKMV718EGg~c3$9RydIoN@sL+^~76 zKlcAXi;)YGt@z>i;v&B>KGOJvUm|YBe8vp%#1DAmP#N+s-pSl0>Mwycm-ob>>Qr-Rp|>@d~NkjWwh2(&q<5 z5O*@f4)-gYG^=v6t@2+l+7x8;&j6&uPZF%2s8De)U(Lw zSIgiv^D=rlEeQ#3?B42o$#xCE>v(%BOeIQ=Ig)9w>3> zkT(3db0RURJ+UAkB&pAis~@mFVYXzdBkvn6Jry5fn-<)_fplJR<1BTNC@tG(#e5fT zDC{z=?Z5u@O6Mjy{}hcrl^THKA=A^JLm!bg0mAWu_dz)(UliLm&Kf)p(&ueY;eBTQ z4bp!yy#zHSll-VtwwvbsL)2ktH1816kmux5aY2ASijvF&a^Rf@*CDq<)bf7rPGT#6 zK>EYeTg@;gDn&@C&dG}PL*|WBALliPqy&s4%Y#L-doO(v5|}1f=MR4Nj30#B33^00 zJh}ym6$E@si<)bA2>lW#)WEtKPZo;>nSr?%L}e(d72XZF*=M01l-4wbjc{?Lvc_a( zuf4jbB8ZRbQLK}4xsoTx`=IXPyGuEezHJzqa?$&?Q@$YGI-2gG30!VbN_&T7kG6l9 zf6SG<0M?R|$DU9kVNc4^nF9e5Vjph*7UXE$q$9k5U@t#BBr8Y^P zDS9}B)R?9Ad@QhtZ_irPVGTrC^i5p8k@2jO`^89$DD%_T@U9*0i7!Ws#%(+Tfoz{A1CdRBp-hLAYf$!R~x4T;?XHpthF9=MQ1;2>UbsqJ~98mry2KiBQ zK~w@kiqDJd;|s~=WKFNAb1oOKQ4dVbV!Mx#5+cg#A}|fGJ!+HZt?(Vsq0IjV_qlzC zrBUw{walG{qHo2&N!dr5U>-6iz-^!=lnV`tz&l_Xo{n4P8c_L+A47d?#;= zIY!8C>NkJ5sm6PUJ^JcK1rfWSANF*H{!@$lG#1;3v@4LW@6Lx&WuY{0f8+b$wFH^S zRn@$fgG$#weeWr`+&FeHQR%W_spjZQ;?q2F;e642H>Fmb>L4%c zPzu@}M0-FwkJf3$qi7AAJ>V1a^k>!SU!KGccKMm9@!x0+y&V?F#bPS8x`1lvm=K?$ z=Cglka#x)7aGm!9&bwmtX)vYIi`t8xbAx554-3_n9I%(uzKL7BWNN(@-ZIKp-?73g z1fnM2>jrp8X(&{LpLyvTd;fffx!1t1Y1p(7UN%9g#cYC$7=YQtcCM87yuKlOq|K`M z6lh#Gg*H6q#w%@N?PsL3@Ky?iJ2J*aTyByICtRyv1A-~&c=fINl?H7p{?eZ&;E-V#n_c)AScxT9V z)Y>~Qxh}vnB*BwSb?%PFx-zCyty$Cl{JNl=%eQsj5ifz6*F78ayBzZ4OX;Gi7_2Up z|H}+N?Pz(M4-6%;EDviYRF>r~z2=BzA(ky-N+?topZ9-K4NHqS`SPnc$h8~Ozv*ws zf2Kvz0l04#@CSkt0UKIYdJk3eIL&{4GfB}@ecz=OzHRzChCicvhfYG3tO|FdKu@D0 ze$wX5@X7GN?xA{XAeyHiwolVKguUJ;8>}+aIBnSA*n8WqZXmF*PTM?;W<9@M{ANvN zndke6reQtck|4@n0?rwr>Zc+ddiB3ru{N)hAL>2(+s?o2DyufBpb;cQKsl}K0L7WT zO3LJ+kbjSc{S#x0df2S%zm|eiLReIy0BQZoa@B_Vb^BRMTG60~jSHe36|s<}u{D$8 znXtPoS~73aBP9e29S8$bc@18+876X6A1~ckDSa7~oR1pA^9@}KXdInf7*MIws(mA= zAYnF|h=E!eEN?h7(Wzy|9pU;Jy=&NuITArR-OIRd7lw^PYdx5;17v5L8pBa^-QV(< z=8h=u#Z@oMfBsb5H~Ds74q%0TVa>X!-1wA zK1XAR0~0(49cMDaNjEnQq=KH+y;^+6saV5gcqqHh8()H|t*W`!6EdHy9bUCx@M%@) z=Oeoo*ks=Ax91+Y#)gWJ>kAO9xXdX=7*1IRpM)bL$>nne8*ojW&1648ePF`Ze7jkp z%gp=lJqBq92ENX>K4+tPAt>d|6Vp{A1L1H}5{AK!Rb z2BYUqszIe1V)COO|oZlOEgPE5VON%jDk7IK#$GIM6$l#4{yF_=@%H?tBqEK z5B1ivEj^um{$Sca`iD4#h!SUlT$jCZa&CBFZdS}DQijGA;zqTyDQBOiT#)X}t7MBD zxk%!2oBpZC*@m9I52J+7&xuC!%&gOc`4ws&?Y(zo)YTm(^RK7dKBIm#DL70f{dkTB zrKHE+&tjX#-QyRrWOT2Op+JFB2H-4L$9}SV=2U5xb&?hH*6Q>Ur=QziUPw{Tq#G}6 zG#YI5(_m(?pSOQHWtkBZfHMH%uK?9Qt_ojPeR#Ml)>rk5Bsm3l({ewI?#qkn*J}H= z!*jrO#QPmDpC^U-Ufg1Id+z}vXsGlpZ4HW|i%0x~br;Y)PZH9#K#9adN{@T3hY@wp zlVk7oMXzcdy3V}auv>NKpQ8*3O@Hxho@S4Av5u<+n^_-`1x+eu*SLMXzv)GrhEp=& z$frlkgKhbThlRuzd|B>d3A|heeO!air(>T*hOOciJV_*;#yxOUi^G%VUfBsC_xE?upFip7^p4Q8vX?)`tI&7m48v`apB(*5b;i{(1veR38jk2K!}q-N z(wtl*{l=k5d%3cviQ&l~Fa=GDk?qCF8UPq1cf!p}ssq;9A%F|STkG8~#tGh7@*g)t zJs&N0v`Qb41UBYXee~K4dXF|g%TE{bRN%a{y3l2A^o0HC$As!(4uJK)egoi`S zhXmdJc`wl!gs`I2_vf$7qV)rTs}{3{?B{3qgNBUnsLz!x_3PX!>&#MI;E5!c4E1!y zJ~T+Hysj+E>Ci_rR-dmn{tZ=AW$4!{(DL28XU*7h?9+31n|H~xC5HF!I+BtvTYct| zZMcf4kt?O`5WS?(nX;z+V`A#261ycCCsBJ)Ccu~FJ9>u;O>l#NY<_#2H^XFI>~-v> z|CbRUSu`s{vGgJ*{QKzVwqkK%2TS^|k4+`+ug7!lt!x^<87T5}0I8)j`V^TtRpVc# z-+@yWW?*48{H=FST7Uj6i{iDwOqVNndF9W>pFD9#Y%>{iVa#x(@vQg>!_T1ha7CXY z@4`Z8kRz;?TcV9+q{6YMZHd#FMa^PL68@U^{Pdn!zADnijP0y=)Hq1yGt@V)WyklKVVa$|85+}aJ?D^Qu(8QH}FV>S}5h_(&(nVLCik`9#LPw%P+`z(9-3KchOnm zc=!-q4#!4>`%hG@RjDnxgoZ5fTjAYp7evXYhStsBi2|7+rp?`zGw;Je74@1Xxw&`> z^=?H_^s4>ECpyJdiWB>$@cqqz2OSqGyU4!*ZCn7DCYmi#E;PSg(>BJ%-qti$@* z`?j5{bBW~=1b9)u@Zl?)M)0m`x%`&4&SIV{jI)Ef?hp9&nCCq_^)xuj$`?rIP8Su_ z-sQJAcPX3HsVRUMQ)tg7V2)+9BgprEkM6ViK7W3Dd`NkQvH}h23=@j^&98l2A@Eu^ z;0YDS>5QchJt0^ z!I?1!uc%9B`06w&3stuWWmm+X*uNJzxizw^fpquaEI;_hllP+I$5f`vs9hGv2oJ=e z-<4}L*IM?zb7y0Dwz(_)B{Al340p8X)k1a5M@g!iy&GNEf*TjhqC2BcaYpTg=RK5T zuPd&oEa!U8Cqv{|GukMKEADC|Y0WA4NYCV|^YAUhba#AT(Jpz6Z8zlw4^w|&4e0!v z3}9jPBcCk>QG%}YRzwvzIp=8jI z2=o{ofZXq!pH*@@Io%oV12Jf*+)fnfDxu~*djsQ^00{x)n*SsO zm{?1`X)9D2ME^w^rX*DvyNxz>#kJj2k+c2 zTk{s7wl5p2QhC;wt&_e6Mm}j2G-vkSgr{XU1w7POZn*<9*d<7`42c{h8@+L;t1bzj zQrWQiX{hsU{EUgT5o7_AgF;>HZ@tsq!J(yYm=PRipdHR zjjX)Wl}SfCbT{52yuZMG)JdPZrR${<2HImZ%5zVdxRT%DMiLXh?Z0x@?EdJMW6ZXE zq|__K@BI8lMA39B9$yHOdpg`ShzcDroE13RP-kh$u6<_uJHJSjO$n!RuWfV4ZwYl^ z7@9A}{SZkc#(Y?$^vXr(A8-Xs-F>+Q^H{0o|bE-$Z zTOrbBsh!}4=IlXUGdNp6i)p*s%JeK;JVz=g`6`a3wnVW?lyn3n!ea+u=OhzM-Z6fb z-Fa%FAb#F8-`KXG0KhZ2kOmV;3A6A^2cc!dAJtHv9j|Xx8AWk>AZE5H^*o@i2Y+3SJ;9uYvh{`p*i^lXJKQ+&?=59g~#j*DD;tp_WVJ66T@S z?$;yJ!rEh5Xt27)*UwMCOgTRZXY7@#Jz1E9Yx^+-06PE~1urkH~P=xdW{d=5N!@gXc=@P^S;6jB9z7U7^?w?(W*jvc(kNY^KEsK>F}<-oREXE zQ#T{TyMx&X?!=fWtEr|vBI@h&Si#RbI;|$T-gz~}Z=d@6cLUfJbFt))Ga!M+@HdPq zhXE?)KcnvlBH?YkKHF@+NJ9LUj+tX>$mUwa;GUYoCP<6DdC)TEQjTG01l@hk9C&<8F3Qm+|n#c01#6kI^;-@^gTwsi*tDAT?)@+LSk8JM4%s@}>l!6UJ%a zgHq#rpxT(wZM)nZ35#X|PVbkt(5DHml|48gSBs6`>aBuQU^$f%W@@ptAlk zg1asqT?h<&tu)DKmJ9j!;~!N1B5}#>f^%^AAkNlY2`p5o#0fz5M-Yd(x?4n`0C-IN zK}4XV)OQiWcjoxq_Rdw4e3!2eq~6UwAn$0OA3Eu60LF2=P}UHt)uL6AQf2Gc%9`;< zAumW7Hs!nfjrT?I`hW_ZzdKpV8SLuJ>t!DX^m=ZbT^t<|{f=`fkoiH+nl-Fc|mHG>0ghIuHiGJ`#9CE^Pi4hj4lHy?6XAWaT8S9%G0zYqtiE>6&%e58Dc`R&gx1 zp(^`Egu32yEPgda13#B-59XO01%3O>hUd*vIifKN&r*msbVnT5(0yV(Gep`ok_qaf zSBS!Ole6<2{hOznIr%mEaUl&?#uAIkqCNE<)L$49hvr3XiX+05>Zu0lh(>5JExc6@ zC-h3F5<5jA>5-n^bi@&*1_<_a9_I&Z0mKJALl!9#EnRQqx!J0Ik8I`y3wk& zZk?=gevJn)*Y$g@y>E3XvN}^cXfEEXl#xz!$wn~+UpssHCrDI6()2)4B;KKB#Ohms zz)INDgCXDDiRAmx+a2DVtRA;hL@3LZ{1$ z`??^j$wix`9;K(TC6Z(IvNW@{CT`FiLtea}TU~4=VdGk%7l}+>r>dSnV+Y!d;mgJY zbV;pgzyVpoiQaY*|BEQFaJpK|Fua5CKkb%U>?DV$W(k~lvEtOUgDUP95z*UyjF zmWW&xkSz$|q>j?OJZ_qL(~z+x0^yw7DS6Q@tbC>-dpXq=djC0N8okKW5jCRa^+3>j zQ=#tf{m7SVYg){2sbG_Vt`0=nhAu#Q%hk}q(kG%qq>Sr8B^=7E2*8MdV+_JS=(j|u z0^*dZ`a;6U?kcCoc3x;SvwNJJs;r`0VtX^b+0ki5_ZExXdD7mzk>?(rpJE9#N z2nu6TnXTs0b3-EW)?vSugZ}6sbNG3q;$>@*4ed4!NX+wN5U;csH$f1J9Vq(uu&lXD z*8$1_J1E>tO?bEbjFm2A4|HLWbxFZ|1>Q#^-)<<_RQ%}U+0-!Im}ENVmiVOinl9^W zQkDC?(N?Q&UlyZpFe{xU#sD64CZGj;?ffBsH5Gnc?>e@5ePJtmg&v^@mb_&-q32Rp$|&I$xeE zK0*5ldMW~Je71}sxy0^TF|Vy_U#I62V;mv5;YS!~CLixP`bM6OIp2_FE!k}z`30n( zkJL2{B2OOdHC~n@)|yp=AOePQP;5xAy;fYT)OYchIadR%n5o*U*`_<~>w>|m7lRd% zAW~m=LCFW(;X!O`A4RUW8^9PBlOm3eB92+j3M&`jGcJD`ts)&pE#IKBq1IvxrDM!a z>BYMbrca+dD3~%vB^=0CR#d3%)KBC^3I&j(drRNx$;(UYx|b{!demH46nu0U12uQE z)Q9XWfg6G|tq}lq>g|rm$RR@Y6pRXsj!+-ZAj6MNBtm9jGe(#n$gD1hs2h^uE|4vx zvKLEUN7CRA#jM1Xxd#zsaMiY=C1SNAQJ7y_TGxCWPQB5rRXn{V$P496)@NGux|~vH ztcM3BiugmY&6R$Uv?M2=AD{tnv*ECfPlzx*L6(GNr=GM?(xo-MjTwq}zDK(4hpO79 zzZoHr4{TdMiljHyrwCw6dVdb4i^LuOCc8c-p zw>jgY{B&=r5vuyIO*~>wv%<$Y05^DlN+*^#zwW5a5eI~Wa&k7OAiF?XyX_Z==W)8*xh&Mf(dHjB=*$SByvBB>G|iC5Iab(OF4#i_ z{xSRFh!f1qPKcq7-^B^+PbK9Yy6%EPpn||g59i4bnW`7&O^m|CUWk&l46sBL=TF$* z>$isnFZoS**;ZKFYbM@c=|Wi|-2Okp-a0O-u8sReL6H^(rAGxsx}+pVL`f0Jp@;77 z9svoFPHB;n7U`A-LFw-9?qL|uLht8!yx;Sl&-sr%v1haQTI;Ic`d(EG9YMSaLCtqY z7!Dq<@r>##M#{}202x&vZ{a$yg}}=gRB(YQd6j3Q(ZJ&{F^CS%+p-%sC3DpmsYPBe zvL301Lzbe@q#mby@(fU2>~&y%8g>KL^)utp&*k>AUBcoz5?I92{J2OXHf=bA$1IyCI^x z%Y}%gKbO?!z$P)ewgkpG&wutUB;6wM922_fHj*Qp-`>n>a{FYtyS0RN$D)mUpuk3~ z$!&EFEM^gxPd)Q`h*4s3nyy0}hWNB^k#O$PQYpuH=_mOl%r_s_&7aIPj~~@s*APKm z-fd;p;gEU34=*h(lx|{oafJq4tUs<__9!Y|NMYRL%{Y*t&gbSBC!1ff2CM9bN;c@_ zi`Sx(Ol=oz(|;Y!;x_W?7Y2UWUC$pnKW)PjRKt!6@Zi_Y%YBK}NXgofs~7g8!%1D~ zJnm|=Y_j+A6W>uw?1t^-y?#_KTL}pu&Gq1%$AOQ0X8q z%s;>h&DJH543|&zb4dP^cU2}1H{lbLPq~8RgvAk=T;?r)BC1bMup#{=Y5hDO#IIFA zj`|R78J^s#j*aEm=y6~T44A)9P%Srn7U1$a>eaC!1D;sbXCp3r@(%}-37bW=%z4^( zri>d8BZTcYfL4e%H<^_RF#+sLTd6D^j-Z8sszys>vFVjFMAczoi{`g`P2MS>Nfl6* zGlH?D0+tf6)Y*Cn=6Q#e{KjNtj2o1(wF)c|u23^08nY93fSmJ(n&sRSoZ(LDrTM9- z<;mD{*tQRo?P)VzDn!&}}?N{qC+n!v{ z&RyS=GqhZ8`+~)~%ydu{DnL636A_{=I{5;eygmR-Qk9?3F=-UtSs&fC)-B^f?!@# zjuBidY19{51CvLZGH;iiVVxRfl!O^KEPT23OHWw2R5}CNSY-*-)gDj#!7vp**B! zF47ecmNJ&s#m-4r`kyh2$?pyqiR3sxR!K~cG&U5`!}nFc7qtOJ;kOsVj}Xjfd#xsz}31AX3JuCJLRd9~^afe=HE?ti4HeRHOjr z33uLopb4@17<1-1?c&95*L}FIAX0I}tbQjwnl8R%B2oTwkK#uks zka#Lk|5~2BQ5XN=_4R=+KfY~iPC~A?gjaeLweG$zov2fk3c};B9lK+*Xoc4{Obzr& ziRSSXbZ2VI1i0Oa8dS*Op(%FJGUEftcL;}26OmheJ@H6%*dYWJoQhIbf8ShxKTy|V z7rOBktld`HMwXJ1qUM%&u->1_tHI z&8FUz^fFf?x~K&{8L5;;Wi;6ZpL~eqw{bq2w@6Rs_&p(FZ7CWuUX1mI9heNnS4iyc zR4L*d4StyiMNs(Co<0h4ZV8P0!>GEpPXkq*<4s=5TWhDot+ig7F5e11qi*L*^fw>G zLicir-j+@Kw1*+r!Iuf8Lb8yQa3Z&L_%R3pjWhNlXkqVD&vZa?CU2UcZ|AV6{GyzQ z`N#gT$NE^?<{`tN{JbR%UjV|m2ga|AhbWkGBFjW5!w?c9h4n`~tNS@gha zi089)tdbT3LhPp!wwi2dSEn>Pq{!%w$al0X#_yES>3aQ?yC{S2eB^zQ8Uv zYy^yeSt4NjkH8a0GrlWEa|4iHEf6cmGncfTzKe7)>i;yu0z}p`W26em=RX!A-jxxsVBfg1eUg zJMhmQX!sw8jdTu|%Ou#!Y{|eq;P`hhN^{61k|+J#UE;FF5r)QMI30OsiQ$kbMzhJc zpLcAc2{H**z&sq1g8%O~5C^_BMT_<+ho0U9y(a`HG**D`D&2)4M1>})yM*%u{C%>% zi@J1B3sZ0Z1Lx_u)klACYZj@O&l`6G(uzd*Q3VR8t%D85|GVO3nzBrp2kkW32HT5F zxj!=^-7vVd*?9`PcWs1Q<m=@vc?44?=!%=kBVkISLmy^|+Q8~> zs*32@`fcHJ>p{#JPTGS4gW(xzlXrq2<=Yj2Ut&0p2>`6U|KODJp)1FKa7rmuxK>9$ z`B6Fh5#TxXAxiVXv;X~8|G&_Ch1YMi_y$$7a8-@FxdjQl2B45l@ZtZQr|%+D_i~`j zT%z|Xr7SaE&T}G_+;2d*-k2pg(Z`a zmd%M=mSBOE?u`wg#-=C$TcLj(Wv0xOX^CD(Z5T~}LXG6)FeCINfbcK^^9mq5j}ia+%3kZslo&lqIgTXXvmmb@x3`Ei zej|JS`)Nx+&iU^T9LRkcZ)*?{MH21iSRQULPO@pFK7}^LJ-AyYOnGiE1x68Y?7=AN zyQsdB1pgIw>*&YG+!XKtKu_TOI|N_5Y2@92&l zA%68{i}kiY2GRf)5X{k0By|d+qjk)zzYC`Qr|rZ5&A#ndOS7VrzgnXk20SJiq|23kd4san9zS6xGF{FBE6JV zGJ0Vw9rf zl~%jXD1<*;q=Sb5mjzD`z@7jfH3L0509~cMyonG0So-u~Bl|8-y!t4)(I|DgZ*H~)70vS&N8?t0&HFxJQ3P;_n0PSJz)iM{El-?mrODSx5Z+ue1NnKh-3tPqY|4z$40nHkIo3 zmv-yMm!QF7hpYKnIL}z)UudoVe}Pqd2<}SIE;~bZiGN|V4B>6@NxnlkGp|6Wz|1rG z3Mn<&gqA<)@c1rQoOZ9oh=H-P~J^OA7)dXE*C|)_37!Qvx#Xl@D#W zR0J@o-1g)Wmhn7X2P9~=6G!pUj!iCUD*Vqg41hP_XFz9xIhxa86u;Ks9VAhT^XCk)I z;`#U-9hn_8;9@8k=aXf`m?S^WM(cQ;c9RdjE*cozPI;>g z#Rb-$4UXJI9Fi7Mokjq0KRO%8SQ`!%6yFLYhbR>my2DU(Xb`}B+y;Zf+ZK4YklmO_BS4FAJdN%D-Jh)?M&I7%QGD?0F9-=y-EH9Tg(Jh zRS>oQ2dmn&G^8Jf?G|>5lm2Q*<=E-z?3>I=EN7b1i}14<{Yil7{QK1Z{@J46fT(s<`iH27x>7`6S-St##)jx~ z0pte0OK#7l*Y=Tz@0xjtQjIY0|8Q$t1hjrwNP{8ktvaAqkA+|Q9;)!04U1Q>FFXOp z^JoS4;~SG;wnC+BBX@?sX@lv1Fmr#5(nv@R6KHL&OkPHoj;03<4`pE`cLjxe&dsHv z2bXlX-vH&`Y_vZIJhK5X%{g*=^jhBWj9Jy{o8W~aQ2GcnpxQic`0H9E{{G1#@`#6F zxwy}b7?zbYH+$>SHo;Q-Kb&E{23%d+>YR1(_Ga4-)6>zOmkVp!kCbR$fD92KbeZ9D zSRcD7_((4VZ*MyBJxTV9_7Tk6Frf-*G>lP-*zoZT5&O%lQbd{e)YF0K(F&%qHgJp5 z>g?`6%>v;hU@C${dqpV%iKhy{Q_`1I#edu^dO%ea7=6SLlt(|GwhpD08@q2`G7UcL zfI#AcrQ;8R@qa#9y_cn|#9mm(fOr{?7@AvK>Rnr+hvImvDXqeK8}6gN~@-=%*Dx(6w{9BSX_d)3_V*H$(DY z2d>heEtWH%W6ffiRS^TcdHUZF+)F5A>RI4F{>OnF8$G5o_S$P1riVgbvezH|rn~;f z@%VE!|7PgMiBb(9FxFBCG@d9o-)FodcisdTl9%Yo|MJ2wqoKbJMq=cy{V182jP?Rq zC3Uke2>mUI2Sg@4>hI-?Q{+kb%J(IwNa+>iW(j0j`ktm`#n39)#_3!~P#lEe2D>Eu zqr`HYW(5Aa0sLqbq#YF&jPr5zs$2%H&U&)%6=nt%>nk-1HU3D&v0qx$)@E zZ@cr~mXmf)9J>*tJ>VE9a;5NEA1-x~O{UB7F@Mu3Z2gbKMc zbF|oir0gS`R(Tv;M41AN84gVVuvG3xL!$6MfEd?gp5Y~L@u}tMz zSQ=uE7KE0oJlTj@1u)rnBUTZI6ax*rjL^1vXRb#(vfLQl5dew$+8*)((Ik-u{Bv`V z3i<{dbzlMi{;tQgwGx$qmw0BV&Vm3WhNjgSuVl61RPqptBru&hB}rY7K+(BDF0PmE zpm62(ic&ayKVn_}Js~jYgg4MqpGcAuOre_|39Ab?Pp0-0R9GoDPH_Vq(6i6bk zo~zXT%+t?)YLH;?(zeTcXR>#KV#Ibh!8q>bwFa=^OJQ&m6@yPHl!BiBM8o>E5?YxG z+;f98bg9-lqw@`AJ+I2+Oru+6`Hn~g%GVOH5rnv}O_G}FUYH7km@YWLvUR}Tc1*zb zvgLB}%U_sxrLysU`-Q=uA8lNjIQ3%UqWDF=e@qyB?=I?1Ap+npZWdBG z6t1*D_A#q~LK+OkXO(aGTlJ~^H0Bw#dX~Js)p|>#x-mw%j|xUgVdvkWx6Is)EBxM& zbsUNuIdi`(GRKN|5ve#*2df=2^nDX(8_^-$KrxzdES%=-*s&$g8thCfDB4rCBYn}F z^WHS?2TK4WjW9446n!#nc3kQEd6A|#B>HA-wqqf%bDFkB5Je>Sa_&E3PIVjHEkgML zn_mbF>@)QqmwN3R8|pNqWJC0j!xnIhEWNNq&;oG^ z^>>!B6v)_|h);^qLl&*K&z?Plg%j9%vGk_O>}kqTX^=<5XldaYS?qjX=r z8)uPd(uh14mnxe`{Dm6#3+BA9A1p9ae3G4oY+Iys2(b}vX0lvL3C5}FE?lOn{t2Az zMo^Tj!*D&8ev3Mk4A_;&dFlmd+ z+DofZ6Sa_v7RphIBWh;!(_{G24g_#qJGYhyF%;XbxwXZBo8ZolJP8B0hLoEvc5`1T z!$wsvJA{ugJ_r3XhdkW-8$*FsccFcC5Xm!_^XxMi@#pnEwL3-<{QA8hE$^&e%cT{o z8l9Ab8TOi)Tjmt*ny2-SjWy~!l<%j3_Q#awHJCfCYN>0?atUwN76}eT&Kbhxh7i>; z&x{A}?p9xw&r(J}Jk>1c4rE}u?m865q@Jc2@5w|);FWutd|yv^8s-XKwNdBYunbxx z$bifthn?36oqJaoYRnDCzfpmmMeOo5LCcI+2ytk9`>Pr#Pt#aiL^ShpCctL0BUitG zcRN-^SKk>hf#sNGWKbcP{j*@FY4O_e=esR;_cgOtVBmO;HL~$*2u)lnX-two0{9bD z@;axXeswuhz`@(ka0~D|JY6aF>*AQ|fgekhLA3|^uRY6erz4ab8UGN8Fr1(h^@*1M zwlYztrwx~Lf7HBqZ95(5X)df$73)9a16}0#2a-}UKV5!VP>n4{-Qp~G30<24txO71 zNe@ebQ3hkRG_^$oP2OE&N&3q4Yl~j0O-qt{f&oXIj;)fxd*0V^bc-HCq_^)E8@2niO_0mQ#JS=vTyuJ}S1>d|m<-hD^PrIQL0ucg=;J zUGD^1h_HRq1+WEr(G#S)w&Ku1(u}B=!%$oSaeh(-)AG<5p#Y3w<%yd_!{rufUtg+q zV5lfhbd=y*o`b%MqmwCz53L!--<02l7F7(FxCL*P@_&0by0SyuKBpuk;qoT>g~blF z#5qsj`pv?S?4pEvjnXEKjX=yG*Bjc zBkv7+koyAiVhqvA3*6=}&%i1kp>0NZmm$+lD-0FoZhel$j($hFe7pP#QiWsvIg)fc z`D=|XpirbMqA%va1;)xDl(`|6z|=NC1>#A z0`a=dPSoU}fY~iK6Wf7xXX2|t#roO6I}YLPcU?(jp@nd)C1kqJhcKCr^Rtn@zj>Wn z&bmNtpeP-qfg!@T^-k~iacXYWcdVkUov&SZhyw2Kd%(@AdbmK3cKO1}6nWXLUc&bZ zE_S-m_gi$>0yCG9vv|2KL0`=t9{TA`#K>ic&#rCD{9(>m*qdifszQ)Hg;O3M9zxHy^(PowL2VMibI|Ob@m*xj=7VTS4qhkl0s|Gk+9;%+4~6Fy4he< zb6zDHF1=McbHh}f?yBi0KS^b(SLhGhp6i)(JoJ`CWPKitwD}61Ogj5c73WatZPulr z#v9Ek&Q3^`;bM2fv-@S8^55|MR}oEBIQi_xYm~&np3P_y20O~-$)PZLsTn_A?=_Ht z%Da05|9SArbXA`@Pt{rUA`(-}E6&6?&a9cF#iJ9*Ou=ps9lqrbI{(_>~NHPSZE8>!TzDr&wc~GxzZTBx zMM;kOKNtJ?6sVeHbytzft&3wg5mn-nBK1uL!aO&+WKul&d~YVjC#JYqqua77b{|Of zJ1rs*pvQQTXFrOHuK8tz&Xu7_r|gY8cie<<&p&AzP=CGM>piofHqAF`Wi=vn6UBGG z`F*Mv9DJuh5P~afq;XOVw)mBL*5&nO?Y;29ycr!!WdlQ*zIR`isKnj~^~o{q)!gT> z{Adt-RRZG>IZ}Me9CibQ^gww@Hnc!2%dAytvBlgb(O;L^2;YD7&pU&;o0@$5TZ(8g zzL}#v2J~CAGzHN%re#oIxc`3UpQsw2!S-sL7@UkS*Ngqwx zTQ+EO#1Hl3EPVOhHo1O2d6bbm@%?j0iL(*@Bj77 zn1>t@XIH^+AE^a96N>1+DqQI~ThlJfLv&D_qw5wyG$Cs&+~_t>npIK@R|MtT7K;~gP&>Mkvc=|}y8ff0=D zZ|InndfJhP?-o=Sb-zI!V$DAnzH#DvI*o9BwXisr{?i4Grn)k3-{zu zzM!&I*bE#Jvjq=|8zU?wBLrXppx6?U1I`L~s2g90s<3&Z{DVCM&Unrfw7J{au_3Jmri zcZ)PGv->|ZA+7K;3f6{=PQ)Q!;XzZw{>dMBNuKX17>%?qDlS~v(f)^Xdx>JR61cCJ zk_L2Wn7aK-*rb{fDMP&q_Yzj~eSah!FXD!9| zBmwFf*;dwf9@6?g-52{(A}OD$HUwTZ*>Kh%RoX-5_Z6@#2wL|={LBd_b0_XWrXb(n zHVIM?Pe!^akIvZScic?cQ|Dx3^6zoEbdev3fMDDbai~8ctJ%}Mb4Gl)b8h|%Bb}z& zY%#9oyT&zJ5wP%w|7gD~M2eD5z;1(BwZrV6V3)Qk+4^m!-W*#v&34@d*v-eF>JXzN zF3pa}w3(NU>(#FbMbDQWy+7eCZa>h$_uR=;gc->@y{s`4>NVI_JU$_Rxp9>|a zOwO3}vUvQmPU3v%ThAV^EW098`Oi~lZMN@+3+H7e#(R3(NXhg&2M=P}QC^Y! zqJ!`^9};vDNT>V&GoL3qy8_be-w=oQH8rtM@>C`C%ss@cxAE^kJ2^oP3zrT^ao(dz ziOF#!j`wb}5$1+ju;>S0*GVQ)rYUp&$}KLXrdCmD-D;~|J|atTPr3bSRu!=|ZkmWM z$s9(LuEcC<;k6F6mA35YtP=-d0dunIT;fVH`3vKU3ygxQHh@ z2_c3Vsw1iC3o}k|U8x}QTG)OKi_Gj7wov4)5xluy7@YmG6V)jVe$HNZz^Kk|I0ErA z&nM|dQqxbVE!Jm%tT6$#=YjMtJMTzL4;2P2j}_mfz|NN`@~ruUmBmKOib~ zj<#xa=rCU4+}eV6n3M3r|0?pe^#QeFGpyucY}VUpB2z~TE+S@BNvmd+zG&iR^T zvu(T(t%ji#CD0cZSJ9FrBACemy_zQ7A+4e!P(#8`SrRU}=nl(6UAkBJAbWcVSYac{ zLd;Z~cd6w>wcqcaqo0C0(+Fr)$Skj@H+#e-BxyS@cnPF`Q}zRHZ$o5pxo6)C+W~Fx#;UPt`q$@rMKuWY&%pJ0-9Hg z3h8#WM`FJwAQG49OB#NM*|t4!yEiP}7BKNNS{+vS`Kdz`s^96#7Y8s@kUER1*ex0y zog8M&ymnjXZl(CT=El?1_WEZ2bxmgl_mOCgb*}Zh%PJO2aalwa*=1%PFNcC2_gc|% zeQb~4Am7p~3ZP>NbUklwsLJzCpcFN=A1FPdQBOIS*e}xVZ&)M(saNei;Cnu(^_8_~ zYuEh!dDZlk^EuZxOXp1dawxJLezh}2*nTi4wY_e7?4Gs9!P0* z+g8}19ZIcVD-3p550()T&xjlwhK#8++ux5c+=e`9 zU--8T8R*l@+IQ>9-NQ|ox3y~lp`=|<3>)QMOx6{Cb189-_xVKWi8y5{*IiF;tz%# zj;KKZ4O#&9qAnxksedBm*~hveMlHtBHDYkDp49+J*H-M;H-T4AJbm3=#7?b9-nN5?kY4b0hU)$y@$ z3;v%(^nvIyKQo1X*=DP!NcSO2Ma2|XA8~{Bmw8cxxYQF^+cF5&NRg}Q+_(7S>de<7 zGk6oDuf)LT*HoRJD86cvvXi`D?{c8d=Fg%3a@KbLT*1@NogA65!!vP06)KXI*KDRN zV?RR8w793UO`GIQ`q*7sKeQ^_rpmlg06mciJ-7sj4)+8h)i1Zv9jkZj>a^8Be|G^i zhqodwH=Kcl!I&Am#q1Y`zn#M89v-8C@0x~jMMY&QwU!afRfz@09g#1lf;jsj~D;bKhXZmY%CsZpNq6MWGv6ma8E40nO_R~GY>V&42Df;CAMR%)-xt4HVpJ`Mu_~Ld{nJ}3sI7hJ+0@9uhGyBKpPm7E zXS>*rcF(RAnM0p5!oHZ+a@Rll8u`Uoo7_OAp}X0w(G@iFdU#f*xuwNk^uB^v`P0dz zR$I;|OmA-V43{|ORh1FEpo^4(5MPP4o9a0oupI0D=rPD(tRwxsT@(k)sHlw}BHdlq zA(}KCEfLmK76^F(T+vRx^8ZHXx=$7%X+?6yzc3=LEq`I?_<>BrgWA3}Q4pX{MTq!c zYt4wWbA3b^>Ba{9s!U6hlXM%w4dAEp~eDx)> z>~`DTD9@PmxAiX-h$6yHBr0n0yEoQ&xLeN~NEbU2eimjbgOr z#H#9C84}$(DyYzSq)+c;jIIW3`h)>pcLI?|U0;~e1t{IGC^HO_m1ExG926$diXYz` zh@5;mHg0pB$%Q9y^MiPP{90EiYLFN9KvHr+uzLHrkj*&xDDKVme5WQ4`Eq8(dBH3WA#L@#LoRI)D)y5yrH*q;;p0Fh zXhy(rEFd!eGBKdrtx(v!=Bp2s?hwjXRHh4m8)>t*g;D4Q&nd{eE~02mo4T79)obT0 zuDRPzwN>ioT%@rphYI3_9)oJNIFBo7vsI04>ML|popU4fzw!A{vg~{R73w_v^^=C* z@ww^n7Xt5w9%)$^`q@7(nGGlLwcRBbKu0@pM!a(&&%gi}nz9Ez{9AS{Hbja+37$L= z-jCdzr9)K>A|GPfkR5)SH&m*6$1qy+N|Jm^-O#&q@-CEdg(raYeeyHS?g)z)?Pqsz5OAx`fL`hRumpjq>9Z7A*L19A|JnM{vMX&21GS=9#e7rD zp$#*N8(T7tj*nl8kIWu+QiEmXfVM^o$AVn|^+IDbYbs1~u)HkjGwn8it1VF$WA%*h z$vYv6DT;uktH#3hXt%+l8>;WavBf&_WBsjOEozg>rqGtbWr2S~WwufKR}8M1?H}qP zk9`jGm#kXwcR<%b3Au2Bbmqv+KZaxSx06{M|KQ#d(fokrNWCuO8~6ceV)cFcr*v)) zx)0IP6*>_A?0Hjn!L%rIqcLWLA?4MhfyXN*C#2TZ4UJoB;~|+HwT5zhRJ$a|1W|qU z#l%ELTJdjm4l9*K;EkxKbmoY``03~K?qOuR|ua?6g&>O%Fl>R8t=dlT`4nbkp5A%qjl}Uhd?sbR52}B zGxLk;J+8D)OkwCGVz*Fyees0_DwMbZbZ{#_<$Q#=jZI67u_993sn)qlq|ZL@;Ul<* z8>*jTh$*!DojJagu93!V3-Z0fi|!@Ep3*v}Uu_i?)h`Tc-H9CBRJpb1&RF>&ffyJ= zgR4w$H8Ej&0;C_gr|Kaf00;0Y5U7w14Zyg8lm6UO@KQLt+FqDYMZd=t+o&nt&{k$= zKZXD>z&cx+dyqYWDkKmaJqlfRtiSz$?!b}KcA^`;%O7?9(W(kE$m;zP{9rAI@@Tb3(SRC*6&zw31HcMJnA?qv|83D_&IOG#cV9I zhwoH;jf;(YO7(;%{nhx*f${*s&mO{DGqGbtY%3x_juv8Nno5*jQ6XXYhWMw4-ytCP zr7#vx;*|=lpw)Pc)@cM(BO-D1X7N2j1^Z8Y4%{eu*KF0^_{HIkJ`~PPDQ1xlB$klx z)gP`phu?&+^9jH@jD+!syq3!szs4$cC%)@B@e|arRqs)Z55d#2LL#KsgrFdyxy6mH z{{&2Ot5I2QI~&H@VS(%o%f0If(6x2;3w%ZEXFE9?BKN_~_>XeDwGmzX!YSqQCF*~~ zh6f;9I zyJ*inn$!@L!J{dW<`atrn@N5J0f?XdwBX)eZ^8KVut~Z-$%iv4sx2(L8%IS1iLFnz zGu@05mgOFGsOqV-;q*Kk?B6yg(=zeAZEVN$JnFliXyeLE%2C*76B@$_ZY;W$T+GSy zA!vZx+c-1YsoFF76#?{y+lVVq>_Tl3ox7rSOvLx$Hu}&c)`)uL#pBn)%*M@-{X22! z%GBjDtd{4#LiUO-sw>KWUSQV=YY9pP!O1cx0AH5B58PLpz{E;1?-!x{ugZM6VqF?i zbd;A}oL^6ST_f<;1{+C4%BMPbGcvPu*p7)N@^&wh$ZRk984i9?g_CDk-HYtgIK_VQ zSgD{q{QXVWh2C@JADZ-(1%!DmcW!%rRZ;pW9h!b#Rx?+_xOJ!!UWED*?g*KFoM2Rv zv93pJvsc2oa>8O~A39${mMW`7)oyjukj$1w*fZCV!JNE&%gEKQOA}#UC0M_YfP5+Z z+OHz>v?pr6Nb&Wg>F|z|;lv~j#@4A)Nhg&Jmco-O1O184*SC#pYqpaPPQu&{!vesF z|8E`q;Pv(W=E0FnkH3TaK{>s-s*rhQhL$+Zqp^0>6?3-v#;l5tb|!a~qIcJYWbEwR z01vM;BAR!de`oydp}2zAfq(F$c4Y3j-TpztHIN3b3L(@ioAY;YCKQ)oMTR72ZoAIUl70zUH1bWN0K941# zZhQ;l)5kd%^3EgVNXDr+U%8Yh8CFX6#W=%mbg9W6O)^dV2NZKcY-B(BZd0x5>sS87duMl89=q~i!$%LJ0CFi?Wzl3XnZIDGN^zAL7BjH z+LT)Xp^;%1385;-HyV#5a$iPFgv4X)^OLP9&wLN!TJmN{t^=rHZKjHVQVuqc;Q+dhb_Ub+ zvQJLWTgND>vER~um2gGnM?QUc(-T0#-KP1s*=e6EKgy@v-Wznvv!Br9xzIm3k$ zw9~u|?8ND~$N{NP_6w4j%@j~^3^zzU0^u-y5#?_I`*HRk0lPx>UWp0n(ZbS>+Q}7p zJYLSj0vzVMiqU6=O8at0r1?RQno_L>o9=aVu`fkw7Zhm~`p!Ks3kkLp-iQ172 z!v~TzFQy#8Ih+bB8k=e8f&Rf8c!C7d8U$7jfOU7>flQzssQ_ML)x6sF$~05DS+rzzS)4a}=`Av$7yJlqR$9L|3r+>jZO&?E4pf8g6TA8?h6`u+013a?QA{ z2K!aC7ChS5>KDd}>{NXDn2h3wF2VLYN=}XKZq3zr)}2;kYwEXN9^B6qWu;uybEDwTlLhxFuG+xnrZWB<#_XFm7Y}5(^F@V(`Ua- zFqQPDv^LLk0sG$3YGn^FEblM%FqmJ?r zieXIxRxnquF8j(ApC^#E-1X{+TAZ6$!K4D#nkv)98C4fiio5~!XGH1+;hJHYvq~uD^iN?%$l`G0Q<69`+K`6g9`eCK8(K=WzTKX42Wz6$p!?(7k z#(cG)rTkU12T_Co#d8+rCkxw(-~3&!kg+^nWvc7ue)2Z>%L;|O zvTs`Y;v+W1URz;FE9MgeVBxxSQ3+LY`1mf76W|GfZUV4*?_@40auXW$r=lKIYds~2 z4Ty!xhk-&}ek@ncMn3nr728#@0!>St9L>u&VLO<}AqOrE>YS>e=2vV=#%70Pmvs6# z^o)_ZYRUYc-hh~44IPsliT53*X&@(mwlR&yLtOk=d+GHoH99f&QHqrsH@YI z$>@$5P)s+r6_)Dv_^CI-%1awuVNNJ83t6$VhpXT76MT&v>lFTJS{j~cFdnEnFU*}P zXI5a$p{nUji!!Y!d7LY5-*fo+-uE052l|q%-Ks8a2w2v}@_hcTs2@$czzTlXCX5P+ z{+6N>1y6$jo-coGM4*6yJeM2as2W#7AV1xe?Mj<`LyQ}CQ#gyg-IU6sYR4s2g!-JL zLjGz>736yj5#CG70^By+4-1fRoQywz1;A$6&}~SS3i?)rxGQM zv+^E!8ZV<$2!R7jyY)|{eG(>+YjW4QI=F(k^M*tlCT9-@k(}9sqX)T`CU$q7rtMN} z8w+g@A4YC4-&=2w0=cIm37R|gZTKK#eKLUX<2V)H5xAwXask{Z+`d|{Hu&^g$^-;RM<066g-9a0+^xF->w|~y*LZm@lDK%*J9Gi(l?=T+#OjOe&ZS+J{>y3tRJ&xvUT z4W}=55Gw@@7l$)*k{+yHh^0S&zgkU^a(bfmKX8`ztyK5jBG=M)A4`1h+$*)sjeKH& z4@*EaRSZK{mfO*25c%GIP64Z`jWVUu+SGQizya8h;>7_vJtwY%bs&RZYoBW??DDTH zh936;#z%r*{oQp7`xRBNU8WsS0L+znCZ!&`=DL{8>qoIXMbrZ52&>1F2bkUAk28W&$m*t=2a{KOF}CFQ7kbDj7a#9Zm&aBjguGV0yAMq*lIft6(erl_9-cMHW+A zwhN_I-`b$3*&>3ltOdifuo<$`@C$=jAvK`7bHh>p7lvmAxNb#9&+aqoZ9Ddp&Z9gx z22`**{KB&p*ruRWqUHkqvL9iWPY5NeI^cnsJGMUTY&WS!;_ndQQ)BSvTarip;8}z; z%VzBh5W_I1o`QbY%>J*KdmS~T*h|L>J~2`6`Lu`Lfc94voj%`bN0o!8U!RC#epIHD zb7%UklP$T@J~j_qnqJ@90EcdJ$ly6e0z2XQ>lK6Jg*_lsmJ$ib?I9Phs$g;l53!}s zjzp_mh@qwaPAY5VfiZ4fn+i0Z_$z~hugZw;COoehy z3E|3F!i-D7sqDw~C}Ypos-CLLN5#9njq`niY^20Bm_rZ|0^iL>`DKDE4)&$?U2#qW zJ)nV@kwufHr>z2Z?Zyx8mhXMhS8x~vfVMhoyqF`ns<0dS4srnM*_Tpy8?N>`PVJoe z86vHX8U1sXaE7P`=Y$qxLEB)=Rr3T0ks}Bw+3&zlKu&&-M?O-riow2TrSw{;6l%@# z@N^kVkiR_*GN*OmAvi>tfBffjkA3H+{~yA>Ix5Pwix))&Q9-0d7^S6@lpYZ&5fPCt z1(X=Ndq5;aU`R;`>FyGcZfO{#ySoP%=GJB>h|>6jD>Uv7!AVELHBEQS8^NFP%x&5}u8Jt`i!x z#-mVChiqU4LlrthJX~gW`YvG+j`EM>eI6eDQ>Q9PkAEN9QP^2r*ex_{@xaqA8qs5C z0H2lz_ZgI!+0242%ywc<;TR@w1_Ji^;Z1+w_t);?{9XS3tN}_?3O_~x82DrAFPu+# zRSnU~x!U}g$9mm%qCM@9tO!-+1N9BJAMe2?8Of`4zcdRj{ibjMr(oJ4Pgup9 zzQ(a=;xC-&ya_Z_rqBk@=-e3~TbhN5>H3tD$Sn$MkRR;nqVKoJ+TquKqakmgY%DPB zq0czX`!IA^*qZMAp{M@4cg9_LlMDOrp{E==Vl;!k6Y=Bj%-|(5&A6;PPASEhO65K~ z=&8BZZNo?SI!D#B<}Mx3$UE3LDk#MYro`YIc%tyxuinteHfK3s6NM#5D=cB@dKC>0BEY@C~uD`l$BdwYrd6Cwi1jp`^}7dr8&3f zo=%C+L~O8>&@hOL&(@Maet_Q<3|6+dUsLUReU!X2SlNZiB{H-i?WLu;($VPj{akiA1Um7(B8zeb=I( zwCR>zvhC~^seo``;CK8B$5QpN2ys?q=eT+TiUhvHmx||8%0h=Xs+n>N@h>A+j*pESb19%62npVc8~BRH4+ibDDa{vO(@S zNR~+h8&)DhlgVmE^0#0a*=S#U_Ix_uHj3VLD=bq~8l|*h5Hxd;i zg-@A*E$v@?GVk^g%-8b;GMEptc0NXxr7{+dVRLqR$h>E0usn^)>IR&Gq316T%6WORDVrd0i89`?DW-Z-p;) zfu{lrn{{4@GaVmC>oLv|(8@QWTR21msWzqR5@{zwEs!$-j;-SHO>l4fFGtT4 z-w^(YsDyat>EW=AU55iPo>9v8+H6IaU>{-(%{mTdv@-Ypr0AjZP=>Q!GhZyj^R}Q! z`SKf4;57^{VKm0h4>m#UH$lc<{h%@F!vZ$h4{8H7c6vTRcA=|qEYXi7ql@|H^v<-A zY94MLUT@DQGA%fpqS>B17L9@WIy<6^=`b6;;I3kmj!nw9WG^gJ?C@%Yte>eGK2=(f z*%c(Q%&Ds4VirbRI?7i8B}NjU%nUsM-C9pTOY)*=hY^}JJQz$n*d>)bMK>u+=NEar zr?wxH%xda--hg;&OFo=D_af7?ZLuF~YS*jL!bw zAEkL+K1XWCD;THd{;-^10*W(NLzbMY%lQ%d{stW5{?BzF%is+KF^ZnaXn+e0fIP9h z`midhAfntXI||%t)N9bWgT@#q933iP=m04owstb1>+eTZT0&SBE+6Xd%A3`$6V{$E zs78B_T2a2d1r#eOUxZ}t>+z&~6P=;qnbf}`&W<)g7=yypUmM4-i}v1y>*cKUiHc&#@1u6yM;_ACn8^D$ z;i2K#7N%5bNI#xoG>ylH#%4v^V_T&Hy0F=Kt_Ht_)j9u6a9(W#^?X=Ok@~ahla#i? zgQ7wU=+E~w!Vu?S8K*Vv43tA=Q1J--99o%3qTrcC#}83pbbB)`*E(C` zHUb@}a$YTvwX;o|Jv#gQ`AT>p_$Ie?N-bPOkX?6Niio4Y43$+;6RikO$??K}bpW`S zpFWE@ctE;5e0wpPrnI;zsQBvD;NXX3zHi)Mp%9|dH#Uc#ADnCYm&P2@0%bo@39gqC zB-Fmg(s)Y=B`mTPDqLJ`6R0fyTluB6Pv4NzJqQB|l^UxWpUHS%K|Bhw;IxRc3hS?; z;as^HnDk?3Z9f-+QYmLFH!tovvx9GE_o8ke67P1J2=+`_Y$tWFTYq-Dz9GI)Avsp? z=BTH}20pU*i2WxNlmj927OL-M!!LIwf=J9Gup-I^+x+=V4q7AUI-EB=lu=4%-rjp! z)ogod%OpV!bj*Kqy^tLr$q(=ZRtqho8E4jN@HP@mLh<&>%yy&V^zCheMUBG4q(VMF z2Ru3d>X^4t`H7p5>J0hp$_URlDb&{JGW83_Z;Ob!i`QWOi~hvN;Aa{hCYF1 z1L}z6b&5}7_rs%n9iV|f9YTJW7+5XMv=li{`~$p(oo2fD&FIC;3M-68)ymDeLRG&o z2Y9Y22{M)N`WwfQXM&Vj_CGxUu_Eg2UG@}{#I=>Rm0y|4uCnK>UgNivg-&Ehd-2_Q z(*^q*vdha-Rdg)HuG+hVyx5$pMOO4&N4?ipYT>GkAakI%Y@(&YOUkzotBWkM3k90E zZVG+>#KF_tcFmJl!8AvpEu_cN1z}=t(#&a4##bWBYb^Atj@tghlHjI7;z7P3$~QSL zDOZ|*w}Lrf4y7~(=BCIqt2lOCixML40f8*Fa-C~~o2gR_hXL@(x9Bh5IJ?(HH~l)d zt>o|{#Pt38;Ea6f+1l*h1w?n@Lat)h2j4;%kja=!z}N{^Loy$Ux#htpfg*@CIl9*( z%|F35aPUXlLEcl;gICbq$>HD7hi&=xnnGpy6WmS`x-ToC_={=sM#e8Vm~Gl$8xX5U z9&TQFnP=@h3~(;KSo$CMN3-ta^L46RBJ>R)vIEh?ot&-FfeMO6ZW(2%;+VT5`v=)O zsE%2_rrzd_LWKj9O(G94yr>k5La@LzEdj^m5cO##N1>u|#@X7gJ*bJhJLRkU&m2Lj&*|S4)&%zo-d4MPYp>wz@ka{)MQNHhu;P z8bNTiq?O}9(Ch1a{iRBE4(*`K6jbVgzlwJy%d{$U!F~eEleWWHA70G`5U^-Eng}~> zbK@gn1({9JH5ZM7NX25Aw+1TexbNC= zDd`K2GQ(7P6%;_5PnxU>eUIApr+^pgVoEhh)SLBcniLht{5@!Iq$NPK_6-V(TH6n+Aog+4(B=2l7> zb-771u=;*E_~}Y*gV&79*72GJ;wTo)@|`(U`?DCyf9fMX{wuz+a+@|nEPCmw|PcZRkIzOaP-LO_Q|Y9n27$7$HT4=80ZH)Iaup=*q%j&^{x_7|KR=P(PpK|;pp0Nu_i?KwUj zsNI?ac7gPNAGn8hwpjRom;ewnW~^=`jbCEyI$QQ6YHg%sl_K9$w$TKds`8e<_haK< z(;Z;X)0v!IGRO?=4%NC`;+{&fEz~Q?j0ExJ;oj6vw@ZNc4~XCzw7xbh38?LF7lks!wXPL z@B>MLCLG^5f3yGIfo!RZB!5yD89Pvr9D-MBm;`?R-&>|j&T_Cig|cjx3l}KUYF-bk z+t9JA&vsU8DSQWJt`dVh$&;X`1lgiYv$Je6x1FX8U;%L?0de+OfRn;lckckK^%$Dv z5842#*ThPcY5sBJ+9BiMR+6dko?(oH1@;v<*f8$3yVP)R%O%`AR(j?%C~Mwp>C%uX zqMIv*7@hN9LAHa9;eUTE+s7b5gVXF*WNzxmX6p_s%yw#r*Jv9!4KsB8wM*dtd*vu_ zcCM0xj5bvF_(p9*h58=u8_&TYlgkz3zZx*F!Dgz{Vpr$Cm*i-el&SVd<)%%}I1rcm zLi~=vy7N`eZ~<&~G7TunQ)Y8soA9sOYJ4e9U!heU%M;0eBrGOnI!CoklmXs5dKv3! zV3UBrPQ$K&M%zXx2xPWvu_z+r-o#YCiha?V4PM^a)*l0#Pz`+@533MB@D@sF?*c(H zIpYBV!saNUs2J!BPcL){`|&Q;1sD#>o!pFt(<`MU9<(k<7mIiIXo3UP^B5c`U>&@` zAtKRmwofQ@4D%gZA(J}dc?aBUUU>V6sJ_I#O zsd52H)CbdtKGYsRcmP&a8qJPnf$3ERso@2zaMZ296!dRaZo#(;u}rh#y6DKrb7>%d z@Yi8}Vu95b$GkCLviqajAB z27;*tYNNN=B|QK-uTpb9G7+ZUeU;bOjT5pRWdz*=S~OVqx18U=!@z5IuVLS7AuG|} zs&4)MF8u?eo|j;|8v)cv*g}86f)th=_m9rH=c;lR)P2B+*Q&P6tio5QZ;coTM z^<%2y0K-JFZxt3e0k8oOb-~j0Y3M+~*ja}&fZIk)1XcO`7hTKwYiBqBThG$zxq-kc zBy(S&kfzS9Om#0y9dAGfkZe^t`ca+%=%3fVLXa(gG~B5DePv09u>NlPQyuARhz`Vi zU|$A_{P)F?zwOQ|c!MU`1h4>DOY!In-s_GJn!Pb;i!0Q$uk_KUeOQAu^sjIK-zWLO zZ{M=;(k<&roXh#u!|Z(2+Aprebn9~SnSI=#kHZ~z@lSV|HG?QrxoBqBavHQO?2gaT z(+6|)`gd-#rM;Zx55{n_5cr6+@Yw*8Su<`%uKR>2&Aby>a&~5U}0p(A>a5~`AOb7$780ixD z|4S>As$RRhar`>PDnxE1$)=(a`DA(G4dQVbabPFav8O`dXCtYHw1UBaVC$KTUMK8T%hcMF3 z_6u@YbJ2A}m&3=BXAmK-V_{`P$NT|@!Hx{x;6=+^0@(t3=7z+Ff+4AqDU z22NiecxC54x0}8mY{N4FpLye`i}?Wmt;{tvr2Tkn9J(=G-}lg8e;96#SjEk4U08-K zO_r|cUWG1l0qKVyI!6!4YMH1SI=SQ;pV&4~S0Om1wChauTV&Qn1F^<2T?*__&pD9Q znhLC)=OH?C0WABOFrM=%^Gq#iUX-eF67nOJ2 z#iS3)t>IHl3B{LRJwNC{$?pFLL_$c78gqX`NY0{~NA%G9lz1K{$Q4Qtzubf5kZYqd z`xdBYwif>dol42@-`)3(c;SaLXTARR9Pfpq)^$|bqxNi}64 z*Dyu01bY)OJy+XbofL-azpr}@-d1UR-u2Zx8vZSmlf>Gf2<7|igQ34%ZeD=0@0Zp~ zmM%)r878p&OF($;)uL31GXvHrk}q?#~|r?hikQvlWt` zMKjA;%C>m}TY42%qya;*p&Ph_DeOO&1fwElAlUZu;3+g)^OmbRS?OvWBZ9&6L*Nu- zPCLQ-TN!fW(jM2U*mSG4Fv8@{EmgL7X&ClCi2r;E;vAR*E#78n z4B2O=RD7BbSL!xp4gk@=AV+sO0OyeZ;Bn(FR`Kg$GGqFIa$GHzcudu~k!H?1xd4vA zwoZ<~LyGgJlKOuf&r|xhH~_!qzuUf-N|o+S1H2l)!<_vGf9_Ut^KGsbC-7>(sp&av zp1?p)> zHl$gJVDunb`lo>Y`-v`9Uw3{mZ_*Kr!i1lDMep)z(sagCYihcWb%j+s-^N`(q8$=T z%G5AcSrc8Kd~G_0YsS%iwH4>&_B5K4YgSGHOL8z&xr2*&{O~u635QZgzTRMLVCU3! z)G`!E`QJ($3kF-U=-?lOs-r?m91~CJ+Jb9grM%uJ))yZOb}I;A`G1T_xMQQZ=!3tZ zMze-dVb@W_cf#3Nr_@%{bdz{ISLgl(znW}eIO;hsG4T4PjxS?#;R>kdwh-VWf^Fso zcy&H(%5R>4Ovo^TZ@}1DK6l=f25&+6Nf=d^?~VW6~pR)P5Lt+N6Tz`G0!E=rnro zta&N-p?ILxuc~|o%k*2dM`CV$rN+Ra=MJ({adObbfPv7_O@%55Mg-b&?mY&%DkT$^ z|32$sfBMr-bH66OnS-s_nZfWS@O3sUP_odE20euu^`?akXl=QzYn>8J9I9rDv4l z8OlmIx@{Sb7sI}UaVFZyTBMKsIU_cRWOl;w_g8>48$7o#U$Xc{lzx;wK<6bJFH#*G z;^7nvK^9w-Oc53rgx4vYxe`yEt&)aKkR}hsyH7$(s^-@BE;^oifj+v|LrqHy&-DjE z|6l2CF+}khl^%T=6Y~l3`PLnFGJ#8mc_v}n#GGv%{%%cH8lw`1*h#v1E7*eRZqr+u zG$t5e2JUG-IN3}%xta7~d`myi#GAR8{6h(VAvr{MGhcb9BpC(7bKF+P|3j@<|8u;SUXH)5}X;bOHYeR@3Op z12~l{uN_ENGv~9@iVkuB-PhpflDRe%Jjc%**J0^9eXXDK0i{<0=Cj5u-xY>Oz#n0) zSoek%^B<}2emdr9-`G0Hg%Ih&jb8Yx8nHK~330+c4ny8BB+Np8s`Pva80aCaYqGGI z`3pxclE3VJE|D#w5jpu{j-l4&&O;D(n}1(c_6X;GWnZ%V{6XW44C@rD{e+_Y(GKBc4Gf;)oQHrF@p(E)x4ru7gon zW;rIRi}X;9)B>e$Ko=dL?&&tc*6D=6moFA) z7N!uzG)rxG7%yhOXu6l%B5q|(Qf|^6dg}gI_vdSh^;3k7Z+Yo^rxuY=8R)a_S1d)G z3_|`M6nIc%74=okHg6e9R%nDxJWXNjs~-r{ce_7@Ae&32_QPc>Y2tUxFUl?4Uqd;h zU({UIj8Xgc(LhkRO25ByIMy~AH~01T?@ndqrX6ay#pJuT(7e=yLC*q1wF4PP!?kl3)n>smf?}Pv9|~^ zZ}Wb!{D7;UfGL&b{xO44ct-fXjp@UsCu;2|y-Z58R29KU&kf~G+p4w9XNheL@T*`q zN{wf#nmw|e-W0T|935u$k$qdW)L|H;D+(!N`9zfY6s_E_9 zqb|c!3@;11ot*G=6EnY|?B1Fk_5XS}{TEJ(EYkM@&kLhpdti+GMi776g#+4=gS=XK zX|s{BsT0+=X^t+kMI(#&SEf$PC!;oDCPuskc%k}7O_i9ExOVFw&5(=NVa13OdyBKH zCP#?xfF5=LG#6w|UcXl@ZLOL}E{EwYU73KO^JUpN_g^eUxaW>+F!2fHCMb3;iLkwzMglQJktO1$!csmU7F25g;I z97!v(dY};rH&7>j+}?gHD;6=~msVbEOc3I2Zl%c03=1{c#;nTw#(`c_E>a%q!Z6xv z51tPut8}OAbj;&in7^>1Xd+ZoT4C(kEB4AcsB!Iy{Ke<%C1;E}eD7_J#HUZ)Skv;; zQ!edZqh5Kqs%i9V6@DnTG3QF**}Rh`MD`UG%HC{JQ~S1Zq7m9Uk%X4 zUG>_vnc97_Jf0TFF8?HG9so1jV8tML=lLE;jL+Xrbev<_{$Dti;Cyqi0DcfOOOl~E z1NA3S>1Tt!FJynb{0W6%N^P>8=CjaE`YVd#s0h86pYD%4PTyZqeg89OWQgC>bZIG6 z*A;t2DH=yDpGR|kKYRy1EZ#NKRQ7VqYOAln>*%R{1N*!~n3Qd7-BR=^yvPfa;&Os8 zVLuK3Hl;M!^2vDdEv@<2HtaD+tEj#xkIGZaY!v}Og0FOYwqtjb`ct0og=nb-wh^Lq zWO23rf&wpc#fLE*htN4498T{VPo@;h@9y~wMF}B~$7^a&4n}@yIb~e91G+g2%xrBg z-TSG=Jbsv)E5;qzw$3`)+|gQ+j`r&Wv;k9RsXC_VSHpT$Q(D1ce**u-3t#@ecdeY& zm)57yS5YBJ?q&6;@4~X1=vp9>@5v9twuhoMn9}6T=OgsYTeOo0J)Ox@CP$j|pJMpi z7G4OnuUDYMT+qcc*B0_Pr8*IFqdb@@_H#uT6DvbKUEqFO*sZ@Jg z+KXd9i8pkNm3+JwcoicDC#nt^s4#_+0I4F|w+#`Z#cOJ1$T6?bcT&Xa8T3xLL0}9# zJnM2murIZOg+=Z=X&e6Zdj{h#1LpJ7X)?=ILP_7%ExQ>N2L6=g>*3ySUO0Ha0is8F zu?@a(znp|YF2FK(yYgM%FKsFrovVWFTiOcVs)l~1k-cCOTW@EnlzC@stM#EW!E!X0 zpSkB_JPzic?&#F)C}1Q%Tb!VE&n~RBj_)YT&46~mIqH~Pw{L8Aop{jaDvVu?Qq;zx zL?(+C`DvU^rsmKF*4Tndb7!K%@0UB0-#8;MHP+?s?C=fzK0Phc9=3y{Je@hE7=ag5 z6|LI{js9(fZ~lS&Gm6kF^fr0wYPL^Y2!hN^eLF%{Rg`MR87dTgFt;`5t}8w~-Ww=S z6@C>%eK(W(LL4oj8z6aXAaN^)R4&*ooe$$9WS=UYD*`2J2GJdeyR^rxx%JWFrr)Qq9!?KvD50N5YEh$KFnM?A-@0^Rals741W@lI21Nkhz#p>tzA!WZriTrK?Q9XGV$tiKg7FxKtI)AoHoFD zkZUdQg?ss(L`TBgUoOKnXp!xv+x&iv-ve(V5+dIosrR@lSr;bvso&IGzNIlL_0<1G z^C~ESji z{R~!K6OzZ?|CsvnNytGSr7^~=_p*39P1j9X6M?Ets7!@R+(UvZGw3c0+3=U+$~6!L zITtBLoVp&RRg>I}23{XNkxjZ-2ZM5lq|zCwiF^$Rh*j+4YQk?q=W%}zz8LbId2mcP z3a_gLKmQ>H{NjHG=~>KzmPD#0xy}odB^)yiK43O>1Y(rb#ed=hQ|Pc~{0*a@p!aC! zma$4s1HYcYf=#dIswk|h6meV5%IV(j%j+RWL_nFCeAm6Tvf0*@(Xx1OK(?sy1yJ;6 z#=;ysNkTlX&fjt&GNJWfMiQ%3uKlazaazQ+-tABuRm zK+;nUQNj&oiAHfUIg!#w<8WyQ9+tN`Nups_|kSA_0mI#=O*2xxx5+0a(?+c(NdeUjyM&##fBmq;UR zXq`DJe|vr21bRLxFQeKFp!y1+BE;6PYC>*%3$bzUFB~mUFQh;jI697t`PvG?Y6)Za z(Rf11*TU9LrHSvQ|D(_m>l$v?njAXP-MNfg%swk|SD$y@L$Y&a~ z6+UA+P=9N1gH}LAv?t>*|9P*MXvr&DfWejldAnSUO69sc1yBgq=VKI-N=;RufU!*r zWE(ueC1#pr-A8;uZEW4uz$KvP7{(GbKi1gS*h?UVx3z+Z0S-_QreV&M(a^Uq_v31xh}Nu(M6|Qf)|~|0c1zQjY!AaY zyTA{!z2tQ?tExjhti~bYE1E+4@yam|looM^e<3fYhH)anqfLqJe~b8VG``HS$VA-r zzPmZy^)DR9!R&jV9@-qwX5me-CBQWdQk?Vtnnp*8y zN3Cc!-)m+wao~bQe(O>@|NtDzM*t%xKBU zHL#r>4+&aox?MtYIZ~fo=R&YsKRowZxXD$M9?k9gcsE+%=ubUVj8;R^DCE1rbpu?{ z>~Hq+kj97g-bC|FttdiA8YsaufPz267!F$=4Kg~|2%DJAn_UZuLk0zLWsSgxZNc_= zztNQGo{qz~AJis;7?nyVrYartkwtG697CWK7|;7*o{-hI6LjG7O`^Ook0T*qtUSId zQGkE9Fq!HstNL<5`#p9d1qlpa?ODQY@m)fvgDm^41+Shp4LSP|&EiU}%c7cO@S@W!sOGf}+wpehq4u37LgSt&gc)Khj9PJ7Fzn*Phqfrd|@YxZ9$^Yr4^+<&gIR zjlZes!G&_*4I@!uA8$z;haA?XnmNAIe-%u0JPT6pc~cK0ROMe+8sPTaCvQL;5jPe+2 z2_p^Mxl`~J-;fpBRviuX&f%u|E2=kw?F2-hJQ~dRE_oADQ$P9$q~@M&q3@+hrj9l; zc=+Hs^hB(BIPk${w!C66$4g(h9WGmaA9GOFN0x}dE-v?r5Y*eZ)LiMAqfeiCm21^L zB~e-SQ0J-4sO1E%A^ISn?aSJ!(Da+j9Y+FNTl;xaGaE}|^YL^JH>rLcZf(K?t$zsg z&6mZK6V#C@HaTt%&Ltc9Weby>mC0pzJ-WL$nyenJHdCl}CMR#B+|PIZBQBuAXU|HVz!#It{UI%9$f>6TW)*c*n8~~h zBcHwQRdP#qoy~j?nv_veC0+GH`B#$-T5uh9pREWXje0wifoZjXTLu;S3P*=~Qw2D5 z3l9s=-B32%ksQk6cCxH$z<=YYYO0!KqS}js&G443u}V8IynOB<;QyS2Qh>&V*1dFZ zKC)PA)#1_gT`s4uMOyJG@gOub{XpZ&%r_bWOB(uTGTDQRUKYD)ymt zF;cm|)8~C3YQ~zUcG)K3b7z+$p3;@l zuZGP_I%T=2t`ir=5k5X5YyY(t^Cj7eO|C{&5OQ}b!DJk{8L9Mr)bHY!rKQ7l5=Fio zewFKOnN=qHFK_S}d^o!t){&0`tE@1@?CgMt1{)86!=ck z$Far9_^HT}%M;Ufl+U;GKHtXpH0Kr-rNOj4 za6s3B>xK)qEMH99RG1&;k<3DTiALOe{VeGsitg0*%14@Foos6il_LnZqdvdsuTshuk zc74KBBL%3e6J@x5IiImY ztNmiE-i^W88oyhqS*9+uUoISUS?aHz>T=n5*#({GC>Ir|ThrF{+j{Vg$a6Qcz5xWQg{7dJO&Ji-^NwWR8Ysz$w8Ztt|O|HhCLcT+9mlRTiH3 z54pJnCT)i@U`=FnPp=@(D0JS5xb&Xga0V%Ph6iU}(wNWr{N^8>kq@u#3x49=v9c@l zY*}1~m2UU=Y@jo`2SR1LiH@Xe3?y&m9M_4&4~-dx<W`7d}}*peuJ!f05)Tg`VJpd!Pow?kp_9T5S_p0UQqL8@(ufw<4N#{TwZ zHq%!nOVQVp^nliqEOU$-BQek|1T8vMqa*JeT$-yX=u_@+rim*vkD~tT!t++}~%SzDO&F z-xxxLU$e&fo>l7puuU0HkNDJN))vPg=6&eX6m|VdYv-7K$aR4EYGA)}>RnDn?QukF zI$<*j#}v8nY4{0MW_(LYxj>+n;p-ZpvbL}}^kmX0!%nOEO)Cx19ph~QU8@4Ff>gm4 z5qsjn{>c!XP-Nm%MkVJ}99vwpSn0s1T5I~~St2Jv=JdRN9DoU}z4p@86*_20L+OFM z#)KIyP9M48OOg6`@eSF-%lbWN_#9g{Unt9KE-qOQN<(4kQ?Y}2q;pG9w((Lt8VvN09I=Xipm z>oemw?eEP)He)sn%MeC*y*64$zV7lB)b7eFt@@g(kr(KhEtjF6C&NqM18xn%tT=){ zg8;BDvZH|E)YaNuJg^Msl!Qv0KH-Ok(XE{qRwd1h?K_u%O^LtpHmNc5h%Cu0BSp!K zJ-K|US&4hqbTzDm98p{V>8@TiUaE+r(0lm93t7XW87S4tDn5=UUe!B{o4Han)}4q) z_0oL?c=-=92UAQ=Xnx=c_w1R>FCf|m?bDCK;jHVt%UVWd3*~m^$>YNh18G_+GAqS) z9q{_S2eswL`1I3xZaOKAt*J5fmX2}ZZISeUA8F8BS@oybtbM_D>lRg9Fdi=x$LC23 z?H_kbX+eS;xc+}~h^jz+q4V#`PiiqAh6?AljxUIVi~<{o7MIGQLUP2eI5jD5RsxD( zsjn29T*IJB9QM`g;!6dSbz91hho=>F^kptFl~ko}gs>)|*TthU`a#dVT5bYV>j{wP z)o&(p4pw)(KL%O0bq*=i);M?VmwiFzFzyNyMR|^^Jbz>#TB!Ds;fug%UH>b4YID}+ z2b7NAW*em|d??F!SRYdRxTDskOC7^+YOP+EOZn(I0&QH=X`C}ks;+tIO%O$T6Ni3_ zMEyG_0)Of>W3LBYL_4HdBx$1t_uNQO_;M5XB59B+q~(U~B#TNsOWb^Le!Qr+TEV~< z3PRHBgzZ5GOgUf-t-vh*#>UHuiS{ZZ-}salx2ZY?$#;0^OD|1GoMccd2ZtHFBYyAk;;*jlXPs1^MugMO z)s_mI=)KnL*QK_JBP<&c~$^1K=IeAS(1zcRmQxSIR=gX#_2#GO{>_+gc@q1+>>KJM}(#v5Cs zKa`Lb2ikHkxg|MfX!Xm;M!v@!Sol&Lk&oJ5wcgzvw`Q~^Iw@R}3rEVP+Nd^-($qAC zeD(DZbvs+li?BF!5g54ihBldIEv>q_GvLj%8%%JHIJD|!24-=cxrXTwcl)K)~I?^;)`xR4K*Uo)w=^mQT4UOs=wc7@7AZR(j^S z3vGT1(2TeLQ%@f~ZI}Q2UoFhlUA|;-4(}uQrQ}b{Z-6(atIU-`x`ZvX;Exk*yGhz@ z-3;EK&s8t#OOBD`pml%S)48URspic_YxQosWfL7{vV;pVVe~ zsBO%c;ue>luzope*eb&h2PPuMU zCV`0sZvOpYR$t-A=$cI1q(F_HbI<=i|J8}FJ$_ETo4@Dsaq}{9yWOyNzq=$+0pK9e z^-n5LGQ`ANiZq{dE0Uz9Tu)w86m)UKej^D@u{-2#v@4hnL3yd%T2Z%@xqEs$nZ8{_ zc{)(xbuAI~ojXDH@g2hDr7%b48MlSfb)N3_kD(Nce1i4u7}otLy$?>|)kf}b(R@Wm zWzKF@q`QM3*9s148+XelU5__sVt)F(;X)@nE(C)6*(m;ZeJhEC@ zbgcT}PyEToKtM2mn8jaKq(v-p`iWVjfc_GQ1-9^y(|(WSP>&0>IUY8ifgaX$5eF8l2Ro8rclB|GyfdT;xC@{{5*W-P z)!0d|f-`uovS=XV4vCs$&}4mUbV7Li(g1CQL{mI}>0pe2+0Dq8cV?mhEnf1VD*f!W z@>2C@m9HKGZ`oxuY-TfrDc4RUQcspYnWfWfLeyr}84=*;& zZ(p5WDsyA~29wZ0YIKYjDuZ+8IClrP9v7L5Izg@IkjG38`i*}_(Jt4JaUj2BAd_4xnq@H*oNQ+!-0VP<3cE)6{tn{%uXVsDk|mibGJU6VPNb6W zQBzV?^JS7mdT?ByrKf3PHXMj%ARQ$^&8bPHCJPOr3QHS0`G3wN&`~#|9l8ULQ_Vz! zBB}q3FhJVzHtF20sP(6FoCFBeO1nHr8m)5Mw;%hPI^DKy z6WCpW3*iU*&072rrBM-Xvwb(3cLcH3Q9o8UM7ajtV9jETFz!_`y6>@N5HZcTrpX>dVUOwTwlwIKtcOns zjyCWxk`p|b8c_Aod)blWyP3{cZx^K3pS1;rS;XVV8QZKmtzIgzsfq~#cU9)txSjG# za9mWCW?Wd3YXawA6HtT|KxX(t(loAGcURWa#vc>}AvgSjuFeIqnm(_hoVryy=N(mGIUU z84)IcY;%%xso^N$y!JpS;TB=QZaD*CHBu7kC6+Rs)Y7+1ba0ewEP&3Ea}zi7WVR5? zl2`s|j%*EwiIEK5ix^?BtB2TmY+w#dQQZB918lrST$5jQ$4`fyI2OM;r>ft358dzF z-eeUPmV0acXgfr1V6ie`mRU;JEdq=j=m{z-E|53^|B^V29k&fu&_K`?z;909op~XGApGxi1ba++b{_a>z^E7lm}dPQ#lbC& zo#GW$?+~lfZfk2enTk&n`j#q>M2rq@ZxIyJ`8EZwB^NL)6}MG?P8_qR1wJ#OD{Ogr$r^rX69R{bdM@?t=l&E z=vHU0TD>fNOBwgY<6_r68bYq)+ncJk1!ufTOFI=&8n_8XFZ_$pm1CI&+3CMN+ML&mfIni{;4iK`v!B# z+M#_Buk}b_HxE~<$mNqr$*Ov7RQ}^CM(tKp__Nfvsr63oX-~(wWv3nR23005a<&z2 zAJsRo9)s#K1vnlllnh}gFtYV5yqkEE7rEJw&K$9KH zHK99UZb0}%Kfku}C_|%Icu%GPfuF zUI-xjrRhiTW_j?mKKnILa>(WJ`fOm_c}QMIAg8@&s$L}EkTzUb@y@~Y=*6XY7`#4V zmll-ffxTV6QklS&9yh-frmgx>)xwY67evmk#Fg=CCM(P)pg)7L)2P}L++oD?UrIWS zfBOHehOb`EW<@rb9I+H{2D2RG=019Mt0Q1FJzzKSFsD;fZy@uH`}QVVQBjbCHpwKh2#D9y%K&v5nz>GSGdPDkh@-f_sk7^UFGGF7pIh%VmJ@t%`g`Wk;F z_*jomJ6T|+%f`Myljr({!9zgk=~{k=EaXOfB%RkTVgLh+ zKkY=Xur~M7afcMPig&XDk~aExUci=?uv}!8csN&)@lLxUm!G(vQtL(?;kQE0biGE( zG@nu$!sj)xK@lEcX%6zSJ=GF?iz=DD2?}dEvH$Yv!!h)JLm2H>*qQenQ`o$J#KLhg zuKy5{Lg?!e7-Nfd^xu8`UgAU#UiukKpMPBpN%6{QY?HM~jH;rlGU$CIDx%6MUa7F>F{oq^|6t2TmK#_3O4dxz9E}htC_pT_&rf`}^3N zihbH&O3BbqR&2bubo%-u;YZKo7%PWs>Z{yij4#|^gM7NjxKr@oqy4zO?K4k?)BbeW zpSdJ!xGAuQuj^EMz@i3ADM}-q9t3vvb=ejZg>Cb7!N@7Ro0;P4=_U z`>X0n-1+bm{t;gM%4GB)cd$cInn2V|q1173S9@hRr>~tZkpV=+GS*=#t-2Hx*K-9K zn4BMFBu8kKv#^RYU4i*$a!mFaH=$EGl?TH@UDWP#(E*M##TsHaGS2 zbIE{`MjDlha?j-_mu#Vx1wMAvP6Gffv=>jwpkFiR;LR?F1+c+0**O3!DsKZa&rdCO zJx5J_9Z*68Hf!OL8&|yWe@yv&V9IBO5;eEm#og=)W}}o4s7&q6^sOKSpk7EzLg0(2 zR^l68VpgHYtg6%rX8jB0vgT`_ldg#iy_v^N9o<{sMMA$b=C#y)V4RD~+{tnTu`v!$ z)>}I*xoIdtDc;DLA@SnIClodZU3mpwhNjf2S(Um@j7-GC*GIFAB8a+R?G2jpARVb`MCfnpDl0MS+`ar+40}r$)>iVAFfKVzA3pur1`q&YS-&OkX3vl4UKQ$!c znB>7q{RN-L`^GdM{Mg^nc)>CQRyaDSoQBj;c0LrR(_ znqL!p>(TA!th^s5zym$Q1WqW@CU$1Ly=2ciE)_)RflKmz?Q#IL>+J-h@$ z{O#qyOb0Bo-y!~}X}cU^9TWBPJjrtdgtrf%?2&YV%toqR~T0aiUIQk*6FpR~Bgok%E zSx=?rbPraXl{=@?Bw=hOix>hth!7aT;#JpyY_U_M1@FH65Zsqq?3nW0eCu}RW~ z`}A4UOt6WhUND@W{Dsd*5F+j&Jt_ptuX5<*(X&tGgIhm06L!V8t=Lwrdzt8Ljdq_> zd7@mdry~z6Ks@IZ3n&*!$XG@j0FpuIHU6a0&q`q`L>tZ*cCTa)zuS18Ru4D8<3qu4 zS4PBe&gv&D2~Zf?Ba$t{B9fn_+h{fmBa9mAzWtC{QB0wG(WFlMdQXCGjkCNM_T)y4 zAC+wGMUUM~L@n?Xr3@e$%P0@uy9*Z`?PgI5)>}`Rb7>_msBWSdqsWgy4Nd&x%L4=# zZvEJUO-OK9hM^zFGKNq14D$1sK!3(qX?>2PDAyAY8AI*@T2-Q>&~f15k_Dhh>_=4^ z(0pIEX_+bQ&E~~DBZuv*gWUOSi~VN>G*&!0fc|(SBlCJf0PBo(8a36+Z9!FY8RB^^ zNY3B5_*?Qw}|hRTY>lV`iVQDv@h_0ADuSUQrcFA9W;0cV`_ZArkYgv3zMZ0rDqj7 z|B60)>>_aBsQ;?5|GE!KHCJFNY+ zCwy&=-}e1EHa7#ub~y5r3)CUUHE{X+lQ`MqQPZn2D-9f^@hBq~Xz$0Pay7)51(@z$ zQHk5rv1pFU^|@XDW~IBGqy7QYhpKiH7MD>$A!MI(_27kwvSldiYZv^?bOOx*E8Gw$ z2QqMcrmf)NWO#tY-Hr}1XqL#NdEl=(!Y?+pm)?EcGJizOk>B~Ag$wJW$~4k0W3xV` zQWk34N6yAcde}%S^hwoBkTg@Rn!$In{Rx5VE>zYz`*H(@MAek$rth*_H!8nAw}}sp zWyO(Qt|*p2?|gABb)7t0VAVPLHe&1*@M3fm){ZE^qx`Mn7eai`Cfqe00idT4Z7hPG| zT(~h-o;F}aC%jLeOusHEh5S{^L9;shYpc3-wo~(_DqHpTOK+4~B5pmwCiX395xa2o z1|F5a{0+k5-B-$}Qd>TSl*tGgUH{C}u_+o7m&r_jHtHOVv9U4MMX^ z81MaO>G;8qkjTRoCh)^mZce;GRc&shf_>h2QuR6O&BxR^X&5xz^3t6v;PZTZ13zlq zn~3OvSQ$Kb~-N zZdWi#6*{xuZRvWNB2F*fpYv4t3E%EyURt+0*^QrD>|(b!w880oF;E9&r&jRda1vl; zDV$u;W{5ud8+fehRE9TJ1?U`TvFh*Qg$coy$x&hF5xKU?V(kj#w{}_LIzkh+xdS%g z*Z^$bS9sl7i}rs0*e~*$R2;OXG16q0IZcbQmUG&+Lm>3nIK1%b4dODsz1~Nx3!32AW{B<|DAeI9x;nUAEg4f8r z)mZ#;rW|Ob4BCOe%Mq6b8f$1mGst0~P z1-ZFl0runF(Ac^jLr4UoQ5TXj;xpd$Ei;?u}Y#gN%q4F}Qp4FqrN zro*7spsmHdPEVo3nY)LYbJy1Zf(Q`q;$%7LQmF{vm10Pq3 zhMaI1uZxf3_h@8ckbqCL!Q;||4%_8-T&1L@C;5`yR4{gbI21xpH+BsFHbz=-9*~R* z5xEIA3}~3A0&6Om z-5@4FA!W}3f??{UdYXQnJmGQspV@hl5?;@UX_{hR#&B@R;W=az^_h5R@vYxadMxut zSc`+PLk=AC8nG+jwE-~XOmN<~+`(BOW_5tP`I>Dt`Vj27(!C{6{#h`#Zz_Ql?M^Bx zb{rT~9B+`IsHUyn&LX|y$g9w6SN5s@Zo$7`Riy<5@)DGWTo?oT!R@V}El*E1OD(w+ zX#)l7OH(mOizRJ8A&5!;k78g8|Keux*80noqQP-_dQN5E_{l8PcncE1aPd~L$L9G9 z{!pQ8EfxRCV*%4iYEd({ZPU$%F0h8Idzv8rs7`sG#M4t&^uxlE#L**J#4D2G$-2tobe>~N z+Tkvw>100u#`Oezm?^Qoy8Bcjq%#zBem*_Lm3&wp|X0_CNP&7@gqfi*c28Lac;a8A1!(Z*`c)gM=r)T?F|4PAU|V zz{EB6L_s~#5;F&xydG?i=n*$37aC2C1o_o%COOb;^WXiDu&VlZ83dz&YRP{0ld=su z|I4v4K}kNA-$S{sobV5wrd5f-!JG$-m47i>vN0j*Q9S82(VlqY_(~$Euv_X617b*V z750V`DuwWoKin&eBNkUfeynWl??aa5VDi2a+Rjl`we_qj3t_4Y7W4M8YDn!I+6^ea zJ39NykH?OV|9o0*UzzGZfAS~r*q|r<+?~i?Nsx^Ia25vCzAwrCMtvy)%`)?^D+(tp zEk1XN9Ep9YzL!8m!?22ZhzS)_ATvVsok< zsp06fO0c`gljEl*GY%>&vLnX+dXhWrz&|gb6;vo>KTFU5>F!HN+X%*zFIM}h+L|$s z5LXHVk5XcCw_{x3iGz&+gv*CXCQ=5XkCtkMI5N#=#ha!XI`}#P(uI*HiqC%3XU7Nf zw0Hm55y@?y;aUMU6w=PB362^#k=B#K@(;ZokaLTMSzt8X;MBwz6)GAJN|T3jatE(A zKNX+xS=&hul_8U5hsqKv&8eN_OMtop(XSHP*EhWw_-9K6#xCj%j}6O)44n&6u>|Nt zSyz@@`gx;X}4OmMgSR5R1AWwAE?uhC> z@Y2}L5Wg78+P9iois0DchU={grxmqJm^Us1#BoV;zVjd7t$jQyIDH{U%wy{x7xDfW z6E}sM?>7q7`u?{Yqv>ZMk{&s=>|ZvY>9QqXfB!)NL z%RDkv?dya5_E5FBE7?*w=Rde#z`DXhq}L#4_? z`sc|X6?IPq(oY2L2i{Ke%i=2RQq^4AT*4)88^k zyy|iR8PE$bI=}RS8 z2G01@$m=bwV)}CT@29vywR-#=}m?%bKrb*Qe zy^r{vG8eB7Yc!utsJr4r;TaR!4^jVwG7ayZ$*mrKdIz70EZD{%%S#G^9xU4!j}^Cz z>;9$i$XJ{mD^dd#>cUekuZv3|L~vAqx2W}bixs-Vm1QL*&pwo>MK~aq^wkb(*^&H+ z)e7o%Hrnz?>HA3cng;TBygG%vm@yVAV zeDWB%p3&`Ss2J>{w(`MM;^dL{eP+T6`6FXLowe#NP}T>Tg~%U+(K~T}{1_K{&}zTg z<|ZXU_oQ;W992P+uwMsH-V1IGO52g!#1fHI;(G@1jMjB~hrNf*tG4X#a@We06Bdd> z)U`$rY#IURkiX%{DM6_}hi;=v=po4AJh8%zYgptIBnD35bd4Voe^Jq?6E3OVv%0w=S!08L2f7OVd8U|5pB>g+hS zYu89~d1vhJyTp!|=xBj@_nVZKLwCJym{4iID>yhMEPsbw%abl)tbFx9M?tx8*V?cD590X0Pq20{_)OnYkPxcL zu20gIX=$)pO$E-2t8_nO=l&uw{Y6fyL)1W>{K6D=MsQ>VrP7^-&Z4mExEm#U;A3ll zeGE3i_7nC8>=?8Ba`X8NPn}{RxiE=o<~9G-j|cx^`j! zB&(X>S>HP*fSqCtHM`57B`@|}KIh*T%@S{2squgkU(jQbwNVWZ#(_$l=x3lphSGnFH}ri}Ox%TdM94>r?^BLr@cK5o3pWD#!Z zMZPlH#v?{`)uUs?^dq3)!Txi5A@CHdZ zY-R}@V@3Na7qio<=}&Oq6&k*nE}aR;-cOJYt|Gz`@+RW{>)Tb>cf!i`r~64rH=-Jh zkXALJ=vOi#7kWbkVEf|vIR}SeM$B+z_FcQ9hYalb(VdUFEX81fnDT|7fDGY1R8GwLbrG@q zUCNcmK`3d$QoRTuQH1|xi~dF`ZGm40kfhOQr%U(`Zs+v)cDP#iIVpd>zN~s=jOEx3 zftup3$^4HTdTZlR(Bl!{ZU&m)#VuzT=a$e*Cc3dX3`#0>xZw;vX&P)o3h<)x%Ksje z*ngkBl}D4_Ea-ag68yT@ZBi5T^S|#^w~`F432AU(NPErKAUv%ac7#op03s2` zmVscck#YKp)R=38Ato5R5WlfdK;QW<&#CwvCC}}2K|C4N+g!U@s{jx6e{Kyy%&dVQ z4|r1NH<})^y1mHNkh(R8zf@0?2F(;e?~8B$nV=iU^$=s&)*cuDU_%9JJsc1ofgEp} zFmo@(Omeg1=9vx^XP)hT2cRDbZsY+tssR28aN8u3fMtD3Uq#)qjg?A&Cx_id)O^|P zPQCVgiY`M$=mi}{%;BatcS(wPVrgsHIfa=b#_bhVb5wj@k@KgI1K0FzbYl#riZJC{ zGKxITLa>=q03<1cT}L!k{GQ)>set4Lvy|FXoYZed4`e+QgromZY|&xDG`^HIJ3N}+ zfhK6-zhCu}jr&1xtv}OgBjiY#{z{GU?K%CX`FqpCD{AxLr!PQ$|8(ZR*9cL9rf%Y5wBfo(Lu1<)8W~!$L zRo&Q5H3;oUDLL-pUV&&(Hy}l%&uC)UWj2R_=JY-XEU5pHf8qbb?QO}Q<4ICpG%2|X zXi$-0l-fT3VvhcT`OcWxyC1L3$V)jkc@;`{46_43q+p;1`0h**$mTC$bnovcX>;=U zHRm%n;_z6ud9Sy8O;SWAC;<-TCR87Ht>QnzDQy0aIAd*7MdLrXkpUZ&R%&EO z2f~kkLu>6AIG;MnlSO#-hLP+YbGYlYfTjs@IZvpufVBBvVwPzuAK8si7Lo$D_UkK@ zOaJG;#)ydromD4DO8Tl30sm-k{sQ$scwq{qeYyqm1~K>LtP>BSpdk?MKx-k6PO&3! z*Yr)G7#YJR9(E$;{zsE_SKt4tCHY)-`RtsR(oyD5?j=)=w3~4MX-IjU!(o?g*Nv2^ z5^$#c&BX%1+y4yRvJWn-C@p?*e47y?_$}YyU6Ssk7eQUdBj<;eMOu7gk+7f7wXIxJ zSM~WDwZp)yUYPq(HGc%ETki*F92q)&c19pI0XMy zfG+MS;y1tAIUBt@cK9|4dsVJKek2Z@8Gj7~?92CCwL06^z-BmM-A<5CDV4@563x&D z|AWVtH%1rMt+wy{!jZQXKNL4bs$(J>BOkL25Bz(anUCn$J9h;7mzUSdo2NT^He+qv zC8qss&zGC8HfZQ$`&%}}=zTHk_Zt1#pfD#;>Ngmgl5MF}0;;kyUndT+*B^~aOHbgN zy*cMqp0Oyl!o{6s?(AjXp+B1PGI;TvDE&wQImMGHC=mi)v zqX;Rpv{5H6&I@M`WCs+*J6_O@_d@nxo`hV#rv7H=Ufxi}i2{(urq1!@rB4?Lg=M+B zRjI=Q&45+q2@sSQ5vK%7$oe;z2Vl^0zo5N2Bu)y1cQd8nFI+qh?d44>LT++F*KpVW z!MlX$lmjmZEWEl-H+n}+yB@G(PvE_kR<0`B?S*`+M9m9Vcz(`f_Eg;|bw6MJdNeO4 zZ|uzH87fwQsQIy8b$kx?hxYr|Nc~OZXamMus@)&ET8)0!>&>2Fw3r(X+(;aFej^$@ zoSYOyC+3;|aD+=z7s*Sr{TvDv4+=L8^;cM9u8|Vp_fQ?Q&e*je9`8Xuj%_jkHc#I_ zc%o40@dVU|*mh%{3L$1~-s0MLmRfyFu?ZR6Xg6#Q?0=v(sWQ89rH>%`3~_J1HYUrl zJhV%;`Tn2(D;!s(AkgR&yf;dbLi+ttN#>NaBBvy2=2ej(pjxf%u113s8n!)1?buB5g%?NAb%){w}8fzpqQgI!gm7@at}+3sm2M*MteDuM=FAdC1O_503nEI_%`WwCuyy?EUs|#9~Y%nAL;uoWGlkUzq zhruT9{fpK-Q8+~X!RUTTx$*^3cvs#znqKSMuBY&I|9_!*`1Mp^?MD1UcxoHoY0}&} z%1E!I1ZQgtGVd8svUL6{znPBiQ2h(@+zd_=ecV#@C7J5;^9ch2>{YQmQe%c*#Q)Dg z2FK9F)QP@gbn#qD`JDHtr|b^XZvfen38m}P?tWmdI66A#k`tRb^R44NXsZ#S)cZEy z`E_wsbhA$ky_w(Gqf`Fk#1Y5CNubi4@E21z9srja;t&hKF$>lxQz}uJ%qU<+?*9wd z2K&?Hzx$Jq@P=QtN?bE>Y#i9~7tkMJ|HnT4cw$JNV7bc`<_1Z5l-J&c0$r2^$P+GT z-`__HI4l180@IrF$q=WAEwVSPNG<_t2W&C7Gb2sg?%LmD0LG@!e-5>rn_HA}Z5NM4 znHO7*iNGiB+dHEoPz$Af(Z@)eIj5Ino19bpjq=dTR39o*7HqO^MhLy|E2}wpJ8Te8 zeMmLsb`#O2it7gr_O{UwM3X(~;Vvi=$rMsHmM;&`Fo9OPMsOTF?9?&*?hx+7|m53cNW=G=*FY|0MQ zm3gDBUKL);1Y5?#f(bRie3*O^g#+;l)+x0p;qP zlj4SUc08h~3It^PvUCpda+rd~Rpdt^l;Vq0y>AmUeBXv@&@OJrF@DQEr*3Nbq=RZg z#4;)_p7D{QnF9gye4RbdjP@;zh5AmFv(Q7(0w(ZlhE>u(763?*$TZ1!* znvlyNJap{*1zgxRqBfRXik)h36-aWL)iVK9 zJhZ~l_6PQTB9izI^0_WjQtB|CpCMXwD~P19gUZcl!F+a>l;6C&FZorQ^D%E%2~SCj zA?@L;m%ZO0yX5p;hZm&+=9p!~(rH_J=-q_&yFbb(A@v&Cbax7zuOa46t}F8xaA&~@ z{Sng&zkE>-O>6G&1*4Vzw@e-pv>l5e8jB##%h`9FA{=>o*$YQm!Xqj_`F)=N3Gj%=~{ zlffCUzsdEH1;;OPne544rSL#=8lKeQcJ^RizVN&9G~natCsWsnpgI~UtC#P z(CzZrY;buF7YnqXXX;z&(@_q@;p2vDstGQ9)OIBvK&GgGMS$_ieBQ;i9dNC`DmnG!t!RAm#{R5&z-E<^{!@(O$Ho z&YoK2rRbX<%^9u5R>!Ka>^g$`?=IMx8Ma7Jld`$WBHokCzRxd7(u;;VKi?>GeD}m9 ze^5=8^`3cBKs8*|^|i6Z?ei|yXMk6uFXz!dVnRRFD4n~ER3L9Aplx*Lr`Eo^dWg5i z%pFJT$8I-xT(87_&gbC~Px$cW>J$Yi0RUD%5SjON4wn%CO?M3{ycX>=;<-4mhgt(P zR$}0+fE=GQG06HTH_4xK?W~KKUEnTkn=EU?l+C-I?9j@q-PF{b*C&-QMF}WI>H}R9 z?lrvUmX6UjBFpc4r+?1w#X+hn^r|ZHnUYJmm*mb|^#P~T4!_q&i)?sUF9!Mgs>8rP zcy8!@6}HOT-y94SLCTZ8zI@GvN*q;z{VB1%<<=&7i?)ZZXoZSfLlkE z)s1aF&^jSVJkq9BB?l}{D zG|eLx?WEB;@li#l!+Jq@-xo)$e6c?az%v{1Ad@;KOG(Zie&KV+rPY{xppJcgdLu+m znXnkvo*J#+~$cG(2a2;{`RzxWclV>*ne0Lw@Z zny4Qj_8R{XQFPuv$?P$0$|2%D(| zJ>HiK0tcz~N$!jFM`k&ZaU zzZHb*@#wvSm%x#SeyCpf6Ozjjz`^0)RGl=T;I`qaey7Ux{IzbS>%woWJFGte7M?`bxcl${mcJ5^ftO$q65-mCh zs#n0L@tfxnVOHw6wD6!@#_;CqX4=LAvjkN=U#1d_)@znzDfn5gz6A->iDR)kS(i1a z0wMnL^rq04olI?_b+0||lz`(Pr^^gys!T1F7}Dt~!xlHQQ$Kc|fBD1ah&iB2`tSw6 zrgd1p7=NM*cYgPjL+}t|@Rn%n0GhK4Vjg&oiBgwoE}T{pW4&0umuTtL+Tl zpN-ePDKzcvWqB@#|6chRRVME34C+FU~`I1d>qvF0ZTj>{^$Azc2IO%$3h!j_S z44rGH9+c9+40}CAXguwW4+FI&jKx7ji}Ff-{0HIbfZhe1DEYZ?1qZ%9wo6^`x9Rvl9J z5rl@(gdX%hn|S6Nb!8z}+Ir5<`5!$0JH26E-`$@Y5@x+esJA@MJF7rEM;qgdTCj1Y zZwugWWJfM3r)9O9@@=od1g=csqL2vqDAhZJpB3Q$=4zZ)sZotW-VjI{-%pbF#+>pKJ`S8|;w%o(kX@f&Bbv_Jd_Ua7=%Z9@?d!`sF-qxpfG+m%^72EHuf1?_w_rh;B zcP?`33m_f7lX)!OFgx#toKlM@yyL+@3xzJEco>(k=cmZqXyLMfk?s7u#{thACigQT z&%Aohk;fV!qstu=^hnvLgMO*Pol0#+b?1K^8E4tMnGB(tA&wJw58jHbgssJ$EG|4dOZFQ z64yy_hZ)$F7GOj2q;D|cM23D_)yGN3q+W32eh4c?t87D(y~Elvl&Jh16fkGBg&4qrnpr-H@%ni z<#T~x+rnUNp~|EtoLJYiQ;>bh7|;OE95_^n>*2cw~Z0h7Dx>(451MZ?t-8zu9W_P*)=yR{yl@ zT3Jt*lz8X#B{$pVM1T1(dSv#UnZ|*{GyT(1@s~#R&JT+VJ=i9M#3Ide-k%` z-nK=0m!q%9*pD{2UT602jSehz%c9mKW3Qr?myei|2I~x*qvOMeTJev<dH_2jeME7@#OVBLF8+L4rcpNZCI3_}+CyYBddR*rt#!8EQratwIvWEp*fO18}Qc53Bw?5~B{r%ho z(Hku1wO<4e;eX9${nWI=Mj%;T*sI9_&DHdM*=(2Xnri&x&Acc-dcP;z&R|PNMN^93 z!oHQ+!H|;io6zxMd%f>7iopuG0v7bNbnr&d!*;DQ#ra2mTOv(nF^crO`W`(9$pzax zLzyqF0=K=v4Bt{SGf{M{rb{f&_NUNS0Sk9&0=9iiCQoY7L7NlESlK-sSPY=nTJ$HO zRXu#puWDMU;xv1MsxN#HwGgp^Q|8{ipE4)loZ4)2Pg(Ja=6W@}Pbsy3XuKjHW16j$mX z{koSixLIcqfv3NK>(zd@;Kx@pg)gYejM5Iw7k5XweZ)58slNTZ+LoqFHUIAXBe-*) z)B3i)P7If zpl@|K@@B>R-{-%c(+8dl-b$!MhgP`cOQ>T(cBj24x&C^L*rkgmADhM z{Ytyy&Z4$Nk>w&OUZBZY#yc_ByDKC^CF>6<`mWrKPG--)cYWH8L#U#%pt0Ftt4->x z6H^+hOeIMC0IeU`q%3fcw|NW+H|}q*kj6?0U!pf_5Q+;M-dDv5TZ12|f1+R8L_B;; zV1tvfbp!cRL7G)Nz(Y9CDk=9As96G&cbO+y!)Zm)#{@4pOl<0j&0KU1)6)fk2w*se zKB>$SCX*%FW56HQi|UUw@1Sm|Co7hn>+*O$LYH-Bw&N zfGe}M(qr5Iy231t318kaq`VPSD6pFv<$E=fv@5Ny>>6sMF?3DcJ|bAd?;V#%uZ(Wn zKX{MR*6K9^Wu4^BR0P~%j*3R)?;mH4y)A=1V41apY51ukr7rz3hoHB&+-i3*~_`{#$` zk9%Hq2I^!x-28SU_syKUGnPtDrqM9{qX}Zt&N%R371^e$HYs<2cWNcy(scFdC@?`R zlmqYYtA8&)RNNEk-dCGDXjG5q8Mc%Zns50B&$hQ&_DUZ^R(pQ@RMAeh9_qPrN4V>2 zb0!VP5hqJN#m7K;FC}y>cMe@J(A;bOF)!m-TS4-+>zot>#F^*L)OfFEXBFLz4C_ozwiOf<41`HH=R z19>==V#Zt2nfMtY&u=K2(Sx;SLi|pQjyF%6CWS}fd;Hb7Hj}t$Yt16rbx6G)%=bE+6F>6rQaBR|47^I~%n*87e;3JxmNH(VKGvS_e|K=ki{64tI z!C}KE;qx+50?>Ka;&307Ntp(LwjBPvCv7>-n1U7ysp||ry@BC=hyndWRfgpG>-(YF zFO$U_$%cbaUv=M!UEW5OsXt?AaCcn}oY6A$wEby9@X@h_Ns)9NxsiS6TS-{htmZx@ucRHCo)l<5@DOLvr6qAR zsr66H{}fIiIu`Y1Azg4p+!l7J!Ee@apqP*C#i6rG`!Z&?>%h{Cf}S*jRz&!Gs+WNM zRpc|xwg~Ol2j-6h+_6e|77A)b>HUN4CA`XL;vCmAMydQ4jM8A$zzF{c2 z`{@F^oKgf%0)(gf@BK2DZ`PheE1rW7S8d9T{SKoC4xBYlphH!4q|nM3=4RWOf(|zD zW7e1+xq*QWLRvJYf?SH+)QE`iGi~Enl&W@@wy0%BT^OVeR-sHu*`U7oYT+>Bylz_s z*PdK~ZKtN%x8{Ku1P~S3n!TwXrk|*F2@kDh3r#+_Hy2l&VaypNr~kFI?1N^KGlv|7 zqJWBM!X=gETE9dDix$jKoyYhn-72w z_;&xlXcYT(h2obN-WnWtdoGPFD7%VRmc~^2^Wc&*JWC>pizhbv z<7O+)N{LTUCu_$Q^K>ngnn%aan+oQ&B|ps_*&=yD>*Z9KJc%_^oX{-_=N)#pq7D#d zs*pMO!aY#pkST0IK_q|8X7BQ=3sFwIz$X}#%WDTGBD;Fi8!9)$=%7ORb8GI}KA3O&N zD1VN~J~-|fc#4jla&RAZ=Azu&h;e({JeK{*hTWkx#-FNLUc zO{1HF&N^8Az~6Vzc`A2l#EG?#i2*sK?(n@QlG~f@7B3+_l<=8vo>hF)Pp)z?3(Zw^ z?~h$1ns{OmUMSznPO1srgCb8!J7fLJUKE>SJuj9z(Hiqo3C}DnZ1VJ0Nk&xT!r~{X ze-bE+=dcMt;4`+=g;m8)oy?+<9ZwqH?j3duYB=f#(A)3O24Y`m$j_92pbmzn&Gn_Y zE)BQ<8T_yHtoqKF^Jf0D#%D)MV}k$v$BW+nL6)}0p3jfsZD9*Q!I>8=SrHxPiXj=p zl(KGs{211p!)1`;fH7-x`s~W0(B4y&-0w*Z+AtOGX5`IpX=<$y)k{F?Sd+TMFODf4 zv$)FDshj&7Gv;Z&?8cm{2)?50ARZ^Y*rv zJRhU&9$C;&rwqq-xwKJ2J_2i5N1^=i)IEXYc~R@$&u3RqOUgiPfvz1pHv?@ZYNCJD z9LieUi>*nQGP8gZaB0bJ@;3hJ+(2K72{RrtPZqo^K) zlS;na{y^M9SJ9MNWg2i7?;8!As%p1~b?>9jGs)$v?SGK#b7t*(f7tPAoI1awV5yEBc``)Diy*p}5{0 z!BT1R72d(5WhW&dO3LJ8{U#6KbPDmtoUIv84M?0`y&DJd*BsLgRK;&-S}Q zNXdyK1}nPU91U*v3hPC20_!Vr+rT*$$Mj)fdBT5+@x4VPH7@F+;s|*k7oPwHM7~FT z@`;+{Dj~Fi5I*L6E)egMjpk}#8c|lFG|Ey8*m3ZpY^JUAj&p+r8aL1i`#Rk(P78ye zOo99uFn>9~ch(sdF@ca#`W4cS69mg(8uH5^hX8||Zvfeg6!kqG@I)sLfkI@di z-(G*M!sj1{N$1q!D4wxT8|=|mjgn;yPA4aKgi3z{1q1;Ug~HRG!+mnEQX*d~{&+W) zOBbdrKlB^|dBDUpn7ekQGkxCY(w)y?c!~BrR26jgIKxg$e~L8GHb%?u z$`K7mj-^Lf;1W&1RDeGl@enmyh@}(zPQAB#IC5FHW_WH`xyWo|T*c+BGQa>DH|Br+ zK}!f9h~zpu-D+X~TI(a_5)v-K<6MRgN&+2?ARBwxB`YrDj)X$9$?qCi?F8PvLkx0j zk<7PuzlAv8eBD7behke_3_Dj4-ywTuVIN~~m|RhK_7T^-Fs>l#!E|M)9v2zZIx$tY zC#yf|t*7Fbc1wGAyq&{~8n*%}-({CGQ;mC+Ey?&lo!-ru7y4K{ue15U7`d}>6X(v_ z#@=^dtN`xj1rD~|Xt0TMLFcpbQgWh3!h%{I=V|F>$8s%IsGR>2zs@(FMYH20kC54<gzXlg37uXUK=cm5KiYM56 zh@8=mo)SdVFuBGd%Ygj;q^)B#@zQ4O@I~zecX~;8!?bPV)XTxz2^uWG+x#rD6mHHa z>deaSyc#?<7&TmPuD`Is(;@l<&*Pw{sJk)M@0A3^NaARjt$oK($CqABs1b4H0+@s;h;Ifj(}8mQtvAH z^!I!Af(8Kt+d>65-7Bd(B7)lyG!*?wGt=6Vh0Y{9%a;9W#wyG=Ug5I@mfaHaEJ>OT z|M7ZP?s4ziBlpZQ{vS&_*<&ALPFsYZ7|t*3BFQ2z(60*|o9xw2!Y1gEAnP2wEJ;Ys zJ#*W*`;d*fQ;*YtX_WuB-md*J$UFk{1PU+F8+u0Ny(}Z=6Lr~9Wz2lEw&2aPiW!*0 zYL`=L8_kB26iddtSR3C2k`ELj`68PVKQg*TBM=XamKHSY)MwhdyuH78jO-p!nV&`)B!)3HUl7V1la%)pUUf>_E02ad|;!ut_*HgOD)4Fyf)9taF)+_qr* z+6b?h1XC+wvjocPZhyb)gFNR{uime?ADIkKn61l^CEOyb)^W5PUbMhgpJCdsKo{6! z0+zfi`>R(p9$5{=qN?#%M|+rB?iEIgiFbX7FskD>>!LeYhJH-eZ#M60jq%u=ENvai zbd7&@$q)*hWe&*ANxj43iS(d&3Fd92$Oe*xv2f9+mIU^&e0+K^oUy zZaQkWth90~6i$IO66&SFsE`8x+Xr&o`x1#Vvszr`j$iuUkQBka9{ZFL*SjzwoJ`g+{~JM*`$T+x)rpRr1hBdvc&Bi2kGkl5~U= z%+*6pw>ZG@q5;euTQHYi_H>|=2*aM*KY02;LA(L&R08(!O(qk_R}_QJXZIL5LVaab z)tbh(8YQOo-B_6;avF}sh}K0H2jx9@1LO%paR;T~wUfg}(O~=ho+;SmVLaSrK0lmbkR(Ip(QWhWmY+v71(X0OQW?>tCfK)2j zELXTk=)bW8+!Crk)$2k?FIObQNfr+U%8yNHOV~{e#2us>ePpDG9dX}HV3|*oI3GoH z5jFrU1y^EXenp$(Hot za22sF+&jyP2>WKqlJxqno++2Ng${j;;Xzd9ji>9^LmuJ~*;E+?^;5Y7J1eUu;-116 zMyp?^Z$qADFC9k^pOkw(PJE@iXT3K3RUhg~+7+`}q)MSjL_9oIVHY|wq`ok!$xj&k z1Fd-&W!6ufiEAR!~&CEZAabV_%3 z*UX&XM$dWQ<9l7-_ZQ5}6Fb+s*V=2{iydke`X_!oZ24A_3S*di74+p9mtL1{cMkpS z1H$6Vbp*?rT&XjkzgAn@$GXXm%L4|TqH~YeNfdpK5ztodgCqCpm~{HmhzV*DIr}ka zKK>wqi#;%=zb3jS*rfJ7^&!xp}xx!WyFI z>lt@lY`@HVe8VBT>C61sZDus01|awfxNjmbhkd_>fg|IhcPshVn{khjyV*MD0_^K$ zsd}NM;>@s0wQqL$qi6}Tt@Rp=%UL18h5T29+Tq)@u&tocMXc-Zqvcl8j5*hEV(iVh z1+N@uPvk~)ddfHlcT_D8{qfyE)8_D^51j-09iIh69*UO6-P|7cLAK1ni^UX|jP>>Aw0qu@)l=@CK zDoqxwR#bn7?%FkTqk%b(tCslGkT-K@wxQ`)Cbzc-ub^zp5|v$TnIi6RIx0m+-6D>d z3o%@;VmexzrS>2non2x8h;>c{9eiQ~@+~g`Y#Y7z7tVjbmyz`jhxyeVCE=s*-)_dn z{<4CnOnswF;gi_#NoNJHzHc||pMv~>B{R+U@{H*(`4=)^SIEcmr`C%PZP#0Y7QD?k zOfyJb+#NMeM<>4M#;-q7`EH_a<`x&I28DxKmRr5KN~FQ@Bs2Ws5BJ-S$mB<25^?2( zM-`27vI3`Xf=$9t(y&{HxomL@G79pnUzIM7?KaocBpajfR*;OXoCViHEn8-Dr!~sy zeW`k1?L5Q7*_iMNkLimyYNdocO(N=rz4Ga{#+(xT=g=Ci`u2IHwE(am=7h|#jvPzI z;ZU+`&W%_{vfN3}ICt(<1XL7CEzkmsoJ1matR^`20u*rh}j6eU)QHIv&D* zeXEO&2FK88nOmPq*dIso6}9X~{e=^iM(?|TFL+Vb^6APUJvIiu%gK5!Y*o%m!}3DK zDTfPt*s`|9Og5Jp;q!y(L=oCtx)3zK3qiJHz+gq~m731@Z@rC`Gj?(~i@bsW9I8hf zlHBfTb>=@(k5(sd&54R>N7PA%>=ZbD%@ysRm*#nPg>+gY>=;~`=`=&iOw_7Y97`pn zfbOb#8z^Q5bDfz$LsH7`EhF4A^ujD^DebfGn?#J_f6e+B^Yuw)Y(S7lN=bNtE*(~J z?VX_GkX;6l_Ed-1syUztWXu!&H;MoO;RMhOm8g@;=^@#aQ48kCiPY1&oH3cACl_CO zxy}CcubPYc`RZMERQ`dZTJ`87XWLakP4C#at(+81C$Fb=_+&kd*X*HM+2GrbJp#U{$OVpYM%N-H5wF0hmJd)5Nh) z%c=xx>=At@Ln4_>VfqI2o})jN#ga3d?=h94S0WndetDQu{UfaJ)Vutf%|-u*0_BjXk2^p(jJltwX?MhD|kh*ucRZQEi#i172A|n zelIb}JFT>ScLMx&V@A2mnGHb_?`^4y7DEhnzX-SWP&jBf;14Y;{jhpyX3N$4(@a|y zHmi00lam|)v??cRq)SVC!NvF~$!xNkOkCJjO$u;qy$9#ivQz{|akbF$FvwR=K6(xE zQ+{WM^f^1Y=hQl3qQLiALO)Tp7V1^id-8F!Cw&}Obqb`(iGuO59U3p|7a!JkUZ>-; z3UMoKnawtIVbbqN_NQXpe$r=s@PUTOIh`-Zi2!okVdhqflpmnKPiQ$8bZIqgRXaEH zh~`iw?9uts@37{vb3dJcN9G!u-GvR}TNvcfydmAfPdMh(+hg;X`To~9{N4$%iS`-} z1AF)y%4l?GT7%q>B2)rr8+*X`5^RNDXZBQ2y6vX6_$PEP?Q5~Lo7&8?vJ}-NX)1cV5B$m5T| z%US}ew1^zNA<$BVrntfX>bng=%9dPgOd*-lY@Qp!>yl0!_T&#_Ydu%B?9hz2_>6f@ zG@t|P`mGW>bQ83r0>XomJE&&n^goX`X$D#CkvvA7hCWH9hSc|vM@pX6`KVLi(^y+x z-KtVa$%1d)0XJkEgfNE3Ud<2rW~gz_LK}4R$`9o6)xVn~0}^}y+LcG5BhGHLYS7GD zvxXhtvFv?IBd|IE@>S2beD4PX{T_bGV0h%5ihV=- zi_znhp+`|7oQ$@MdBgNI4l5H5?#Aqi@+b8lbgyN~=+6qgs+WWG02R<2k$b=B{W0ON zt(+mO2SBIi0D5K6+$QpLxpCKNIMwng3H~-V{1#KvPBRGQL^}%ttjqe(T|D;Z5aIM)qU$^SZFNZ*wr6r) z;+x5iMJ&ZEe>yLlg)ADxO`~i1Cs!k z7bwhaUF*H4kS*!?vkp2c=Z&=Det`%&nph7!`EFXL^d0{lfs%T5!i)FkYlc-zS{&#s z;aB#{gos6%;&hGVBlfx6P?#%VSxCSa7;27yNjE%@-q1sDOnO)Uqv;)kD@5)CzNx)M zlMO_&w-@#1Zp@+?)}U***h4Z1&=W1k*@m{)LNku&c!!P@nw(zzuLr!%bUJH@kf6pI#n@vZ8O z;>=IL;Zxb~0Q31_QD!^GCL|_%4hs^8c1j?;wMDAg-U56t(0`W6W3aBirOD7epQdL_ zL^?O4K1Ih{rMG;(`o4J^I6zfgov8>kdO++nbh1yj^;|z2@U*yNIi)0|ZmpR|+}S20 zuJU9l3l2JSpOp8@e`TaB5sC-F2U-X;^)}S?>uQdgEw5BGmIVVEzm~S(=fwSUN+d$1 zvq`?$sJBF%wA0a1MN@#(6RU&&>yq@@IvndN*x@4RyJ$52Wn13(x*;u4so|nDC{Nr4 z_{BA_gajuLkQX|b@b`v%W(QiCA`8bAvDLQgYxwDV=_aby({vl1EDbd~tiYiP;+8LF zTtd6AYWbv2o2^rdYt$4wxV{t8VdSaB&2h>2cEn3TK7yV9-w*cL8pS;=WKA2zyu*-tz)&P{lkIfnuT}HTR1!HbSBXr)sL#H zP?)BM<_}>9KR^c%Xc}59gpUD$W3_KVbS_fYPc=!Q6@J+9oUKwtbAkXwXR-V|bF*T? zpB%Bnch49X!2c92g0U48iE)g*Af+4^6zQylPA=uxVQW*=5stnsUubKtsA&P8ZTRu?V85si@{d8#h`Ya3tlAXOmg^m5d zlGl(kYH0o~^JXnJTwTU=8GqxGhszTv*%tr1l;Z^Q6s&?_1p@azETn=(LkEgh&s;mT zf@n|8BNYjO+xX}jg412_s+TA{@J85QIKLKVa=X`ZOKo4x z9E%>9dC-ZcB*XSGSh3aIBYdn6gLkf1b%z}=3Qfo7TXIX%xqddRdK_sovt~Q4iV-MCXxRz>-WrbwofcgN)L%J|aEbS6$(oU0@9; zb^6JL%oZ51UX5pA5XFs!ZRZTtZD-xQxT`qrTVkapzr}&r)QUeDMQ*3ZZy5=*QjX-F z=INgFS;<^)k|8l;ne{)zOF}2CRsk4}?Y6V1(B5tjP zC#pF0m!wpB)Oa;iOTIbln-t#K?z*zBRzi9HR5&Gz8(0}IOgR4cXQ<;#vu9p+AXS6G zI4XPxN`VX%CFuI)WPldHn4J|c9PFv&$As7)!i;w9#1+gUOGo7u z6|6U=Lw%k@s&H=2A!e~1)!nE5vv{e6{-m+2xV#_-DKnD_7d$)|I&bbn+eN#H1%T4D1b@3&$(X65HhuEYjV9`7CGblfA$!NeG`WwQjNcPrMNeX@_F`ejcKa-UTxis%gXfi`bo(&PQLN2li;I4z@Gpmek>6$%3eoZJ9=Yf-rlWYo@rV(~34M zcd{quBkEnn2{!X51tTgHwz3F4vvBu|K<`$#j-<(%HcH=_i^AGutFQ#!RI>x@l!EN*__eT~(F4_qnAAlF{u;YE zlTO84t>(d)Sd%yX>acCb|75JL{;0k7nRA`$em69IuP?FiRCf5_`TcP~A#;wj36X7C zKkWl5g~ES5Hu*AL(Pgn>hsqu|`>w!NW5S$h*H&45nmV@K1S}?LPKu%WlsWxK( z%sQ~q?xmU6kItM-z0xVX?ALsxXeFJ-)AUvW6e99HQb|Sn+~6~Q4__YzO-_Pe9gDL8 zeXTXacA^UXj&*cfhn`1UMJ4M7MIlK{nYnoUY6YBN+qo}vd@exk`tXBwu*~{urq!T+ z-M?_|*PQYRCOLU0Ijk8FnlpC0lG+UXs$~X1vMjpkcL#Dj>#zXFdYP?5%P50W@vdXN z0@Lw{MYv;vm5kbjH+?(={xv%s8qg4Mc>>3U7mJU;L9WiWjyp6>KR{E3?K$OYd8Q!{ zcwEogX-BZ>8tzwfSqdmBE6@Pwl+PmeWdXTNto=Zu+xZ^6W(-I3UgpiC&~{{8&pE0R zQfzpCNu5^x7oeB!!%zAA&{Qv>IS%+10qB2f$9b2i<`tp)B?fI`Z!XiPp#+hdi_u2J3?mDxrAg+p(*$z{^1TJjvFqwXInW1y%Mq47DyzG|K& zzU-#5raLYr$lM$(@%&Q0A_D+!%_&2`5iR_ek^$g|la8uW905rD-WLA0Td%7_;N5eY zC1ARM-0P;wU3MkGcJwDyoSH?=FV64e$9nKBPGs9h0+H?YQ6{Kw9j-t8Bod0O;klqo zMpalA$@VV)qkR61nCJtBz*VnHh>i+7r&!F2 zY0b3G`j5S`Q?robdsLH*w&s$ZmV(AYdL5S0&cy;JjEPkCV?sr)UCN&A@^n&y?WLO< z_0t>h1z-~cDfHVu<;C{Gj)0gLRp;ldr$6! zQh0-4ARGLA>&-f&cKkvfa7ViSmOxl@{{Fky*nVE{IYV&tQzF0WmMrmvvG%c3JBNEGyq~o)ch(Hd4Y6giM9rF3Sx&RGWoYERL4&zHxkeGO*IPVN`sjw!cy zbyx?qr&2A$+i8)7R1NY-IMaJ*>OtY$hsZ*Gi~qSy5qJk)?A07kgNL8dlaOd$JK)Yw zXEXtO&6W*HwmKXdiqLo-Vdn-rdA+}XBKP%k|6G@*kYFzm%SflL(`o1^L-t4(5SSfS zf}Clve*AOs%_ubJV%~urB5IC#WVIbhRx%=%7Pg;ON*~>6xK_V;>h7s$s3E%Vvv_D`+dI4(|q-_7)>Z!zl zf{XI%#nF!C9;bYVZx~|VAPV(g3b-T_Aq)N<)t6vC?UF%4=hfdmT}Q4J$c7cB(^C*(9?ttYiQ6KYN91@;1%Gz~wuM^O+1>olxCUs^f)eJKP(%>nvB{iT1e7CdAl&w7@+(<-rg?DcD1TgvB=YsFH&0>#rwllS< z0rm%nv|u?tC22@&Sx8`*erfu+WfeaCC?6EJRe>G0fhZ%`)+b<$bTJ}N=b@&umjtgM zhHSdf#}*X6OGTP#NMqVUs)yg;JHHA^R?%_FJz z&|-KqW~XLWd5tsEMBLVgI9yG|RuhLc7=-lAJb^w)ocNDy#Q-3KZY3w>F<`9?0lloCF_*f&&vICd1mMUQ+$E^3<4ZT&C~_)EX2NvF0+hz(fk$6 zz`qtEm_fsT&7igeojbmOl6aM9Z8*fL)Z*Pm+mDar_{Kh`{d)__IXfh~qiBAw%gPCI zjfwyV9WKXL`X@^9i7T(|INsx@i(-i_pYaX@6ZQY|B4?Aw-BbG~u&v}B(>oF3&8LNy z)CU231b_A;JDXOeWH6g*Vfg+t71j`HoH-mPqE&5ih5lEkL-D|n7FGZ*{2$N~qr$@^ z|9}|1Dnw(%T|IP!m6&BOBH)t}Z7_k=rc%u`e=nev_Wr$Ut*DsDw#6pTk`aW}Ta^}Z zY*M~vNyj|jg#Ne;w)JHh+O7ND)iQo*ndZlMPxzw;O7co-Tjck3rNfEV)e6A8H$?#t z=3~GOf3^kFQ=8Ra!B_tIm~rm4VbD`(@?FNbx*9dZ2K~lg7k%`o_;}qfiVfc2Gq>i`qNmlAf-+_UVrJ%;2tvQqQe++A8 zN9c@ItN(kaWK~JgDT>93pl6RAr~*x9Dfw1b$gO>r1ab(a8D`JKM`2O6_M}KJeSc1< z3SeH2puS3xCm#^Zhf?2lp@SMW>M4bKK-3ju&RIMb&Fxfx<7)Pd6iYLc3@>v9rn6PN2Rq*Duh|@f&|36p<_=t}3n$CzAq-$0Z4sd_ z4(B%vP^9!5u&oUGb;i)wpB`=&_zT89T?7`?|Ge*i-fuI*XwL4#Bjl5Mjl7Dg?ViYQl8AS{0wPSuEA!#F|##zKUpdTzKg56d%jNDP{ zAo&j@>8cW)0?teDWS#40Sx=VL{}LMEBu=;IjurTzKXC;>EC1fpIhSzwt`wONeE!K8 z{cB$V(0O?x5_FB_x4KTB+=?|s?biL?CVBCFx;K68w>Kn7nvOoI`7|aHN_q${d#rqU(|o;_CyNR37M>UnBKDugfJsHiWgA2QtRhFc}$FcfZ%G{&3g+v!3Mfcb%C= z?h8KibhbMGmT7>(>JL;jz7fs;0q_N#2Se3BF zSzO!kiW&iBdh~-4v;PW{Ok=Q>M{zaJGq-l7)M z!_3&-r@YORW?RVy$hdclf3^t-xPQwe6{_xYk88KX)&^cP4gF|6hs@`&j0br}u&o%w znt$dXYZ?0}zu!!^(1+0*_+`q|D9$^^DdhN%T&6)(O~)go<_ z|BH%}r$mv)N3W2OSZYGI7v{2-f{e6SBA0*3L-|?g_{}d?-XNMS! zF7eJea{t-BY-W1R;z8%lf}|hwCgTe@?6G^_g~I1oR%WS(^guNeKWG$=iT;!j%D`^& zbG*N3RqOHet2o}MC|nOW!hn!5q!bXgmwixR2bk7u0w6z=Ne{~C-1&$tB>==?*H{Fu z5G#EM7ylCU150!rjQyTYu% z?#KloUu4@g4n7~)1rQcm$!hT6#?R|y%VT%@kTL}lhnfxsPk0@!_$v#iJ^)(Ht6mmJ z5N@3_bhr&9$ZOEfF7jLe505ftiYi7mj3cEDXJ6rO@t9f~g;ytp;+BCvC|TayZP{Z1 zTw}oHKYJ#>&fcqWn>%E3xY_1b9-7Fv&qs!B}pz9 zueD20`ke>{?l&eC4>d{LH~5_K;Ie`zGA5M-AI(fjgmtkY0EHvaS`JOs>@$HXw8&yG zjq%YbX|h+6FpOd^xX8ln0Iha{#D@MCk2qhaS^>r29iISo<-`NGM<39%iP+md|LT8bJTb+bVo$uTyUN;( zEW04$&!0az%l4>Fsjt8e*WpLyyDiLbYT4MJN!85rjB@rPu7T2_G>d2O=PI`t=nmL9 zzs8^Y&xe#o;lWm-(g(2q+Z1|9;=(oq`;8Qo|lq!EMqZN&c5bf8sF z&Rh=v;Nm#9i`3!VuRzGYB@OQ|h&%sf^8R!63ov5<)%@cnn9fd=&DnW&1H_L|CqD|v( zr>8bLoG)*FU`~N!PiITtn>`5g1S6mf2E+YVI7@ig*uZ;|`3Yt~CX-o@T?DbKE1dHa zPk6TPFaL!DM5(ZPhEs^b8^OneyyhDSdGu;pu}6=@aaii%88OEqn=u}!ykdTN+Am9C zR&wHHNK`>suPv;%(BgfoSlq;qlq6l}5Gp*8NZ8;v&g)m74s9b`8V_R+tp&0u@-Hk$jg1<|NO+0S#MSGjFL zee#(AJ}THIOs8=mBx%u1`?#)6}fR^30Kz@-^g>uNTlJnHN&NnPCiDBzT|o3 zjdu=rJ1JaA;yd0q`UsnfSIK#ouyCWI3qk9ae zB$R-vdH^pNnsIpzpa?5i08i5-*-bYC_BynBVr zydtZs0mNjHHA2;e#`l`&(eMa1Pf-kg>WBqQ5pfg*u_U&tbcj~JT zZtxtWyltIUq`n1L&l~J+PYoKglDkZU^r78Jd7OGhiufA(=O&hzI7_awAappuk2C-^ zom^PX>}~TMA5e#mN89Tc(He!h_p9(ar;JC7$p=+h^!KTMNZ30yzl60(owoWSE_*U_ z)|~b`6ZW+DNXKPo02%I)!B>G+==P@1o8G1=X`q(u1D%rr&XDhwPQ)1Zf2?U`-4Tc>voNA7pcb6O-oxNJG*H^^hvjLrwEPDR=zK~3<(Yhv7oKZPVxMpoPl zPberS{i9f(^e~)9;EAlStKj?Hi{Kc76oh~?wi?*0!4$x$c=r9E z4HtzFZS=M_pxLd2Z=BV)4<=!0r68OrL~B~iFm?e~i(64=l9z;oU`3w>5%X~0Xq(q- z;TGIPr9`#_{Q!(HUZ+d0JE}8Mu9A^#G^BQpy9)e$3G4zwOqeMh5~ZR888r#rk6zD9 zRwdZTgZEbMHryQ!Oq`_Mqc9cP1HjN|X2noZFAs!fVNgaD_v1?ny7#1w4@2dW&1Gw< zOrDWUy_pRraQqR`m{l8_Rx9{KsHQhVHamlW3Gbpi1z5OOl&hO;s~b~aFFv8JEZ>jdz&(6Z@uhgA4P#h z%xlVENbHYXy=1BC~gug2&_ zQ8Oe1XmJpXc2(gl0Q`iLF=%V$Q%zrZkVL60=0*j~Z*u3}iq2WYk9e}^QAoC6)KpY$ z8kOisvQ?vE$U*cHQ(jOSyPNFb=kgyTT1`ASr7N|NRHxH`GA*hz--djA#QPg4)k5hS z&K4f5x-V%XZ(|6%A{*IBN|o@9lYhXY0n;r(sWGM;@iB!X8WC4}Gmm!X9F}5;eCBEh zQ}z|2oeJEpc-XYmG9ht};;CZj7%RR= zML=0;^$9rYTisL)@fSOFdG1R~OS(@ou)HJ2mPwiFiPqkqhYT$qbgNS6`{YV@uYbwv zMsAeAw-_E|@rpMkkMD662iC=1`tEGY**+#~;=uaGAHXRyPJ$2b3?96FTlI=zF zchnAk47Qpa066t|0c8U8{X3{%Gz^(r`e^qB;L!5{LQT2Mj0Bvw`~ZFc9PsgW3Y>@w zI?twi?lXbo@}3D7J^$F$D=I6XVMDkd;m%iBsh^lu7I25$UjK>fL;F=|!18%ld)dso z>*UkE2ZYCBJ#ub(IG8Q|g=+KaZM}ocCu6Bss`6Z1?o3n_G?riQOeJb*zSm>_o_kxr zEJynJk!yYdnXa3;V_jh}>k4erX>XeG*mi&WYO3@2<_Gbfog#9&kr>Zc?5I>(xezd;yMZTvOd<_n$VGI@x{40Oe&batocmn-pAJ- zWBJaTJooLFm$f3ok}J)b!ra&{wc;F}^p_?*&nbbKm@Wu+lIE}2&J@x5c~RqnggUY} zhE2V^>;4rS=@+i8*N(`}zib(6s|bu>6NebW>Mx)ONA(AQPXSjoQi#S!!>8nVSedWF z=+;3t@-lG#-BhnREJ2~o`;1!BGC8bWxq;+n0!6ZGPOhq4I!8}3VLyr$?glUg9EvS5 zYl`LT@Ze${lCOVEFU>T2&^}$W8J)`@73($z6=>8+c-hyYGYZ$KCd&cuAY0iNV^G98 zUx%tSZc@rLGk4{-MX-`@8vz48lx*@-b5vY>Ui)&_kM+IO7037Lp%e(%_|-Pt?uCz; zD;(xqnvyONhMt5?IIzA|#mA46{ig!9Lq^KdZ6?=bo{Qac$-c2c;T}2x3f|^bNwgdAIiOiu?w;|l*wb9m$O9gbFLMpG-vftZru$sUA_x58(J>4)0pk9Qv4qRLZlj#m6u0+9uFRerCr} zF0JtWJz61MQ%5TDg`GpEke&qAmBzom%}*19`)vo> z!;U2PP3zagprvo#a zIMQH~5nk-R755Nf=R9{Vokgjm(ztGi564_UNH@kfx|<^tqod}-!BQ0ULK+t>Z2iEi z+)G8_B{Lfl*{7TrYQSFJV+;v=0?oR|jx8u-n47$Y_r%~c#>F#q*D136vAm>Cvn?2uQM6hZV z>2lt}b-0O}n}-U!xB1h;V6ZSe>8Y&1P`A)MAlQwSfaK$?*~8VoHHdmkZoe3Z$2g7_ z0U}@`9Vqg%?&1}smoo^;UcfinG2*Dyv%G_fPtnT1>Lx2X5hmlF^eL1*&f(;4f1Eeq zp$&FBhjXgzokdh8z& z#cCuEgwASo@wp_ZrOZ5(;m5oXD1vLOMi=K;{I`- z_j6n-Roq@&@@XsSiHpj%c|YgO)d8255x@H)f@bvw5p_?9@DNv{d`w% zj>gj&yz8CaiP3iV+vbtD={k2+0ZfyD?`f!5ZC}zC{>QqXK~u2KX5QOm0r_d8_TczM z_z5%woL5WCYCmSha=oUQvI84deCdTeCrY3^8Uu&x-3RblIRn3H$6I(7%h>Lmk}G-a z#pl!LlW#eG-f-Ce3&(SPBZ!Xfv87zzDpmVLyr5^HZsI+V;FNI`Z|U2 z@P)!5(XDnfJ^(;SyI66%k&e}G1NwN5-VF@15)-+(-0Rv)%VpwJn|h!Ws~=~wJ-Mu% zZu_1i>B?4PcN}f=3nv1{#)`qh<2Td{r`J;fWw7iwa$5m*xxOO28bWvONegUB6?Yxq z+q~tQAMEC)zO*2=uFy(6-oIn*&qneS(=*B0Cqg4)kePSwT;Epe1EMbjLHcrm%){oa zA$@T5x3}N*~3WN-TN$@x~x_BV9;11_tk_9a?k zLz@K4TGzc(T85h}+{ctVmBme!5d=2+W`?X(>ONE%f)-je-kXof+f`#{!@kp=7S$eo zo4+@pchN^!Pz1Z3vp794B6+`V&RQ4fr~GHtPl>;r-?_{q8gHZbJa`L za^@n(vd(>+^xSrBi4@NWDC{_l)E%U4dEO%}mJGG$v`>Q@FDUQ}bz24XPd-G@zIyd8 zzR&I+gE%jUP?1V{d)iH4HBbm0p95}-zr!TvHQlwpCxX$rRgbL#f4jvT2-AGl2A%Fj z>wex;^gzfiFlHGKo#H-5hX(MU4l!SN!z)U$t&aD;$?+Ag;y}AvUID9+{aG)*`WC7wnnECI3 zhnDX@uB;aQ*Fd*sDHb;7StF^Yl{9b0i(Z)z6=8*|_A!Qlu5k|Jk;Af*y zT2`Buf2{e>Jx~EQa`i@!R?86u$gdvRS`3QsyXK*GPit79VX?1oS-Dq(csj*bFLmkg zc6msI8M^^)rU!e7mPyqhv+bir{2*iBs_pSF?JVbXZz# z+qQf1Cz4YJhGS%HmA6SMv@~DkNM5+%BAlg=P?SVvEG{m*QPa1o#kr1tlzpiLS?w9W zN0OWqeDaip_ZYFOP8|L1!U%%gfc5(tlOj4lNPV ztgb=Hhgi-{+0suAt!hVYLG>>uw6!D!m|AFU$nG0S=UQvR54Yc z(Akfx&~=SsD%mexC-oI+RGygVNWJWRF3a+K)Jz2_O;I?F=1u!r+#?x>`Vm-R;8aLR zzo(W@ZU$$6P~yAGWVN(KZ}>dy-VPw1>A6_Lh-r9+aMMUY-Z$F)J$!ZI%rO^+*CM~f zI9LdB?|=SIEJ;h#66|^yV#ydg7jx!uBY|{ zfx0xOe-!Ar>HlUju_>Z{fk9}Kaa!F)edoi)6=SO;Cr+}H2{_XqMj17xpn5rs4wN>un< zl&18QNW|F@6jN$9)9u>#u?ht2Q`jYMi+|7Tp?r}&!^+%OPn>vV z?FsG;V7M6hT#blgdttSob5%O{2mf=6UG$jKLdA7npGMeXvVy415r=9tVBFgn3b&JW5TMafPfU|9uUk8fO7#y%}^ zg&C$S%H4WF<})A=j9?fDOq*Uf<9YYCsir8GCRS#`Z>bUyM5YcFh8;>)`*is$UzNC| zBwx(AQnUW1lyo!o(~N-rDDBCRSgsMH6D>7^N6C42oPyPxQ%@-@5j=9g$w>`5Nk zJZMh)mnA=;)B=~<^9EzX0sVvnj`yLs3oNzCxKdwkXsFRVR4ZM9KIgIx*+{w$FqxB# z_XQwlI9EWKln7~r(#sbvh_noEuKCkh9l_@IA+y4oV3^yA*FW-@zp@*snXR%n@|@lblQ1#N;-stU+K=e7!quEv;}% z{3qPPF=Sb55zxB{>YvfO4LncXrj6e&LA%ETeE`O#TfOplIFaAI(UBmqX6`xx#+e1{ zF|gRTO_t{KU15e6+Z_Unx*^z_&10w8L_kkXb=`6(hd6A_IBm1Zgv;B^~`I(}O-(TM_^3Vfe8r!TlXTd7i#i{GgHn7z<1D3(9v%G{e0 zsqi6010zB4gmR>4uZnMll{|RPsdPX0*+Ajah~7JWd;a^CF=tT(>72i;J<-XO=UiF6M&D<|J%FJlf*Y0rx zlCy@ikrs5f_)q&wumjn6SL43yeP2IhMdU?6e2QG zQ?rP3SnRFxm66zBx?@Epyu3$JcNE$}*RwX}D&LP(P$AP16{9z1oA>v;3t~JMwIipy zj&Vkz+L}FDZL{Piu~ItdD#W*k1Tv%rZxnkGz@)pKx~bb#{Ml~KvKhF2zfArjj)o63 zqVA~FqPO;LvklQ;C8V}Od+c(fD~~8b;`Nr7To^U9E`)cOXpg;6#Ch?=9&M~pUv6Y5 z5&7u6gZqoCI1b~$*VA<;r0ldFCaQJ4x=i0pKkC8NBFWPLC|SBHOT2<)-{r;0TCv8Z z40~m2OFa7y^TR`?Xb)?;yiVv!&5Z0_4e7K-vkUn=^oH%G1ow>YKPxS~!}LOePB#^X z%}C264paX&Yb26A8$fcJC~((n#9^{hkxXFjm5RU+dG7hgH^_XYHVVZib;*Q0Q%@6o zze#y^*)n+^fUDTD_-%l?d3qrif|4+;!~kptjj#s=I3QAJf5XToNwr|)VE$U&&JR= zF6dxx?~fh*+nCpcd*Y*2xOCK@J&hrYSrBG|^Bt%R#+t&WQx2B;!!Pl!kZCMBamuFYjWqo zAs?f+s&yH`>Gh!{V|U35(F2Q5&mm!l9kzD^Yfp(kgv3%!G?f;Xu22v1Q)E%9;9u0SE+jT?Q zA~aPHUnj+T(ynov2qF(Ny{pOz)dE7W1>Gli+q(tiDY&;2D|Nq~29A3x1olMBTHCnt zmX@9(HomxxjFTd#)n^Kqa~_*svy@n*EO9ZeDz7Z*XMXPSd|qS2L$CtFct@0x%@bZweb)^VbR?my^(s|`x7g>o5W~a zSRYk5m-n}sasAeMiU22&i_W(p&8sE)f>$|2HdW5Wh|%8T;VgQg+{K)c_`6_D_A53M z0VR6tm-=b{=5bVwBLoUjyX&m#dwh|}Ac0i^|3wGik9Y#|_LFC4ciJdzotbVpILh1S z|HsI$XT#;w7kH90DpM?7ao#QOK2f&Ae!nTq(tmvGAeo84WA6G_Ybu|@(C*elo*IfH ziy@`buy##L*TYl&k#bpIDe6#LUfyf)y(_&#Qz&_rw=YLOfwOpH!Ax$EKC`TPpO1FRR<%yCdfW8SLIU zeUiSkSi4VRgc!ehqHI%XLKicdBBo`FgTt>x+@F$A0*Sb4C z_is?GaPb+4@qrhMOjV&*Tu_E5*Zwal&w{X!l3#d2mL7HYp`e%m!>3R#;=5B$msuk2 z*hfDLIqJ)w)Hi#eln7P9n~NB;Ev>c<38EIljV3nHB%noo^HyDIQ$`RSAS;UB~dFD|rmEV}W!7 zjzg|Bw@U1fx5*EnT$h*J{rw!Ng9F~ZD${+NPEyw+HO!;LGWN@>`gQ->*Yt&oH zx>gjYyU6q{9Pxs$)ijz!%SqwW*OZ}580mr8Q~Cr$rc zDPWF>?s=&sKe)&Na`(9Bf%ys2EZT>@_~P!Rv7qfphl2u@l;#{VQ&Ib#3e0PEgO*UZ zHpATNp1StNEriuK3~S%mf@>{F)%tqDx7PK^H6Jd&K5vRUO{z)$rIXU2-FL9ODR-Fj zTeM6sG8Sqsem$Dp#qh8@ljty=;2*q~>60#3nh%Q+ zvSKFAt@iVlRq76SjrkC39_}G;Dx>H>c-o0@lDV8U3fFSBDEXt-*152#ev?VYLQT0< zB6};RMRT4&ewJIj2FMw9^kCZIb=*B?=(NMZ*i8;i^I$A)SM?m-;@@i;QlYoXI}US9 z8%qPRT>!70($WX1KeA;EpJuJvLj&f|IV629Oz0~;A2;;DuJsd|w=$2*u6_4&)VUC( zz16R11CQ=#z+gVwE^&LssR?3epSwtVeQqb4;fW@fW8xosS%Vi@k3&|e=nHXPgV&No z{m5wa;2WR*!K3+J121X5Y2Ni4-WKNt!+q8cCCQF)g$AZLfL>B8j!`&H5RmQUUNh2+#rL1_E>eztx7+McJ!8Ux$NU zO9S$w15mLgLm@ac68?vG8#QYf_}=cJTTg^Iw8d7jgvaH#Vkq*##*XK?#cXKUJi$70 z9ceYd(%|fWGdFkTH`5hgWtzk>*SdpUR0@XqOL{=6ydz7dIQt+;Bcm>FD}~ zq5ONHSx0ZPu?v4X1(#b!Vt!O;Cp%_doVza*)rMBU!7{2{<7(nI>uVl1U-j{^Dhg(w zeo5H(Mwt(!^mDqF^hR7{jULORg`aX&8OG#=liKT3TYLCyGWkN(2hTxn`?NWB~lJ^y_ z6*>oW=?Bq%W_A+m8U&hFIqI@SkeeI(r5*CF5mdZAZ?&Gm9Kj!!*IG9s?Kd@vT4C_&X5@cA0OMqUhuaHgD||;bb70s-%qZiTNoQeL&+#zfpfS3LdlZ4@ z0zXz2n=N_vq{{I-rF{32vlIUK+@B84ySIcBPMPivRbhKQB+BrM>vMTxhGTvO*r2>20j9gdiDZTX|WIcwFVX$ z>RxvL9Zh!zSns-8A+hpPfcB{k8%P$4inV%tAW0-IkSr@9swM$^hSY4T-(hg_G?!9o zhJxbf?codTsUcReADDfi0BB?*oi{*h zoqQkyB75zJMFca-ljxAN56n&_m1vRaBu+YcL8}5D@2os*CPkU*}yi~21!ql$J(vqDZYg_(otQ? zw3Cnd(!SRu;U@J1%5S%SFN`oZEtexg^;A=kEX4^$B;@N(`gLXEqO^Ne@47Xms>OOc zhmTG!86w{czpE^bn_z!=-h~7Va8S(^*$^nU`QxpTCyXo2R|D%nXqk9U{NCAj={lf9 z>+oBrwH_n^CxtiHO*{P66COF~C)&H(JlaYvStw~z*gp9`cq6Wjmf=K+a-QMxSpj&1XVSJHf9o@jPrSCFJ4<*->%82eA}ax?nAq8#-Z)`wLRQgIVO( z=zfn;7~lHd8Tzl&?#}(b3%zFiVb%sReSkzCnqUdDJJ)X%&^@^vjBI?m%zYdq9n`X$ zad^GyqA3dP^st2m5#>Wsy;$`iQ2iu*11hTSQeJ_Na69Bthsmj`OVt!-A1Vb^NPn$O zl2U%8*e9?NN=8m!k1PHl@L4U~e-A~s855TNz35%f_NyDo^%sQbuaF(Ca}C)D$J@${ zm(&0s*Z#>6!O(zqenM|eh6rE8%(KLlOIYjV?@YuOoE$RHJ%&tygqmSocNK%?2-Z}c zc%APr&+*%kjjx#36Y+jSdYm}-bCL~Vdjp3z7LFgBz+tWSr55qT9lXaF!e?x+g63+V zeeYY%>~XjS%mVa2%b8WkS{BsZ5rNcQlNDcKz$|9xF+T5y1e+Kc)cx@0X)ISy)n$(l zR=;iS^yF3d^*YvUF!xDbsWt-a%!cY6prUD)Q}Z$+h_jUcX>ZxeKRh zA84R2YZjRNrG+J#GWupa`mSGWwoE$eC620#2cKGMg+3Ok{CQvGG970b9TZ@0+_eAU z!ec%zxn++pgfe)Z<`ad{X6!+!O5F04QTPjzSB+`|p*aHEQ*77nP=_uy9qPQ<|D^2G z4QQSmA}F`mt~ZM3|8>;CXoTO&Kkl8RBUUj=_*-N-L>jMnaqp}n%8SPZZyMup#T7%p zX-2fR5^4VsoZmmvPTW=Hj=#-Q zEp{cB_kZUWt4e-!6R5%8#p^dxZ7QIiEz;G&TWd2h^cu9zvP9a2POyxZE3~rgw^+6I zcwaN?)3!`ToO>u)81^o0GTHm5o0W&4g3oQaGqyL(bT%VF`Pb{!Gp9UF{Y>N3ZK1Gr6%H0jiPs>>l&hzsPpm+N4ou!y+s(~}uIRFG z8oPGE8*6IyfAo1jjFE`opz`kx*iAN!>TpVnM*ivWoop0G;)-36&qu9vOP_TQutjpX z6LxL!8cPg5_-4|4=LeSyp4+rG0z2cp`DY0gS6Cc63mNHkLMM42y9uJBfo>}K? zR&Aw?Q9tG10NHy)lQ^k9*8eI^t9RxNv(K)0ZbwhN6gs84K6!IbzZ(?hz0-b$%)`c& z)Q3FHYa!5^nE{dVW5PLKEfrI@rv|U!;#Jx#!qNAU&R@xlkTz<`r*EmYH}Oap&3)ZT zS{ZeZk#mn|Wlc8sE8U-tuY7j&b01+bR86YS-TZMrTucVpl>=8BBSJ#Ff8&IEEk_>Z zH%~k#U6>rnT>Rk46f)JRAWEGxyyjgVRoFN9z>zr6*|wRBX0E7kA%R@~`ZaU=&4u)o z6U%1bGkX>UG_DVkpC#(;rw1{OrwA`vl3s|lp^Gc~|9baW|4!Fo;s87_PAB(Oiqf;{ z9sY!?Sgu~-Z1?c%Rtw=P8^&gqX(q-V5mX^OrUESq$pl$pU$i5J$!O^h-loMo3As(2 zT`n(16k*-H{!*39lG|xIVa=FGs&0QT`!&&KqqaC>w8C#=|pjZw|v4x?eHy! zd(kps5&}m)944_t@5)mh_1{&qzpv8fo(;WnXJ@+(p|R}4H7rD74I>}DP|qYJ2~`lj z>hg0rAEgmI-3Yg&^`p`=bxEvcMaT= zc;Y^DN#Vw;`%H>!e7TXE3xqQI+}eiE+~JEZ1jUxNZ{mS|$$>sTP4JQr||e_=eS zv^Rffe%-YXSa$e88d4}oQ$G~9x(#3JgSIrC>)d=05^+aI3OMV~HNPHy90g(a#EV1_ zGJ4(QX>n-fk9!VGgA)u6g<7(3Pb;poH*m|VPBkr*q=gi;ZSZ%T>z|xamJ_w7pa>Lw z$iQJLn)EYdj!c`Xi~GvQUZ^#0+@ox^NoMMLBI@xq0E46EE^<;Y#i)!pBnK(Q55}MK z{=ri#I(7|-9^JQZ=?IxU&wva7e&7!vAXO*NaD8rmT$X8DbiQ^Eagas4_SLT;Pe5t~ zC4HR;X9C}*1VNcNZ$@%V%_;cZV8*WyY{IX2m1nuWBq{#bX&i->>Q$rm%6oOq60jw0 zP(5|!31~0y$6nzcR?Zfn*_(T1pgYSR5UYvp` zt1nIu$OKd~kFmjXnGfCMk4OB&*8?$@MwjKZi^J^H%V{0a11D*alX-5A@D8iC&2&`^ zWQrSx_LkS9l7UxmBs6KUBXaAJO^bt%Pi9HZ?cRu};V#SrP)lHsEd~{aTtUxj03ynR zMq_&1#IeYcPWaq9Kq&SqH3v|W`9uw4Ff<7?R|`~|7Bx%oCj)o+c%xAznN_wQ%k+(rHm7tZLWUkdbWNUC&165A6iVlx`z%O8SNid7U&b_iD0 zc(-Ma38g%%ETE`g&Y;>y$@Evju$h@1Ui%wdzecxTN#q9*%{31z!0z{5$ zkBj)8K;I=@zGFm!PJk-7ZW;+FrakXTxCXtceu0tJ0N(`GpYI7CjtGuo1}MFUXW&Sh zSu7+1@*lgV|FB$@hED;vFdG}f^g3q@asdrzUi^nn02~&a;ED86J=ESh=+gwh2sqYE zb%d#UHu|?KVd=w1_`aT{)mDbfa$2_(7Co<6o4saWa_PI_1L97{oDhc55NZY71^}J3 z$eswg3^%t9w@Il0xX}|fAwSwb4LtmUe&Bhzj?G>XEP=W5~sNLjT^Iy@DZVTcs zH%lcyc=qL6mJAAzivU1SH5`Od?| z6x76lbb5j01Lqs0%<{v*(1E;Jc1QI{Y+QuZL79_6 z#`Nu+aORh{YxyN>kC`V>hZ(D?HY;@D`9oEAVsX5=EUyV7ZoS`glfnH0v8Lh7jwwr% zjpg;pjr*#&4yEOTGPIes?#|-WlaV}mD!Q3UnJEg`&XqG9B6Z|BPb=Ls&_*3`GDW(9 zC=iXSB>y|OX5e&+`oB#C9MOPaxmPLSBea;zn<_Pr1^pAuU9Arha^MmCWy*VSzvo^Z zL$3;7kLS>)%cqO?m2;&VGWGPK8@^?2|DdHWbz zy(PmRy(Eze3#dPz3NUeUv~sK=<#W~J;x(eFb^vBZegfXHx&)tA&cG4@QG^GO;taRe zZ%X>GmknKs3^85r3vcLD)i5rTCcO=q0r-)1ytvLpkOj1Wx?P|tpySNtix3X^e@H%O z26)C`IJ%C)fE)pCsk!{g8w7OvT6ILeOt<|I=qzTlL99nDE|A_02YkGLXGXrhx=D^< zswgU*9D%HM82MJW@0#Ap5F3Lkj|S!|lObClB$mBx+x;(eZT_dos3w*%n^&z%TJtKy zt*v=u9<=`hha{@21Gsa5uuq86u=QtzJW|NQ{}%sYpXChgPse=5=S1jT)P3o58UvU! zPI&|p{a%!Sw%Bn5qGG8loXm-&Gg)F}6-LS>UqAtNOXt{LGSRo3cW4w?QOMB)1U4@4wtxCDRSie~!n+ZnHv$4v33U7RRy)}`NqVn6kl{L)=*!aC*cVWRU_tosPx2|dYpRlB`0_bMJ59!)Uc z&2z?GG5ISjzH&2V++2GeQ1gA}N(g=(!8bs!E&avi-DRN=6FHRT`k0Jc#5v}0AwM6pWXhY_WARUK#+!839lYJhk-;z(~hg)+`spEvt zGoBfT8HjUWWuJlMu7zQv$i7|=iET}3ZCGHzQJ|)gXlh$HXmTgeuHTgQv;tD-1O(Qg zr-~gLn<@Khe^TUU*UvwuV&`4Es+A+Ye`59e@c*JCus-17>J#o@KYrQ9eL~qbeg`(= z3Fr9xJO{`zjL5xfAUh83c)N{7b7r)A%8pyBzI9EvH138D-a8^{Da7Gm4(uGD8-Ca+ z6e~-LGh@R;9`WkFW+C8xp zr?=KDxb9=|DN^?SWr@N|036}wUvPw^Xx5J;8^Q=+{#zTRf+pDQlIH97F_q@&9Q`y?Eq%mGvU~4Fdasix#E3>75vDa zfSC?k3~jUk`qfPLlanPU&$+AZkG(~{-fhb00@Jt4&azd%a$#=w*)o@k_lZUg4cje{fWuKGo0mEJR`FY2Lh3&jnk6ZGXn!hm2E&lhG zd;o7i$DH1aVyr`dRFyWWgn>(gMV-1d!a(p7n`0lIAz2$;h&RI~W;9vPze+NGZClo< zCkuowb02*nr8IWYBjn4@ z@n4SxYm5T1Mf zn`x>>hOpcWpa_&5sJ?a+55=6%P&@?0Nul>M*K~rBN$_jmkkik+7xcyUjzvy%l8_xk$Jov*)pOMw z0PXwEa_!!N2+r5~J^bR%ASk#$LBOphcv5uyI@aC1_UG|K-kTV6yFbjL8w2T1D%mu$ zLf*SyuE=cYm5$grol^yXpIa!P>I0qtJQ)-Q==oIu`KtEpUtru7Rm*EOU03YMhJMY} z;7c!HtRdOWcd;?jPGr?xrN>%J=F@a97LJX8Q3#frk?|u2v2OjVR@nwx-7TN)wpEzg zQz07|=BF6(nc^QT9VoE1nU*7**M`SHxt?!pNmxE(Mvh^*B><}NIp&rYGmae)&gjXW zt7sw|Z&%XE7Pj2HYf8PBG4}WcRjcqg>c^K90=={6^xw=$iW`8R9%ot?!^|IZktq{2 z{VuTUECFip#QzI~ko(138rLwewg+2Ng}03#*A}jw;pSG5Us*(sj(EG(T5R7{Vi_-V zb0BUOkg{TBnTyqS%m3r)GpgT3n>lwCvtu+7Gef|dKFD!cwkO^H$Xm3&Yrhl+tjB#V zaSsv&-1_&~B{KNF70b*oG)sw~uj)=t>qe3R)>L4?*S0gKlULfCDV57^%L) z0Jugw~^V78B z(bX}B!`X=vA&AiOqAPvpp9wLTpzC?4c+KGF=58hs0jRT`v*Nv=dh_neHB!%q@<4&j zR|tr`(DjM-^lBi@y20#-L>&%BFIT(}@eHmiz&~!0JVxev+9X{m3s(^TRTTnd!!cTF zP@tUr*htAM_IPhV!hI<$6^Lj#-hf?Y-4_!DnP?p}%yYQU<>xDW!ulx)o@-LPX+1*9 zmOhR*a|c@OLwmDI0#VvHAp;^PUElx|+c%tEu@23$elIR&wls!D;In$`9>QZHzOlId zEY$&!v|8<_#Blw9=7Dbx`i`(s>JjTC*F+?NJ;{_Ca~7N#%MzDP#73q)Fr7!&Xm23x z#{PU*id@mjW-qS*P*DBe20#<4nD4_xeva;-E1f@*t7HsR=6_{{mpD+pE7E z(WixNCP97RB$xrQ2|+(VtVgX21ALRAK}JFjW5ERNgl|7b6jo}dB>@tvJr0o3swKd& zgYA-mlLiY6b&S_7!Oy<1UH=sVQsZngwxfq!BJGf*d8a!z}04nM_dI!v92-jTpC(NRmRV4#E zWvS4mB&O!vy7yB8QLHE9SZW_nQ!};zptl^M&3s_%Q~ZM$3B!iEj{K*dJJ?TyIKwMW zNrlDTWHY~Z`TE&+VE=jT&=^2*>5-Hb`l{r%1imVj=biG8qS`3X`8Ko`-$+_66jfaY3GpA)=(3)Xz{#@Hn$Ttprop80TUSIA3< zu1AUhcT)s=AKEqrkC(aX?X&;$*xF>ZBgrM3VFNDOMj$%6VeD3rDcWIa;V-_QAdkVy zo^&xhCcY87q93)f?}p?ajG2Gsfp#|)V|2w>Bf)<4;*vqh7A?4AuKkJCQtNtlxJ?dt zj!$mH(JKn=iX#snbzy12-=4mDm4!}LX999EP{re`Tkn@gNRluTEgwo)3!Z6;MmWe$fJ))u*=PzI(P5<{r zK<{r`5$HhJF%}R}znTxxQ@rHs|tU9pFdTx@U4U&DmBv5!(H=1sLSm ztD2V^v!fxVLq`MV7*^!&EGS)qj`}s)5z6uC&8Bcj58LqBw(1#m#1 zoqJyhxfu;ZZ=LKLHuNd+aD~=;8)NlXSdQWAYiu?MiaDqy1_ze7q7I{&#TnLa^MZ1m zxHuteGJV-a=npsm<9uNQ*#O~~6b?kevGY8gn($8ai;O z)edE?b592irk{lhs2;6CyA+w0ELvi1l>&L$Gn1F`)2SS*pWlN#!0|>^QR(I>O%?8lLrBOWnG-3{v-9_MGd@(=eX^S)Vt374E94aB} zctiysoO~<$!?Z*!-mjsqV`gA;e*H}-Ca8+L4#@5v*f{9q2gt+ndsVuyr9d!POL@cK zUI>f>w53H?fnOr}>S*Txezco=#VJAvMCiofyQFYHT4x+y2ySvFY6e7m`6j*jc7eqq=; zuqYa`ojagEAL>Qn-~gaI<^O&-f1R?OnH%vVMNuoi(-P1X>)2$V!H#(tyl~cwuoD*x zS3>Ib)fNcFZd9Q}+DEtTMiai%JNQ_W^y1*QK)faeW0wEH3#pyc0K5psHh>7;x1MXZ z5})D!6?nXuJEmYW{XuUp5PuGfRZg5wXhmf7w;v|CxdG9Lz@AgZorm^?Qf7Fdc?!g_ z$H`&6jWVOZ0VIKz5s+GI(4^)GsOlne^LrTz*JmNHzS}P`4ge$7H%Zr%i`E| zPckJ4T~EZ>`2NC z!w$2~d4O^s@+pfs#M6cFr3r>D`~5vkbnWx)yANNC&#!k9Q#BLinhfmKuG%wWVVyhf z5W|=$L(4$fWZ+8ZYe==A6!$i&bk-j20Cog<%>6()u4zZwAP~bgxp$(ICb6Ns7`6>eSG#Lls(_U&iSdgr;YiLlQ+1#~{f%)OSU9 z)Yn}Amg7<|RM)QMWwgalbB^6-{AYpta1GuZ>_4zlIU<9nGhVu1a)H=z}wu zQriVeKKy6+kypk*6bin3RXw6Ql$GskY&KYG5_B^BB)s;R20kqS-z7iWAZI%KxLocY zcF#Ob^EDPX*k&y9hzJ}Nc)mpNPk~s`(`PMP%bLTx$e(m0ng zlFlKpz?N$Yi0Ef+oSL zRoE$>WwtNTtG;)wU8N;nujyLY_#|KYdhEsZgsCGP5r7m2!zG)b`A_b-@gDwv_-i|9 z#zb_zAsYI?v=IctHy{XFyasIoDV?7NyGpg&LykQWw5!%}y}NBZ@1OY!NDxe}7#YO` z=Kh%1MtoTzh7Y{^`hFpD=;@)~Eoxi~&{Ti}j%glj5&8lnS_TAPPRu*SSLs9db0mkF z@s^0HpXDYN6%gvRz;}OjfAYH67a?3b{agflj{H=*AUE?>|4JI+mn{v^PRxSJ)C+X= zV0vRmze}*S#kgOHX<0CRrdP^BL?00UmuUZewt2B2JvYfmCVE7EC!bXM!t!X*8^mrRydf@XF0r zuv%4Jy!Xi?v3a0pHlv{4Gt1!#cqH(5W&sT3v2n|?9p}mHwq-9Gk|xZq$a7xLlwME; zUoydpo!-+{*9cqDE|C~7vhb(V@r}I6k1`%AN25Id=3x83H6V{7WP1}*SAUHnDSVQa zEu@<&f4V(Fmvxd!al#Lk&$#Qvyb%ug7P34D?Ez7=%dBP^l&7hj$(6{CVO_v^lVbsK zte)unG62Wt2aXz;K+XYgj(cbC&pi**Bs&i%UOBFg--9s1D~f%!e<-Hw%cc=K^u(&&9lEFw#1~$qf5-kma%(mmD`C_2Aro)>GK9id- zRr?AA8%8Q?DS^yp<2_o3@7~P$b0h6}Ig-mv^*?eHjF3AKu*g$`dyt2SUM%ygN()lo z`^0futexhwKO%yi(E3nsU~od1%M5%C1+=-|z$ORtoJLEU3JXUmgFd28bC^gnSibo@ zIU3yS^y|>H0C4)CQ&DftWZm1uDfRw)gQf|N{z)xME$KXwsDNZsF3$*`=j<`_v646!U z@hTK5&-Njc?0yM+5;iM;M`A--6*EY(tNX?p3d)hnw(+N<)8 zb$J0rZ8rx!lbbQ-%so}!ZAbr%!U4dYC&T(rL059fsg*ecRf9ZYT;O&|a$ z>KoB4vp>h1eXR3+n?GLgc9D{^{=69&NVE2*EaDy?$uk2i=y&(l%3(`1=gbnk;@H}y z#XgX^y!u9Iy){3}q^^KM-FFIzyIqR=6ZU*b&W1*5n7GiEI4w;(y{_*W z)=UXD2s41AcG(m-SzExlWU4aLjN7+80bGNh0j{;?5|24A={00J50e^POr_>@@S)PQ zPgkxac?+zd0Na|cALZZVKmh)PJFk=sTglSK48$2tWg%DLr>fufpS{CHG0P=Q zb2$Np8pLok1xoGa8&=-=ykzj2;rYk}u((W~K#R}ITiYUx#+;2P11|{YO5kcz00A_K z*$`zNM&e|TPpA5E`DwA}_{_l3c)+LNA zY4|Gjs#VB)VcG$ig1f6eR%u~h_dAVB78tiLF6peTO84{M%6}sPoSCeq_3%GG0AEZ? zf%d9CBbz7c$3_v$c$JZxq*9!34bliJBh`Y{S(&A}Jo`$0Q<=k6ACi8p{B(d>$=-DA z1mhzd?6DWEmNZF)3kpSkLNKcA;;G0Qjkvz@jQ6%5ev-;@$GnBX`bfB^jt zTjj=`OF_w~mt4&5h;_P?^$*_dDX;!lu9vbMB)^wSmxJS4BKg*(f2%Oe>D4oYr#mH2 z1%uBwj}${$v->Ft4r@!eJ#~Ne0aPa|_2s2oNA6bZuBuGqLomLN@)>EG%7<_8z&+o? zX0?;z36JPTEDi?A=yDRh6yVLJt2qqk@f*zXoazRO6TA5rh~mt~yS!c4(%SMxTr^&c z3^lnjPysW@2Dt|qnl;a&V_wcMwtYDgR|%Ud78uGhx!QX81!_`u^YTW5-f2PO zw8C>ua$k*o=q#I0LO6uJgcZ+x$@y_q%a9wtJ4)77*upMP2JI z?)A(N(%)__ewnb&jF%Mk`|xQKH|Fl7DEjmD7Be8Gv_x4%XqjsejqZ&v%3Atsn^O(Y zJagE&+`3g2-2vO#H#h1{qhYNBk7G)I*$yvyzNVnjpSSztqoaX*tR49pPjoJFR4OYM z5&XLMI+s%H(t$~hRZQchCIh`U{t;77@FC$wi>LW_Jl9R;t@<=%n=fW3MetM|Ncu-6 z?JZZRV*GN>d~2OB%Vjz8?>Mbh&;PrqtwoYi{ws`=gPk~a9(ijfe-^RMNwOaU{X}ovr84N?o>xM2mR7Y>qT6J)) zEH5oDD2hq%DNQVkpub~~N`obdk4*7;OvBRIa!HdZ2@At9Ci*|Vm&bGxud33wftsN{ zLj_9A(ctZT+iD^y1z3Bg&BIdh%VNPsGD!4dZD*193&CmSZuk-s_pUfTgVYEZw?>rc z0b~e#PP-Zeuc1Y2jeeTmL%l!YzWi~+Z%3Hu8(nc5z_TsSULt)Wh$l*b8YrjUi&gf$ zD(+5%v9>l$GBzE!#w8X{tAj&>6Vl+}=B5mIf;<38aP~A6u7?p zQkMFSWkUl&Klo%WE_!M9Y=jA9w>;}G=)Kdb^^*B((q-dHj|hR3*Q&-*A}l+(uNIy# zbBV}cOxAS7(v1ycKMN+!!Q%{4xDUoR{@tmaCr z?xRk9K_bTJBvn%sabDRTblk5~c<+yXl-_|tU9L}vlSqA5Zb|;CURyLEPbr1u~;l0Ws%?LyUI6J0N?^_@>84Im|_ubn0lHhom30wMs zE3AilU+zuZ?vWVzhbVbNQ@V-y=No_lJ3~>z6G2r@>Toef8F9UVuv?Y$zB1o&O6ja- z-V0RsWN(q$Z!W6Bji}wMk(79WtS={x0&vwdmyx?D+Qkn7DNZ-05Nc8@9}{0sItkWY zJZYmFOfB~O)T2m|I~Va%BK$ES@D|Lo<#9Q$sj|6VGS2af?FqZx9IFku9N{!r!cBY4 zFYx@P?A?w@3Ec%eG8GrfDO={GK(w}`qs?>YfjCdXBL-h+P7}U2d(xYB;hVxt=^ zTKoAA-itixVdqOQ`>o6mX^-F0FS#10(jE0I4O}-YV^utloMDJU5eAOfDR76WdM?}8 zG8YtUvxf0`9^9eK{gyRYC^}8eeBK$q_ zig;`ls+UUE?E3z}13dMGrmN4!yR52XTngJ{viYsK(E7}QxlH~%r9v3T_{N2bA8ab{ zSiTg$>fC($;s7NNR6WKQm}{sgaFF^{d5hD!AO`kHW2na~p3nOJpcRX+^J0Ha4P)81 zK!F=<0%(Yx>F6?zW)YGl#()r#8)2HRS&k2dpH;-Xw+jiYaco0K zo*b2YkoVx;hjq5sns^!LpvB@!!F`VF4j61GT_&F;yD7<_dc-R-6K3Xt>IeTr4y%f5 z9%{NPh*35!+*}CglP>}-#hmdpyzi?)i^F61(F{CZ+mP|5*lw=Lb*NSD>Ciu6gNvs>V@Y{mm_7UhdcxmqtH2O=@|48#!HXaK; z(z5{WR&~@*J$Js8D9n=BbG()4G9ukdD{-Dy`I@I|jzRYHd7CE1ACbM?+DaY;xAQ0- zJ$^imVa8aM+X=;s2j_}bm|N~GbNUs61Z?@D$%9&JGois8&`pp>D92SZ03u@e-vDQWD;Lwaf2Z+e1pD-7i3su;Up9RG zm?PABo>zb9YL`(LBg;A*S*`JgI*)2WlB~msF3xzq4H`U&=ifcD8cqIrJrY0}TLFwk+GnM4x;&)lfxv^5|cHDrEMm)A3CL}eY1 z;9HhDEDp8w#hkql61S-vFTMBvBHdGMhWr_8ZfUm<^Ri}i{0OIB5 zXdH^9{k;mK*vbT9CPR79`2)8o#R#&oh01Uv8a2MwhU%IH&RO#)-pzQt7j$4!dnrtj zAWdIKKw*QqKish>8E+>_7`|Whh)fUKh%^k1uaqycohi=Qjpbp{p73SxM5?B-eO%wa z8*w!92=Nhla9OibHj<5x&*y?fpZm?pr@@XAH3>kN6|47ZXeXri9=u-yl$G|>c8?F0 zR#EDDKtH;&p`mBk#(dj!5M%BB~+?97Qcs zc6$xR>3Li`FzMGeD;~dkr~Db?s_L^1nv+co*NdV&NX=3f>@$8c(U zQb@`}_R}l32SkXC@4Z&1{U)6;QsY(L$Kz_NS(FxH_6gHUbdSht?;kv>S8+iP$rRMd znPC&VM}u@VSHd+FZ(M4Tq=ffmammQ$wibQv5mh54^YQ6$9Y{H_MyvbFrCTu^+(UglU6^T1Mw6@F^&49M@nP# zoGjO!%9bt$ctHH2?EU8p6#1=R+Hhj36p2z92j199>Ej^~G4B{VHP_b*P!Z*6<4~lE6|MerC zq6vdD*#Y!JE&=X=r#sdMut9Q=)Ag}E-m4%wac%*Jf0AyV<<`AMiP_ETYD8}1omp4+ z%Yq-^J|Yp@Ii}yU)(yAo*0j=nQs}lF^)vBb_ut3$7$#;X$=~zgNa4DVgDZn!FIr|W7+<7!R`<}v&*?y*r=YmL>fpe} zU>t|&T_osWi7w%6jEm?D(m=F60v#QRU*sYwDy{EmFq zvDUEEr4X0$-I(`6bFsz>Z%TiWld5hGuqGuu%q|zDJJ`z$B8<)PE0dDxl#{Y5^LVoV z&JgiH9eE$-bn*TVKTT8ro^P#s?;Ie`-thA+f96w?dVdD8;2*|av}k>2lGulw6&~?0 z#mN*vgQl41GMCWkr7qj~N(3p?diNyp8}XYvIAe=0Cg`2_gTMSt=rkDapAgnufxH2= zw*1TF<=JD;Y68((EzfE{d={CIEq>c`jeyRSDCukJp--xz;WD?^p9rL73=vWCV+qr0 z(`6N@)vqIj?&!}~D5a#4N_!~$rR;PMCo%SWVY+a2^4lrNS&;=CYo_dtaee$%Ry}S+ zFy7i~p2+htR?R{zZ@hfC;hF8F&JoiE9mC+jZx0!!dTr%l} z7^paeqP*_@Kc5H_s=7Io3UD#F@H%DVx^uIB)>${f*GLrV6CZz|8C?pQdm6xwN*10q zxn8B?d_J94?sIM8?H>GX65Q!-{0FbfZC;*UwfO2- zzfgoI{KB}^QT%-~#m!%@EZqLVyWmB#A9}Y(L8$DP?}d@nyBLSoz*9^81A~C#3oK9hf=P$NTH4e>qm0Jq$2@AJt}+H)Q!vd`?}^Z1h%e zD|`h6=EXt$2@^C}3$Pe3TLmB~ze9tvI9CW%b8-Tc7^DD&)B0%|rp+VA^UoEZ!-KM{#jC>- z1qlQ$e@P&s_m%1}j$RzK>hn!@qHclmySA~ zvA~LJq^7I}u0WJ)bQB~_Rd0B~>LGb|=aX8lsitKLk$ ziMaOilgr$Zj+V!r)ttsF6tsAcxE9ihoRzR7k=h0P#d0zPq&t3-6Xg=;n%4>wY<3SQ zejD>A+$ED&9VmQSxXr=>+J=^+>*=qK9Rk@_2&8-=w5V*5BnSe;yeCPUf&mzCr6l10 z`oQ1=2Kbp5jBL~y5{>`X_P}o-qGvodh5&S7n%r!Dl2}f#qA_CdesUhq$rB8Vh&7DO ziH-RavUiYfc_exrU62((AQ>Tk)qq#3>gxI(G0~|({>;O#T)IX~;q^;(8ht)iS`&5Q zm5z54@rirn6YEStj&h}c)H?f_^?M@+nZ>%Jb6SG93`&;O+j-G!#xV0{go2%q(R(-U~u;|}P+i)@+f8Rz^ThmvG4e@`d!`Ug({g)N6xqnbv47EyHR zufgYm@l(o+jVNP%njtom&KBiKZyan#|I_q4JUItNW%V;dmc^_6V~_{I@!^L4$mL(p zoXgCu4jA5*q2B-Qa_If6`TchF1?W%mSI%vkQcn5E6$YLic7@s446|e_S=5$*GUa!E{0j>)Yb~} zbHY#N*AFCnY#q6%`*h&?#JIP7o#~D>L1Y_$0(V#1l4G6AphZdx;rV(b#NrA zv{0a|Zlr2Z@cbRSK3mbT>g>GglF{VrVQ%bnM?slaxgXu!lFf1NAPz5}_G_LyJUtO1rL1`6)ULyl70Aorfs#@vUTwx zP;dNakX?g}+nbu6IwqStxaX&HMa(miKQu*nJ>qfqfw2kFy&W(0*gF+>L3=~*7BA*4 z(BOH@=(vs#jZYK$azhrj3e&<|4E{g1&N{BiuYLR=Dh45?G$<$vN;i%X3ewWj3JB8O zF+xQU8Lc1^($d|a)CgfTNcTu-7%=wy&OkrU=lQ;V|L|h4-MjB|&Xwmn@5`;psc<+1 zqu9r}S7%NpTP4BK2I(byv2K`T=V)Lr_k*zTn^3hU(wTMiGTXqhDg%x8i3;83LDNTt z7O(djql8fYz@q(vSDW=8EYcq()o3)o5M zT`5O9ErW)d#~rDm&rLG(UUX4^3h-#TK`tgQGRGLhZ&7J~&sy5eREFsReyd16;@@F) zr*fJMKErBu4&fak8<-$NO{L0hXfh%9L9YrLb<$V<(hwd&pyn=9NeP#Ubg$yo92ZOFLr{fi1v zdqTT(H*t#14};1X%_6eCIhJQ^#l}svyYc**2-1B=-@B{M&Z4z^U0F!i>Xf6_wEWAa@71!0G>};=N3PO@e^P=-4B-J zPp{@rAJ{UZ@@=HJ*)5Exd7XtSCqw>S8XtbR*wD{d`TcZB$6C@n$LjJ-!G&kF-F_$F zL~@k{v%CCZF!ETlYjSxgkdVhb^QcLltMcn{yq4r*Z!!^y8|X&jr1@J0=-r)=fqoNm z3;RP87Pbhalm32cj-E8Df4Y9wye(sr?)B+1VzB=xM~L=P1B)^RXycgWy}%q<@|mSEN^Jfn~nOu{XG7$s>fXnYXlCy9ScYTAN(@nZ~N}E8%=?$VCp{{p)wBNzhoAi^0aT zGnbV~hX=HRm&_7_9;YrZ`H@q;4BBE+*V7*D{*pFE+;_p4+rB9ak$sR`m7mhjY!*KK z=03NqEeK0jCz*YeXP?Zuu@^%%4M9({zI55Rk94~bPO&aAL#G>~H`($TpNj5`9Ba9> z29%HbMNT};WV`$G7n{Ir6uSGMX?Urfwd1Pr;Z2!t;f=il^G(h&ws+26UfJ)9tVzF| zOR6Nb%M;8i9M?(Z=X`hd9{rJ)0zQgfTm731xd07K+mdftI|s!bOVxy!xJfh&D*=4L zO|FwmLto6?!K>K6ucXJ9;f(>c!z~~*eI2=j8>Qq2o|+yNAw^)5^ua&dyGlx7V(P9$ zKb(60gU6ndVG(I$=+EqvkW}eI>}+Gk7M?)l6*AekyOfIO=l6!;ny1$Ikc|G2mQ4K{ zi#i&@z? z5l=Q=7ojIYQS;2@`>euyomb;Bu9hr($KFH|PS(jP{>psyEeL-zZQ7)eAxGrbt2g&7 z9bx1ybq9Sq9Bi>g?9aI&tm2b{je5;=4>gh3f7)W?1TVAP7ZJgN8YJdcccvJ9XKCGA zT?sd@Y{J^};SzKD{SB)t&=VppMY;Zvk)Bq831L|O0PN^mb_7J_=@vk)a{_6>VfT<& z@u)4V=D2$lR^kQ}IQ5sbFVH9I`y(tn#4Z?g2d>Lq{=tFFG5*Y%YTUqI+{m+fm#SmM zGtk-~y(FR+UguF>kz@IWmFy6;>;Rwn_OyyeDe(tv)(90owb>J%KgbW#th9PhEfshGtJ}>bvmOg(sgob+cCCN&w(35&a1NG2WC)y^ z$|nTbU|mGifpJ;wE!eEhpVIAp252xXBM0J$5jKX~|9u-*Dt~zw`?dg`>%R{Q11oU8 zI;9)q(>CO^gPb*mYn+$C=7;hs+qIeCm#W`QFgk0G9pjCfj+L%2q&-VJ3@>1x%Vx~= z;m9xFy6>8GT>=4Kh)09UsO5e<;qzWX0R5pPVy)S)%L|cJ3)d@k;KW-FOq`N$FSCmK zjc)_$C5tw+Q>)6VM2Ie}9w_OCJi7&DFPN@OH5M9A9ECm*5+*%8TYZ8kHU_zTBJ|6i^jVMvmv;E_*dQ=Lt zA}SPk-U=?O+W^?5pPxqkWQ8x((@R@(R_p4lSHe*y=zxcu!ZRao1;#-)pBZ~ct;hLO z{6Tkw99yEJXyAsyo7S)ULsFBJ)9n6%iAh0arpv_=K^yqru}qeet+daUIy3OPch=VYnD_3T>#Mo?{tNpkH%)3g#5)SK5E^&S zRQ%xgp_M0*DrooXdUUT)$o+WG>8#T4Epv|j4QM0art43?h{--OC?zo~7xB7^Z*EH{GMX9@7PE@mEnfSxg&a5j zv?R zA=ms&L3ekGM-al9C%rc(oz}+St;J^L9<~Y$Bkfq)A&T$#pr}?oe*aoC>HI564oDlT zQfi*&WAW$00?&EEQ6kyr{KR}U+R6~RFvJ?uUN7v6(N-Ag8#||d;E?tVWsNcIE}e$i zJlftSaP;H9|M;k3MfxUDyTSp_IrBl)yZL*_z9a(9X=R?>yoQprxqD&IUwL{(pI!Oh zmu{^=hzD(Rn8}a>ALLrJXy&Q)+ZA>c^_S8>g>~bzn&K>FV zX*BcGz`ppd__MFM^=3+W(Iqm}Inz4_r0Kk~<2hk<5RM+Z2YJ@a+l`1A)xL*rEe;=x zWy58l?9sm!s?93=0Q37#NL)6jXa;IJ`$5hmR|PNJWf=i0!EF~;%t;ZBfbdZXy080j zi`FOL!<(!~dLX1_%6o={KFM3_8`}JxZFBlObFcPxv$;5JOtp?{fvMlvP0bFAa`p+Br83|DCj%cN-m;(ptk^c z{<=Xx-udIQbq=$R5dLtdol%~s4NYnl0jZztChbrZV$>w%7os180~9(==<-&JU?Omj zAhUV}@;l}BNblSJjvzl-f->_7+2d^`mFq?H%iB?*Bq$6!%_2Fuj|E4#OZ_!qa}*o) zfC5p4eajPhPqN70MyuPa1NG5r|X-hzU>ozaX zQwNYckf!e@(SZ*Pj@-8#t-i=!`OrL2z0)+~DFPz7{M2I0!@6YvIO11)29Hw7q7vq4 z#G|XD28tH)C%%4-le&BE>)RzE)_9$lq`PT^j<9)Ltjlx~S-b5zMutc!kp2%|oH}+K z^dQ|?mM~@Zq*WEn?or~C;cxZ^{we>m+y3V)E_1Z9zuQJ|m zE0r#utPYzaT4k_xrZDx2Y>aaHE+PF8@!qD~vw%8?Y`Vdx5_N}Wi;xS9GYdj}`7h$Lc*zWZLA@j>0ztYjFIG*HQ>c2-wXrEurA?ap5 z&*xAkF^4(QPJ~$^>~7v}TasvBM{8zzdl1JRR)h;9KTTnjgs!(Om`$e4#A-V+Vki<> z*cyh4RRR{H4^6tQ53Vt7<&=Xp#$UnCO6VULiK;j*`bJJND7 zr3FE*`(kO13t`%ye!0(`6j**%d$OMFeBNPWUDHmS-J%%pmf7A+0&J}eVc?!#Mzb%& z+C+wo_u(0T8l5;jJ0_$WSR^p!4QX9hVFZ5P+8%0%q?M@L(MQ=UewQ@Jlp_1|{ABQ& zu=nE)3X@}bs1YknFgI{V7ClrE{Ejx-1FTmN-L`e#AQ(!qHirhs+W1kU%ASqKbzT$C zD508Ap}{P91V2RWd~H-LbIHEs_YCZrzU|Tukcn06nu-r57qm_w_tDCKe9@tTAgs}^ zt}R28*O$t72+t{D;M~+f99vSl<@YQ<6jKb5!{e*-S27tJ`l=bOVkJO?hI4F(g|d|M zCW*tME~vvbD7A)=!CmeKFDvv57$6#8QC{g`A3Pr1l-hr3>4t4qM+Ey^5bV{-{Di)L$yS*s zz@oZ7w;viCS|h=N7dSv_*-(ctZuDvD$jakD6tUu zxo4O2sQRlGn~1DRo_``YKMVsKz65HZ+5q6sDfF-5KX$7|f%x*Q-dIwAcY>~O#XV>9 zBD)CZ?Kgaka{E*)+rpV+k63-uNSn#pmqlKytjy zBsGhdW-|8=frEO3 zs$%2~lVf&Jq=s|=UU!*&;?=npSC$h{@PB=90$s!OOVu3f1qXac8q5=;7YS+7aBmGE zGCuBAM41u+$pu{vEf(R`Wyx-{v7F0(&m|71N+=_4-R%eyIsBHscKgLolLzZ9#_M$+ zPw2k4Gp&LnUZ{(!k@RRBM)*C^(>-d+c1_s-A%D3=)OWyEyCneRGWHL=-KyA&-g5hT%jGguOz+xNNb=H1^a z>4xQfyC<}_&92SgHDpF8i}_eF8EzSrlGUn`pUYyp_X1-iue1ZXVpnCNJs4e_Kfgpe z$+!onK0nO+vBZ+XmTvO~eLW1RyZm6_^#xFsqSm0^unB5q{6YR;+USTZkNxN7VRw)n zd>_2lV%l=3h%4pi0rMg;Kpg5%*JkF-(tAH3OD;5k{8pxcuh*kdE?oq{hk$Ab3o z>~Y03@gc%twxc19eJdV9vp#5zzhM$M)-4Dw0{Qoc>41BmcmO*X{SV$2|3Ke`i*Wt` zGV+LuhX>iJf=SWZsjx=k3>ea@;dmW}j#r)jzz^&E^FpNOkk$S!GAwf^-K52>Ve|EJ z!_J@kfTJaMk%t?=74Rtls#@X8)n6s%Pk?QI5cD^mbQr3uAH7gk_IBd(J@WHv6ZRKH z^1=2nZp#RIqX8U0-xA=7)aH-YD_XoEIQxj1AjvLWyQJ?1T7r<<*a^KswNdI z33=%D7RZaA4u{$(nohB_=Ix@$@6M)MZ7E;upNP;LT8Jb+HG>1xj#2e#^_+1n=6R@g z#*_{MW_~+2_XiWrU3+(Ca3v6rzlN%SX&W{=044TY0%R7<33Q(H7h0+-Y4ow0!7i!N z+%M+2#5xk(CELngzc6vUr z-#oLgyq0R_Qtrm1w`|mrcjhyVeJ*%zU~X2sVfMj&)qezon?vSq+`(1z;K%YH;3rkT z%gD5%%D?qaFL@Ww`AAE#m7gth!GHqo*wsoDg(ZSECW})PnnVd8Pj(w-p2pv9RGeFk z@}PdGg#=q9TxTKZQ1<5AMA$+Z?mZYK{eEXU1J0Su0J*rhE7#`9LIX!g<>_Mr_(#p$ z-oqBos+NaElZ7tUe36w8RNuy+BD`zoUJ&F%WXseTuNM)X*Z{D8!;F*#^B2JdXUB~f z^u6=8?F1Pdw`>>{LxHNTf8%*+b1)p7XDR{nCylu`*EICL52QRcQm~YVYqynUiEUo+ z%X1rHj~L6W+7sODj#p}Krs%>CErb@Kje#j+WN==)pRhNa&-c}YEt2ElT{YOFtkm*R zN9{vx=ShZA+hQxW*|5ktUs~6@k%_crFCrpzxjYe5~UG8^qGfzTi!YTgfj$DhVpGJnn zp5iGpRt)k-3RUTqI;^cyy#C(_D)+z5{SXD(A@+}K3&>l3pWbllGz*)#%p=DvvWEUD zmM23g94m=5;s$Uv&xlRsc-TVS)X6@W0Dd%+;y+3ysZ_EJNmqsaRm0-5zC>_b!3xt2 zdvI%-Tz7H3Ve%90J`64C45S^nJ7?1VfAx&T@gs2^Mk`Cs7kHN!=dkf!g9{#G8*QkS zU-@WvHYKLN+6#`BDxLbT)==*bo{#uZbZ9krnsz#C`j%^lmg4`{n+z_LUbV8KswP)s zy_8-(P2{A0?~eYhAr$MqtiES#!Vj4byIfoXmH#Fdu z&HLniN1iisi=&WF~S z=FjF^<*$*RXPiD#tIvpdFPGsCQrPD4qy452DsMoJPdIYHDMPO`@RThZC;LelrHAfU z6_~cS{?3Q4NQQLAuO|1%?N`=!wvoaR%jNolz3V?xzA^AU#0}~+iCdW9yrXv;nX^{4Lp1s5cu}? z);=&vnS^weR*wV^Dy(MGM31SN+k&Y2w8F!JuOB@3$*_AzPbg3k3Knt}__@)n;$^w;+K6 zK9C%;R@%kO!2T=QKkcPCr$V^0J>hc*d-}oKwT%tds#v+EdS0rx!g!uu8W{ynve#!L z+H@yspZ%C)$+sLhkmJ{XgDf7}-24D)cVdU3r?v;2aSMJ1Ls})_)K(HN-@c;=0r?XY zOK5+GUb863o8#w~V97X057$8|;Gf|+vtEC$;B?dL9{qcRTcqKkC&Z@mk)49GdRZHW z?|~NaJ+)j7XO;^#Lsp10dVfB47(OV%@;X593SUxpuFzG3Ow27Urkzm~_6YbvpZ~Af zb7J0i1U}i%OhC|q9xGSkhrO-iTLV6}xzGCt3m%4APTf54?jjtm6s&mEA3Jon^nC(d zSs3FJ%^-Pe!C&_0Na_c{G&Qn3hyFEHBHs6m>u!V0L_IKtJ6|CQp&YM5*&S$iRzp6F z>QIN08gir?5&hzlGY4-8LaPS_*?>{efu8I_8v#(SI3na-01-50waa93?0bJC;qn?s zi5;mf_m4=}@e=Hf#3asiJ~%ab)$5YXJmDk~ER~=eGZ5xuIUvk9=LRRuy{8CN^N7i3L2MtFM?%_?q$$o3MTI7I zb4-x>@u&XF59es`2?Hq32RoJy@nEY$BmYTU!QSza~# zF3xDd(Kma5JyyZq!8y1WWB&M$IG51t(VaAp+$SudL?%=d-Xg2nK-B``Q9)ABsGP|0 z<1=k(xs=FQ+T#tfXYFE#V{RU~Bs>Wwc%B0t7RjNyZoJ;Apj=NFY}>xW+UVfFl_uyL<*0?dNgLl*1ZcHINrI8(W{xe-0R`;CO8m{n_c!**G6@CD$a8)%u_1{5$32Vjh^ za0dSRxsYb_ixnL8ki>c7f67($uw-6bhpRvoe7MkB>FM8ebkl2JhTO5&D`0~T0kts0I%=x{`qMI~u(Rg~0pUHb;P;`aE(i1*>tCakEwPY>@ILl^Q+Jul6l z!OrPUoI{kFV!^9A6&>>xu_~x_gD0CU;Xr#-FrD6$^o-Y?)d#2VSBN7li9osWbob#Y zn4GL6_C74+OF%UUOfX%3_V?+*YI^eUU$UnyN@~s$dxM6WI_*KFw(diYf4*IEGcTBW z=g)lTw;6WG(ob;I4@2jT1{zj}K!3SGQuL!W=$V|)=-qH__b`X#z6nsGlWFnvlL3_x zvAyZS!jq`CoMHp-CRN8ddVy*%SZ3PU@&N;dTh};ycOZxOuZRrQ_g;-i)XbS^ce37m zyOR9e)LFpkM?GE0#aJC?8s>cE{*%$&0Zj+>ISqu}d>0!1cLXCO?cK@t!qrl5E^P<{1&>UbTBj`!^)1`_gaHJo9^Zev4~&^rD_D$TC<&8H}@yBT&G(%^${+5ks+F`aqF@A!`QXcqzvJ zUk2nbBB?k6m8mwMfimXaH3oHjysIA_GBF-Hr~w3WCw~Kc{vqhia%y7G@zT@lr>_ct z!9mA+FZp&Qdfh4UV4Dn~VgvO}U&ORwJ z%h;80ySAk2Lgf){SyUL0YF(+Kq+b#@K7eRStC@{+I4G6e#bi~ruL_~2VsT}-d={KC_{OseTm`@2fH=?B?20@$^$@4?6mie74~Pr zk6|6K@e&Q=NkU+(iWn&iL9}wJ;3YTHgK@%fYT@2!18b@#tW##7#_R0|)Vn);RpaFr zTL_}#TMZ1S%4S!48)nE0q1%6qUey1NbU!Lso?P}bgMwi#ovpzDtmGc}$OrD_btqqH zn2NzqVo&q`btN)MFFzywt7ufa10!YetuhhUU0VrzuJj6PAmrDeGgL)jK!NmvxbuzB zzXlAghLYNMd|5yO7SrDjmIGP$^H_>X6<)okRGcnCMJ0h_1(2@3;zDhvJoM@@opxf= zu~_$ZIR@)Hz96|=dNlmPPiFyi$%Di6oRIctZo2eZ<`1LMWHQVO@!7Bs-)SKw3 z-HT@=8*P%{*hc^M7R%9P6kS>?x2T_$EOnensdM1$qo9ls1a=a7d?gBdojz&zqTMl$ zx-p`4-$AeW;=D9`pM9ZJ>wspA(i>LHZo}BPpIbgf&H%Q3-yOkqFiLDC1rd@p1%_ot3t!{(9T zcYSjGM@@89N3>e_L7ni9Bvvm%K1g@t>Uy{ z)l(d1)`hTjV43w?aNiCCNRt+^7!d(01_b85I^Y{5{lhl^fDwu_c$)q18Oo@>tZ_>+ zL_!fYb}Ro&Vr*H=KUhsy#|u@4Y{f;?L%!S(YPhx71fo zN-r3Ge!sxXC}Dev5xXn=m>@c$2HY4C3M9K?VH`KzyL5=#$~gvr1CKijhy6 zD_;`)&Sq)}Yb+{VUAA+h{xwFkf&zZNRKW9e4*k8e51sK+2KEgh$1hLn3ifT0qMC5G zqy$s{1e=3=;^)!KoDFdo^It8=)Me7cI)8#q`Lvm9>gL&2@tOOAaPgG+!%3~FiQfRm z1OU%v2v{Q+;w&f@% zodItc`14|C+d*^E+P;cyReNn#g%85)4JI&4_VkLBu*PntU64d>Pr^3V4tk@O(qP}e zsaiQUEwqD5cG%w1z5|JwCxAQwqZkOzB;n>8%>BP!8NOt7D@xi^gsmrMoTSeR$H^xh zl*pF6Ge`u!%2g;f8E9KR+_FTxtpzIhGD+&~%n@;9F$?F0n6JG=s~}u=`z}gOly=>h zF4R3_4qHbDxcn%&xr-BPkUsBiQe)mQ6r_BYK7PfM>Fk@L&WKn{n?(TkM0mEY7G`^F=c%<>vEW=d zFt)SA4Av6zWJ0j<@4`VUSfYcnAG@C`27gUzT00A`C;)1|sB*lJ}cj71Eh3bEZgwRsKDqzaLzo;KoT ziQ=~@`ayOQH_wIMW_+{9r-X~ILq)w;1t}es*`rOKJGzO%&^jQ5kZ?M^_cvhL-$Hl( zY9gNNaXk7F1EeZjnJ_a&UMVa+>;ruf+vq7p<|;M(@bw?ymJ*cQ-n|c8!wyF=SR%G$IJf{8ifd!R<$3u5Pf+V!#(VV-1l8Kio;1!%o7EX?H5B2s2=!@NT5m zt)vp^#farIoD1R%=Q4%X0Zu_1&?-1!%uWhXUuf%3*bBH1R0X0 z82BBaz_o`D6cpmHHK_<-yg!}M{H$K@9Mli8C3*H07Dmo3PPEDz!t&^gNIV#{F>K~c z+kYv189=T*WigG&lQUM7&{~8_)nYrEbiJ>Mvs&0kT(oe50e)mu{;mt^k37 z0EizLPaGSHX)_5n@aOvlP|`Z(ky2#s^ZU>l?XQ(`P9fg!3lGygwcgCa)^mo-kC~#% z`R;58xdMH|4Y6#k$^Q?Y@k!DNUH4AKAH-V~jDW}rbe_c3@9Q#(;s7tF_4@-lPS5Ji zJMF;}uVPcq7=^$@zXs`s9)95PZ2;;EGadu`y*pPdt5lOpBS1XU=m=W^N-P40w6fo- zm&F7&obq4vZ&ndjVOG7K6neEPeWQbfK^!K7C<7B^wzf)4K5!=;+u%Ssuo>YO!-~)Y zpy!J+3@uHnIlE0?4OKFJMwJY;6Ak<&rkP{DV{# zXdIcOi^Ny&ak1Xdy9f`R%M*V@zb%{gD!yXBC2HJ*QTf*uo2i;YktK)~RDDZj-!=6? z<_HGK#U%7Obe^D}ad+y%Iev>05N#6U^0&`Hjk62~4hG^^c9~^zvVw6sI&a_t0kdhnusJj-c`o8Po{9|b7H&+)3FuqNgHOkqOkrS z&cIGSwW6NP4=ijURVeNAu?tSoC4v|4|We&25`ab5>t(_7DIQ9@V>pgxl=z$<{Z zQLh?sj{MHiDjvbKnQemYiWDaTV5XMVN;O%GByjNiE#{OZK=6)Vo zkHM;?hP8)u+VgGqtKv9#_oqx`u|3=W!CRQ>-adep)X)HqJw?(H=!OQQqMQ^HjKbDJ z_rG{_z;!>Rb+G{w99U1MD?;dxK)@R9VN0}s1|mY363HFq2i48jkOk`lPEP?IWgIpJ zh<6{c6n41lf?unIqZ~lJSR^Q)Z6m~-I|X5-fXhz*ccH=2%A_X*u(P$)yk9JO{mpyx z4B>A%7y1MlNKf|fE=cc3{&t0KCIIXI=T-#l6t;}^W7DZJM`|1RpwQ0=&nfyD2b(`l zNZhZ)HBTpCWGOp6w6;Vn9a1pF4`AQ)iU1t640$Hf$CmPtL)yIO-!nI{p`q>p(6~5t1p; ziT@q?#pu=ze)uD%Yd?VEFoUkofyJJTk)oah#MoK@=32CJ;;8ST!ye`3K-gEN{VuP_ zsxI%PG~T5jT>%gHuZuFBep|yS+%{iGwcj>ZDpC$v$ykpa{75`weiez5di~6)ZPyO{ z4EC3;Tk%kAmTMh!X$1Sxhm6WohZZ%iPHPa3PO?A}&-mZsj6^Vt)53=gRXGw~n|Q;U zfD}oLacwZ(IcR2`SX^(Fqi!WlHwB`O0KSyUDWg|<_68;h%vOOWn6bnvONWp`fXAx@ z!v==x>3@CM|Gu*Fi*$Kv`T8h8#>3<=zQC;JTr^w-ygv-ObRD`0tVU59lnill?(E?T z?qY}FP@e`qEY*F_G+TG4qu#Y1L)mQDfA0Yx2>*LOi(3 zZl>VOH_q)X<68H*b9IBGW5><=bA<_!tUjsymY*~U$B;KrV7Jmg;y4~Xqa_Ka&cz=4 zgnQH4aMajIkXsDPoeeRXAFaOY(*Gl0R!IY`E}y54&{4QU`9|sD8fGY#Y_N_8z=gzs zc$_YZ|FS6COOjX6n7glA`2D@d%}=6a*>9Wz4K1Ol?=YNp4M&d=Vu4jY?3zs|eH8dUujm^SNR3GoX>3iW3|SAS48T^zJwcf%j_OdC?6s z;y^V1OZeRdZw12zv^p3YfB(MJ$fsWb_L_cMOa-k1TcP=5FIDFN0v4>jQ{y@Pp$Dmc z*iXAI!CHivlf6aa!RQZ0d;@@x{ruut>OPjJ^+`SFddyw!hl&{vkE$w9>&{@ zKU5IO>Qn+Q@Fw&hf@bQ!x!*0w^WVL*M-I*vv*`_3zqSS%r&AK>vw^V{PaSj^A*K<0 z*pBJs0~_W(?C7rpZm4k()oS0-ge6pOa$CGR!E)~?O66C|q--WoSgp|A%V%*DNE<*; zr2c5mi?>k1w}Yy(9U}TKeq?>zjePn4RSpf$42kC&&plp1-`N5^9_@A^kMGF zn5G;=7}DjT{a(S)l1Hz}?~!CXEQe%D*Y1(UrOc`&U7^t5Wy@d8Ud5@((PyHp;6Y@6Ja7r@OLrn zFO>q9H61FPy|jXW3jHVMsC7Sg!HWd^iJACM&f~EMIj7P~lGMbu&bmmYTuN;H;Lnvi z(^dGNh!{Vt8#I@vL{zOm(~g%+baeA0YygGX<%+7Wj0h}ZH*)S*c-UX`_2ypC8?D)( zaR0!+&N@1Bc(0t5z}hGALK!$4|=6L^`e731~C?;mhDhPd0o(jVph zRPam`%NetzT})*u>l)s;Jagy!ii(qA;Pl2t13kpOICBwJ@9h-qy6EJnm{`lZ>%vH= zKh=a>?(H|_f;^o^UOqlqQENgROE*LzwXPpNZH_>KQucE>gs(G^S*(cqWI#_YX;C3V zb!T@QZ{m?(bUh~B&rz4H5~3Z7pEo(V1OBa6qM)W`@ns_nI>?dYFx9r;xRS3Ew}7MuAx z+FB(-{q*C#^+EV>U%E$R?18ArT7ceRZk<1h>bsS8nkD(852573NMozs+Lw;;W|5Q^ z&5rBqXk^Pg@Lj70=0E$<$_QhY-g727B^M^De7+BZrhB?IsV7}ihAsCt?D7}zl)&@A zUnBuP`e@hgg!taTNPfm}^W*!@KVkhKXHmPVU3W|s_k2V=Q#`e=j%oIW5)=#e^ViB| z>$$bPq;e`Y0Q>L3BS8x7h)zr0^{&aZO<5ih*5}t5EVn4jq?GrQ!18o z-YhfOoG!wP78+)<(?Z8k`6F3njY9tlTkE1_ z73j-WBt1rK(Jo^Mff$H@4JTaYq5zDYQMT|B=$-=i15PC&^u)UY8&H~&M?PI9JViqQ zG``E$`f&r$CF&|58B?gol7;lFm@|P>8ZjL}cXfvt($EjXX0xsDJ0HQcA*(1o#S&pfnf0rqrpjx@oYMH=5V?b|!>(q-dG^K3TYe*5 zVZRZ;A68YxJV+xag)|Euz38T@?|Y05 z^1XGD!VGn}oNTU_IkB?qpBwX_Oo|V;CNp;rFM>Y8mz&&?`vF(c=CSk13 zEzVl5T2a>cnRI@wPj*ujqV1=oQQBU4;&usz2q>TVSW*6Gxq2(V79(L~L7As^2%vdLNHNIORAn2?TdU71+Tew!i`>+-V7Bwp#qg;!>wzf4?S z1WZ7zN_xvK6qf5yXFbmwltYQE>+j05nhd8~=H)1+nc|124bU-fk%riEHiygJT4(i{ zXhJ)zZs@NGnk~F84rq>OXC4}CO)Tn)L_`t-an4f~_B&6*KN#Dzc&FbP9pSIRK=@)= z`*&UdBD`|iQzQNf$&?>fCf|tY(Uc@+g>C@Or}v{_oA5KXo)j?Tk?3exi?lNgc<4RX zt4VPic8qpMXh0SihRnhbNew_+4z`Og=PlERCW{R_ADB2>nw(%tJm~jpq7_Q39o?Gh zA74ZBYNz*EXUJf1aq&vQ*h90Dr#IeJA!c-fIrPUpUg0&`qE@BeJzILP7H@Hx zIh-&nk7icy8E^h~xF^zrwb)Q9A!!Hm?cRb{R?!=pv|DwP>E(+2N!_uRn=_f`8Lik< z`%Gbzc82&6pZXXl`PVJi+L>HnF`6+U#YHRT*hf2H4KsnJcuV#o1v21Jgf!^l05S!+ znGvezR-CCmY4GxqR$dV1e0F82bd1V9)fka!vaT@^+O2D0JNxvhQ<4$3&awJ!YF&U6gP(C_X4z15>dfa_LtUJs%tZ_na|Oxz-i#lxcNW1gI?#G?}QO~ z*63%yw}?TA27((2f!F&#^R-#B^N?5ayL@|Kz%VD%GB$-Rjc;wTNd+?PY&RTT)lM=A z*@ZH~+DJ&xeE#m2#&_SgMvX_@ls#_ZU%o%X(Lvg#{$R=hQJMYwC7E<2v1**${aZVZ zydn@Dy>jz55pt-Shxp(Jb0?G{9yJY1Qo6Mqqv&2rpkPKtMeS=EUt_v{%wvapc2d=R!Qqr9;_O z1GliZ-mGE=| zCUS@My-fWFbw%S?3y3?yGT-6e$j*B%A_M)K7LPi(NjupOvc{UUBlKSoxAJ=aEL$R9 z9csMwRiv=inQ2Zl*X7cNo&1~U_z>CQsnIYqaSvO^u5=^4?^l9JD9w3E8ooTf(9($N z#`6`ymMyF6ap;9o1SIe1C#Ks5zPeC?*vm+_SFc}C@OaOS5-Bj*bi;(i8UZ8`aZc-c zzcnx$iD0)fLah^5d7n~du5CP1)n;izTetilybKT-rOExB(>I z5NqF|lR3k^RL&H)#pw&(zNKSyUa7oEpRvaW=?0R9iZ&1k6g1&5cZ^hy$g++UJ+Y|6 zpSUJ}P~Jx8<%iFP+QnE}T|MNyaqwF3()|2jo#Rca*!_pm-XTew+gxzUy0S&{N1=sD5;;m`Z~!TyQ9WgeG}eE76rG%)^R>nisdY%HtDM) zz}@C;5HowVgLMh`VnSVqMPY->x(yirf`-*em6P)Wohj)L;uhF5sg%v!d;$lC@~Ukw z<|tVO%MoS^k*8&l<^J**MQgY&kYg6^@74%WubU zmLEN_<4;IUs#{L7od1yY(Y^^n9ag5_{?Y48P+*d8ovF`foLmmLPn$mu!q$VRO44!x zLo2viE)8(21O_S~e>#7a^u(JBB;rErZx;9`5HRE<49cF&J$KSFrF+Y6byaPf3)&3* z^2$s*NYO)NG~;RZVsPDMRJg8QsH6P_C*7Dia?~qi|74_1fK4%nf%ru! zhi;#S#m*!pm&{i2`?2)pR1B^>lK3U5EZu~Ye% zndyUGx`u|nd|ev8xPkn6IVqW(Wz07NF1aMNa6%b&iHF>~Yz=+cR-*~7y8cSJ4oH>f zKCepA{v?ThCy6r5_y_p=*gY|^SNvZ}MMW^g;0_euZb8L}ucz_pV~8 zWbA@J_#CH~6ZG?dG=}fMm|i=Vt(NN*A=7D6)udIqdoFZJj1d`V6P3v86L`l6wD#C& z<%wAbokGyFA9&XYRTPI+%(J3jXBo{RRj_pqqiL;r%e;iDm^Y7r3j%@5;{>?;On@B= zF$^Gn{HO6+?m|^BLqKg*Ym+#8J=1R(2(MxzyF4MqYN28FCSEx#IHik0qHsUAggkkDQY~B%>ohvH; z6|H8CMV5iO)AQ|l*rjg@(=~Kn@KS2ycBMG-hI~r}uekN~2oqMk)USb~Ig?hy@_rA) zQXyCF=DP4HQP;DU^YUA!JNS7(b!}r(e^^~ybzcAD_SSkwgmg0~B({}ZI2RjC9>BzKZ)g?kentsSy^%xCTDy=5QY=a2YwOmORmZW&YTcB!ZyGqF zwU`LDVu|iuU$okdePnI#D9O;`$rXgeDD$tukf1n#I`^*4bN`Ei^PW6;NYZeZJSc;B zKNI%t-Po22S5GdS>_4sl8$8oH7$W9ihm>3m>q*#9-K}9^-FQ7J$WO1GQcfsRcjv@V z=W8V?qpuF-X4M?kgeBL3y$>|cp}H8K@&o+SCZYFiz84im>Sk-%gYLNfYiqhH6EUOE zcNKG!bsw8V?=#Z(-l?tB_<$;xd%7WVTO;uUT-8u$6DeI?Q>honYN}NQcNUKVQ*icN%@7)W*tK(N33qI9+ zWQ?IKl;OTTN@%Ej&(_2%K{-9EdYn7TT}om>V*P1T!BRPAo(nT^0xVY*sXF+^YSlH~ zxlc4zN{@Mqt752jqgkA~y1p*hy7w8~yCd6&CWOfXnM%Z|W^lva&nmBxP5S1M8y-uHNthR3B6{yzqLmWtrbz4lLwKJ2_=m*T zwx6j@9WQvY{VRShLk*j9_$PiN_9Xq+UrRHK(jnbqt*PSo&Xh>Llm~JBPQr80thuSx z6xOKibBgQiwbED4Ma$X4z-QSjtr?V(2v^ATEk`1LTwRgCUeE8;-4ggx*6=G+JYR+J+~F!*_S zv{K2bNjqMqIKOZ`w78;!diUxI1hl&HN)J2K{Jf3G$|H7@gKIsGFd>qvU`>)--c6gV z4)~Io$&---GymR9|0z5HZh1gVft3(-JMnA*E=0(7FxcQIT;9xnn)#eT#oBW?_f^t1 zKEP)Tah;sk&~W4YT=P)(@i>Q|=7eagSRqx;LA567?fL;G`g6pV!LmwU#}GEga^HoK zMp9NnPi5*Vx93)?KwbS_eT?zw!kcV~iFXLbz0Y3W{ApI%X;-@?sge4C(zJK;fy$%J zo}%8;tV#1wd2R%`Q-^;~{La+7__d0ogre_jz1CN_zj=x=el51CwRXAs!}{a>&d3_q z%omA+o+!oG%{;`%Djms->$q=kSLpOI5)mh`_L)RqG4|js1lBWhhWF**2JF>dmBldu&Vo)(zyqv z0y0tlxOWIK8p2+CX(y|=#)?{XxZzP%`vSvU3p(`<+t`)e z(Gi-aViF{L3L(}IV!x`FXmnqkHFiEm?%kxrJ5eX>x;0uwZ}|BZrPg*_;hSi9Nx@4y z%RL(or9QLrSlJJJMgNbhvyO{u>mEJ`3X+PVATcT^N{EPbjG~l?NOveGFhh3_Ass^q zC?JE<-QCiHAl)59cQed=_n_YA{@#D?N4SSMXZBfp_4;mg>-!AIYVPNouCXiO+U&$n z?M#l4V>}!cF#@Sy$CeHhv>dDmxP*eFUpK3{DeV-^(hocsIG1Wn zn(*36dhz}vDc@Lo>nI|6MhRBcqPxnk%h4q;Bc(>Kn?6e_Yx`tXL5VcNaq<@BRzJox zpH;g>Pzm@d6xSa%KM-Cinh(1t+~rfTA0>PD^SiRDL!5f}JQRkAwDL&E?+l zO;-Ip>zd#?p1=rK-%~E}G7XS9AgpbFZO$;I$O3bTL5%QI;<*^b1lw zqdZoyY=QnL%GnTYGq4O53vp+hQc}rxjK-VA%;e}SeTO4r_2?v3n5y~8!xrpo&1&9k zm*d&LbULPVT65t`X*Y(`wZ^{A#E%QHckUDG9G`42ef=}I1%9Q;R`vZv=XW7H)(~W; zW{8#ZDJ+?TU3)zQ#`$RFwH6zF-r6p8e+ztW3GFnsW>$WXWy&i;hxtz$k2=^ITTp?Rm)w3uv}t1$Sg`c~`xm zNKtG_SeppBPVtwy$fwL`k?KsfSfNlCe*x4T2fKaPRFTmAJC#&|SGLjoqTj0dn(QD(AvZH9h}RJ#IfiltCoJrr@TE3ZHk26x zy^3V)EI-sS(Fg3Je5-jNXUDIpeqlbiz62J7pf*_ z2#;gOX9n&MnVL}hTAXCAXOdbX#cQXBXTwd1+ZHr=8fsWG>0*s2}ROQDVTbJn$mzVAQPxK_fs z7%h&RugEZ#BRrn*Q#vy0BofK9lolbnKlu!{o17A#?5CZdjbjonjC z?32OCy$u#HRMZYiXoeOd&d6k^_*}3-G&hb9B0zA>6LfGFrPyIQN9?$tAsCW*m3&7! zL@xP-rV$HI<6-==IN57d%{ZP&lTp}Za7Zqerk`V>`&X8GK2sTX@gPT1x2fs-d8Q8x zZYkyF#16TuznHmS))C$GOoM(<+54ECIUYefaSbYGxwMy*XlPl~J+esr_$SrGg2ENM zxlY6gu!d!^46-a+&mCQY7vis9ev;9=@=M_#5}{mJ6YbHz^8()!zx`}Ezhln`Qb701~hONwpX%* z%e}A+_Rj2Ebpg2)CUR6aP#*-^eE&@(v^(&lbqbF8uneZWyDz$i0ElT+Q5#$!ZnsH&%q zHl?byv6nr`jn`zb5E_6C>(>N!;XNdJZ{=29Q+$8LVpK7%ptr+_?>rGv`Cew=C5g4c zfdWk({|6(S578dT=#gB_3HG^5*5M+o<3Eh!y{AN@LEzp6Zk2_C0LR9O@_1kO^kSxJ zoi-;Z{G+fx)pajH=R}B3opJ%EKjyIgC+RBqK;2AK8%v*35VR;DNH+uaQzV%KFJ|)?q{)5E0(&ALuCbb32l4U0QrxQEp!lcTSOb zwo|_&XOOyN5GVH_7kG_tU`y*S_xXcWU%}h9e3(*6n-%12a&5#;= z^ZcF_*OywpY{#7J4B5oxUU4R=b3!(uA#--es@Bt}t4mhmEU`D=x1F@M03g=aOcRQ0 z{bYhN#5*_N2{gaBEN^_{_Gz{hd2dcHh#T}(2HD4zBt3c)m3kJxyiQS0OLMkLdb6IyIV_qzUn>Ww#4iRnVAYZ0U=XW2`|(wUWhc}JVa>GV zunQjlHFnAJfz*(n+3K4T*G)(W0I*=5y86$Ygs2 zEvGhSG4Va#Q<}QBL{u?5aulO71y3ZcCzq7z#&3Y5FP2AUq{j?v4+j;eyMy�UhxP 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 literal 307653 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≷1$;Prn@)9fJFUI4Acc$h|(d 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

P4jAI`6C05b4^ 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

+O1eEP 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 diff --git a/docs/images/museum/harmonium/samples_0.jpg b/docs/images/museum/harmonium/samples_0.jpg index 0055fd0b0b85dcc9eabb5175c67ecb3108dccf32..60cf557ad8fc22b85c4c527744cc3172eaf7ce25 100755 GIT binary patch literal 94571 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 literal 102083 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 diff --git a/docs/images/museum/harmonium/samples_1.jpg b/docs/images/museum/harmonium/samples_1.jpg index f9310647ad8e246d06ab7c9f29a1fe44b5879184..eed0571b9b007011a4dc0a5daf47d99d5617676c 100755 GIT binary patch literal 94856 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 Vq5o8S38WP7B^Cca`h*cs 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 Z-*(AT0phV$@ZwRBk=Fma57m$1e*h0#Gm`)S diff --git a/docs/images/museum/harmonium/samples_2.jpg b/docs/images/museum/harmonium/samples_2.jpg index 0f1323741fb094f567357cacb86b7168cb8cdbea..aa14ba1618cf6d30686808ea0a671e597408f652 100755 GIT binary patch literal 92862 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 B2SNY< literal 113008 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äq5kVg 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 Tp4fw`&;z7q|L;EZKL`E=Zq)xR diff --git a/docs/museum/harmonium.md b/docs/museum/harmonium.md index a197d409..c43e6fd5 100644 --- a/docs/museum/harmonium.md +++ b/docs/museum/harmonium.md @@ -229,43 +229,44 @@ by cycling through it several times, saving the final $ python sim_harmonium.py ``` -which will fit/adapt your harmonium to MNIST. This should produce per-training iteration output, printed to I/O, -similar to the following: +which will fit/adapt your harmonium to MNIST. Note that the model exhibit code that you will run uses a special +extension of CD learning known as persistent CD (PCD); our PCD implementation[^3] essentially obtains negative-phase +statistics by maintaining a set of Gibbs sampling chains that are never reset but instead sampled from each time the +model parameters are to updated [6] (this extension that improves the quality of the samples produced by the RBM). +This should produce per-training iteration output, printed to I/O, similar to the following: ```console --- Initial RBM Synaptic Stats --- W1: min -0.0494 ; max 0.0445 mu -0.0000 ; norm 4.4734 b1: min -4.0000 ; max -4.0000 mu -4.0000 ; norm 64.0000 -c0: min -11.6114 ; max 0.0635 mu -3.8398 ; norm 135.2238 --1| Test: err(X) = 54.3889 -0| Test: |d.E(X)| = 16.8070 err(X) = 46.8236; Train: err(X) = 52.7418 -1| Test: |d.E(X)| = 27.1183 err(X) = 36.8690; Train: err(X) = 41.3630 -2| Test: |d.E(X)| = 13.7855 err(X) = 31.8582; Train: err(X) = 34.5511 -3| Test: |d.E(X)| = 9.0927 err(X) = 28.6253; Train: err(X) = 30.4615 -4| Test: |d.E(X)| = 5.8375 err(X) = 26.2317; Train: err(X) = 27.6882 -5| Test: |d.E(X)| = 5.3187 err(X) = 24.3207; Train: err(X) = 25.5485 -6| Test: |d.E(X)| = 3.7614 err(X) = 22.8012; Train: err(X) = 23.8361 -7| Test: |d.E(X)| = 2.2589 err(X) = 21.6163; Train: err(X) = 22.4523 -8| Test: |d.E(X)| = 3.2040 err(X) = 20.5934; Train: err(X) = 21.3355 -9| Test: |d.E(X)| = 2.4215 err(X) = 19.7679; Train: err(X) = 20.4297 -10| Test: |d.E(X)| = 1.5725 err(X) = 19.0672; Train: err(X) = 19.6835 -11| Test: |d.E(X)| = 0.5418 err(X) = 18.4881; Train: err(X) = 19.0372 +c0: min -15.2663 ; max 0.1887 mu -4.0560 ; norm 148.4289 +-1| Test: err(X) = 66.7563 +0| Dev: |d.E(X)| = 10.0093 err(X) = 64.7762 +1| Dev: |d.E(X)| = 2.5509 err(X) = 57.7121 +2| Dev: |d.E(X)| = 5.0427 err(X) = 53.9887 +3| Dev: |d.E(X)| = 5.1724 err(X) = 52.6923 +4| Dev: |d.E(X)| = 5.0167 err(X) = 51.1648 +5| Dev: |d.E(X)| = 3.4010 err(X) = 49.9060 +6| Dev: |d.E(X)| = 1.2844 err(X) = 48.9477 +7| Dev: |d.E(X)| = 3.8469 err(X) = 48.2278 +8| Dev: |d.E(X)| = 3.2666 err(X) = 47.3158 +9| Dev: |d.E(X)| = 0.7140 err(X) = 46.4883 +10| Dev: |d.E(X)| = 3.5822 err(X) = 45.7021 +11| Dev: |d.E(X)| = 1.9054 err(X) = 45.2206 ... ... -91| Test: |d.E(X)| = 0.4870 err(X) = 11.0443; Train: err(X) = 10.9832 -92| Test: |d.E(X)| = 0.0390 err(X) = 11.0118; Train: err(X) = 10.9820 -93| Test: |d.E(X)| = 0.5127 err(X) = 11.0013; Train: err(X) = 10.9586 -94| Test: |d.E(X)| = 1.9180 err(X) = 10.9874; Train: err(X) = 10.9312 -95| Test: |d.E(X)| = 0.0258 err(X) = 10.9906; Train: err(X) = 10.9274 -96| Test: |d.E(X)| = 0.4760 err(X) = 10.9712; Train: err(X) = 10.8940 -97| Test: |d.E(X)| = 0.6038 err(X) = 10.9589; Train: err(X) = 10.8960 -98| Test: |d.E(X)| = 0.2870 err(X) = 10.9563; Train: err(X) = 10.8727 -99| Test: |d.E(X)| = 1.6622 err(X) = 10.9347; Train: err(X) = 10.8671 +93| Dev: |d.E(X)| = 0.3789 err(X) = 27.3184 +94| Dev: |d.E(X)| = 0.5906 err(X) = 27.2172 +95| Dev: |d.E(X)| = 0.0461 err(X) = 27.2518 +96| Dev: |d.E(X)| = 1.9164 err(X) = 27.1477 +97| Dev: |d.E(X)| = 2.3997 err(X) = 27.0035 +98| Dev: |d.E(X)| = 2.9253 err(X) = 27.1244 +99| Dev: |d.E(X)| = 1.2569 err(X) = 26.9761 --- Final RBM Synaptic Stats --- -W1: min -1.8648 ; max 1.3757 mu -0.0012 ; norm 70.6230 -b1: min -7.5815 ; max 0.2337 mu -2.3395 ; norm 53.3993 -c0: min -11.6316 ; max -2.4227 mu -5.3259 ; norm 161.5646 +W1: min -1.1823 ; max 0.7636 mu -0.0087 ; norm 57.4068 +b1: min -4.0943 ; max -2.8031 mu -3.5501 ; norm 56.9961 +c0: min -16.0370 ; max -0.8244 mu -4.6686 ; norm 158.2293 ``` You will find, after the training script has finished executing, several outputs in the `exp/filters/` model @@ -282,7 +283,7 @@ if not). In particular, we remark notice that the filters that our harmonium has to the fact our exhibit employs some weight decay (specifically, Gaussian/L2 decay -- with intensity `l2_lambda=0.01` -- to the `W1` synaptic matrix of our RBM). Weight decay of this form is particularly useful to not only mitigate against the harmonium overfitting to its training -data but also to ensure that the Markov chain inherent to its negative-phase mixes more effectively [5] (which ensures +data but also to ensure that the Markov chain inherent to its negative-phase mixes more effectively [5] (which ensures better-quality samples from the block Gibbs sampler, which we will use next). Finally, you will also find in the `exp/filters/` model sub-folder another grid-plot containing some (about `100`) of @@ -330,8 +331,9 @@ Gibbs sampling process. reading the plot follows the ordering of samples extracted from the specific Markov chain sequence.) Note that, although each chain is run for many total steps, the `sample_harmonium.py` script "thins" out each Markov chain by only pulling out a fantasized pattern every `20` steps (further "burning" in each chain before collecting -samples). Each chain is merely initialized with random Bernoulli noise. Note that higher-quality samples can be -obtained if one modifies the earlier harmonium to learn with persistent CD or parallel tempering. +samples). +We remark that higher-quality samples can be +obtained if one modifies the earlier harmonium to learn with more advanced forms of CD-learning, such as parallel tempering. ### Final Notes @@ -343,15 +345,16 @@ Boltzmann machine (GRBM). ## References -[1] Smolensky, P. "Information Processing in Dynamical Systems: Foundations of Harmony Theory" (Chapter 6). Parallel +[1] Smolensky, P. "Information Processing in Dynamical Systems: Foundations of Harmony Theory" (Chapter 6). Parallel distributed processing: explorations in the microstructure of cognition 1 (1986).
-[2] Hinton, Geoffrey. Products of Experts. International conference on artificial neural networks (1999).
-[3] Hinton, Geoffrey E. "Training products of experts by maximizing contrastive likelihood." Technical Report, Gatsby +[2] Hinton, Geoffrey. Products of Experts. International conference on artificial neural networks (1999).
+[3] Hinton, Geoffrey E. "Training products of experts by maximizing contrastive likelihood." Technical Report, Gatsby computational neuroscience unit (1999).
-[4] Movellan, Javier R. "Contrastive Hebbian learning in the continuous Hopfield model." Connectionist models. Morgan +[4] Movellan, Javier R. "Contrastive Hebbian learning in the continuous Hopfield model." Connectionist models. Morgan Kaufmann, 1991. 10-17.
-[5] Hinton, Geoffrey E. "A practical guide to training restricted Boltzmann machines." Neural networks: Tricks of the -trade. Springer, Berlin, Heidelberg, 2012. 599-619. +[5] Hinton, Geoffrey E. "A practical guide to training restricted Boltzmann machines." Neural networks: Tricks of the +trade. Springer, Berlin, Heidelberg. 599-619 (2012).
+[6] Tieleman, Tijmen. "Training restricted Boltzmann machines using approximations to the likelihood gradient." Proceedings of the 25th international conference on Machine learning. (2008). [^1]: In fact, it is intractable to compute the partition function $Z$ for any reasonably-sized harmonium; fortunately, @@ -359,3 +362,8 @@ we will not need to calculate $Z$ in order to learn and sample from a Harmonium. [^2]: In general, CD-1 means contrastive divergence where the negative phase is only run for one single step, i.e., `K=1`. The more general form of CD is known as CD-K, the K-step CD algorithm where `K > 1`. (Sometimes, CD-1 is just referred to as just "CD".) +[^3]: Note that we have slightly modified the PCD algorithm to include a "chain-swapping" mechanism taken from the +statistical approach known as "parallel tempering". In our implementation, we randomy swap the states of the +set of Gibbs chains we maintain under a fixed mixing probability `p_mix`; we found that this somewhat improved +the quality of our model's confabulations more consistently. + From 710d8b1a9cf36c78bd9474917310efb7075b2dbc Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Sun, 7 Dec 2025 22:42:25 -0500 Subject: [PATCH 12/15] updated leaky-noise-cell to maintain temporal derivative of state --- ngclearn/components/neurons/graded/leakyNoiseCell.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ngclearn/components/neurons/graded/leakyNoiseCell.py b/ngclearn/components/neurons/graded/leakyNoiseCell.py index 85c4cd03..bef0c0dc 100755 --- a/ngclearn/components/neurons/graded/leakyNoiseCell.py +++ b/ngclearn/components/neurons/graded/leakyNoiseCell.py @@ -89,7 +89,8 @@ def __init__( self.j_input = Compartment(restVals, display_name="Input Stimulus Current", units="mA") # electrical current self.j_recurrent = Compartment(restVals, display_name="Recurrent Stimulus Current", units="mA") # electrical current self.x = Compartment(restVals, display_name="Rate Activity", units="mA") # rate activity - self.r = Compartment(restVals, display_name="Rectified Rate Activity") # rectified output + self.r = Compartment(restVals, display_name="(Rectified) Rate Activity") # rectified output + self.r_prime = Compartment(restVals, display_name="Derivative of rate activity") @compilable def advance_state(self, t, dt): @@ -106,12 +107,14 @@ def advance_state(self, t, dt): _step_fn = _step_fns[self.intgFlag] #_step_fns.get(self.intgFlag, step_euler) params = (self.j_input.get(), self.j_recurrent.get(), eps, self.tau_x, self.sigma_rec, self.leak_scale) _, x = _step_fn(0., self.x.get(), _dfz, dt, params) ## update state activation dynamics - r = self.fx(x) ## calculate rectified / post-activation function value(s) + r = self.fx(x) ## calculate (rectified) activity rates; f(x) + r_prime = self.dfx(x) ## calculate local deriv of activity rates; f'(x) ## set compartments to next state values in accordance with dynamics self.key.set(key) self.x.set(x) self.r.set(r) + self.r_prime.set(r_prime) @compilable def reset(self): @@ -123,6 +126,7 @@ def reset(self): self.j_recurrent.set(restVals) self.x.set(restVals) self.r.set(restVals) + self.r_prime.set(restVals) @classmethod def help(cls): ## component help function From a8b156affa27f21ae1ba5ae452e220af0c35c89c Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Mon, 8 Dec 2025 15:01:02 -0500 Subject: [PATCH 13/15] minor revisons/updates to hebb/dense syn, metric utils --- ngclearn/components/neurons/graded/rateCell.py | 2 +- ngclearn/components/synapses/denseSynapse.py | 12 ++++++++++-- .../synapses/hebbian/hebbianSynapse.py | 17 +++++++++++------ ngclearn/utils/metric_utils.py | 8 ++++---- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/ngclearn/components/neurons/graded/rateCell.py b/ngclearn/components/neurons/graded/rateCell.py index f70b0f52..3cf50a22 100755 --- a/ngclearn/components/neurons/graded/rateCell.py +++ b/ngclearn/components/neurons/graded/rateCell.py @@ -226,7 +226,7 @@ def advance_state(self, dt): ## self.pressure <-- "top-down" expectation / contextual pressure ## self.current <-- "bottom-up" data-dependent signal dfx_val = self.dfx(z) - j = _modulate(j, dfx_val) + j = _modulate(j, dfx_val) ## TODO: make this optional (for NGC circuit dynamics) j = j * self.resist_scale tmp_z = _run_cell( dt, j, j_td, z, self.tau_m, leak_gamma=self.priorLeakRate, integType=self.intgFlag, diff --git a/ngclearn/components/synapses/denseSynapse.py b/ngclearn/components/synapses/denseSynapse.py index 977f2464..d7980c4c 100755 --- a/ngclearn/components/synapses/denseSynapse.py +++ b/ngclearn/components/synapses/denseSynapse.py @@ -36,14 +36,20 @@ class DenseSynapse(JaxComponent): ## base dense synaptic cable p_conn: probability of a connection existing (default: 1.); setting this to < 1 and > 0. will result in a sparser synaptic structure (lower values yield sparse structure) + + mask: if non-None, a (multiplicative) mask is applied to this synaptic weight matrix """ def __init__( - self, name, shape, weight_init=None, bias_init=None, resist_scale=1., p_conn=1., batch_size=1, **kwargs + self, name, shape, weight_init=None, bias_init=None, resist_scale=1., p_conn=1., mask=None, batch_size=1, + **kwargs ): super().__init__(name, **kwargs) self.batch_size = batch_size + self.mask = 1. + if mask is not None: + self.mask = mask ## Synapse meta-parameters self.shape = shape @@ -79,7 +85,9 @@ def __init__( @compilable def advance_state(self): - self.outputs.set((jnp.matmul(self.inputs.get(), self.weights.get()) * self.resist_scale) + self.biases.get()) + weights = self.weights.get() + weights = weights * self.mask + self.outputs.set((jnp.matmul(self.inputs.get(), weights) * self.resist_scale) + self.biases.get()) @compilable def reset(self): diff --git a/ngclearn/components/synapses/hebbian/hebbianSynapse.py b/ngclearn/components/synapses/hebbian/hebbianSynapse.py index f0814443..1f6c9a07 100644 --- a/ngclearn/components/synapses/hebbian/hebbianSynapse.py +++ b/ngclearn/components/synapses/hebbian/hebbianSynapse.py @@ -86,7 +86,7 @@ def _enforce_constraints(W, w_bound, is_nonnegative=True): """ _W = W if w_bound > 0.: - if is_nonnegative == True: + if is_nonnegative: _W = jnp.clip(_W, 0., w_bound) else: _W = jnp.clip(_W, -w_bound, w_bound) @@ -173,7 +173,10 @@ def __init__( prior=("constant", 0.), w_decay=0., sign_value=1., optim_type="sgd", pre_wght=1., post_wght=1., p_conn=1., resist_scale=1., batch_size=1, **kwargs ): - super().__init__(name, shape, weight_init, bias_init, resist_scale, p_conn, batch_size=batch_size, **kwargs) + super().__init__( + name, shape=shape, weight_init=weight_init, bias_init=bias_init, resist_scale=resist_scale, p_conn=p_conn, + batch_size=batch_size, **kwargs + ) if w_decay > 0.: prior = ('l2', w_decay) @@ -243,19 +246,20 @@ def calc_update(self): post = self.post.get() weights = self.weights.get() biases = self.biases.get() - opt_params = self.opt_params.get() + #opt_params = self.opt_params.get() ## calculate synaptic update values dWeights, dBiases = HebbianSynapse._compute_update( - self.w_bound, self.is_nonnegative, self.sign_value, self.prior_type, self.prior_lmbda, self.pre_wght, self.post_wght, - pre, post, weights + self.w_bound, self.is_nonnegative, self.sign_value, self.prior_type, self.prior_lmbda, self.pre_wght, + self.post_wght, pre, post, weights ) self.dWeights.set(dWeights) self.dBiases.set(dBiases) + #self.opt_params.set(opt_params) @compilable - def evolve(self): + def evolve(self, dt): # Get the variables pre = self.pre.get() post = self.post.get() @@ -268,6 +272,7 @@ def evolve(self): self.w_bound, self.is_nonnegative, self.sign_value, self.prior_type, self.prior_lmbda, self.pre_wght, self.post_wght, pre, post, weights ) + ## conduct a step of optimization - get newly evolved synaptic weight value matrix if self.bias_init != None: opt_params, [weights, biases] = self.opt(opt_params, [weights, biases], [dWeights, dBiases]) diff --git a/ngclearn/utils/metric_utils.py b/ngclearn/utils/metric_utils.py index e5a61eb4..f91dda5b 100755 --- a/ngclearn/utils/metric_utils.py +++ b/ngclearn/utils/metric_utils.py @@ -308,7 +308,7 @@ def measure_CatNLL(p, x, offset=1e-7, preserve_batch=False): nll = jnp.mean(nll) return nll #tf.reduce_mean(nll) -@jit +@partial(jit, static_argnums=[2]) def measure_RMSE(mu, x, preserve_batch=False): """ Measures root mean squared error (RMSE). Note: If batch is preserved, this returns a column vector where each @@ -328,7 +328,7 @@ def measure_RMSE(mu, x, preserve_batch=False): mse = measure_MSE(mu, x, preserve_batch=preserve_batch) return jnp.sqrt(mse) ## sqrt(MSE) is the root-mean-squared-error -@jit +@partial(jit, static_argnums=[2]) def measure_MSE(mu, x, preserve_batch=False): """ Measures mean squared error (MSE), or the negative Gaussian log likelihood with variance of 1.0. Note: If batch @@ -352,7 +352,7 @@ def measure_MSE(mu, x, preserve_batch=False): mse = jnp.mean(mse) # this is proper mse return mse -@jit +@partial(jit, static_argnums=[2]) def measure_MAE(shift, x, preserve_batch=False): """ Measures mean absolute error (MAE), or the negative Laplacian log likelihood with scale of 1.0. Note: If batch @@ -376,7 +376,7 @@ def measure_MAE(shift, x, preserve_batch=False): mae = jnp.mean(mae) # this is proper mae return mae -@jit +@partial(jit, static_argnums=[3]) def measure_BCE(p, x, offset=1e-7, preserve_batch=False): #1e-10 """ Calculates the negative Bernoulli log likelihood or binary cross entropy (BCE). Note: If batch is preserved, From f72a063703c62b0d29433101df2cf6220f158590 Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Mon, 8 Dec 2025 15:44:30 -0500 Subject: [PATCH 14/15] cleaned-up/revised leaky-noise-cell --- .../neurons/graded/leakyNoiseCell.py | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/ngclearn/components/neurons/graded/leakyNoiseCell.py b/ngclearn/components/neurons/graded/leakyNoiseCell.py index bef0c0dc..cf7a5850 100755 --- a/ngclearn/components/neurons/graded/leakyNoiseCell.py +++ b/ngclearn/components/neurons/graded/leakyNoiseCell.py @@ -53,19 +53,23 @@ class LeakyNoiseCell(JaxComponent): ## Real-valued, leaky noise cell :Note: setting the integration type to the midpoint method will increase the accuracy of the estimate of the cell's evolution at an increase in computational cost (and simulation time) - sigma_rec: noise scaling factor / standard deviation (Default: 1) + sigma_pre: pre-rectification noise scaling factor / standard deviation (Default: 0.1) + + sigma_post: post-rectification noise scaling factor / standard deviation (Default: 0.) + + leak_scale: degree to which membrane leak should be scaled (Default: 1) """ - # Define Functions def __init__( - self, name, n_units, tau_x, act_fx="relu", integration_type="euler", batch_size=1, sigma_rec=1., - leak_scale=1., shape=None, **kwargs + self, name, n_units, tau_x, act_fx="relu", integration_type="euler", batch_size=1, sigma_pre=0.1, + sigma_post=0.1, leak_scale=1., shape=None, **kwargs ): super().__init__(name, **kwargs) self.tau_x = tau_x - self.sigma_rec = sigma_rec ## a "resistance" scaling factor + self.sigma_pre = sigma_pre ## a pre-rectification scaling factor + self.sigma_post = sigma_post ## a post-rectification scaling factor self.leak_scale = leak_scale ## the leak scaling factor (most appropriate default is 1) ## integration properties @@ -94,9 +98,12 @@ def __init__( @compilable def advance_state(self, t, dt): - ### run a step of integration over neuronal dynamics + ## run a step of integration over neuronal dynamics + ### Note: self.fx is the "rectifier" (rectification function) + key, skey = random.split(self.key.get(), 2) + eps_pre = random.normal(skey, shape=self.x.get().shape) ## pre-rectifier distributional noise key, skey = random.split(self.key.get(), 2) - eps = random.normal(skey, shape=self.x.get().shape) ## sample of unit distributional noise + eps_post = random.normal(skey, shape=self.x.get().shape) ## post-rectifier distributional noise #x = _run_cell(dt, self.j_input.get(), self.j_recurrent.get(), self.x.get(), eps, self.tau_x, self.sigma_rec, integType=self.intgFlag) _step_fns = { @@ -105,13 +112,13 @@ def advance_state(self, t, dt): 2: step_rk4, } _step_fn = _step_fns[self.intgFlag] #_step_fns.get(self.intgFlag, step_euler) - params = (self.j_input.get(), self.j_recurrent.get(), eps, self.tau_x, self.sigma_rec, self.leak_scale) + params = (self.j_input.get(), self.j_recurrent.get(), eps_pre, self.tau_x, self.sigma_pre, self.leak_scale) _, x = _step_fn(0., self.x.get(), _dfz, dt, params) ## update state activation dynamics - r = self.fx(x) ## calculate (rectified) activity rates; f(x) + r = self.fx(x) + (eps_post * self.sigma_post) ## calculate (rectified) activity rates; f(x) r_prime = self.dfx(x) ## calculate local deriv of activity rates; f'(x) ## set compartments to next state values in accordance with dynamics - self.key.set(key) + self.key.set(key) ## carry noise key over transition (to next state of component) self.x.set(x) self.r.set(r) self.r_prime.set(r_prime) @@ -146,7 +153,7 @@ def help(cls): ## component help function "n_units": "Number of neuronal cells to model in this layer", "batch_size": "Batch size dimension of this component", "tau_x": "State time constant", - "sigma_rec": "The non-zero degree/scale of noise to inject into this neuron" + "sigma_pre": "The non-zero degree/scale of (pre-rectification) noise to inject into this neuron" } info = {cls.__name__: properties, "compartments": compartment_props, From d5b350a16ea4ad98064905b6c4046dab6f1c9fcf Mon Sep 17 00:00:00 2001 From: Alexander Ororbia Date: Mon, 8 Dec 2025 15:47:58 -0500 Subject: [PATCH 15/15] cleaned-up/revised leaky-noise-cell --- ngclearn/components/neurons/graded/leakyNoiseCell.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ngclearn/components/neurons/graded/leakyNoiseCell.py b/ngclearn/components/neurons/graded/leakyNoiseCell.py index cf7a5850..9ccf4f8e 100755 --- a/ngclearn/components/neurons/graded/leakyNoiseCell.py +++ b/ngclearn/components/neurons/graded/leakyNoiseCell.py @@ -22,10 +22,14 @@ class LeakyNoiseCell(JaxComponent): ## Real-valued, leaky noise cell The specific differential equation that characterizes this cell is (for adjusting x) is: - | tau_x * dx/dt = -x + j_rec + j_in + sqrt(2 alpha (sigma_rec)^2) * eps + | tau_x * dx/dt = -x + j_rec + j_in + sqrt(2 alpha (sigma_pre)^2) * eps; and, + | r = f(x) + (eps * sigma_post). | where j_in is the set of incoming input signals | and j_rec is the set of recurrent input signals | and eps is a sample of unit Gaussian noise, i.e., eps ~ N(0, 1) + | and f(x) is the rectification function + | and sigma_pre is the pre-rectification noise applied to membrane x + | and sigma_post is the post-rectification noise applied to rates f(x) | --- Cell Input Compartments: --- | j_input - input (bottom-up) electrical/stimulus current (takes in external signals) @@ -33,7 +37,8 @@ class LeakyNoiseCell(JaxComponent): ## Real-valued, leaky noise cell | --- Cell State Compartments --- | x - noisy rate activity / current value of state | --- Cell Output Compartments: --- - | r - post-rectified activity, i.e., fx(x) = relu(x) + | r - post-rectified activity, e.g., fx(x) = relu(x) + | r_prime - post-rectified temporal derivative, e.g., dfx(x) = d_relu(x) Args: name: the string name of this cell