diff --git a/tutorial/PsyNeuLink Tutorial.ipynb b/tutorial/PsyNeuLink Tutorial.ipynb index 21888bace75..4a671b8f0e6 100644 --- a/tutorial/PsyNeuLink Tutorial.ipynb +++ b/tutorial/PsyNeuLink Tutorial.ipynb @@ -1,1497 +1,1649 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "PsyNeuLink_Tutorial.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.1" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "H6ZYZf4adoW6", + "colab_type": "text" + }, + "source": [ + "# Welcome to PsyNeuLink\n", + "\n", + "PsyNeuLink is an integrated language and toolkit for creating cognitive models. It decreases the overhead required for cognitive modeling by providing standard building blocks (DDMS, Neural Nets, etc.) and the means to connect them together in a single environment. PsyNeuLink is designed to make the user think about computation in a \"mind/brain-like\" way while imposing minimal constraints on the type of models that can be implemented." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V7laEcFxdoW7", + "colab_type": "text" + }, + "source": [ + "## How to get PsyNeuLink\n", + "\n", + "PsyNeuLink is compatible with python versions >= 3.7 and is available through PyPI:\n", + "\n", + "```shell\n", + "pip install psyneulink\n", + "```\n", + "Or you can clone the GitHub repo [here](https://github.com/PrincetonUniversity/PsyNeuLink). Download the package with the green \"Clone or download\" button on the right side of the page and \"Download ZIP.\" Open the version of this Tutorial in the cloned folder before continuing on.\n", + "\n", + "## Installation\n", + "\n", + "To install the package, navigate to the cloned directory in a terminal, switch to your preferred python3 environment, then run the command `pip install .` (make sure to include the period and to use the appropriate pip/pip3 command for python 3.7). All prerequisite packages will be automatically added to your environment.\n", + "\n", + "For the curious, these are:\n", + "* numpy\n", + "* matplotlib\n", + "* toposort\n", + "* mpi4py\n", + "* typecheck-decorator" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vK3d3A4NdoW8", + "colab_type": "text" + }, + "source": [ + "\n", + "## Tutorial Overview\n", + "\n", + "This tutorial is meant to get you accustomed to the structure of PsyNeuLink and be able to construct basic models. Starting with a simple 1-to-1 transformation, we will build up to making the Stroop model from [Cohen et al. (1990)](https://www.researchgate.net/publication/20956134_Cohen_JD_McClelland_JL_Dunbar_K_On_the_control_of_automatic_processes_a_parallel_distributed_processing_account_of_the_Stroop_effect_Psychol_Rev_97_332-361). Let's get started!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6skRbr-sdoW9", + "colab_type": "text" + }, + "source": [ + "### Imports and file structure\n", + "\n", + "The following code block will import the necessary components for basic neural network models in PsyNeuLink. In particular, we need tools for handling *[Compositions](https://princetonuniversity.github.io/PsyNeuLink/Composition.html)*, the set of specific *[Mechanisms](https://princetonuniversity.github.io/PsyNeuLink/Mechanism.html)* that will make up our networks, and the *[Projections](https://princetonuniversity.github.io/PsyNeuLink/Projection.html)* to connect them. We also import basic prerequisites and set up the jupyter environment for visualization." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Knw8qifUdoW-", + "colab_type": "code", + "outputId": "0175f0f1-b4b9-4fd1-950e-7866e83006cb", "colab": { - "name": "PsyNeuLink_Tutorial.ipynb", - "provenance": [], - "collapsed_sections": [] + "base_uri": "https://localhost:8080/", + "height": 136 }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.1" - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" + "ExecuteTime": { + "end_time": "2024-09-27T02:32:45.944047Z", + "start_time": "2024-09-27T02:32:29.034605Z" } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "H6ZYZf4adoW6", - "colab_type": "text" - }, - "source": [ - "# Welcome to PsyNeuLink\n", - "\n", - "PsyNeuLink is an integrated language and toolkit for creating cognitive models. It decreases the overhead required for cognitive modeling by providing standard building blocks (DDMS, Neural Nets, etc.) and the means to connect them together in a single environment. PsyNeuLink is designed to make the user think about computation in a \"mind/brain-like\" way while imposing minimal constraint on the type of models that can be implemented." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "V7laEcFxdoW7", - "colab_type": "text" - }, - "source": [ - "## How to get PsyNeuLink\n", - "\n", - "PsyNeuLink is compatible with python versions >= 3.5, and is available through PyPI:\n", - "\n", - "```python\n", - "pip install psyneulink\n", - "```\n", - "Or you can clone the github repo [here](https://github.com/PrincetonUniversity/PsyNeuLink). Download the package with the green \"Clone or download\" button on the right side of the page and \"Download ZIP.\" Open the version of this Tutorial in the cloned folder before continuing on.\n", - "\n", - "## Installation\n", - "\n", - "To install the package, navigate to the cloned directory in a terminal, switch to your preferred python3 environment, then run the command __\"pip install .\"__ (make sure to include the period and to use the appropriate pip/pip3 command for python 3.5). All prerequisite packages will be automatically added to your enviroment.\n", - "\n", - "For the curious, these are:\n", - "* numpy\n", - "* matplotlib\n", - "* toposort\n", - "* mpi4py\n", - "* typecheck-decorator" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "vK3d3A4NdoW8", - "colab_type": "text" - }, - "source": [ - "\n", - "## Tutorial Overview\n", - "\n", - "This tutorial is meant to get you accustomed to the structure of PsyNeuLink and be able to construct basic models. Starting with a simple 1-to-1 transformation, we will build up to making the Stroop model from Cohen et al. (1990). Let's get started!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6skRbr-sdoW9", - "colab_type": "text" - }, - "source": [ - "### Imports and file structure\n", - "\n", - "The following code block will import the necessary components for basic neural network models in PsyNeuLink. In particular, we need tools for handling *[Compositions](https://princetonuniversity.github.io/PsyNeuLink/Composition.html)*, the set of specific *[mechanisms](https://princetonuniversity.github.io/PsyNeuLink/Mechanism.html)* that will make up our networks, and the *[projections](https://princetonuniversity.github.io/PsyNeuLink/Projection.html)* to connect them. We also import basic prerequisites and set up the jupyter environment for visualization." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Knw8qifUdoW-", - "colab_type": "code", - "outputId": "0175f0f1-b4b9-4fd1-950e-7866e83006cb", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 136 - } - }, - "source": [ - "!pip install psyneulink #run this command if opening in Google CoLaboratory \n", - "import psyneulink as pnl" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "Requirement already satisfied: psyneulink in /usr/local/lib/python3.6/dist-packages (0.5.3.2)\n", - "Requirement already satisfied: typecheck-decorator==1.2 in /usr/local/lib/python3.6/dist-packages (from psyneulink) (1.2)\n", - "Requirement already satisfied: toposort in /usr/local/lib/python3.6/dist-packages (from psyneulink) (1.5)\n", - "Requirement already satisfied: llvmlite in /usr/local/lib/python3.6/dist-packages (from psyneulink) (0.28.0)\n", - "Requirement already satisfied: pillow in /usr/local/lib/python3.6/dist-packages (from psyneulink) (4.3.0)\n", - "Requirement already satisfied: numpy<1.16 in /usr/local/lib/python3.6/dist-packages (from psyneulink) (1.15.4)\n", - "Requirement already satisfied: olefile in /usr/local/lib/python3.6/dist-packages (from pillow->psyneulink) (0.46)\n" - ], - "name": "stdout" - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "Cw_2dcCfdoXB", - "colab_type": "code", - "colab": {} - }, - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IMknYIZ0doXE", - "colab_type": "text" - }, - "source": [ - "### Creating a mechanism\n", - "\n", - "*[Mechanisms](https://princetonuniversity.github.io/PsyNeuLink/Mechanism.html)* are the basic units of computation in PsyNeuLink. At their core is a parameterized *function* but they also contain the machinery to interact with input, output, control, and learning signals. Our first mechanism will perform a linear transformation on a scalar input. For now, we will initialize it by just specifying the *function* of the mechanism." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "hbBADbLrdoXF", - "colab_type": "code", - "colab": {} - }, - "source": [ - "linear_transfer_mechanism = pnl.TransferMechanism(\n", - " function=pnl.Linear(slope=1, intercept=0))" - ], - "execution_count": 0, - "outputs": [] - }, + }, + "source": [ + "!pip install psyneulink #run this command if opening in Google CoLaboratory \n", + "import psyneulink as pnl" + ], + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "gt0gGfYYdoXN", - "colab_type": "text" - }, - "source": [ - "In this case, we didn't actually need to specify the slope and intercept as the function will default to reasonable values (if we didn't specify it would have defaulted to a slope of 1 and intercept of 0). The function above has two parameters, slope and intercept. If we wrote the equation as y = ax + b, a is the slope, b is the input, x is the input and y is the output. As a function we write this f(x) = ax + b. Note that you can change these parameter values of a=1 and b=0 to other numbers -- because parameters are variables within a function. \n", - "\n", - "Some transfer functions other than Linear that you could use are: Exponential, Logistic, or SoftMax. An Exponential function raises some input number to an exponent (e.g. squaring a number is an exponent of 2, and the square root of a number is an exponent of 1/2). The output of a Logistic function is bounded between 0 and 1, and we'll learn a bit more about it later in this tutorial. SoftMax is a more complex function that is often used in neural networks, and you don't need to understand how it works yet. \n", - "\n", - "Next let's try inputing the number 2 to our linear transfer mechanism..." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "EYzobUQjdoXI", - "colab_type": "code", - "outputId": "cdf049b2-2adf-4b36-a3a7-904a561f25c1", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "linear_transfer_mechanism.execute([2])" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([[2.]])" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 40 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "3Y68tW8WfY6E", - "colab_type": "text" - }, - "source": [ - "Try reparamaterizing the mechanism (change the slope and/or intercept) and executing again before moving on... \n", - "\n", - "If you change slope to 3, run the code by pressing play, then change the input value to 4, what output do you get? Why? Can you predict what will happen if you change the slope to 4 and intercept to 5 and run both cells again with an input of 3? \n", - "\n", - "Another way of expressing this function is (slope x input) + intercept. \n", - "\n", - "### Logistic Function\n", - "\n", - "The following cell plots a logistic function with the default parameters; gain = 1, bias = 0, offset = 0. " - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "2pSgoHcHfkoS", - "colab_type": "code", - "outputId": "ec35c2f8-0afa-4f0d-cf3f-afeb1ac356e6", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 269 - } - }, - "source": [ - "logistic_transfer_demo = pnl.TransferMechanism(function=pnl.Logistic(gain=1, bias=0, offset=0))\n", - "logistic_transfer_demo.plot()" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "E8Y4AwEefsxw", - "colab_type": "text" - }, - "source": [ - "In the cell below you can plug a single number into this function and get an output value. Your input corresponds to a point on the x axis, and the output is the corresponding y value (height of the point on the curve above the x you specified). " - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "q6C_KmkEft-k", - "colab_type": "code", - "outputId": "4928c3b7-d58a-4648-fb6b-2e7609898882", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "logistic_transfer_demo.execute([-2])" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([[0.11920292]])" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 42 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "lBBsnUvaf2qk", - "colab_type": "text" - }, - "source": [ - "The logistic function is useful because it is bounded between 0 and 1. Gain determines how steep the central portion of the S curve is, with higher values being steeper. Bias shifts the curve left or right. You can turn the logistic function effectively into a step function that works as a threshhold by increasing gain. The step in the step function (where it crosses through 0.5 on the Y axis) is located on the X axis at (offset/gain) + bias." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "76xpYsiMf7Bw", - "colab_type": "code", - "outputId": "252c08d2-e098-45a9-8ec3-bee5f1d7cf89", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 269 - } - }, - "source": [ - "logistic_transfer_offgain = pnl.TransferMechanism(function=pnl.Logistic(gain=5,offset=10, bias=0))\n", - "logistic_transfer_offgain.plot()" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\nXAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Q1NbpKYef_zX", - "colab_type": "text" - }, - "source": [ - "Negative values of gain mirror reverse the S curve accross the vertical axis, centered at the x value of (offset/gain)+bias. Below notice that offset/gain is -2 (10/-5), and at an X value of -2 the Y value is 0.5. " - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "ouY4W0-VgAoy", - "colab_type": "code", - "outputId": "7e71b829-2035-4623-efa5-29b738ae4525", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 269 - } - }, - "source": [ - "logistic_transfer_invert = pnl.TransferMechanism(function=pnl.Logistic(gain=-5, bias=0, offset=10))\n", - "logistic_transfer_invert.plot()" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "pJYwFCtFgLL_", - "colab_type": "text" - }, - "source": [ - "### From Nodes to Graphs: Compositions\n", - "\n", - "Generally with PsyNeuLink, you won't be executing mechanisms as stand-alone entities. Rather, mechanisms will be nodes in a graph, with Projections as edges of the graph, connecting nodes. We call the graph a Composition. \n", - "\n", - "The simplest kind of Composition graph is one-dimensional: a linear progression from one node to the next. Information flowing through this graph will enter as input, be processed in the first mechanism, transfered via projection to the next mechanism, and so on. You can think of this with an analogy to digestion. Chew the food first, then swallow and it is \"projected\" to the stomach, then the stomach soaks food in digestive acid to further break it down, then the output is projected to the small intestine where nutrients are absorbed. Note that the order matters -- the small intestine wouldn't be effective if food hadn't been chewed and then broken down in the stompach. \n", - "\n", - "A Mechanism takes some input, performs a function, and delivers an output. The same is typically true of Compositions -- they take some input, perform multiple functions using multiple Mechanisms, and deliver some output. A powerful feature of this input-output architecture is that an entire Composition today can become a Mechanism tomorrow in a more complex Composition, and that Composition can become a Mechanisms in yet a more complex Composition, all the way up. [Note: this is true in principle, but PsyNeuLink is actively under development and such scaled up functionality is not all implemented.] \n", - "\n", - "The main parameter when initializing a Composition is its pathway, which is the order in which the Mechanisms will execute. Of course, with only one Mechanism in our Composition, the list has just one element.\n", - "\n", - "To better see how the Composition runs, we can also turn on output reporting. Reporting can happen at every level in PsyNeuLink and here we set the preference for the Mechanism." - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: psyneulink in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink (0.15.1.0+338.g923c227782.dirty)\r\n", + "Requirement already satisfied: beartype<0.19.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (0.17.2)\r\n", + "Requirement already satisfied: dill<0.3.9 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (0.3.8)\r\n", + "Requirement already satisfied: fastkde<1.0.31,>=1.0.24 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (1.0.30)\r\n", + "Requirement already satisfied: graph-scheduler<1.3.0,>=1.2.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (1.2.2)\r\n", + "Requirement already satisfied: graphviz<0.21.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (0.20.3)\r\n", + "Requirement already satisfied: grpcio<1.67.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (1.60.2)\r\n", + "Requirement already satisfied: leabra-psyneulink<0.3.3 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (0.3.2)\r\n", + "Requirement already satisfied: llvmlite<0.44 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (0.41.1)\r\n", + "Requirement already satisfied: matplotlib<3.7.6 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (3.7.2)\r\n", + "Requirement already satisfied: networkx<3.4 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (3.2.1)\r\n", + "Requirement already satisfied: numpy<1.26.5,>=1.21.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (1.24.4)\r\n", + "Requirement already satisfied: optuna<3.4.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (3.3.0)\r\n", + "Requirement already satisfied: packaging<25.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (23.2)\r\n", + "Requirement already satisfied: pandas<2.2.4 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (2.2.0)\r\n", + "Requirement already satisfied: pillow<10.5.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (10.2.0)\r\n", + "Requirement already satisfied: pint<0.22.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (0.21.1)\r\n", + "Requirement already satisfied: protobuf<3.20.4 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (3.20.2)\r\n", + "Requirement already satisfied: rich<10.13,>=10.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (10.12.0)\r\n", + "Requirement already satisfied: scipy<1.15,>=1.7.3 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (1.11.4)\r\n", + "Requirement already satisfied: toposort<1.11 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (1.10)\r\n", + "Requirement already satisfied: modeci_mdf<0.5,>=0.4.3 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (0.4.10)\r\n", + "Requirement already satisfied: torch<2.5.0,>=1.10.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from psyneulink) (2.1.2)\r\n", + "Requirement already satisfied: bokeh>=0.12.6 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from leabra-psyneulink<0.3.3->psyneulink) (3.5.2)\r\n", + "Requirement already satisfied: ipywidgets>=7.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from leabra-psyneulink<0.3.3->psyneulink) (8.1.5)\r\n", + "Requirement already satisfied: jupyter in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from leabra-psyneulink<0.3.3->psyneulink) (1.1.1)\r\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from matplotlib<3.7.6->psyneulink) (1.3.0)\r\n", + "Requirement already satisfied: cycler>=0.10 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from matplotlib<3.7.6->psyneulink) (0.12.1)\r\n", + "Requirement already satisfied: fonttools>=4.22.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from matplotlib<3.7.6->psyneulink) (4.53.1)\r\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from matplotlib<3.7.6->psyneulink) (1.4.7)\r\n", + "Requirement already satisfied: pyparsing<3.1,>=2.3.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from matplotlib<3.7.6->psyneulink) (3.0.9)\r\n", + "Requirement already satisfied: python-dateutil>=2.7 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from matplotlib<3.7.6->psyneulink) (2.9.0.post0)\r\n", + "Requirement already satisfied: h5py in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modeci_mdf<0.5,>=0.4.3->psyneulink) (3.11.0)\r\n", + "Requirement already satisfied: onnxruntime in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modeci_mdf<0.5,>=0.4.3->psyneulink) (1.19.2)\r\n", + "Requirement already satisfied: onnx in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modeci_mdf<0.5,>=0.4.3->psyneulink) (1.16.2)\r\n", + "Requirement already satisfied: skl2onnx in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modeci_mdf<0.5,>=0.4.3->psyneulink) (1.17.0)\r\n", + "Requirement already satisfied: attrs>=21.1.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modeci_mdf<0.5,>=0.4.3->psyneulink) (24.2.0)\r\n", + "Requirement already satisfied: cattrs in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modeci_mdf<0.5,>=0.4.3->psyneulink) (24.1.0)\r\n", + "Requirement already satisfied: modelspec<0.4,>=0.3.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modeci_mdf<0.5,>=0.4.3->psyneulink) (0.3.5)\r\n", + "Requirement already satisfied: glom in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modeci_mdf<0.5,>=0.4.3->psyneulink) (23.5.0)\r\n", + "Requirement already satisfied: alembic>=1.5.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from optuna<3.4.0->psyneulink) (1.13.2)\r\n", + "Requirement already satisfied: cmaes>=0.10.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from optuna<3.4.0->psyneulink) (0.11.1)\r\n", + "Requirement already satisfied: colorlog in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from optuna<3.4.0->psyneulink) (6.8.2)\r\n", + "Requirement already satisfied: sqlalchemy>=1.3.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from optuna<3.4.0->psyneulink) (2.0.33)\r\n", + "Requirement already satisfied: tqdm in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from optuna<3.4.0->psyneulink) (4.66.5)\r\n", + "Requirement already satisfied: PyYAML in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from optuna<3.4.0->psyneulink) (6.0.2)\r\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from pandas<2.2.4->psyneulink) (2024.1)\r\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from pandas<2.2.4->psyneulink) (2024.1)\r\n", + "Requirement already satisfied: colorama<0.5.0,>=0.4.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from rich<10.13,>=10.1->psyneulink) (0.4.6)\r\n", + "Requirement already satisfied: commonmark<0.10.0,>=0.9.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from rich<10.13,>=10.1->psyneulink) (0.9.1)\r\n", + "Requirement already satisfied: pygments<3.0.0,>=2.6.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from rich<10.13,>=10.1->psyneulink) (2.18.0)\r\n", + "Requirement already satisfied: filelock in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from torch<2.5.0,>=1.10.0->psyneulink) (3.15.4)\r\n", + "Requirement already satisfied: typing-extensions in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from torch<2.5.0,>=1.10.0->psyneulink) (4.12.2)\r\n", + "Requirement already satisfied: sympy in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from torch<2.5.0,>=1.10.0->psyneulink) (1.13.2)\r\n", + "Requirement already satisfied: jinja2 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from torch<2.5.0,>=1.10.0->psyneulink) (3.1.4)\r\n", + "Requirement already satisfied: fsspec in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from torch<2.5.0,>=1.10.0->psyneulink) (2024.6.1)\r\n", + "Requirement already satisfied: Mako in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from alembic>=1.5.0->optuna<3.4.0->psyneulink) (1.3.5)\r\n", + "Requirement already satisfied: tornado>=6.2 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from bokeh>=0.12.6->leabra-psyneulink<0.3.3->psyneulink) (6.4.1)\r\n", + "Requirement already satisfied: xyzservices>=2021.09.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from bokeh>=0.12.6->leabra-psyneulink<0.3.3->psyneulink) (2024.9.0)\r\n", + "Requirement already satisfied: comm>=0.1.3 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (0.2.2)\r\n", + "Requirement already satisfied: ipython>=6.1.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (8.27.0)\r\n", + "Requirement already satisfied: traitlets>=4.3.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (5.14.3)\r\n", + "Requirement already satisfied: widgetsnbextension~=4.0.12 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (4.0.13)\r\n", + "Requirement already satisfied: jupyterlab-widgets~=3.0.12 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (3.0.13)\r\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jinja2->torch<2.5.0,>=1.10.0->psyneulink) (2.1.5)\r\n", + "Requirement already satisfied: pymongo in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modelspec<0.4,>=0.3.0->modeci_mdf<0.5,>=0.4.3->psyneulink) (4.8.0)\r\n", + "Requirement already satisfied: tabulate in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modelspec<0.4,>=0.3.0->modeci_mdf<0.5,>=0.4.3->psyneulink) (0.9.0)\r\n", + "Requirement already satisfied: docstring-parser in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from modelspec<0.4,>=0.3.0->modeci_mdf<0.5,>=0.4.3->psyneulink) (0.16)\r\n", + "Requirement already satisfied: six>=1.5 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib<3.7.6->psyneulink) (1.16.0)\r\n", + "Requirement already satisfied: boltons>=19.3.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from glom->modeci_mdf<0.5,>=0.4.3->psyneulink) (24.0.0)\r\n", + "Requirement already satisfied: face==20.1.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from glom->modeci_mdf<0.5,>=0.4.3->psyneulink) (20.1.1)\r\n", + "Requirement already satisfied: notebook in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter->leabra-psyneulink<0.3.3->psyneulink) (7.2.2)\r\n", + "Requirement already satisfied: jupyter-console in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter->leabra-psyneulink<0.3.3->psyneulink) (6.6.3)\r\n", + "Requirement already satisfied: nbconvert in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter->leabra-psyneulink<0.3.3->psyneulink) (7.16.4)\r\n", + "Requirement already satisfied: ipykernel in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter->leabra-psyneulink<0.3.3->psyneulink) (6.29.5)\r\n", + "Requirement already satisfied: jupyterlab in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter->leabra-psyneulink<0.3.3->psyneulink) (4.2.5)\r\n", + "Requirement already satisfied: coloredlogs in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from onnxruntime->modeci_mdf<0.5,>=0.4.3->psyneulink) (15.0.1)\r\n", + "Requirement already satisfied: flatbuffers in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from onnxruntime->modeci_mdf<0.5,>=0.4.3->psyneulink) (24.3.25)\r\n", + "Requirement already satisfied: scikit-learn>=1.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from skl2onnx->modeci_mdf<0.5,>=0.4.3->psyneulink) (1.5.1)\r\n", + "Requirement already satisfied: onnxconverter-common>=1.7.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from skl2onnx->modeci_mdf<0.5,>=0.4.3->psyneulink) (1.14.0)\r\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from sympy->torch<2.5.0,>=1.10.0->psyneulink) (1.3.0)\r\n", + "Requirement already satisfied: decorator in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (5.1.1)\r\n", + "Requirement already satisfied: jedi>=0.16 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (0.19.1)\r\n", + "Requirement already satisfied: matplotlib-inline in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (0.1.7)\r\n", + "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (3.0.47)\r\n", + "Requirement already satisfied: stack-data in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (0.6.3)\r\n", + "Requirement already satisfied: pexpect>4.3 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (4.9.0)\r\n", + "Requirement already satisfied: joblib>=1.2.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from scikit-learn>=1.1->skl2onnx->modeci_mdf<0.5,>=0.4.3->psyneulink) (1.4.2)\r\n", + "Requirement already satisfied: threadpoolctl>=3.1.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from scikit-learn>=1.1->skl2onnx->modeci_mdf<0.5,>=0.4.3->psyneulink) (3.5.0)\r\n", + "Requirement already satisfied: humanfriendly>=9.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from coloredlogs->onnxruntime->modeci_mdf<0.5,>=0.4.3->psyneulink) (10.0)\r\n", + "Requirement already satisfied: appnope in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipykernel->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.1.4)\r\n", + "Requirement already satisfied: debugpy>=1.6.5 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipykernel->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.8.5)\r\n", + "Requirement already satisfied: jupyter-client>=6.1.12 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipykernel->jupyter->leabra-psyneulink<0.3.3->psyneulink) (8.6.2)\r\n", + "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipykernel->jupyter->leabra-psyneulink<0.3.3->psyneulink) (5.7.2)\r\n", + "Requirement already satisfied: nest-asyncio in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipykernel->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.6.0)\r\n", + "Requirement already satisfied: psutil in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipykernel->jupyter->leabra-psyneulink<0.3.3->psyneulink) (6.0.0)\r\n", + "Requirement already satisfied: pyzmq>=24 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from ipykernel->jupyter->leabra-psyneulink<0.3.3->psyneulink) (26.2.0)\r\n", + "Requirement already satisfied: async-lru>=1.0.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.0.4)\r\n", + "Requirement already satisfied: httpx>=0.25.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.27.2)\r\n", + "Requirement already satisfied: jupyter-lsp>=2.0.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.2.5)\r\n", + "Requirement already satisfied: jupyter-server<3,>=2.4.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.14.2)\r\n", + "Requirement already satisfied: jupyterlab-server<3,>=2.27.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.27.3)\r\n", + "Requirement already satisfied: notebook-shim>=0.2 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.2.4)\r\n", + "Requirement already satisfied: setuptools>=40.1.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (68.0.0)\r\n", + "Requirement already satisfied: beautifulsoup4 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (4.12.3)\r\n", + "Requirement already satisfied: bleach!=5.0.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (6.1.0)\r\n", + "Requirement already satisfied: defusedxml in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.7.1)\r\n", + "Requirement already satisfied: jupyterlab-pygments in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.3.0)\r\n", + "Requirement already satisfied: mistune<4,>=2.0.3 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (3.0.2)\r\n", + "Requirement already satisfied: nbclient>=0.5.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.10.0)\r\n", + "Requirement already satisfied: nbformat>=5.7 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (5.10.4)\r\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.5.1)\r\n", + "Requirement already satisfied: tinycss2 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.3.0)\r\n", + "Requirement already satisfied: dnspython<3.0.0,>=1.16.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from pymongo->modelspec<0.4,>=0.3.0->modeci_mdf<0.5,>=0.4.3->psyneulink) (2.6.1)\r\n", + "Requirement already satisfied: webencodings in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from bleach!=5.0.0->nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.5.1)\r\n", + "Requirement already satisfied: anyio in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from httpx>=0.25.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (4.4.0)\r\n", + "Requirement already satisfied: certifi in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from httpx>=0.25.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2024.8.30)\r\n", + "Requirement already satisfied: httpcore==1.* in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from httpx>=0.25.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.0.5)\r\n", + "Requirement already satisfied: idna in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from httpx>=0.25.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (3.8)\r\n", + "Requirement already satisfied: sniffio in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from httpx>=0.25.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.3.1)\r\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from httpcore==1.*->httpx>=0.25.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.14.0)\r\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jedi>=0.16->ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (0.8.4)\r\n", + "Requirement already satisfied: platformdirs>=2.5 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel->jupyter->leabra-psyneulink<0.3.3->psyneulink) (4.2.2)\r\n", + "Requirement already satisfied: argon2-cffi>=21.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (23.1.0)\r\n", + "Requirement already satisfied: jupyter-events>=0.9.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.10.0)\r\n", + "Requirement already satisfied: jupyter-server-terminals>=0.4.4 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.5.3)\r\n", + "Requirement already satisfied: overrides>=5.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (7.7.0)\r\n", + "Requirement already satisfied: prometheus-client>=0.9 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.20.0)\r\n", + "Requirement already satisfied: send2trash>=1.8.2 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.8.3)\r\n", + "Requirement already satisfied: terminado>=0.8.3 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.18.1)\r\n", + "Requirement already satisfied: websocket-client>=1.7 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.8.0)\r\n", + "Requirement already satisfied: babel>=2.10 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.16.0)\r\n", + "Requirement already satisfied: json5>=0.9.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.9.25)\r\n", + "Requirement already satisfied: jsonschema>=4.18.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (4.23.0)\r\n", + "Requirement already satisfied: requests>=2.31 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.32.3)\r\n", + "Requirement already satisfied: fastjsonschema>=2.15 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from nbformat>=5.7->nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.20.0)\r\n", + "Requirement already satisfied: ptyprocess>=0.5 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from pexpect>4.3->ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (0.7.0)\r\n", + "Requirement already satisfied: wcwidth in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (0.2.13)\r\n", + "Requirement already satisfied: soupsieve>1.2 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from beautifulsoup4->nbconvert->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.6)\r\n", + "Requirement already satisfied: executing>=1.2.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (2.1.0)\r\n", + "Requirement already satisfied: asttokens>=2.1.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (2.4.1)\r\n", + "Requirement already satisfied: pure-eval in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from stack-data->ipython>=6.1.0->ipywidgets>=7.0->leabra-psyneulink<0.3.3->psyneulink) (0.2.3)\r\n", + "Requirement already satisfied: argon2-cffi-bindings in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (21.2.0)\r\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2023.12.1)\r\n", + "Requirement already satisfied: referencing>=0.28.4 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.35.1)\r\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.20.0)\r\n", + "Requirement already satisfied: python-json-logger>=2.0.4 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.0.7)\r\n", + "Requirement already satisfied: rfc3339-validator in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.1.4)\r\n", + "Requirement already satisfied: rfc3986-validator>=0.1.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jupyter-events>=0.9.0->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (0.1.1)\r\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from requests>=2.31->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (3.3.2)\r\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from requests>=2.31->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.2.2)\r\n", + "Requirement already satisfied: fqdn in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.5.1)\r\n", + "Requirement already satisfied: isoduration in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (20.11.0)\r\n", + "Requirement already satisfied: jsonpointer>1.13 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (3.0.0)\r\n", + "Requirement already satisfied: uri-template in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.3.0)\r\n", + "Requirement already satisfied: webcolors>=24.6.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (24.8.0)\r\n", + "Requirement already satisfied: cffi>=1.0.1 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from argon2-cffi-bindings->argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.17.0)\r\n", + "Requirement already satisfied: pycparser in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.22)\r\n", + "Requirement already satisfied: arrow>=0.15.0 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from isoduration->jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (1.3.0)\r\n", + "Requirement already satisfied: types-python-dateutil>=2.8.10 in /Users/younesstrittmatter/Documents/GitHub/younesStrittmatter/princeton/PsyNeuLink/.venv/lib/python3.11/site-packages (from arrow>=0.15.0->isoduration->jsonschema>=4.18.0->jupyterlab-server<3,>=2.27.1->jupyterlab->jupyter->leabra-psyneulink<0.3.3->psyneulink) (2.9.0.20240821)\r\n", + "\r\n", + "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m23.1.2\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m24.2\u001B[0m\r\n", + "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n" + ] + } + ], + "execution_count": 20 + }, + { + "cell_type": "code", + "metadata": { + "id": "Cw_2dcCfdoXB", + "colab_type": "code", + "colab": {}, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:45.951120Z", + "start_time": "2024-09-27T02:32:45.946607Z" + } + }, + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ], + "outputs": [], + "execution_count": 21 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IMknYIZ0doXE", + "colab_type": "text" + }, + "source": [ + "### Creating a Mechanism\n", + "\n", + "*[Mechanisms](https://princetonuniversity.github.io/PsyNeuLink/Mechanism.html)* are the basic units of computation in PsyNeuLink. At their core is a parameterized *function* but they also contain the machinery to interact with input, output, control, and learning signals. Our first Mechanism will perform a linear transformation on a scalar input. For now, we will initialize it by just specifying the *function* of the Mechanism." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hbBADbLrdoXF", + "colab_type": "code", + "colab": {}, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:46.031769Z", + "start_time": "2024-09-27T02:32:45.951940Z" + } + }, + "source": [ + "linear_transfer_mechanism = pnl.TransferMechanism(\n", + " function=pnl.Linear(slope=1, intercept=0))" + ], + "outputs": [], + "execution_count": 22 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gt0gGfYYdoXN", + "colab_type": "text" + }, + "source": [ + "In this case, we didn't actually need to specify the slope and intercept as the function will default to reasonable values (if we didn't specify, it would have defaulted to a slope of 1 and intercept of 0). The function above has two parameters: slope and intercept. If we wrote the equation as $y = ax + b$, $a$ is the slope, $b$ is the intercept, $x$ is the input, and $y$ is the output. As a function, we write this $f(x) = ax + b$. Note that you can change these parameter values of $a=1$ and $b=0$ to other numbers -- because parameters are variables within a function. \n", + "\n", + "Some transfer functions other than Linear that you could use are `pnl.Exponential`, `pnl.Logistic`, or `pnl.SoftMax`. The exponential function raises a constant base to a variable exponent. The output of a logistic function is bounded between 0 and 1, and we'll learn a bit more about it later in this tutorial. SoftMax is a more complex function that is often used in neural networks, and you don't need to understand how it works yet. \n", + "\n", + "Next, let's try inputting the number 2 into our linear transfer Mechanism..." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "EYzobUQjdoXI", + "colab_type": "code", + "outputId": "cdf049b2-2adf-4b36-a3a7-904a561f25c1", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 }, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:46.042893Z", + "start_time": "2024-09-27T02:32:46.034201Z" + } + }, + "source": [ + "linear_transfer_mechanism.execute([2])" + ], + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "Wy8RpatmdoXO", - "colab_type": "code", - "outputId": "d3e1287c-bae7-4340-e91c-5c51ba6c68d3", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 80 - } - }, - "source": [ - "comp_simplest = pnl.Composition()\n", - "comp_simplest.add_linear_processing_pathway(pathway = [linear_transfer_mechanism])\n", - " \n", - "\n", - "linear_transfer_mechanism.reportOutputPref = True\n", - "comp_simplest.show_graph(output_fmt = 'jupyter')" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n\n\n\n\nComposition-31\n\n\n\nTransferMechanism-14\n\nTransferMechanism-14\n\n\n\n" - }, - "metadata": { - "tags": [] - }, - "execution_count": 64 - } + "data": { + "text/plain": [ + "array([[2.]])" ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 23 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3Y68tW8WfY6E", + "colab_type": "text" + }, + "source": [ + "Try reparamaterizing the Mechanism (change the slope and/or intercept) and executing again before moving on... \n", + "\n", + "If you change the slope to 3, run the code by pressing play, then change the input value to 4, what output do you get? Why? Can you predict what will happen if you change the slope to 4 and the intercept to 5 and run both cells again with an input of 3? \n", + "\n", + "Another way of expressing this function is $(slope x input) + intercept$. \n", + "\n", + "### Logistic Function\n", + "\n", + "The standard logistic function is defined as $f(x) = \\frac{1}{1 + e^{-x}}$\n", + "\n", + "Psyneulink allows us to adjust this function with the parameters scale, gain, bias, and offset:\n", + "\n", + "$scale * \\frac{1}{1 + e^{-gain * (variable + bias)} + offset}$\n", + "\n", + "The following cell plots a logistic function with the default parameters: $scale = 1$, $gain = 1$, $bias = 0$, and $offset = 0$. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2pSgoHcHfkoS", + "colab_type": "code", + "outputId": "ec35c2f8-0afa-4f0d-cf3f-afeb1ac356e6", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 }, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:46.216210Z", + "start_time": "2024-09-27T02:32:46.043603Z" + } + }, + "source": [ + "logistic_transfer_demo = pnl.TransferMechanism(function=pnl.Logistic(scale=1, gain=1, bias=0, offset=0))\n", + "logistic_transfer_demo.plot()" + ], + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "aUAu67OfdoXU", - "colab_type": "code", - "outputId": "b737679e-74dd-4d7b-e590-4ef3648514f3", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 323 - } - }, - "source": [ - "comp_simplest.run([4])" + "data": { + "text/plain": [ + "
" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "'TransferMechanism-14' executed:\n", - "- input: 4.0\n", - "- params:\n", - "\tconvergence_criterion: 0.01\n", - "\tconvergence_function: Distance Function-1\n", - "\t\tintercept: 0\n", - "\t\tslope: 1\n", - "\tfunction: Linear Function-852\n", - "\t\tintercept: 0\n", - "\t\tslope: 1\n", - "\tinitial_value: None\n", - "\tintegration_rate: 0.5\n", - "\tintegrator_mode: False\n", - "\tmax_passes: 1000\n", - "\tnoise: 0.\n", - "- output: 2.0\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[array([4.])]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 65 - } - ] + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 24 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E8Y4AwEefsxw", + "colab_type": "text" + }, + "source": [ + "In the cell below you can plug a single number into this function and get an output value. Your input corresponds to a point on the x axis, and the output is the corresponding y value (height of the point on the curve above the x you specified). " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "q6C_KmkEft-k", + "colab_type": "code", + "outputId": "4928c3b7-d58a-4648-fb6b-2e7609898882", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 }, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:46.229140Z", + "start_time": "2024-09-27T02:32:46.219538Z" + } + }, + "source": [ + "logistic_transfer_demo.execute([-2])" + ], + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "Gn9BTx3AhKe1", - "colab_type": "text" - }, - "source": [ - "Let's turn off the reporting and look at our process' output over a wider range of values." + "data": { + "text/plain": [ + "array([[0.11920292]])" ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 25 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lBBsnUvaf2qk", + "colab_type": "text" + }, + "source": "The logistic function is useful because it is bounded between 0 and 1. Gain determines how steep the central portion of the S-curve is, with higher values being steeper. Bias shifts the curve left or right. You can turn the logistic function effectively into a step function that works as a threshold by increasing gain. The step in the step function (where it crosses through 0.5 on the y-axis) is located on the x-axis at $\\frac{offset}{gain} + bias$." + }, + { + "cell_type": "code", + "metadata": { + "id": "76xpYsiMf7Bw", + "colab_type": "code", + "outputId": "252c08d2-e098-45a9-8ec3-bee5f1d7cf89", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 }, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:46.429709Z", + "start_time": "2024-09-27T02:32:46.234722Z" + } + }, + "source": [ + "logistic_transfer_offgain = pnl.TransferMechanism(function=pnl.Logistic(gain=5,offset=10, bias=0))\n", + "logistic_transfer_offgain.plot()" + ], + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "6s3wlnUPdoXX", - "colab_type": "code", - "outputId": "e33caf50-e257-4ee4-938e-cf4777f20a00", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - } - }, - "source": [ - "linear_transfer_mechanism.reportOutputPref = False\n", - "\n", - "xVals = np.linspace(-3, 3, num=51) # create 51 points between -3 and +3\n", - "yVals = np.zeros((51,))\n", - "for i in range(xVals.shape[0]):\n", - " yVals[i] = comp_simplest.run([xVals[i]])[0]\n", - " # Progress bar\n", - " print(\"-\", end=\"\")\n", - "plt.plot(xVals, yVals)\n", - "plt.show()" + "data": { + "text/plain": [ + "
" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "---------------------------------------------------" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "0FZlTGTJhkqq", - "colab_type": "text" - }, - "source": [ - "Now let's put it all together and make a new transfer process, this time with a logistic activation function. We will also extend our mechanism by giving it two units (operating on a 1x2 matrix) rather than the default one (operating on a scalar)." - ] + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 26 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q1NbpKYef_zX", + "colab_type": "text" + }, + "source": "Negative values of gain mirror reverse the S-curve accross the vertical axis, centered at the x-value of $\\frac{offset}{gain} + bias$. Below notice that $\\frac{offset}{gain}$ is -2 (10/-5), and at an x-value of -2 the y-value is 0.5 $(f(-2) = 0.5)$. " + }, + { + "cell_type": "code", + "metadata": { + "id": "ouY4W0-VgAoy", + "colab_type": "code", + "outputId": "7e71b829-2035-4623-efa5-29b738ae4525", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 269 }, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:46.557364Z", + "start_time": "2024-09-27T02:32:46.430338Z" + } + }, + "source": [ + "logistic_transfer_invert = pnl.TransferMechanism(function=pnl.Logistic(gain=-5, bias=0, offset=10))\n", + "logistic_transfer_invert.plot()" + ], + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "k3h7k2wIdoXb", - "colab_type": "code", - "outputId": "502edb72-a2b2-49c5-cef0-6ea30f1d3dd0", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - } - }, - "source": [ - "# Create composition\n", - "comp_1x2 = pnl.Composition()\n", - "\n", - "# Create the mechanism\n", - "logistic_transfer_mechanism = pnl.TransferMechanism(default_variable=[0, 0],\n", - " function=pnl.Logistic(gain=1,\n", - " bias=0))\n", - "# Place mechanism in composition\n", - "comp_1x2.add_linear_processing_pathway(pathway = [logistic_transfer_mechanism])\n", - "\n", - "\n", - "# Iterate and plot\n", - "xVals = np.linspace(-3, 3, num=51)\n", - "y1Vals = np.zeros((51,))\n", - "y2Vals = np.zeros((51,))\n", - "for i in range(xVals.shape[0]):\n", - " # clarify why multiplying times 2\n", - " output = comp_1x2.run([xVals[i], xVals[i] * 3])\n", - " y1Vals[i] = output[0][0]\n", - " y2Vals[i] = output[0][1]\n", - " # Progress bar\n", - " print(\"-\", end=\"\")\n", - "plt.plot(xVals, y1Vals)\n", - "plt.plot(xVals, y2Vals)\n", - "plt.show()" + "data": { + "text/plain": [ + "
" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "---------------------------------------------------" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "image/png": "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njc0mOkDABIcYQSJa9w46/nHH5vpAwASHGEEics+MkIYAQAjCCNIXPaREaZpAMAIwggSF9M0ABAVCCNIXEzTAEBUIIwgcdlHRj75RDp61EwvAJDACCNIXPYwIkmNjZHvAwASHGEEiSs9ve/GZyxiBYCII4wgsbGIFQCMI4wgsRFGAMA4wggSG1vCA4BxhBEkNkZGAMA4wggSG2EEAIwjjCCxMU0DAMYRRpDY/G18duyYmV4AIEERRpDY7CMjEhufAUCEEUaQ2NLTpYwMa42pGgCIKMIIwCJWADBqQGFk48aNysvLU2pqqvLz87Vr165TXv/555+rtLRUY8aMUUpKis4991xt27ZtQA0DIcfbewHAqCHB3rB161aVlZWpqqpK+fn5Wr9+vYqKirR3716NHj26z/VdXV36+te/rtGjR+vpp5/W2LFj9dFHH2n48OGh6B8YPPvICNM0ABBRQYeRdevWadmyZSopKZEkVVVV6aWXXtLmzZu1cuXKPtdv3rxZn376qXbu3KmhQ4dKkvLy8gbXNRBKTNMAgFFBTdN0dXWprq5OhYWFPV/A6VRhYaFqa2v93vP888+roKBApaWlysrK0vTp0/XAAw/I7Xb3+306OzvlcrksBxA27DUCAEYFFUZaW1vldruVlZVlqWdlZampqcnvPR9++KGefvppud1ubdu2TatXr9ZDDz2k+++/v9/vU1lZqczMzO4j19/jl0CoMDICAEaF/Wkaj8ej0aNH69FHH9Xs2bNVXFyse++9V1VVVf3eU15erra2tu6jgX+pIpzsYaS1VTp+3EwvAJCAglozMmrUKCUlJam5udlSb25uVnZ2tt97xowZo6FDhyopKam7dt5556mpqUldXV1KTk7uc09KSopSUlKCaQ0YOH8jbx9/LE2aFPleACABBTUykpycrNmzZ6u6urq75vF4VF1drYKCAr/3XHrppdq3b588Hk937f3339eYMWP8BhEg4jIyfJuf9cZUDQBETNDTNGVlZdq0aZMef/xxvfvuu7rtttvU0dHR/XTNkiVLVF5e3n39bbfdpk8//VTLly/X+++/r5deekkPPPCASktLQ/e3AAaLdSMAYEzQj/YWFxerpaVFa9asUVNTk2bNmqXt27d3L2o9ePCgnM6ejJObm6uXX35Zd955p84//3yNHTtWy5cv19133x26vwUwWLm50rvv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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 27 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pJYwFCtFgLL_", + "colab_type": "text" + }, + "source": [ + "### From Nodes to Graphs: Compositions\n", + "\n", + "Generally with PsyNeuLink, you won't be executing Mechanisms as stand-alone entities. Rather, Mechanisms will be nodes in a graph, with *Projections* as edges of the graph, connecting nodes. We call the graph a *Composition*. \n", + "\n", + "The simplest kind of Composition is one-dimensional: a linear progression from one node to the next. Information flowing through this graph will be entered as input, processed in the first Mechanism, transferred via Projection to the next Mechanism, and so on. You can think of this with an analogy to digestion. Chew the food first, then swallow it, and it is \"projected\" to the stomach. Then, the stomach soaks food in digestive acid to further break it down. Then, the output is projected to the small intestine, where nutrients are absorbed. Note that the order matters -- the small intestine wouldn't be effective if the food hadn't been chewed and then broken down in the stomach. \n", + "\n", + "A Mechanism takes some input, performs a function, and delivers an output. The same is typically true for Compositions -- they take some input, perform multiple functions using multiple Mechanisms, and deliver some output. A powerful feature of this input-output architecture is that an entire composition today can become a Mechanism tomorrow as part of a more complex Composition, and that Composition can become a Mechanism in yet a more complex Composition all the way up. [Note: This is true in principle, but PsyNeuLink is actively under development, and such scaled-up functionality is not fully implemented.]\n", + "\n", + "The main parameter when initializing a Composition is its pathway, which is an ordered list of Mechanisms and Projections. Of course, with only one Mechanism in our current Composition, the list has just one element.\n", + "\n", + "To better see how the Composition runs, we can also turn on output reporting. Reporting can happen at every level in PsyNeuLink, and here we set the preference for the Mechanism." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Wy8RpatmdoXO", + "colab_type": "code", + "outputId": "d3e1287c-bae7-4340-e91c-5c51ba6c68d3", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 80 }, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:46.811934Z", + "start_time": "2024-09-27T02:32:46.558Z" + } + }, + "source": [ + "comp_simplest = pnl.Composition()\n", + "comp_simplest.add_linear_processing_pathway(pathway = [linear_transfer_mechanism])\n", + " \n", + "linear_transfer_mechanism.reportOutputPref = True\n", + "comp_simplest.show_graph(output_fmt = 'jupyter')" + ], + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "j4BXYFbLh8Zn", - "colab_type": "text" - }, - "source": [ - "The `default_variable` parameter serves a dual function. It specifies the dimensionality of the mechanism as well as providing the inputs that will be given in the absence of explicit input at runtime. You can also specify the dimensionality using \"size\", e.g. size=2 will also create default_variable=[0,0]." + "data": { + "image/svg+xml": "\n\n\n\n\n\nComposition-1\n\nComposition-1\n\n\nTransferMechanism-14\n\nTransferMechanism-14\n\n\n\n", + "text/plain": [ + "" ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 28 + }, + { + "cell_type": "code", + "metadata": { + "id": "aUAu67OfdoXU", + "colab_type": "code", + "outputId": "b737679e-74dd-4d7b-e590-4ef3648514f3", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 323 }, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:46.832580Z", + "start_time": "2024-09-27T02:32:46.814299Z" + } + }, + "source": [ + "comp_simplest.run([4])" + ], + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "FtN0VYCsiJwa", - "colab_type": "code", - "colab": {} - }, - "source": [ - "logistic_transfer_step = pnl.TransferMechanism(default_variable=[0, 0],\n", - " function=pnl.Logistic(gain=100,\n", - " offset=100))" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "ddg9BFXfiLNB", - "colab_type": "code", - "outputId": "45be1414-3b25-404c-a0a1-08c5474fa3a9", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "logistic_transfer_step.execute([.9,1.1])" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([[4.53978687e-05, 9.99954602e-01]])" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 69 - } + "data": { + "text/plain": [ + "array([[4.]])" ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 29 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Gn9BTx3AhKe1", + "colab_type": "text" + }, + "source": [ + "Let's turn off the reporting and look at our process' output over a wider range of values." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6s3wlnUPdoXX", + "colab_type": "code", + "outputId": "e33caf50-e257-4ee4-938e-cf4777f20a00", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 }, + "ExecuteTime": { + "end_time": "2024-09-27T02:32:54.670105Z", + "start_time": "2024-09-27T02:32:54.257893Z" + } + }, + "source": [ + "linear_transfer_mechanism.reportOutputPref = False\n", + "\n", + "xVals = np.linspace(-3, 3, num=51) # create 51 points between -3 and +3\n", + "yVals = np.zeros((51,))\n", + "for i in range(xVals.shape[0]):\n", + " yVals[i] = comp_simplest.run([xVals[i]])[0]\n", + " # Progress bar\n", + " print(\"-\", end=\"\")\n", + "plt.plot(xVals, yVals)\n", + "plt.show()" + ], + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "dPaX0syYiShl", - "colab_type": "text" - }, - "source": [ - "### Adding Projections\n", - "\n", - "To connect Mechanisms together in a Composition, we need a way to link mechanisms together. This is done through *[Projections](https://princetonuniversity.github.io/PsyNeuLink/Projection.html)*. A projection takes a mechanism output, multiplies it by the projection's mapping matrix, and delivers the transformed value to the next mechanism in the Composition. " - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "---------------------------------------------------" + ] }, { - "cell_type": "code", - "metadata": { - "id": "VEUVwefgiXPn", - "colab_type": "code", - "outputId": "a9344b09-ca1c-4c51-a53e-bcd31331a065", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - } - }, - "source": [ - "# Create composition\n", - "comp_linlog = pnl.Composition()\n", - "\n", - "# Create mechanisms\n", - "linear_input_unit = pnl.TransferMechanism(function=pnl.Linear(slope=2, intercept=2))\n", - "logistic_output_unit = pnl.TransferMechanism(function=pnl.Logistic())\n", - "\n", - "# Place mechanism in composition\n", - "comp_linlog.add_linear_processing_pathway(pathway = [linear_input_unit, pnl.IDENTITY_MATRIX, logistic_output_unit])\n", - "\n", - "\n", - "# Iterate and plot\n", - "xVals = np.linspace(-3, 3, num=51)\n", - "yVals = np.zeros((51,))\n", - "for i in range(xVals.shape[0]):\n", - " yVals[i] = comp_linlog.run([xVals[i]])[0]\n", - " # Progress bar\n", - " print(\"-\", end=\"\")\n", - "plt.plot(xVals, yVals)\n", - "plt.show()" + "data": { + "text/plain": [ + "
" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "---------------------------------------------------" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGdCAYAAAAvwBgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5/ElEQVR4nO3dd3iUdb7+8fdMeh0IhFCS0HtJQRGwgWLBBrqCEH+Kq8dVT0IRdQVXZbFhQZS2Hs/Rg3t2CVUQuyIKVlRIoYYOCQmQhJCezCQzz+8Pz3IdFTDBTJ6ZzP26rvljhod8bx+TmZvn852JxTAMAxERERETWM0OICIiIr5LRURERERMoyIiIiIiplEREREREdOoiIiIiIhpVERERETENCoiIiIiYhoVERERETGNv9kBzsXlclFQUEBERAQWi8XsOCIiItIAhmFQUVFBx44dsVrPfc3Do4tIQUEBcXFxZscQERGR85CXl0dsbOw5j/HoIhIREQH89B8SGRlpchoRERFpiPLycuLi4k6/jp+LRxeRf41jIiMjVURERES8TEO2VWizqoiIiJhGRURERERMoyIiIiIiplEREREREdOoiIiIiIhpVERERETENCoiIiIiYhoVERERETGNioiIiIiYxq1F5LXXXmPQoEGnPxl12LBhfPTRR+5cUkRERLyIW4tIbGwszz//PFu3bmXLli1cccUVjBkzhp07d7pzWREREfESFsMwjOZcMCoqipdeeol77rnnN48tLy/HZrNRVlam3zUjIiLiJRrz+t1se0ScTifLly+nqqqKYcOGnfEYu91OeXn5z24iIiLS9EqrHdz3jy18s7/Y1BxuLyLbt28nPDycoKAg7r//ftauXUu/fv3OeOycOXOw2Wynb3Fxce6OJyIi4nO2HjnF9Qu+5pOdJ/jz6m3UOV2mZXH7aMbhcJCbm0tZWRmrV6/mjTfeYNOmTWcsI3a7Hbvdfvp+eXk5cXFxGs2IiIg0AZfL4L++OshLn+yh3mXQpU0oi1KSGdDJ1qTrNGY00+x7REaNGkX37t15/fXXf/NY7RERERFpGiVVDh5amcUXe4oAuDGhI8/dPICI4IAmX6sxr9/+Tb76b3C5XD+76iEiIiLu9cOhEqYsy+R4eS1B/lb+elN/JlwYh8ViMTuae4vIzJkzGT16NPHx8VRUVJCens7GjRv55JNP3LmsiIiI8NMo5m8b9zNv/V5cBnSLDmNxSjJ9O3jOlMGtRaSwsJA777yTY8eOYbPZGDRoEJ988glXXXWVO5cVERHxeUUVdqavzOKrfT+9K+aWpE48PXYAYUHNPgw5J7emefPNN9355UVEROQMvj1QzNTlWRRV2AkOsPL0mAGMu8Az34nqWbVIREREzpvTZbDw830s2LAPlwG9YsJZnJJMz5gIs6OdlYqIiIhIC1BYXsvU5Vl8d/AkAOMviGX2TQMICfQzOdm5qYiIiIh4ua/2FfHgiiyKKx2EBvrx7M0DuDkp1uxYDaIiIiIi4qXqnS5e/WwfizfuxzCgT/sIFt+eTPfocLOjNZiKiIiIiBc6VlbD1GVZ/HC4BICUi+J58oZ+BAd49ijml1REREREvMwXewqZviKLU9V1hAf5M+eWgdyY0NHsWOdFRURERMRL1DldzP10D69vOgjAgE6RLJqYTJe2YSYnO38qIiIiIl4gv7SGyekZZOSWAjBpWGceu74vQf7eNYr5JRURERERD7d+1wkeXpVNWU0dEcH+vPiHQYwe2MHsWE1CRURERMRDOepdvPBxDm9+fQiAhFgbi1KSiYsKNTlZ01ERERER8UB5JdWkpWeQfbQMgHsu6cqj1/Yh0N9qcrKmpSIiIiLiYT7ecYxHVm+jorYeW0gAc8clcFW/GLNjuYWKiIiIiIew1zt57oPd/P27IwAkx7diwcQkYlu3nFHML6mIiIiIeIDDxVWkpmews6AcgPsu78bDV/cmwK9ljWJ+SUVERETEZO9lFzBzzXYq7fW0Dg1g3vhERvZpZ3asZqEiIiIiYpLaOidPvb+L9O9zAbiwS2sWTEyigy3E5GTNR0VERETEBAeKKkldmkHO8QosFkgd0YNpo3ri38JHMb+kIiIiItLM1mYe5S9rd1DtcNI2PJBXbkvk0p7RZscyhYqIiIhIM6lxOJn17g5WbjkKwLBubZg/IZF2kcEmJzOPioiIiEgz2HeigtT0DPaeqMRigalX9mTyFT3xs1rMjmYqFRERERE3MgyDVVuP8uS6HdTWuYiOCGL+hESGd29rdjSPoCIiIiLiJlX2ep54ZwdrMvMBuLRnW+aNTyQ6IsjkZJ5DRURERMQNdh8rJy09gwNFVVgt8NDVvXng8u5YfXwU80sqIiIiIk3IMAyW/ZDH7Pd2Yq930T4ymAUTkxjSNcrsaB5JRURERKSJVNTW8djaHbyXXQDAiN7RzBufSFRYoMnJPJeKiIiISBPYkV9GWnoGh09W42e18OdrenPvpd00ivkNKiIiIiK/g2EY/HPzEZ5+fzcOp4tOrUJYMDGJwZ1bmx3NK6iIiIiInKeymjpmrtnGh9uPAzCqbwxzxw2iVahGMQ2lIiIiInIesvNKSVuWQV5JDQF+FmaM7svdF3fBYtEopjFURERERBrBMAz++5vDPP/RbuqcBrGtQ1ickkxCXCuzo3klFREREZEGKq128PCqbXy2+wQA1/Zvzwu3DsIWEmByMu+lIiIiItIAW4+cYsqyTPJLawj0s/L4DX25Y2hnjWJ+JxURERGRc3C5DP7rq4O89Mke6l0GnduEsjglmQGdbGZHaxFURERERM6ipMrBQyuz+GJPEQA3DOrAnFsGEhGsUUxTURERERE5gx8OlTBlWSbHy2sJ9Lcy68Z+pAyJ1yimiamIiIiI/B8ul8Frmw4wb/1enC6Dbm3DWHx7Mn07RJodrUVSEREREflfxZV2HlyRxVf7igG4OakTz4wdQFiQXi7dRWdWREQE+O7ASaYuz6Swwk5wgJWnxgxg3OBYjWLcTEVERER8mtNlsPDzfSzYsA+XAT3bhbP49mR6xUSYHc0nqIiIiIjPKqyoZdryLL49cBKAcYNjmT2mP6GBenlsLjrTIiLik77eV8y0FZkUVzoIDfTjmbEDuCU51uxYPkdFREREfEq908Wrn+1j8cb9GAb0aR/BopRkerQLNzuaT1IRERERn3G8rJYpyzP54VAJACkXxfPkDf0IDvAzOZnvUhERERGfsHFPIdNXZlNS5SA8yJ/nbhnITQkdzY7l81RERESkRatzunj50738x6YDAPTvGMmilGS6tg0zOZkAWN35xefMmcOFF15IREQE7dq1Y+zYsezZs8edS4qIiJyWX1rDhP/cfLqE3DmsM28/MFwlxIO4tYhs2rSJ1NRUNm/ezPr166mrq+Pqq6+mqqrKncuKiIjw2a4TXL/gK7YeOUVEsD+v3Z7MU2MGaD+Ih7EYhmE012JFRUW0a9eOTZs2cdlll/3m8eXl5dhsNsrKyoiM1Gf8i4jIb3PUu3jx4xze+PoQAAmxNhZOTCa+TajJyXxHY16/m3WPSFlZGQBRUVFn/HO73Y7dbj99v7y8vFlyiYhIy5BXUk3askyy80oBuPvirswY3YdAf7cOAOR3aLYi4nK5mDZtGhdffDEDBgw44zFz5sxh9uzZzRVJRERakI93HOOR1duoqK0nMtifueMSuLp/e7NjyW9ottHMAw88wEcffcTXX39NbOyZP7nuTFdE4uLiNJoREZGzstc7ee6D3fz9uyMAJMW3YuHEJGJbaxRjFo8bzaSlpfH+++/z5ZdfnrWEAAQFBREUFNQckUREpAU4XFxF2rIMduT/NMq/77JuPHxNbwL8NIrxFm4tIoZhMHnyZNauXcvGjRvp2rWrO5cTEREf8v62Ama8vZ1Kez2tQwN4eXwCV/SJMTuWNJJbi0hqairp6emsW7eOiIgIjh8/DoDNZiMkJMSdS4uISAtVW+fk6fd3sfT7XAAu7NKaBROT6GDT64o3cuseEYvFcsbHlyxZwl133fWbf19v3xURkf/rQFElqUszyDlegcUCD1zenelX9cJfoxiP4jF7RJrxI0pERKSFeyczn8fWbqfa4aRNWCCv3JbIZb2izY4lv5N+14yIiHi0GoeTv767kxVb8gAY2i2K+ROSiIkMNjmZNAUVERER8Vj7TlSQmp7B3hOVWCww5YqeTLmyJ37WM4/+xfuoiIiIiEdatSWPJ9ftpKbOSXREEPNvS2R4j7Zmx5ImpiIiIiIepdpRz+Pv7GBNRj4Al/Royyu3JRIdoc+ZaolURERExGPkHC8ndWkGB4qqsFpg+lW9+PcRPbBqFNNiqYiIiIjpDMNg+Y95/PXdndjrXcREBrFgQhIXdWtjdjRxMxURERExVaW9nsfWbOfd7AIARvSO5uVxCbQJ1yjGF6iIiIiIaXbkl5GWnsHhk9X4WS08ck1v/nRpN41ifIiKiIiINDvDMPjn5iM8/cFuHPUuOtqCWZiSxODOUWZHk2amIiIiIs2qvLaOGW9v48PtP/3+sVF92zF3XAKtQgNNTiZmUBEREZFms+1oKWnpmeSWVBPgZ+HRa/twzyVdz/q7yaTlUxERERG3MwyDJd8cZs5Hu6lzGsS2DmFRSjKJca3MjiYmUxERERG3Kquu45HV2Xy66wQA1/Zvzwt/GIQtNMDkZOIJVERERMRtMnJPMTk9k/zSGgL9rPzl+r7cOayzRjFymoqIiIg0OZfL4I2vD/Lix3uodxl0bhPKoonJDIy1mR1NPIyKiIiINKmSKgcPr8rm85xCAK4f1IHnbxlIRLBGMfJrKiIiItJkfjxcwpRlmRwrqyXQ38qsG/uRMiReoxg5KxURERH53Vwug9c2HWDe+r04XQbd2oaxKCWZfh0jzY4mHk5FREREfpfiSjsPrsjiq33FAIxN7MgzNw8kPEgvMfLb9F0iIiLn7bsDJ5m6PJPCCjvBAVaeumkA4y6I1ShGGkxFREREGs3pMlj0+X7mb9iLy4Ae7cJZnJJM7/YRZkcTL6MiIiIijVJYUcu05Vl8e+AkAOMGxzJ7TH9CA/WSIo2n7xoREWmwr/cVM21FFsWVdkIC/Hj25gHckhxrdizxYioiIiLym+qdLuZv2MeiL/ZjGNCnfQSLUpLp0S7c7Gji5VRERETknI6X1TJ1eSbfHyoBYOKQeGbd2I/gAD+Tk0lLoCIiIiJntXFPIdNXZlNS5SAs0I/nbhnImMROZseSFkRFREREfqXO6WLe+r28tvEAAP06RLL49mS6tg0zOZm0NCoiIiLyMwWlNUxelsnWI6cAuHNYZx67rq9GMeIWKiIiInLaht0neGhVNqXVdUQE+fPCrYO4bmAHs2NJC6YiIiIiOOpdvPhxDm98fQiAQbE2Fk1MJr5NqMnJpKVTERER8XF5JdVMXpZJVl4pAHdf3JVHR/cmyF+jGHE/FRERER/2yc7jPLIqm/LaeiKD/Zk7LoGr+7c3O5b4EBUREREfZK93MufDHN769jAAiXGtWDgxibgojWKkeamIiIj4mCMnq0hLz2R7fhkAf7qsG49c05sAP6vJycQXqYiIiPiQD7YdY8bb26iw19M6NICXxydwRZ8Ys2OJD1MRERHxAbV1Tp75YBf/3JwLwAWdW7MwJYkOthCTk4mvUxEREWnhDhZVkpqeye5j5QD8+4juTL+qF/4axYgHUBEREWnB1mXl89ia7VQ5nLQJC2TebYlc3iva7Fgip6mIiIi0QDUOJ399dycrtuQBMLRbFPMnJBETGWxyMpGfUxEREWlh9p2oIDU9g70nKrFYYPIVPZlyRQ+NYsQjqYiIiLQgq7bk8eS6ndTUOWkbHsT8CYlc3KOt2bFEzkpFRESkBaiy1/PEuh2sycgH4OIebXjltkTaRWgUI55NRURExMvlHC8ndWkGB4qqsFrgwVG9+PeRPfCzWsyOJvKbVERERLyUYRis+DGPWe/uxF7vIiYyiPkTkhjarY3Z0UQaTEVERMQLVdrr+cva7azLKgDg8l7RzBufQJvwIJOTiTSOW7dQf/nll9x444107NgRi8XCO++8487lRER8ws6CMm5c+DXrsgrws1p49No+LLnrQpUQ8UpuLSJVVVUkJCSwePFidy4jIuITDMPgH5uPcPPfvuVQcRUdbMGs+NNQHhjRHav2g4iXcutoZvTo0YwePdqdS4iI+ITy2jpmvr2dD7YfA+DKPu2YOy6B1mGBJicT+X08ao+I3W7Hbrefvl9eXm5iGhERz7DtaClp6ZnkllTjb7UwY3Qf7rmkKxaLroKI9/OoIjJnzhxmz55tdgwREY9gGAZvfXuY5z7cTZ3ToFOrEBalJJEU39rsaCJNxqM+73fmzJmUlZWdvuXl5ZkdSUTEFGXVddz3j63Mfm8XdU6Da/rH8OGUS1VCpMXxqCsiQUFBBAVp17eI+LbM3FOkpWeSX1pDoJ+Vx67rw6ThXTSKkRbJo4qIiIgvMwyDN746xAsf51DvMoiPCmVxSjIDY21mRxNxG7cWkcrKSvbv33/6/qFDh8jKyiIqKor4+Hh3Li0i4lVOVTl4eFU2G3IKAbh+UAfm3DKQyOAAk5OJuJdbi8iWLVsYOXLk6fvTp08HYNKkSbz11lvuXFpExGtsOVzC5GWZHCurJdDfypM39OP2i+I1ihGf4NYiMmLECAzDcOcSIiJey+Uy+I8vD/Dyp3txugy6tQ1jUUoy/TpGmh1NpNloj4iIiAlOVtp5cGU2X+4tAmBsYkeeuXkg4UF6Whbfou94EZFmtvngSaYuz+REuZ3gACuzb+rP+AviNIoRn6QiIiLSTJwug8Vf7OfVz/biMqBHu3AWpyTTu32E2dFETKMiIiLSDAoranlwRRbf7D8JwB+SY3l6bH9CA/U0LL5NPwEiIm72zf5ipi7PorjSTkiAH0+PHcCtg2PNjiXiEVRERETcxOkymL9hHws/34dhQO+YCBbfnkSPdhrFiPyLioiIiBucKK9lyrJMvj9UAsCEC+OYdWN/QgL9TE4m4llUREREmtimvUVMX5HFySoHYYF+PHfLQMYkdjI7lohHUhEREWki9U4XL6/fy2sbDwDQt0Mki1OS6BYdbnIyEc+lIiIi0gQKSmuYsiyTLUdOAXDH0M785fq+BAdoFCNyLioiIiK/0+c5J5i+MpvS6joigvx5/g+DuH5QB7NjiXgFFRERkfNU53Tx4sc5/NdXhwAY2MnGopQkOrcJMzmZiPdQEREROQ95JdVMXpZJVl4pAHcN78LM6/oQ5K9RjEhjqIiIiDTSJzuP88iqbMpr64kM9uelcQlc07+92bFEvJKKiIhIA9nrnTz/UQ5LvjkMQGJcKxZOTCIuKtTcYCJeTEVERKQBjpysIi09k+35ZQDce2lXHrmmD4H+VpOTiXg3FRERkd/wwbZjzHh7GxX2elqFBvDyuASu7BtjdiyRFkFFRETkLGrrnDzzwS7+uTkXgAs6t2bBxCQ6tgoxOZlIy6EiIiJyBgeLKklNz2T3sXIAHhjRnelX9SLAT6MYkaakIiIi8gvrsvJ5bM12qhxOosICmTc+gRG925kdS6RFUhEREflfNQ4ns9/byfIf8wC4qGsUCyYmERMZbHIykZZLRUREBNhfWEHq0kz2nKjAYoHJI3sw5cqe+GsUI+JWKiIi4vPe3nqUx9/ZQU2dk7bhQbx6WyKX9GxrdiwRn6AiIiI+q9pRz5PrdrJ661EAhndvw6sTEmkXoVGMSHNRERERn7T3RAWpSzPYV1iJ1QLTRvUidWQP/KwWs6OJ+BQVERHxKYZhsHJLHrPe3UltnYt2EUEsmJjE0G5tzI4m4pNURETEZ1Ta63l87XbeySoA4LJe0cwbn0Db8CCTk4n4LhUREfEJuwrKSUvP4GBxFX5WCw9d3Yv7L+uOVaMYEVOpiIhIi2YYBku/z+Wp93fhqHfRwRbMgolJXNglyuxoIoKKiIi0YBW1dcxYs50Pth0D4Mo+7Zg7LoHWYYEmJxORf1EREZEWafvRMtKWZXDkZDX+VguPXtuHf7u0KxaLRjEinkRFRERaFMMw+Pu3h3nuwxwcThedWoWwMCWJ5PjWZkcTkTNQERGRFqOsuo4/v53NJztPAHB1vxheujUBW2iAyclE5GxURESkRcjMPcXkZZkcPVVDgJ+Fx67ry13Du2gUI+LhVERExKsZhsGbXx/i+Y9yqHcZxEeFsigliUGxrcyOJiINoCIiIl7rVJWDh1dlsyGnEIDrB3Zgzh8GEhmsUYyIt1ARERGvtPVICZPTMykoqyXQ38oTN/Tj/10Ur1GMiJdRERERr+JyGbz+5UHmfroHp8uga9swFqUk0b+jzexoInIeVERExGucrLQzfWU2m/YWATAmsSPP3jyQ8CA9lYl4K/30iohX+P7gSaYsz+REuZ0gfytPjenP+AviNIoR8XIqIiLi0Zwug799sZ9XPtuLy4Ae7cJZnJJM7/YRZkcTkSagIiIiHquows60FZl8s/8kAH9IjuXpsf0JDdRTl0hLoZ9mEfFI3+wvZuryLIor7YQE+PH02AHcOjjW7Fgi0sRURETEozhdBvM37GPh5/swDOgV89MopmeMRjEiLZGKiIh4jBPltUxdnsnmgyUATLgwjlk39ick0M/kZCLiLtbmWGTx4sV06dKF4OBgLrroIn744YfmWFZEvMimvUVcN/8rNh8sISzQj/kTEnn+D4NUQkRaOLcXkRUrVjB9+nRmzZpFRkYGCQkJXHPNNRQWFrp7aRHxAvVOFy9+nMOk//6Bk1UO+naI5L3JlzAmsZPZ0USkGVgMwzDcucBFF13EhRdeyKJFiwBwuVzExcUxefJkZsyYcc6/W15ejs1mo6ysjMjISHfGFBETHCurYcqyTH48fAqA/zc0nsev70dwgK6CiHizxrx+u3WPiMPhYOvWrcycOfP0Y1arlVGjRvHdd9/96ni73Y7dbj99v7y83J3xRMREn+ec4KGV2ZyqriM8yJ/n/zCQGwZ1NDuWiDQzt45miouLcTqdxMTE/OzxmJgYjh8//qvj58yZg81mO32Li4tzZzwRMUGd08VzH+7m7re2cKq6joGdbHww5RKVEBEf1SybVRtq5syZlJWVnb7l5eWZHUlEmtDRU9WMf/07/vPLgwDcNbwLqx8YRuc2YSYnExGzuHU007ZtW/z8/Dhx4sTPHj9x4gTt27f/1fFBQUEEBQW5M5KImOTTncd5eFU25bX1RAb78+KtCVw74NfPAyLiW9x6RSQwMJDBgwezYcOG04+5XC42bNjAsGHD3Lm0iHgIR72L2e/t5E//2Ep5bT0Jca34YMqlKiEiAjTDB5pNnz6dSZMmccEFFzBkyBBeffVVqqqq+OMf/+jupUXEZLknq0lblsG2o2UA3HtpVx65pg+B/h41FRYRE7m9iNx2220UFRXx5JNPcvz4cRITE/n4449/tYFVRFqWD7cf49HV26iw19MqNICXxyVwZV/93IvIz7n9c0R+D32OiIj3qa1z8uwHu/nH5iMAXNC5NQsmJtGxVYjJyUSkuXjM54iIiG85VFxFWnoGOwt++gygB0Z0Z/pVvQjw0yhGRM5MRUREmsS72QXMfHsbVQ4nUWGBzBufwIje7cyOJSIeTkVERH6X2jons9/bxbIfcgEY0jWKBROSaG8LNjmZiHgDFREROW/7CytJS88g53gFFgtMHtmDKVf2xF+jGBFpIBURETkvb289yuPv7KCmzknb8CBevS2RS3q2NTuWiHgZFRERaZRqRz1PrtvJ6q1HARjevQ2vTkikXYRGMSLSeCoiItJge09UkLo0g32FlVgtMG1UL1JH9sDPajE7moh4KRUREflNhmGwastRnnx3B7V1LtpFBLFgYhJDu7UxO5qIeDkVERE5p0p7PY+v3c47WQUAXNqzLa/clkjbcP2CShH5/VREROSsdhWUk5aewcHiKvysFh66uhf3X9Ydq0YxItJEVERE5FcMwyD9h1xmv7cLR72LDrZgFkxM4sIuUWZHE5EWRkVERH6moraOGWu288G2YwBc0acdc8clEBUWaHIyEWmJVERE5LQd+WWkpmdw5GQ1/lYLj17bh3su6apRjIi4jYqIiGAYBv/z3RGe/WA3DqeLTq1CWJiSRHJ8a7OjiUgLpyIi4uPKaup4dPU2Pt55HICr+sUw99YEbKEBJicTEV+gIiLiw7LySklLz+DoqRoC/Cw8dl1f7hreBYtFoxgRaR4qIiI+yDAM3vz6EC98nEOd0yA+KpRFKUkMim1ldjQR8TEqIiI+prTawcOrsvlsdyEA1w1sz/N/GERksEYxItL8VEREfMjWIyVMTs+koKyWQH8rT9zQj/93UbxGMSJiGhURER/gchn851cHeemTPThdBl3bhrEoJYn+HW1mRxMRH6ciItLCnay089CqbDbuKQLgpoSOPHfLQMKD9OMvIubTM5FIC/b9wZNMWZ7JiXI7Qf5W/npTfyZcGKdRjIh4DBURkRbI5TL428b9zFu/F5cB3aPDWHx7Mn3aR5odTUTkZ1RERFqYogo701dm8dW+YgBuSe7E02MGEKZRjIh4ID0zibQg3+4vZuqKLIoq7IQE+PHUmP6MuyDO7FgiImelIiLSAjhdBvM37GPh5/swDOgVE87ilGR6xkSYHU1E5JxURES83InyWqYuz2TzwRIAbrsgjr/e1J+QQD+Tk4mI/DYVEREv9uXeIh5ckcXJKgehgX48d/NAxiZ1MjuWiEiDqYiIeKF6p4tXPtvL3zYewDCgT/sIFt+eTPfocLOjiYg0ioqIiJc5VlbDlGWZ/Hj4FAC3XxTPEzf0IzhAoxgR8T4qIiJe5IucQqavzOJUdR3hQf7MuWUgNyZ0NDuWiMh5UxER8QJ1ThdzP9nD618eBGBAp0gWTUymS9swk5OJiPw+KiIiHi6/tIbJ6Rlk5JYCcNfwLsy8rg9B/hrFiIj3UxER8WCf7jzOI6u3UVZTR0SwPy/dOohrB3QwO5aISJNRERHxQI56F89/lMN/f3MIgIS4ViyamERcVKjJyUREmpaKiIiHySupJi09g+yjZQD82yVd+fO1fQj0t5qcTESk6amIiHiQj7Yf489vb6Oith5bSAAvj0tgVL8Ys2OJiLiNioiIB6itc/Lch7v5n++OADC4c2sWTEyiU6sQk5OJiLiXioiIyQ4XV5GansHOgnIA7r+8Ow9d3YsAP41iRKTlUxERMdF72QXMXLOdSns9UWGBvDw+gZG925kdS0Sk2aiIiJigts7J7Pd2seyHXACGdIliwcQk2tuCTU4mItK8VEREmtn+wkrS0jPIOV6BxQKpI3owbVRP/DWKEREfpCIi0ozWZBzl8Xd2UO1w0jY8kFduS+TSntFmxxIRMY2KiEgzqHbUM2vdTlZtPQrAsG5tmD8hkXaRGsWIiG9TERFxs70nKkhdmsG+wkqsFph6ZS/SruiBn9VidjQREdO5bSj97LPPMnz4cEJDQ2nVqpW7lhHxWIZhsPLHPG5a9DX7CiuJjghi6b8NZeqoniohIiL/y21XRBwOB+PGjWPYsGG8+eab7lpGxCNV2et5/J0drM3MB+DSnm155bZE2oYHmZxMRMSzuK2IzJ49G4C33nrLXUuIeKTdx8pJXZrBweIqrBZ46OrePHB5d6y6CiIi8isetUfEbrdjt9tP3y8vLzcxjUjjGIZB+g+5zH5vF456F+0jg1kwMYkhXaPMjiYi4rE8qojMmTPn9JUUEW9SUVvHzDXbeX/bMQBG9o7m5fGJRIUFmpxMRMSzNWqz6owZM7BYLOe85eTknHeYmTNnUlZWdvqWl5d33l9LpLnsyC/jxoVf8/62Y/hbLcwc3Yc3J12oEiIi0gCNuiLy0EMPcdddd53zmG7dup13mKCgIIKCtJlPvINhGPzPd0d49oPdOJwuOrUKYcHEJAZ3bm12NBERr9GoIhIdHU10tD4FUqSspo4Zb2/jox3HARjVN4a54wbRKlRXQUREGsNte0Ryc3MpKSkhNzcXp9NJVlYWAD169CA8PNxdy4q4XXZeKWnLMsgrqSHAz8KM0X25++IuWCx6V4yISGO5rYg8+eST/P3vfz99PykpCYAvvviCESNGuGtZEbcxDIP//uYwz3+0mzqnQWzrEBanJJMQ18rsaCIiXstiGIZhdoizKS8vx2azUVZWRmRkpNlxxIeVVjt4eNU2Ptt9AoBr+7fnhVsHYQsJMDmZiIjnaczrt0e9fVfEE209coopyzLJL60h0M/KX67vy53DOmsUIyLSBFRERM7C5TL4r68O8tIne6h3GXRuE8rilGQGdLKZHU1EpMVQERE5g5IqBw+tzOKLPUUA3DCoA3NuGUhEsEYxIiJNSUVE5Bd+OFTClGWZHC+vJcjfyqwb+zNxSJxGMSIibqAiIvK/XC6D1zYdYN76vThdBt2iw1ickkzfDtooLSLiLioiIkBRhZ3pK7P4al8xADcndeKZsQMIC9KPiIiIO+lZVnzetweKmbo8i6IKO8EBVp4aM4Bxg2M1ihERaQYqIuKznC6DhZ/vY8GGfbgM6NkunL/dnkzPmAizo4mI+AwVEfFJheW1TF2exXcHTwIw/oJYZt80gJBAP5OTiYj4FhUR8Tlf7SviwRVZFFc6CA3049mbB3BzUqzZsUREfJKKiPiMeqeLVz/bx+KN+zEM6NM+gkUpyfRop1/CKCJiFhUR8QnHymqYuiyLHw6XAJByUTxP3tCP4ACNYkREzKQiIi3eFzmFTF+ZxanqOsKD/HnuloHclNDR7FgiIoKKiLRgdU4Xcz/Zw+tfHgSgf8dIFqck06VtmMnJRETkX1REpEXKL61hcnoGGbmlAEwa1pmZ1/XVKEZExMOoiEiLs37XCR5elU1ZTR0Rwf68+IdBjB7YwexYIiJyBioi0mI46l288HEOb359CICEWBuLUpKJiwo1OZmIiJyNioi0CHkl1aQtyyQ7rxSAey7pyqPX9iHQ32puMBEROScVEfF6H+84xiOrt1FRW48tJIC54xK4ql+M2bFERKQBVETEa9nrnTz3wW7+/t0RAJLjW7EwJZlOrUJMTiYiIg2lIiJe6XBxFWnLMtiRXw7AfZd34+GrexPgp1GMiIg3URERr/NedgEz12yn0l5P69AA5o1PZGSfdmbHEhGR86AiIl6jts7JU+/vIv37XACGdIli/sREOtg0ihER8VYqIuIVDhRVkro0g5zjFVgskDqiB9NG9cRfoxgREa+mIiIe753MfB5bu51qh5O24YG8clsil/aMNjuWiIg0ARUR8Vg1Diez3t3Byi1HARjWrQ3zJyTSLjLY5GQiItJUVETEI+07UUFqegZ7T1RiscDUK3sy+Yqe+FktZkcTEZEmpCIiHsUwDFZtPcqT63ZQW+ciOiKI+RMSGd69rdnRRETEDVRExGNU2et54p0drMnMB+DSnm2ZNz6R6Iggk5OJiIi7qIiIR9h9rJy09AwOFFVhtcBDV/fmgcu7Y9UoRkSkRVMREVMZhsGyH/KY/d5O7PUu2kcGs2BiEkO6RpkdTUREmoGKiJimoraOx9bu4L3sAgBG9I5m3vhEosICTU4mIiLNRUVETLEjv4y09AwOn6zGz2rhkWt686dLu2kUIyLiY1REpFkZhsE/Nh/hmfd343C66GgLZmFKMoM7tzY7moiImEBFRJpNWU0dM9ds48PtxwEY1TeGueMG0SpUoxgREV+lIiLNIjuvlLRlGeSV1BDgZ2HG6L7cfXEXLBaNYkREfJmKiLiVYRj89zeHef6j3dQ5DWJbh7A4JZmEuFZmRxMREQ+gIiJuU1rt4JHV21i/6wQA1/Zvzwu3DsIWEmByMhER8RQqIuIWGbmnmJyeSX5pDYF+Vh6/oS93DO2sUYyIiPyMiog0KZfL4L++OshLn+yh3mXQuU0oi1OSGdDJZnY0ERHxQCoi0mRKqhw8vCqbz3MKAbhhUAfm3DKQiGCNYkRE5MxURKRJ/Hi4hMnpmRwvryXQ38pfb+zPxCFxGsWIiMg5qYjI7+JyGby26QDz1u/F6TLoFh3G4pRk+naINDuaiIh4ARUROW/FlXYeXJHFV/uKAbg5qRPPjB1AWJC+rUREpGH0iiHn5bsDJ5m6PJPCCjvBAVaeGjOAcYNjNYoREZFGsbrrCx8+fJh77rmHrl27EhISQvfu3Zk1axYOh8NdS0ozcLoM5n+2j9vf2ExhhZ2e7cJ5N+0Sxl+g/SAiItJ4brsikpOTg8vl4vXXX6dHjx7s2LGDe++9l6qqKubOneuuZcWNCitqmbY8i28PnARg3OBYZo/pT2igLqyJiMj5sRiGYTTXYi+99BKvvfYaBw8ebNDx5eXl2Gw2ysrKiIzU5kczfb2vmGkrMimudBAa6MczYwdwS3Ks2bFERMQDNeb1u1n/KVtWVkZUVNRZ/9xut2O320/fLy8vb45Ycg71ThevfraPxRv3YxjQp30Ei1KS6dEu3OxoIiLSArhtj8gv7d+/n4ULF3Lfffed9Zg5c+Zgs9lO3+Li4pornpzB8bJaUt74nkVf/FRCJg6J553Ui1VCRESkyTS6iMyYMQOLxXLOW05Ozs/+Tn5+Ptdeey3jxo3j3nvvPevXnjlzJmVlZadveXl5jf8vkibxxZ5CrlvwFT8cKiEs0I8FE5OYc8tAggP8zI4mIiItSKP3iBQVFXHy5MlzHtOtWzcCAwMBKCgoYMSIEQwdOpS33noLq7Xh3Ud7RJpfndPF3E/38Pqmn/bx9O8YyaKUZLq2DTM5mYiIeAu37hGJjo4mOjq6Qcfm5+czcuRIBg8ezJIlSxpVQqT55ZfWMGVZJluPnALgjqGd+cv1fXUVRERE3MZtm1Xz8/MZMWIEnTt3Zu7cuRQVFZ3+s/bt27trWTlPn+06wUOrsimrqSMiyJ8Xbh3EdQM7mB1LRERaOLcVkfXr17N//372799PbOzP3+bZjO8Ylt/gqHfx4sc5vPH1IQAGxdpYNDGZ+DahJicTERFf0KyfI9JY2iPiXnkl1aQtyyQ7rxSAuy/uyozRfQj01whNRETOn8d+joh4jo93HOOR1duoqK0nMtifueMSuLq/RmYiItK8VER8jL3eyZwPc3jr28MAJMW3YuHEJGJbaxQjIiLNT0XEhxwuriJtWQY78n/6xNr7Lu/Gw1f3JsBPoxgRETGHioiPeH9bATPe3k6lvZ7WoQG8PD6BK/rEmB1LRER8nIpIC1db5+Tp93ex9PtcAC7s0poFE5PoYAsxOZmIiIiKSIt2oKiS1KUZ5ByvwGKBfx/RnQdH9cJfoxgREfEQKiIt1DuZ+Ty2djvVDidtwgJ55bZELuvVsE/EFRERaS4qIi1MjcPJX9/dyYotP/3CwKHdolgwIYl2kcEmJxMREfk1FZEWZN+JCtLSM9lz4qdRzJQrejLlyp74WS1mRxMRETkjFZEWYtWWPJ5ct5OaOifREUHMvy2R4T3amh1LRETknFREvFyVvZ4n1u1gTUY+AJf0aMsrtyUSHRFkcjIREZHfpiLixXKOl5O6NIMDRVVYLTD9ql78+4geWDWKERERL6Ei4oUMw2D5j3n89d2d2OtdxEQGsWBCEhd1a2N2NBERkUZREfEylfZ6HluznXezCwC4vFc088Yn0CZcoxgREfE+KiJeZEd+GWnpGRw+WY2f1cIj1/TmT5d20yhGRES8loqIFzAMg39uPsLTH+zGUe+ioy2YhSlJDO4cZXY0ERGR30VFxMOV19Yx4+1tfLj9OABX9mnH3HEJtA4LNDmZiIjI76ci4sG2HS0lNT2DvJIa/K0WZozuwz2XdMVi0ShGRERaBhURD2QYBku+Ocycj3ZT5zSIbR3CopRkEuNamR1NRESkSamIeJiy6joeWZ3Np7tOAHBN/xhevDUBW0iAyclERESanoqIB8nIPcXk9EzyS2sI9LPyl+v7cuewzhrFiIhIi6Ui4gFcLoM3vj7Iix/vod5l0LlNKIsmJjMw1mZ2NBEREbdSETHZqSoHD63K5vOcQgCuH9SB528ZSESwRjEiItLyqYiY6MfDJUxZlsmxsloC/a08eUM/br8oXqMYERHxGSoiJnC5DF7bdIB56/fidBl0axvGopRk+nWMNDuaiIhIs1IRaWbFlXamr8zmy71FANyc1Ilnxg4gLEj/K0RExPfo1a8ZbT54kinLMimssBMcYOWpmwYw7oJYjWJERMRnqYg0A6fLYNHn+5m/YS8uA3q0C+dvtyfTKybC7GgiIiKmUhFxs8KKWh5ckcU3+08CMG5wLLPH9Cc0UKdeREREr4Zu9M3+YqYuz6K40k5IgB/P3jyAW5JjzY4lIiLiMVRE3KDe6WLBhn0s/GI/hgF92kewKCWJHu00ihEREfm/VESa2PGyWqYsz+SHQyUATBwSx6wb+xMc4GdyMhEREc+jItKENu4pZPrKbEqqHIQF+vHcLQMZk9jJ7FgiIiIeS0WkCdQ5Xcxbv5fXNh4AoF+HSBbfnkzXtmEmJxMREfFsKiK/U0FpDZOXZbL1yCkA7hjamb9c31ejGBERkQZQEfkdNuw+wUOrsimtriMiyJ8Xbh3EdQM7mB1LRETEa6iInAdHvYsXP87hja8PATCwk41FKUl0bqNRjIiISGOoiDRSXkk1acsyyc4rBeCPF3dhxug+BPlrFCMiItJYKiKN8PGO4/x5dTbltfVEBvvz0rgErunf3uxYIiIiXktFpAHs9U7mfJjDW98eBiAxrhULJyYRFxVqbjAREREvpyLyG46crCItPZPt+WUA/OmybjxyTW8C/KwmJxMREfF+KiLn8MG2Y8x4exsV9npahQYwb3wCV/SJMTuWiIhIi6Eicga1dU6e+WAX/9ycC8AFnVuzYGISHVuFmJxMRESkZVER+YWDRZWkpmey+1g5AA+M6M5DV/XCX6MYERGRJqci8n+sy8rnsTXbqXI4aRMWyLzbErm8V7TZsURERFost/4z/6abbiI+Pp7g4GA6dOjAHXfcQUFBgTuXPC81DiePrt7G1OVZVDmcDO0WxYdTL1UJERERcTO3FpGRI0eycuVK9uzZw9tvv82BAwe49dZb3blko+0vrGDs4m9YsSUPiwWmXNmTpf82lJjIYLOjiYiItHgWwzCM5lrs3XffZezYsdjtdgICAn7z+PLycmw2G2VlZURGRjZ5ntVbj/LEOzuoqXPSNjyI+RMSubhH2yZfR0RExJc05vW72faIlJSUsHTpUoYPH37WEmK327Hb7afvl5eXuyVLtaOex9/ZwZqMfAAu6dGWV25LJDoiyC3riYiIyJm5/a0gjz76KGFhYbRp04bc3FzWrVt31mPnzJmDzWY7fYuLi3NLpvTvc1mTkY/VAg9f3Yu/3z1EJURERMQEjR7NzJgxgxdeeOGcx+zevZs+ffoAUFxcTElJCUeOHGH27NnYbDbef/99LBbLr/7ema6IxMXFNflopt7pYtqKLO4Y2pmLurVpsq8rIiIijRvNNLqIFBUVcfLkyXMe061bNwIDA3/1+NGjR4mLi+Pbb79l2LBhv7mWu/eIiIiISNNz6x6R6OhooqPP722tLpcL4GdXPURERMR3uW2z6vfff8+PP/7IJZdcQuvWrTlw4ABPPPEE3bt3b9DVEBEREWn53LZZNTQ0lDVr1nDllVfSu3dv7rnnHgYNGsSmTZsICtLGUBEREXHjFZGBAwfy+eefu+vLi4iISAug3+QmIiIiplEREREREdOoiIiIiIhpVERERETENCoiIiIiYhoVERERETGNioiIiIiYRkVERERETKMiIiIiIqZx2yerNoV//WLg8vJyk5OIiIhIQ/3rdftfr+Pn4tFFpKKiAoC4uDiTk4iIiEhjVVRUYLPZznmMxWhIXTGJy+WioKCAiIgILBZLk37t8vJy4uLiyMvLIzIyskm/dkujc9VwOlcNp3PVcDpXjaPz1XDuOleGYVBRUUHHjh2xWs+9C8Sjr4hYrVZiY2PdukZkZKS+URtI56rhdK4aTueq4XSuGkfnq+Hcca5+60rIv2izqoiIiJhGRURERERM47NFJCgoiFmzZhEUFGR2FI+nc9VwOlcNp3PVcDpXjaPz1XCecK48erOqiIiItGw+e0VEREREzKciIiIiIqZRERERERHTqIiIiIiIaVREgJtuuon4+HiCg4Pp0KEDd9xxBwUFBWbH8jiHDx/mnnvuoWvXroSEhNC9e3dmzZqFw+EwO5pHevbZZxk+fDihoaG0atXK7DgeZ/HixXTp0oXg4GAuuugifvjhB7MjeZwvv/ySG2+8kY4dO2KxWHjnnXfMjuSx5syZw4UXXkhERATt2rVj7Nix7Nmzx+xYHum1115j0KBBpz/EbNiwYXz00Uem5VERAUaOHMnKlSvZs2cPb7/9NgcOHODWW281O5bHycnJweVy8frrr7Nz505eeeUV/uM//oPHHnvM7GgeyeFwMG7cOB544AGzo3icFStWMH36dGbNmkVGRgYJCQlcc801FBYWmh3No1RVVZGQkMDixYvNjuLxNm3aRGpqKps3b2b9+vXU1dVx9dVXU1VVZXY0jxMbG8vzzz/P1q1b2bJlC1dccQVjxoxh586d5gQy5FfWrVtnWCwWw+FwmB3F47344otG165dzY7h0ZYsWWLYbDazY3iUIUOGGKmpqafvO51Oo2PHjsacOXNMTOXZAGPt2rVmx/AahYWFBmBs2rTJ7CheoXXr1sYbb7xhytq6IvILJSUlLF26lOHDhxMQEGB2HI9XVlZGVFSU2THEizgcDrZu3cqoUaNOP2a1Whk1ahTfffedicmkJSkrKwPQ89NvcDqdLF++nKqqKoYNG2ZKBhWR//Xoo48SFhZGmzZtyM3NZd26dWZH8nj79+9n4cKF3HfffWZHES9SXFyM0+kkJibmZ4/HxMRw/Phxk1JJS+JyuZg2bRoXX3wxAwYMMDuOR9q+fTvh4eEEBQVx//33s3btWvr162dKlhZbRGbMmIHFYjnnLScn5/TxjzzyCJmZmXz66af4+flx5513YvjIh8429lwB5Ofnc+211zJu3Djuvfdek5I3v/M5VyLSvFJTU9mxYwfLly83O4rH6t27N1lZWXz//fc88MADTJo0iV27dpmSpcV+xHtRUREnT5485zHdunUjMDDwV48fPXqUuLg4vv32W9MuVTWnxp6rgoICRowYwdChQ3nrrbewWltsn/2V8/m+euutt5g2bRqlpaVuTucdHA4HoaGhrF69mrFjx55+fNKkSZSWlupq5FlYLBbWrl37s3Mmv5aWlsa6dev48ssv6dq1q9lxvMaoUaPo3r07r7/+erOv7d/sKzaT6OhooqOjz+vvulwuAOx2e1NG8liNOVf5+fmMHDmSwYMHs2TJEp8qIfD7vq/kJ4GBgQwePJgNGzacflF1uVxs2LCBtLQ0c8OJ1zIMg8mTJ7N27Vo2btyoEtJILpfLtNe8FltEGur777/nxx9/5JJLLqF169YcOHCAJ554gu7du/vE1ZDGyM/PZ8SIEXTu3Jm5c+dSVFR0+s/at29vYjLPlJubS0lJCbm5uTidTrKysgDo0aMH4eHh5oYz2fTp05k0aRIXXHABQ4YM4dVXX6Wqqoo//vGPZkfzKJWVlezfv//0/UOHDpGVlUVUVBTx8fEmJvM8qamppKens27dOiIiIk7vN7LZbISEhJiczrPMnDmT0aNHEx8fT0VFBenp6WzcuJFPPvnEnECmvFfHg2zbts0YOXKkERUVZQQFBRldunQx7r//fuPo0aNmR/M4S5YsMYAz3uTXJk2adMZz9cUXX5gdzSMsXLjQiI+PNwIDA40hQ4YYmzdvNjuSx/niiy/O+D00adIks6N5nLM9Ny1ZssTsaB7n7rvvNjp37mwEBgYa0dHRxpVXXml8+umnpuVpsXtERERExPP51oBfREREPIqKiIiIiJhGRURERERMoyIiIiIiplEREREREdOoiIiIiIhpVERERETENCoiIiIiYhoVERERETGNioiIiIiYRkVERERETKMiIiIiIqb5//v1l85psmEIAAAAAElFTkSuQmCC" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 30 + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0FZlTGTJhkqq", + "colab_type": "text" + }, + "source": "Now let's put it all together and make a new transfer process, this time with a logistic activation function. We will also extend our Mechanism by giving it two units (operating on a 1x2 matrix) rather than the default one (operating on a scalar)." + }, + { + "cell_type": "code", + "metadata": { + "id": "k3h7k2wIdoXb", + "colab_type": "code", + "outputId": "502edb72-a2b2-49c5-cef0-6ea30f1d3dd0", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + } + }, + "source": [ + "# Create Composition\n", + "comp_1x2 = pnl.Composition()\n", + "\n", + "# Create the Mechanism\n", + "logistic_transfer_mechanism = pnl.TransferMechanism(default_variable=[0, 0],\n", + " function=pnl.Logistic(gain=1,\n", + " bias=0))\n", + "# Place Mechanism in Composition\n", + "comp_1x2.add_linear_processing_pathway(pathway = [logistic_transfer_mechanism])\n", + "\n", + "\n", + "# Iterate and plot\n", + "xVals = np.linspace(-3, 3, num=51)\n", + "y1Vals = np.zeros((51,))\n", + "y2Vals = np.zeros((51,))\n", + "for i in range(xVals.shape[0]):\n", + " # clarify why multiplying times 2\n", + " output = comp_1x2.run([xVals[i], xVals[i] * 3])\n", + " y1Vals[i] = output[0][0]\n", + " y2Vals[i] = output[0][1]\n", + " # Progress bar\n", + " print(\"-\", end=\"\")\n", + "plt.plot(xVals, y1Vals)\n", + "plt.plot(xVals, y2Vals)\n", + "plt.show()" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "gQP6ZFH-ifO2", - "colab_type": "text" - }, - "source": [ - "`IDENTITY_MATRIX` is a keyword that provides a projection from the unit preceding it to the unit following that creates a one-to-one output to input projection between the two. \n", - "\n", - "Now let's make our projection definition a bit more explicit." - ] + "output_type": "stream", + "text": [ + "---------------------------------------------------" + ], + "name": "stdout" }, { - "cell_type": "code", - "metadata": { - "id": "9QF9E0TainCy", - "colab_type": "code", - "outputId": "9f5915c7-02af-462b-8a9e-5af00d7d434d", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 286 - } - }, - "source": [ - "# Create composition\n", - "comp_explicit = pnl.Composition()\n", - "\n", - "# Create mechanisms\n", - "linear_input_unit = pnl.TransferMechanism(function=pnl.Linear(slope=2, intercept=2), name=\"linear\")\n", - "logistic_output_unit = pnl.TransferMechanism(function=pnl.Logistic(), name=\"logistic\")\n", - "\n", - "# Create projection\n", - "mapping_matrix = np.asarray([[1]])\n", - "unit_mapping_projection = pnl.MappingProjection(sender=linear_input_unit,\n", - " receiver=logistic_output_unit,\n", - " matrix=mapping_matrix)\n", - "\n", - "# Place mechanisms and projections in composition\n", - "comp_explicit.add_linear_processing_pathway(pathway = [linear_input_unit, unit_mapping_projection, logistic_output_unit])\n", - "\n", - "\n", - "# Iterate and plot\n", - "xVals = np.linspace(-3, 3, num=51)\n", - "yVals = np.zeros((51,))\n", - "for i in range(xVals.shape[0]):\n", - " yVals[i] = comp_explicit.run([xVals[i]])[0]\n", - " # Progress bar\n", - " print(\"-\", end=\"\")\n", - "plt.plot(xVals, yVals)\n", - "plt.show()" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "---------------------------------------------------" - ], - "name": "stdout" - }, - { - "output_type": "display_data", - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - } - } + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" ] - }, + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "j4BXYFbLh8Zn", + "colab_type": "text" + }, + "source": "The `default_variable` parameter serves a dual function. It specifies the dimensionality of the Mechanism as well as providing the inputs that will be given in the absence of explicit input at runtime. You can also specify the dimensionality using \"size\", e.g. size=2 will also create default_variable=[0,0]." + }, + { + "cell_type": "code", + "metadata": { + "id": "FtN0VYCsiJwa", + "colab_type": "code", + "colab": {} + }, + "source": [ + "logistic_transfer_step = pnl.TransferMechanism(default_variable=[0, 0],\n", + " function=pnl.Logistic(gain=100,\n", + " offset=100))" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "ddg9BFXfiLNB", + "colab_type": "code", + "outputId": "45be1414-3b25-404c-a0a1-08c5474fa3a9", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "logistic_transfer_step.execute([.9,1.1])" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "wiKec76Riuop", - "colab_type": "code", - "outputId": "2017afbd-f503-4084-ec39-6c228181dca6", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 176 - } - }, - "source": [ - "comp_explicit.show_graph(output_fmt = 'jupyter')" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n\n\n\n\nComposition-34\n\n\n\nlinear\n\nlinear\n\n\n\nlogistic\n\nlogistic\n\n\n\nlinear->logistic\n\n\n\n\n\n" - }, - "metadata": { - "tags": [] - }, - "execution_count": 73 - } + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[4.53978687e-05, 9.99954602e-01]])" ] - }, + }, + "metadata": { + "tags": [] + }, + "execution_count": 69 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dPaX0syYiShl", + "colab_type": "text" + }, + "source": [ + "### Adding Projections\n", + "\n", + "To connect Mechanisms together in a Composition, we need a way to link Mechanisms together. This is done through [Projections](https://princetonuniversity.github.io/PsyNeuLink/Projection.html). A projection takes a Mechanism output, multiplies it by the Projection's mapping matrix, and delivers the transformed value to the next Mechanism in the Composition. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "VEUVwefgiXPn", + "colab_type": "code", + "outputId": "a9344b09-ca1c-4c51-a53e-bcd31331a065", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + } + }, + "source": [ + "# Create Composition\n", + "comp_linlog = pnl.Composition()\n", + "\n", + "# Create Mechanisms\n", + "linear_input_unit = pnl.TransferMechanism(function=pnl.Linear(slope=2, intercept=2))\n", + "logistic_output_unit = pnl.TransferMechanism(function=pnl.Logistic())\n", + "\n", + "# Place Mechanism in Composition\n", + "comp_linlog.add_linear_processing_pathway(pathway = [linear_input_unit, pnl.IDENTITY_MATRIX, logistic_output_unit])\n", + "\n", + "\n", + "# Iterate and plot\n", + "xVals = np.linspace(-3, 3, num=51)\n", + "yVals = np.zeros((51,))\n", + "for i in range(xVals.shape[0]):\n", + " yVals[i] = comp_linlog.run([xVals[i]])[0]\n", + " # Progress bar\n", + " print(\"-\", end=\"\")\n", + "plt.plot(xVals, yVals)\n", + "plt.show()" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "vmqMmXDrizMf", - "colab_type": "text" - }, - "source": [ - "This time we specified our mapping matrix (which is a 2-D numpy array) then explicitly initialized a *[MappingProjection](https://princetonuniversity.github.io/PsyNeuLink/MappingProjection.html)* with that matrix as well as its input and output mechanisms. Note: because we specified the input and output mechanisms in the projection itself, we didn't need to include it in the composition pathway as the composition would have infered its position from those parameters. Ultimately, however, this does the exact same thing as our keyword method above which is far less verbose for this common use case." - ] + "output_type": "stream", + "text": [ + "---------------------------------------------------" + ], + "name": "stdout" }, { - "cell_type": "markdown", - "metadata": { - "id": "XV91dEJ2i_rP", - "colab_type": "text" - }, - "source": [ - "### Compositions\n", - "\n", - "The highest level at which models are considered in PsyNeuLink is that of the *[Composition](https://princetonuniversity.github.io/PsyNeuLink/Composition.html)*. A composition is built out of one or more mechanisms connected by projections. This allows Composition graphs to be more complex than the strictly linear ones covered so far. Our first composition will consist of two input nodes that converge on a single output mechanism. We will be modelling competition between color naming and word reading in the Stroop task. [Recall that the Stroop task involves naming the ink color of words: when the word itself mismatches with the ink color it is written in (e.g. the word RED written in blue ink), that produces conflict and slower response times to name the ink color.] \n", - "\n", - "### Mini-Stroop Model" + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" ] - }, + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gQP6ZFH-ifO2", + "colab_type": "text" + }, + "source": [ + "`IDENTITY_MATRIX` is a keyword that provides a Projection from the unit preceding it to the unit following, creating a one-to-one output-to-input Projection between the two. \n", + "\n", + "Now, let's make our Projection definition a bit more explicit." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9QF9E0TainCy", + "colab_type": "code", + "outputId": "9f5915c7-02af-462b-8a9e-5af00d7d434d", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 286 + } + }, + "source": [ + "# Create Composition\n", + "comp_explicit = pnl.Composition()\n", + "\n", + "# Create Mechanisms\n", + "linear_input_unit = pnl.TransferMechanism(function=pnl.Linear(slope=2, intercept=2), name=\"linear\")\n", + "logistic_output_unit = pnl.TransferMechanism(function=pnl.Logistic(), name=\"logistic\")\n", + "\n", + "# Create Projection\n", + "mapping_matrix = np.asarray([[1]])\n", + "unit_mapping_projection = pnl.MappingProjection(sender=linear_input_unit,\n", + " receiver=logistic_output_unit,\n", + " matrix=mapping_matrix)\n", + "\n", + "# Place Mechanisms and Projections in Composition\n", + "comp_explicit.add_linear_processing_pathway(pathway = [linear_input_unit, unit_mapping_projection, logistic_output_unit])\n", + "\n", + "\n", + "# Iterate and plot\n", + "xVals = np.linspace(-3, 3, num=51)\n", + "yVals = np.zeros((51,))\n", + "for i in range(xVals.shape[0]):\n", + " yVals[i] = comp_explicit.run([xVals[i]])[0]\n", + " # Progress bar\n", + " print(\"-\", end=\"\")\n", + "plt.plot(xVals, yVals)\n", + "plt.show()" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "rAymk7bujTCG", - "colab_type": "code", - "outputId": "9d6ef8e9-f323-4b7e-ae20-72fd151e6a77", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 176 - } - }, - "source": [ - "mini_stroop = pnl.Composition()\n", - "\n", - "colors = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Linear,\n", - " name=\"Colors\")\n", - "words = pnl.TransferMechanism(default_variable=[0, 0],\n", - " function=pnl.Linear(slope=1.5), name=\"Words\")\n", - "response = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Logistic,\n", - " name=\"Response\")\n", - "\n", - "\n", - "# Place mechanisms and projections in composition\n", - "mini_stroop.add_linear_processing_pathway(pathway = [colors, response])\n", - "mini_stroop.add_linear_processing_pathway(pathway = [words, response])\n", - "\n", - "\n", - "mini_stroop.show_graph(output_fmt = 'jupyter')" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n\n\n\n\nComposition-24\n\n\n\nWords-2\n\nWords-2\n\n\n\nResponse-1\n\nResponse-1\n\n\n\nWords-2->Response-1\n\n\n\n\n\nColors-2\n\nColors-2\n\n\n\nColors-2->Response-1\n\n\n\n\n\n" - }, - "metadata": { - "tags": [] - }, - "execution_count": 54 - } - ] + "output_type": "stream", + "text": [ + "---------------------------------------------------" + ], + "name": "stdout" }, { - "cell_type": "markdown", - "metadata": { - "id": "BOWowlx6kC4g", - "colab_type": "text" - }, - "source": [ - "An input of [1, 0] to ink is red ink, and [0, 1] is blue ink. \n", - "An input of [1, 0] to word is \"red\" and [0, 1] is \"blue\". \n", - "If the input values to ink and word are the same, that is a congruent trial. If the input values to the ink and word are different that is an incongruent trial. \n", - "\n", - "In the output of the Composition, the first output value is the strength to respond red, and the second value is the strength to respond blue. \n", - "\n", - "In the following two cells we will first specify a congruent trial (blue ink, word \"blue\") to see the output, and then specify an incongruent trial (red ink, word \"blue\"). " + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" ] - }, + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "wiKec76Riuop", + "colab_type": "code", + "outputId": "2017afbd-f503-4084-ec39-6c228181dca6", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 176 + } + }, + "source": [ + "comp_explicit.show_graph(output_fmt = 'jupyter')" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "qgEakz_4kQLL", - "colab_type": "code", - "outputId": "d65ac391-5f02-4daa-ba67-0ddca93fc18b", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "input_allblue = {colors: [0, 1],\n", - " words: [0, 1]}\n", - "mini_stroop.run(input_allblue)" + "output_type": "execute_result", + "data": { + "text/plain": [ + "" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[array([0.5 , 0.92414182])]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 55 - } - ] - }, + "image/svg+xml": "\n\n\n\n\n\nComposition-34\n\n\n\nlinear\n\nlinear\n\n\n\nlogistic\n\nlogistic\n\n\n\nlinear->logistic\n\n\n\n\n\n" + }, + "metadata": { + "tags": [] + }, + "execution_count": 73 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vmqMmXDrizMf", + "colab_type": "text" + }, + "source": "This time, we specified our mapping matrix (which is a 2-D numpy array) and then explicitly initialized a *[MappingProjection](https://princetonuniversity.github.io/PsyNeuLink/MappingProjection.html)* with that matrix as well as its input and output Mechanisms. Note: Because we specified the input and output Mechanisms in the Projection itself, we didn't need to include them in the Composition pathway as the Composition would have inferred its position from those parameters. Ultimately, however, this does the exact same thing as our keyword method above, which is far less verbose for this common use case." + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XV91dEJ2i_rP", + "colab_type": "text" + }, + "source": [ + "### Compositions\n", + "\n", + "The highest level at which models are considered in PsyNeuLink is that of the *[Composition](https://princetonuniversity.github.io/PsyNeuLink/Composition.html)*. A Composition is built out of one or more Mechanisms connected by Projections. This allows Composition graphs to be more complex than the strictly linear ones covered so far. Our first Composition will consist of two input nodes that converge on a single output Mechanism. We will be modeling competition between color naming and word reading in the Stroop task. [Recall that the Stroop task involves naming the ink color of words: when the word itself mismatches with the ink color it is written in (e.g., the word RED written in blue ink), that produces conflict and slower response times to name the ink color.]\n", + "\n", + "### Mini-Stroop Model" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rAymk7bujTCG", + "colab_type": "code", + "outputId": "9d6ef8e9-f323-4b7e-ae20-72fd151e6a77", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 176 + } + }, + "source": [ + "mini_stroop = pnl.Composition()\n", + "\n", + "colors = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Linear,\n", + " name=\"Colors\")\n", + "words = pnl.TransferMechanism(default_variable=[0, 0],\n", + " function=pnl.Linear(slope=1.5), name=\"Words\")\n", + "response = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Logistic,\n", + " name=\"Response\")\n", + "\n", + "\n", + "# Place Mechanisms and Projections in Composition\n", + "mini_stroop.add_linear_processing_pathway(pathway = [colors, response])\n", + "mini_stroop.add_linear_processing_pathway(pathway = [words, response])\n", + "\n", + "\n", + "mini_stroop.show_graph(output_fmt = 'jupyter')" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "xyHPjYkWj0gK", - "colab_type": "code", - "outputId": "d92538bb-889f-4e7a-d70b-697c451b8258", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - } - }, - "source": [ - "input_redblue = {colors: [1, 0], \n", - " words: [0, 1]}\n", - "mini_stroop.run(input_redblue)" + "output_type": "execute_result", + "data": { + "text/plain": [ + "" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[array([0.73105858, 0.81757448])]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 56 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "OubMjYMkdoYQ", - "colab_type": "text" - }, - "source": [ - "### Pre-trained Complete Stroop Model\n", - "\n", - "Let's practice using compositions by recreating the more complex stroop model from Cohen et al (1990). Later we will train the network ourselves, but for now we will explicitly model the learned weights." - ] - }, + "image/svg+xml": "\n\n\n\n\n\nComposition-24\n\n\n\nWords-2\n\nWords-2\n\n\n\nResponse-1\n\nResponse-1\n\n\n\nWords-2->Response-1\n\n\n\n\n\nColors-2\n\nColors-2\n\n\n\nColors-2->Response-1\n\n\n\n\n\n" + }, + "metadata": { + "tags": [] + }, + "execution_count": 54 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BOWowlx6kC4g", + "colab_type": "text" + }, + "source": [ + "An input of [1, 0] to ink is red ink, and [0, 1] is blue ink. \n", + "An input of [1, 0] to word is \"red\" and [0, 1] is \"blue\". \n", + "If the input values to ink and word are the same, that is a congruent trial. If the input values to the ink and word are different that is an incongruent trial. \n", + "\n", + "In the output of the Composition, the first output value is the strength to respond red, and the second value is the strength to respond blue. \n", + "\n", + "In the following two cells, we will first specify a congruent trial (blue ink, word \"blue\") to see the output, and then specify an incongruent trial (red ink, word \"blue\")." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qgEakz_4kQLL", + "colab_type": "code", + "outputId": "d65ac391-5f02-4daa-ba67-0ddca93fc18b", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "input_allblue = {colors: [0, 1],\n", + " words: [0, 1]}\n", + "mini_stroop.run(input_allblue)" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "XFNp0zgtdoYR", - "colab_type": "code", - "outputId": "d86f5d6d-8e79-4b39-87fa-0559d5bf3c61", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 272 - } - }, - "source": [ - "stroop_model = pnl.Composition()\n", - "\n", - "ink_color = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Linear(),name=\"Ink_Color\")\n", - "word = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Linear(),name=\"Word\")\n", - "task_demand = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Linear(),name=\"Task\")\n", - "\n", - "hidden_layer = pnl.TransferMechanism(default_variable=[0, 0, 0, 0],\n", - " function=pnl.Logistic(bias=-4), name=\"Hidden\")\n", - "\n", - "output_layer = pnl.TransferMechanism(default_variable=[[0, 0]], function=pnl.Linear(), name=\"Output\")\n", - "\n", - "\n", - "color_mapping_matrix = np.asarray([[2.2, -2.2, 0, 0], [-2.2, 2.2, 0, 0]])\n", - "color_projection = pnl.MappingProjection(sender=ink_color, receiver=hidden_layer,\n", - " matrix=color_mapping_matrix)\n", - "word_mapping_matrix = np.asarray([[0, 0, 2.6, -2.6], [0, 0, -2.6, 2.6]])\n", - "word_projection = pnl.MappingProjection(sender=word, receiver=hidden_layer,\n", - " matrix=word_mapping_matrix)\n", - "task_mapping_matrix = np.asarray([[4, 4, 0, 0], [0, 0, 4, 4]])\n", - "task_projection = pnl.MappingProjection(sender=task_demand, receiver=hidden_layer,\n", - " matrix=task_mapping_matrix)\n", - "output_mapping_matrix = np.asarray(\n", - " [[1.3, -1.3], [-1.3, 1.3], [2.5, -2.5], [-2.5, 2.5]])\n", - "output_projection = pnl.MappingProjection(sender=hidden_layer, receiver=output_layer,\n", - " matrix=output_mapping_matrix)\n", - "\n", - "\n", - "stroop_model.add_linear_processing_pathway(pathway = [ink_color, color_projection, hidden_layer, output_projection, output_layer])\n", - "stroop_model.add_linear_processing_pathway(pathway = [word, word_projection, hidden_layer, output_projection, output_layer])\n", - "stroop_model.add_linear_processing_pathway(pathway = [task_demand, task_projection, hidden_layer, output_projection, output_layer])\n", - "\n", - "\n", - "ink_color.reportOutputPref = True\n", - "word.reportOutputPref = True\n", - "task_demand.reportOutputPref = True\n", - "hidden_layer.reportOutputPref = True\n", - "\n", - "stroop_model.show_graph(output_fmt = 'jupyter')" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n\n\n\n\nComposition-25\n\n\n\nTask-2\n\nTask-2\n\n\n\nHidden-1\n\nHidden-1\n\n\n\nTask-2->Hidden-1\n\n\n\n\n\nWord-1\n\nWord-1\n\n\n\nWord-1->Hidden-1\n\n\n\n\n\nInk_Color\n\nInk_Color\n\n\n\nInk_Color->Hidden-1\n\n\n\n\n\nOutput-1\n\nOutput-1\n\n\n\nHidden-1->Output-1\n\n\n\n\n\n" - }, - "metadata": { - "tags": [] - }, - "execution_count": 57 - } + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([0.5 , 0.92414182])]" ] - }, + }, + "metadata": { + "tags": [] + }, + "execution_count": 55 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xyHPjYkWj0gK", + "colab_type": "code", + "outputId": "d92538bb-889f-4e7a-d70b-697c451b8258", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + } + }, + "source": [ + "input_redblue = {colors: [1, 0], \n", + " words: [0, 1]}\n", + "mini_stroop.run(input_redblue)" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "cQ5qk7UadoYU", - "colab_type": "text" - }, - "source": [ - "In the next cell we will run the model with inputs. The \"ink_color\" and \"word\" are the same as the previous model, and the addition of task demand allows us to specify whether the task is to name the color of ink [0, 1], or to read the word [1, 0]. The output can be thought of as activation strengths of two possible responses [red, blue]. " + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([0.73105858, 0.81757448])]" ] - }, + }, + "metadata": { + "tags": [] + }, + "execution_count": 56 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OubMjYMkdoYQ", + "colab_type": "text" + }, + "source": [ + "### Pre-trained Complete Stroop Model\n", + "\n", + "Let's practice using Compositions by recreating the more complex Stroop model from Cohen et al. (1990). Later, we will train the network ourselves, but for now, we will explicitly model the learned weights." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "XFNp0zgtdoYR", + "colab_type": "code", + "outputId": "d86f5d6d-8e79-4b39-87fa-0559d5bf3c61", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 272 + } + }, + "source": [ + "stroop_model = pnl.Composition()\n", + "\n", + "ink_color = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Linear(),name=\"Ink_Color\")\n", + "word = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Linear(),name=\"Word\")\n", + "task_demand = pnl.TransferMechanism(default_variable=[0, 0], function=pnl.Linear(),name=\"Task\")\n", + "\n", + "hidden_layer = pnl.TransferMechanism(default_variable=[0, 0, 0, 0],\n", + " function=pnl.Logistic(bias=-4), name=\"Hidden\")\n", + "\n", + "output_layer = pnl.TransferMechanism(default_variable=[[0, 0]], function=pnl.Linear(), name=\"Output\")\n", + "\n", + "\n", + "color_mapping_matrix = np.asarray([[2.2, -2.2, 0, 0], [-2.2, 2.2, 0, 0]])\n", + "color_projection = pnl.MappingProjection(sender=ink_color, receiver=hidden_layer,\n", + " matrix=color_mapping_matrix)\n", + "word_mapping_matrix = np.asarray([[0, 0, 2.6, -2.6], [0, 0, -2.6, 2.6]])\n", + "word_projection = pnl.MappingProjection(sender=word, receiver=hidden_layer,\n", + " matrix=word_mapping_matrix)\n", + "task_mapping_matrix = np.asarray([[4, 4, 0, 0], [0, 0, 4, 4]])\n", + "task_projection = pnl.MappingProjection(sender=task_demand, receiver=hidden_layer,\n", + " matrix=task_mapping_matrix)\n", + "output_mapping_matrix = np.asarray(\n", + " [[1.3, -1.3], [-1.3, 1.3], [2.5, -2.5], [-2.5, 2.5]])\n", + "output_projection = pnl.MappingProjection(sender=hidden_layer, receiver=output_layer,\n", + " matrix=output_mapping_matrix)\n", + "\n", + "\n", + "stroop_model.add_linear_processing_pathway(pathway = [ink_color, color_projection, hidden_layer, output_projection, output_layer])\n", + "stroop_model.add_linear_processing_pathway(pathway = [word, word_projection, hidden_layer, output_projection, output_layer])\n", + "stroop_model.add_linear_processing_pathway(pathway = [task_demand, task_projection, hidden_layer, output_projection, output_layer])\n", + "\n", + "\n", + "ink_color.reportOutputPref = True\n", + "word.reportOutputPref = True\n", + "task_demand.reportOutputPref = True\n", + "hidden_layer.reportOutputPref = True\n", + "\n", + "stroop_model.show_graph(output_fmt = 'jupyter')" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "_3h3HUQ2doYV", - "colab_type": "code", - "outputId": "9eac7bdb-a7c3-40cb-98cd-2fe620a4e935", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1292 - } - }, - "source": [ - "input_dict = {ink_color: [1, 0],\n", - " word: [0, 1],\n", - " task_demand: [1, 0]}\n", - "stroop_model.run(input_dict)" + "output_type": "execute_result", + "data": { + "text/plain": [ + "" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "stream", - "text": [ - "\n", - "'Ink_Color' mechanism executed:\n", - "- input: [array([1., 0.])]\n", - "- params:\n", - "\tconvergence_criterion: 0.01\n", - "\tconvergence_function: Distance Function-1\n", - "\t\tintercept: 0.0\n", - "\t\tslope: 1.0\n", - "\tfunction: Linear Function-1038\n", - "\t\tintercept: 0.0\n", - "\t\tslope: 1.0\n", - "\tinitial_value: None\n", - "\tintegration_rate: 0.5\n", - "\tintegrator_mode: False\n", - "\tmax_passes: 1000\n", - "\tnoise: 0.\n", - "- output: 0.0 0.0\n", - "\n", - "'Word-1' mechanism executed:\n", - "- input: [array([0., 1.])]\n", - "- params:\n", - "\tconvergence_criterion: 0.01\n", - "\tconvergence_function: Distance Function-1\n", - "\t\tintercept: 0.0\n", - "\t\tslope: 1.0\n", - "\tfunction: Linear Function-1048\n", - "\t\tintercept: 0.0\n", - "\t\tslope: 1.0\n", - "\tinitial_value: None\n", - "\tintegration_rate: 0.5\n", - "\tintegrator_mode: False\n", - "\tmax_passes: 1000\n", - "\tnoise: 0.\n", - "- output: 0.0 0.0\n", - "\n", - "'Task-2' mechanism executed:\n", - "- input: [array([1., 0.])]\n", - "- params:\n", - "\tconvergence_criterion: 0.01\n", - "\tconvergence_function: Distance Function-1\n", - "\t\tintercept: 0.0\n", - "\t\tslope: 1.0\n", - "\tfunction: Linear Function-1058\n", - "\t\tintercept: 0.0\n", - "\t\tslope: 1.0\n", - "\tinitial_value: None\n", - "\tintegration_rate: 0.5\n", - "\tintegrator_mode: False\n", - "\tmax_passes: 1000\n", - "\tnoise: 0.\n", - "- output: 0.0 0.0\n", - "\n", - "'Hidden-1' mechanism executed:\n", - "- input: [array([ 6.2, 1.8, -2.6, 2.6])]\n", - "- params:\n", - "\tconvergence_criterion: 0.01\n", - "\tconvergence_function: Distance Function-1\n", - "\t\tbias: -4\n", - "\t\tgain: 1.0\n", - "\t\toffset: 0.0\n", - "\t\tscale: 1.0\n", - "\t\tx_0: 0.0\n", - "\tfunction: Logistic Function-19\n", - "\t\tbias: -4\n", - "\t\tgain: 1.0\n", - "\t\toffset: 0.0\n", - "\t\tscale: 1.0\n", - "\t\tx_0: 0.0\n", - "\tinitial_value: None\n", - "\tintegration_rate: 0.5\n", - "\tintegrator_mode: False\n", - "\tmax_passes: 1000\n", - "\tnoise: 0.\n", - "- output: 0.018 0.018 0.018 0.018\n" - ], - "name": "stdout" - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[array([ 0.54950475, -0.54950475])]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 58 - } - ] - }, + "image/svg+xml": "\n\n\n\n\n\nComposition-25\n\n\n\nTask-2\n\nTask-2\n\n\n\nHidden-1\n\nHidden-1\n\n\n\nTask-2->Hidden-1\n\n\n\n\n\nWord-1\n\nWord-1\n\n\n\nWord-1->Hidden-1\n\n\n\n\n\nInk_Color\n\nInk_Color\n\n\n\nInk_Color->Hidden-1\n\n\n\n\n\nOutput-1\n\nOutput-1\n\n\n\nHidden-1->Output-1\n\n\n\n\n\n" + }, + "metadata": { + "tags": [] + }, + "execution_count": 57 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cQ5qk7UadoYU", + "colab_type": "text" + }, + "source": "In the next cell, we will run the model with inputs. The \"ink_color\" and \"word\" are the same as the previous model, and the addition of task demand allows us to specify whether the task is to name the color of ink [0, 1], or to read the word [1, 0]. The output can be thought of as activation strengths of two possible responses [red, blue]. " + }, + { + "cell_type": "code", + "metadata": { + "id": "_3h3HUQ2doYV", + "colab_type": "code", + "outputId": "9eac7bdb-a7c3-40cb-98cd-2fe620a4e935", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1292 + } + }, + "source": [ + "input_dict = {ink_color: [1, 0],\n", + " word: [0, 1],\n", + " task_demand: [1, 0]}\n", + "stroop_model.run(input_dict)" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "a2g6AQLBdoYZ", - "colab_type": "text" - }, - "source": [ - "To get a better sense of how the model works, try reverse engineering by changing each of the inputs (remember the options are only [1,0] or [0,1]) one at a time and running the model. Given 3 input states (Task, Word, Ink) with 2 options each, there will be 8 possibilities (2^3). \n", - "\n" - ] + "output_type": "stream", + "text": [ + "\n", + "'Ink_Color' mechanism executed:\n", + "- input: [array([1., 0.])]\n", + "- params:\n", + "\tconvergence_criterion: 0.01\n", + "\tconvergence_function: Distance Function-1\n", + "\t\tintercept: 0.0\n", + "\t\tslope: 1.0\n", + "\tfunction: Linear Function-1038\n", + "\t\tintercept: 0.0\n", + "\t\tslope: 1.0\n", + "\tinitial_value: None\n", + "\tintegration_rate: 0.5\n", + "\tintegrator_mode: False\n", + "\tmax_passes: 1000\n", + "\tnoise: 0.\n", + "- output: 0.0 0.0\n", + "\n", + "'Word-1' mechanism executed:\n", + "- input: [array([0., 1.])]\n", + "- params:\n", + "\tconvergence_criterion: 0.01\n", + "\tconvergence_function: Distance Function-1\n", + "\t\tintercept: 0.0\n", + "\t\tslope: 1.0\n", + "\tfunction: Linear Function-1048\n", + "\t\tintercept: 0.0\n", + "\t\tslope: 1.0\n", + "\tinitial_value: None\n", + "\tintegration_rate: 0.5\n", + "\tintegrator_mode: False\n", + "\tmax_passes: 1000\n", + "\tnoise: 0.\n", + "- output: 0.0 0.0\n", + "\n", + "'Task-2' mechanism executed:\n", + "- input: [array([1., 0.])]\n", + "- params:\n", + "\tconvergence_criterion: 0.01\n", + "\tconvergence_function: Distance Function-1\n", + "\t\tintercept: 0.0\n", + "\t\tslope: 1.0\n", + "\tfunction: Linear Function-1058\n", + "\t\tintercept: 0.0\n", + "\t\tslope: 1.0\n", + "\tinitial_value: None\n", + "\tintegration_rate: 0.5\n", + "\tintegrator_mode: False\n", + "\tmax_passes: 1000\n", + "\tnoise: 0.\n", + "- output: 0.0 0.0\n", + "\n", + "'Hidden-1' mechanism executed:\n", + "- input: [array([ 6.2, 1.8, -2.6, 2.6])]\n", + "- params:\n", + "\tconvergence_criterion: 0.01\n", + "\tconvergence_function: Distance Function-1\n", + "\t\tbias: -4\n", + "\t\tgain: 1.0\n", + "\t\toffset: 0.0\n", + "\t\tscale: 1.0\n", + "\t\tx_0: 0.0\n", + "\tfunction: Logistic Function-19\n", + "\t\tbias: -4\n", + "\t\tgain: 1.0\n", + "\t\toffset: 0.0\n", + "\t\tscale: 1.0\n", + "\t\tx_0: 0.0\n", + "\tinitial_value: None\n", + "\tintegration_rate: 0.5\n", + "\tintegrator_mode: False\n", + "\tmax_passes: 1000\n", + "\tnoise: 0.\n", + "- output: 0.018 0.018 0.018 0.018\n" + ], + "name": "stdout" }, { - "cell_type": "markdown", - "metadata": { - "id": "YPcQIM7odoYg", - "colab_type": "text" - }, - "source": [ - "# Constructing Compositions\n", - "\n", - "As shown in the Stroop models above, mechanisms are the building blocks in PsyNeuLink, and projections are how these building blocks get connected. The configuration of mechanisms connected by projections determines how information will flow and be processed within each model. Next we'll explore how to build models with different configurations of mechanisms and projections, along with generating diagrams that visualize these configurations. " + "output_type": "execute_result", + "data": { + "text/plain": [ + "[array([ 0.54950475, -0.54950475])]" ] - }, + }, + "metadata": { + "tags": [] + }, + "execution_count": 58 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "a2g6AQLBdoYZ", + "colab_type": "text" + }, + "source": [ + "To get a better sense of how the model works, try reverse engineering by changing each of the inputs (remember the options are only [1,0] or [0,1]) one at a time and running the model. Given 3 input states (Task, Word, Ink) with 2 options each, there will be 8 possibilities (2^3). \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YPcQIM7odoYg", + "colab_type": "text" + }, + "source": [ + "# Constructing Compositions\n", + "\n", + "As shown in the Stroop models above, Mechanisms are the building blocks in PsyNeuLink, and Projections are how these building blocks get connected. The configuration of Mechanisms connected by Projections determines how information will flow and be processed within each model. Next, we'll explore how to build models with different configurations of Mechanisms and Projections, along with generating diagrams that visualize these configurations. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "HeNSMjrNdoYh", + "colab_type": "code", + "outputId": "94d9d639-f2d2-4dcb-e09a-694db78f8ee0", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 176 + } + }, + "source": [ + "# Create Composition\n", + "comp_line2 = pnl.Composition()\n", + "\n", + "input_layer_cL2 = pnl.TransferMechanism(\n", + " name='input_layer_cL2',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "output_layer_cL2 = pnl.TransferMechanism(\n", + " name='output_layer_cL2',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "# Place Mechanisms in Composition\n", + "comp_line2.add_linear_processing_pathway(pathway = [input_layer_cL2, output_layer_cL2])\n", + "\n", + "\n", + "input_layer_cL2.reportOutputPref = True\n", + "output_layer_cL2.reportOutputPref = True\n", + "\n", + "comp_line2.show_graph(output_fmt = 'jupyter')" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "HeNSMjrNdoYh", - "colab_type": "code", - "outputId": "94d9d639-f2d2-4dcb-e09a-694db78f8ee0", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 176 - } - }, - "source": [ - "# Create composition\n", - "comp_line2 = pnl.Composition()\n", - "\n", - "input_layer_cL2 = pnl.TransferMechanism(\n", - " name='input_layer_cL2',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "output_layer_cL2 = pnl.TransferMechanism(\n", - " name='output_layer_cL2',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "# Place mechanisms in composition\n", - "comp_line2.add_linear_processing_pathway(pathway = [input_layer_cL2, output_layer_cL2])\n", - "\n", - "\n", - "input_layer_cL2.reportOutputPref = True\n", - "output_layer_cL2.reportOutputPref = True\n", - "\n", - "comp_line2.show_graph(output_fmt = 'jupyter')" + "output_type": "execute_result", + "data": { + "text/plain": [ + "" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n\n\n\n\nComposition-26\n\n\n\ninput_layer_cL2-2\n\ninput_layer_cL2-2\n\n\n\noutput_layer_cL2-1\n\noutput_layer_cL2-1\n\n\n\ninput_layer_cL2-2->output_layer_cL2-1\n\n\n\n\n\n" - }, - "metadata": { - "tags": [] - }, - "execution_count": 59 - } - ] - }, + "image/svg+xml": "\n\n\n\n\n\nComposition-26\n\n\n\ninput_layer_cL2-2\n\ninput_layer_cL2-2\n\n\n\noutput_layer_cL2-1\n\noutput_layer_cL2-1\n\n\n\ninput_layer_cL2-2->output_layer_cL2-1\n\n\n\n\n\n" + }, + "metadata": { + "tags": [] + }, + "execution_count": 59 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "yyYi8cMqdoYj", + "colab_type": "code", + "outputId": "0ab453d8-7705-4264-d0e5-ba96bcd07979", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 272 + } + }, + "source": [ + "# Create Composition\n", + "comp_line3 = pnl.Composition()\n", + "\n", + "# Create Mechanisms\n", + "input_layer_cL3 = pnl.TransferMechanism(\n", + " name='input_layer_cL3',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "\n", + "hidden_layer_cL3 = pnl.TransferMechanism(\n", + " name='hidden_layer_cL3',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "output_layer_cL3 = pnl.TransferMechanism(\n", + " name='output_layer_cL3',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "\n", + "\n", + "# Place Mechanisms in Composition\n", + "comp_line3.add_linear_processing_pathway(pathway = [input_layer_cL3, hidden_layer_cL3, output_layer_cL3])\n", + "\n", + "input_layer_cL3.reportOutputPref = True\n", + "hidden_layer_cL3.reportOutputPref = True\n", + "output_layer_cL3.reportOutputPref = True\n", + "\n", + "comp_line3.show_graph(output_fmt = 'jupyter')" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "yyYi8cMqdoYj", - "colab_type": "code", - "outputId": "0ab453d8-7705-4264-d0e5-ba96bcd07979", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 272 - } - }, - "source": [ - "# Create composition\n", - "comp_line3 = pnl.Composition()\n", - "\n", - "# Create mechanisms\n", - "input_layer_cL3 = pnl.TransferMechanism(\n", - " name='input_layer_cL3',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "\n", - "hidden_layer_cL3 = pnl.TransferMechanism(\n", - " name='hidden_layer_cL3',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "output_layer_cL3 = pnl.TransferMechanism(\n", - " name='output_layer_cL3',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "\n", - "\n", - "# Place mechanisms in composition\n", - "comp_line3.add_linear_processing_pathway(pathway = [input_layer_cL3, hidden_layer_cL3, output_layer_cL3])\n", - "\n", - "input_layer_cL3.reportOutputPref = True\n", - "hidden_layer_cL3.reportOutputPref = True\n", - "output_layer_cL3.reportOutputPref = True\n", - "\n", - "comp_line3.show_graph(output_fmt = 'jupyter')" + "output_type": "execute_result", + "data": { + "text/plain": [ + "" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n\n\n\n\nComposition-27\n\n\n\ninput_layer_cL3-3\n\ninput_layer_cL3-3\n\n\n\nhidden_layer_cL3-3\n\nhidden_layer_cL3-3\n\n\n\ninput_layer_cL3-3->hidden_layer_cL3-3\n\n\n\n\n\noutput_layer_cL3-3\n\noutput_layer_cL3-3\n\n\n\nhidden_layer_cL3-3->output_layer_cL3-3\n\n\n\n\n\n" - }, - "metadata": { - "tags": [] - }, - "execution_count": 60 - } - ] - }, + "image/svg+xml": "\n\n\n\n\n\nComposition-27\n\n\n\ninput_layer_cL3-3\n\ninput_layer_cL3-3\n\n\n\nhidden_layer_cL3-3\n\nhidden_layer_cL3-3\n\n\n\ninput_layer_cL3-3->hidden_layer_cL3-3\n\n\n\n\n\noutput_layer_cL3-3\n\noutput_layer_cL3-3\n\n\n\nhidden_layer_cL3-3->output_layer_cL3-3\n\n\n\n\n\n" + }, + "metadata": { + "tags": [] + }, + "execution_count": 60 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "v0KoxHnFdoYm", + "colab_type": "code", + "outputId": "418b710f-ba44-41ff-921c-698a99fb9ccb", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 368 + } + }, + "source": [ + "# Create Composition\n", + "comp_recur1 = pnl.Composition()\n", + "\n", + "input_r1 = pnl.TransferMechanism(\n", + " name='input_r1',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "\n", + "hidden_r1a = pnl.TransferMechanism(\n", + " name='hidden_r1a',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "hidden_r1b = pnl.TransferMechanism(\n", + " name='hidden_r1b',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "output_r1 = pnl.TransferMechanism(\n", + " name='output_r1',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "\n", + "# Place Mechanisms in Composition\n", + "comp_recur1.add_linear_processing_pathway(pathway = [input_r1, hidden_r1a, hidden_r1b, output_r1])\n", + "comp_recur1.add_linear_processing_pathway(pathway = [hidden_r1b, hidden_r1a])\n", + "\n", + "\n", + "input_r1.reportOutputPref = True\n", + "hidden_r1a.reportOutputPref = True\n", + "hidden_r1b.reportOutputPref = True\n", + "output_r1.reportOutputPref = True\n", + "\n", + "comp_recur1.show_graph(output_fmt = 'jupyter')" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "v0KoxHnFdoYm", - "colab_type": "code", - "outputId": "418b710f-ba44-41ff-921c-698a99fb9ccb", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 368 - } - }, - "source": [ - "# Create composition\n", - "comp_recur1 = pnl.Composition()\n", - "\n", - "input_r1 = pnl.TransferMechanism(\n", - " name='input_r1',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "\n", - "hidden_r1a = pnl.TransferMechanism(\n", - " name='hidden_r1a',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "hidden_r1b = pnl.TransferMechanism(\n", - " name='hidden_r1b',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "output_r1 = pnl.TransferMechanism(\n", - " name='output_r1',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "\n", - "# Place mechanisms in composition\n", - "comp_recur1.add_linear_processing_pathway(pathway = [input_r1, hidden_r1a, hidden_r1b, output_r1])\n", - "comp_recur1.add_linear_processing_pathway(pathway = [hidden_r1b, hidden_r1a])\n", - "\n", - "\n", - "input_r1.reportOutputPref = True\n", - "hidden_r1a.reportOutputPref = True\n", - "hidden_r1b.reportOutputPref = True\n", - "output_r1.reportOutputPref = True\n", - "\n", - "comp_recur1.show_graph(output_fmt = 'jupyter')" + "output_type": "execute_result", + "data": { + "text/plain": [ + "" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n\n\n\n\nComposition-28\n\n\n\ninput_r1-1\n\ninput_r1-1\n\n\n\nhidden_r1a-1\n\nhidden_r1a-1\n\n\n\ninput_r1-1->hidden_r1a-1\n\n\n\n\n\nhidden_r1b-1\n\nhidden_r1b-1\n\n\n\nhidden_r1a-1->hidden_r1b-1\n\n\n\n\n\nhidden_r1b-1->hidden_r1a-1\n\n\n\n\n\noutput_r1-1\n\noutput_r1-1\n\n\n\nhidden_r1b-1->output_r1-1\n\n\n\n\n\n" - }, - "metadata": { - "tags": [] - }, - "execution_count": 61 - } - ] - }, + "image/svg+xml": "\n\n\n\n\n\nComposition-28\n\n\n\ninput_r1-1\n\ninput_r1-1\n\n\n\nhidden_r1a-1\n\nhidden_r1a-1\n\n\n\ninput_r1-1->hidden_r1a-1\n\n\n\n\n\nhidden_r1b-1\n\nhidden_r1b-1\n\n\n\nhidden_r1a-1->hidden_r1b-1\n\n\n\n\n\nhidden_r1b-1->hidden_r1a-1\n\n\n\n\n\noutput_r1-1\n\noutput_r1-1\n\n\n\nhidden_r1b-1->output_r1-1\n\n\n\n\n\n" + }, + "metadata": { + "tags": [] + }, + "execution_count": 61 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xx0P8GajdoYt", + "colab_type": "code", + "outputId": "62ef161c-abdb-44a1-bf13-871a7370ad05", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 272 + } + }, + "source": [ + "# Create Composition\n", + "comp_multihidden = pnl.Composition()\n", + "\n", + "input_mh = pnl.TransferMechanism(\n", + " name='input_mh',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "hidden_mh_a = pnl.TransferMechanism(\n", + " name='hidden_mh_a',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "hidden_mh_b = pnl.TransferMechanism(\n", + " name='hidden_mh_b',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "hidden_mh_c = pnl.TransferMechanism(\n", + " name='hidden_mh_c',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "output_mh = pnl.TransferMechanism(\n", + " name='output_mh',\n", + " function=pnl.Linear,\n", + " default_variable=np.ones((4,)),\n", + ")\n", + "\n", + "\n", + "# Place Mechanisms in Composition\n", + "comp_multihidden.add_linear_processing_pathway(pathway = [input_mh, hidden_mh_a, output_mh])\n", + "comp_multihidden.add_linear_processing_pathway(pathway = [input_mh, hidden_mh_b, output_mh])\n", + "comp_multihidden.add_linear_processing_pathway(pathway = [input_mh, hidden_mh_c, output_mh])\n", + "\n", + "\n", + "\n", + "input_mh.reportOutputPref = True\n", + "hidden_mh_a.reportOutputPref = True\n", + "hidden_mh_b.reportOutputPref = True\n", + "hidden_mh_c.reportOutputPref = True\n", + "output_mh.reportOutputPref = True\n", + "\n", + "comp_multihidden.show_graph(output_fmt = 'jupyter')" + ], + "execution_count": 0, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "xx0P8GajdoYt", - "colab_type": "code", - "outputId": "62ef161c-abdb-44a1-bf13-871a7370ad05", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 272 - } - }, - "source": [ - "# Create composition\n", - "comp_multihidden = pnl.Composition()\n", - "\n", - "input_mh = pnl.TransferMechanism(\n", - " name='input_mh',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "hidden_mh_a = pnl.TransferMechanism(\n", - " name='hidden_mh_a',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "hidden_mh_b = pnl.TransferMechanism(\n", - " name='hidden_mh_b',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "hidden_mh_c = pnl.TransferMechanism(\n", - " name='hidden_mh_c',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "output_mh = pnl.TransferMechanism(\n", - " name='output_mh',\n", - " function=pnl.Linear,\n", - " default_variable=np.ones((4,)),\n", - ")\n", - "\n", - "\n", - "# Place mechanisms in composition\n", - "comp_multihidden.add_linear_processing_pathway(pathway = [input_mh, hidden_mh_a, output_mh])\n", - "comp_multihidden.add_linear_processing_pathway(pathway = [input_mh, hidden_mh_b, output_mh])\n", - "comp_multihidden.add_linear_processing_pathway(pathway = [input_mh, hidden_mh_c, output_mh])\n", - "\n", - "\n", - "\n", - "input_mh.reportOutputPref = True\n", - "hidden_mh_a.reportOutputPref = True\n", - "hidden_mh_b.reportOutputPref = True\n", - "hidden_mh_c.reportOutputPref = True\n", - "output_mh.reportOutputPref = True\n", - "\n", - "comp_multihidden.show_graph(output_fmt = 'jupyter')" + "output_type": "execute_result", + "data": { + "text/plain": [ + "" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "image/svg+xml": "\n\n\n\n\n\nComposition-29\n\n\n\ninput_mh-1\n\ninput_mh-1\n\n\n\nhidden_mh_a-1\n\nhidden_mh_a-1\n\n\n\ninput_mh-1->hidden_mh_a-1\n\n\n\n\n\nhidden_mh_b-1\n\nhidden_mh_b-1\n\n\n\ninput_mh-1->hidden_mh_b-1\n\n\n\n\n\nhidden_mh_c-1\n\nhidden_mh_c-1\n\n\n\ninput_mh-1->hidden_mh_c-1\n\n\n\n\n\noutput_mh-1\n\noutput_mh-1\n\n\n\nhidden_mh_a-1->output_mh-1\n\n\n\n\n\nhidden_mh_b-1->output_mh-1\n\n\n\n\n\nhidden_mh_c-1->output_mh-1\n\n\n\n\n\n" - }, - "metadata": { - "tags": [] - }, - "execution_count": 62 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eSHeXhofdoY2", - "colab_type": "text" - }, - "source": [ - "This is currently the end of the tutorial, but more content is being added weekly. For further examples, look to the Scripts folder inside your PsyNeuLink directory for a variety of functioning models." - ] + "image/svg+xml": "\n\n\n\n\n\nComposition-29\n\n\n\ninput_mh-1\n\ninput_mh-1\n\n\n\nhidden_mh_a-1\n\nhidden_mh_a-1\n\n\n\ninput_mh-1->hidden_mh_a-1\n\n\n\n\n\nhidden_mh_b-1\n\nhidden_mh_b-1\n\n\n\ninput_mh-1->hidden_mh_b-1\n\n\n\n\n\nhidden_mh_c-1\n\nhidden_mh_c-1\n\n\n\ninput_mh-1->hidden_mh_c-1\n\n\n\n\n\noutput_mh-1\n\noutput_mh-1\n\n\n\nhidden_mh_a-1->output_mh-1\n\n\n\n\n\nhidden_mh_b-1->output_mh-1\n\n\n\n\n\nhidden_mh_c-1->output_mh-1\n\n\n\n\n\n" + }, + "metadata": { + "tags": [] + }, + "execution_count": 62 } - ] + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eSHeXhofdoY2", + "colab_type": "text" + }, + "source": "This is currently the end of the tutorial, but more content is being added weekly. For further examples, look to the Scripts folder inside your PsyNeuLink directory for a variety of functioning models." + } + ] }