From 7047302cc481391e636c275e32c177b01dc1351a Mon Sep 17 00:00:00 2001 From: jdcpni Date: Mon, 12 Aug 2024 13:17:50 -0400 Subject: [PATCH] Refactor/autodiff/track pnl (#3030) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • composition.py, autodiffcomposition.py and relevant subordinate methods: - implement synch and track parameter dictionaries that are passed to relevant methods - add/rename attributes: - PytorchCompositionWrapper: - retained_outputs - retained_targets - retained_losses - _nodes_to_execute_after_gradient_calc - PytorchMechanismWrapper: - value -> output - input - add methods: - synch_with_psyneulink(): centralize copying of params and values to pnl using methods below - copy_node_variables_to_psyneulink(): centralize updating of node (mech & comp) variables in PNL - copy_node_values_to_psyneulink(): centralize updating of node (mech & comp) values in PNL - copy_results_to_psyneulink(): centralize updating of autodiffcomposition.results - retain_in_psyneulink(): centralize tracking of pytorch results in PNL using methods below - retain_torch_outputs: keeps record of targets and copies to AutodiffComposition.pytorch_targets at end of call to learn() - retain_torch_targets: keeps record of targets and copies to AutodiffComposition.pytorch_targets at end of call to learn() - retain_torch_losses: keeps record of losses and copies to AutodiffComposition.pytorch_losses at end of call to learn() • compositionrunner.py, autodiffcomposition.py, pytorchwrappers.py: - move loss tracking from parameter on autodiff to attribute on its pytorch_rep - batch_inputs(): add calls to synch_with_psyneulink() and retain_in_psyneulink() - batch_function_inputs(): - needs calls to synch_with_psyneulink() and retain_in_psyneulink() • composition.py: - run(): add _update_results() as helper method than can be overidden (e.g., by autodiffcomposition) for less frequent updating * • autodiffcomposition.py - restrict calls to copy_weights_to_psyneulink based on copy_parameters_to_psyneulink_after arg/attribute - implement handling of optimizations_per_minibatch and copy_parameters_to_psyneulink as attributes and args to learn - autodiff_training(): fix bug in call to pytorch_rep.forward() - implement synch and track Parameters - _manage_synch_and_retain_args() - run(): support specification of synch and retain args when called directly - autodiff._update_learning_parameters -> do_optimzation(): - calculates loss for current trial - calls autodiff_backward() to calculate gradients and update parameters - updates tracked_loss over triasl - autodiff_backward() -> new method that is called from do_optimization that calculates and updates the gradients - self.loss -> self.loss_function - _update_results() - overriden to call pytoch_rep.retain_for_psyneulink(RUN:trial_output) - learn(): - move tracked_loss for each minibatch from parameter on autodiff to attribute on its pytorch_rep (since that is already context dependent, and avoids calls to pnl.parameters._set on every call to forward() - synch_with_pnl_options: implement as dict to consolidate synch_projection_matrices_with_torch, synch_node_values_with_torch and synch_node_values_with_torch options passed to learning methods - retain_in_pnl_options implement as dict to consolidate retain_torch_outputs_in_results, retain_torch_targets and retain_torch_losses passed to learning methods • pytorchwrappers.py - sublcass PytorchCompositionWrapper from torch.jit.ScriptModule - retain_for_psyneulink(): implemented - stores outputs, targets, and losses from Pytorch execution for copying to PsyNeuLink at end of learn(). - PytorchMechanismWrapper: - .value -> .output - add .input - add/rename attributes: - PytorchCompositionWrapper: - retained_outputs - retained_targets - retained_losses - _nodes_to_execute_after_gradient_calc - PytorchMechanismWrapper: - value -> output - input - add methods: - synch_with_psyneulink(): centralize copying of params and values to pnl using methods below - copy_node_variables_to_psyneulink(): centralize updating of node (mech & comp) variables in PNL - copy_node_values_to_psyneulink(): centralize updating of node (mech & comp) values in PNL - copy_results_to_psyneulink(): centralize updating of autodiffcomposition.results - retain_in_psyneulink(): centralize tracking of pytorch results in PNL using methods below - retain_torch_outputs: keeps record of targets and copies to AutodiffComposition.pytorch_targets at end of call to learn() - retain_torch_targets: keeps record of targets and copies to AutodiffComposition.pytorch_targets at end of call to learn() - retain_torch_losses: keeps record of losses and copies to AutodiffComposition.pytorch_losses at end of call to learn() • pytorchEMcompositionwrapper.py - store_memory(): - implement single call to linalg over memory - only execute storage_node after last optimization_rep • keywords.py - implement LearningScale keywords class • AutoAssociativeProjection: make dependent on MaskedMappingProjection in prep for allowing lcamechanism to modulate auto/hetero parameters * fix Literals import • Factorize scripts into: - ScriptControl.py - TestParams.py - [MODEL].py --------- Co-authored-by: jdcpni --- ...m 2) - CSW using EMComposition (BACKUP).py | 433 ----------- ...Model (sim 2) - CSW using EMComposition.py | 433 ----------- ...m 2) - CSW with Integrator and Learning.py | 406 ---------- .../EGO/EGO Model - MDP OLD.py | 500 ------------ .../EGO/Tutorial/Declan's EGO Tutorial.ipynb | 399 ++++++++++ .../EGO/Using EMComposition/DeclanParams.py | 93 +++ .../EGO Model - CSW with RNN.py} | 6 +- ...EGO Model - CSW with Simple Integrator.py} | 258 +++---- .../EGO Model - Revaluation.py} | 4 +- .../{ => Using EMComposition}/Environment.py | 0 .../EGO/Using EMComposition/ScriptControl.py | 29 + .../EGO/Using EMComposition/TestParams.py | 56 ++ .../EGO/Using EMComposition/__init__.py | 0 .../EGO Model - MDP.py | 0 .../Using EpisodicMemoryMechanism/__init__.py | 0 .../EGO/__init__.py | 0 .../Models (Under Development)/nback/nback.py | 2 +- .../nback/nback_og_pnl.py | 2 +- psyneulink/core/components/component.py | 10 +- psyneulink/core/compositions/composition.py | 138 +++- psyneulink/core/compositions/showgraph.py | 7 - psyneulink/core/globals/keywords.py | 134 +++- psyneulink/core/globals/parameters.py | 2 +- .../modulatory/learning/EMstoragemechanism.py | 2 +- .../pathway/autoassociativeprojection.py | 3 +- .../compositions/autodiffcomposition.py | 724 ++++++++++++++---- .../library/compositions/compositionrunner.py | 138 +++- .../library/compositions/emcomposition.py | 6 +- .../pytorchEMcompositionwrapper.py | 29 +- .../library/compositions/pytorchshowgraph.py | 4 +- .../library/compositions/pytorchwrappers.py | 470 ++++++++++-- tests/composition/test_autodiffcomposition.py | 24 +- tests/composition/test_emcomposition.py | 12 +- tests/composition/test_report.py | 7 +- 34 files changed, 2033 insertions(+), 2298 deletions(-) delete mode 100644 Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition (BACKUP).py delete mode 100644 Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition.py delete mode 100644 Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW with Integrator and Learning.py delete mode 100644 Scripts/Models (Under Development)/EGO/EGO Model - MDP OLD.py create mode 100644 Scripts/Models (Under Development)/EGO/Tutorial/Declan's EGO Tutorial.ipynb create mode 100644 Scripts/Models (Under Development)/EGO/Using EMComposition/DeclanParams.py rename Scripts/Models (Under Development)/EGO/{EGO Model (sim 2) - CSW using EMComposition with WM.py => Using EMComposition/EGO Model - CSW with RNN.py} (98%) rename Scripts/Models (Under Development)/EGO/{EGO Model (sim 2) - CSW with Learning.py => Using EMComposition/EGO Model - CSW with Simple Integrator.py} (65%) rename Scripts/Models (Under Development)/EGO/{EGO Model (sim 1) - MDP using EMComposition.py => Using EMComposition/EGO Model - Revaluation.py} (99%) rename Scripts/Models (Under Development)/EGO/{ => Using EMComposition}/Environment.py (100%) create mode 100644 Scripts/Models (Under Development)/EGO/Using EMComposition/ScriptControl.py create mode 100644 Scripts/Models (Under Development)/EGO/Using EMComposition/TestParams.py create mode 100644 Scripts/Models (Under Development)/EGO/Using EMComposition/__init__.py rename Scripts/Models (Under Development)/EGO/{ => Using EpisodicMemoryMechanism}/EGO Model - MDP.py (100%) create mode 100644 Scripts/Models (Under Development)/EGO/Using EpisodicMemoryMechanism/__init__.py create mode 100644 Scripts/Models (Under Development)/EGO/__init__.py diff --git a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition (BACKUP).py b/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition (BACKUP).py deleted file mode 100644 index 55f44870058..00000000000 --- a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition (BACKUP).py +++ /dev/null @@ -1,433 +0,0 @@ -# Princeton University licenses this file to You under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. You may obtain a copy of the License at: -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed -# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and limitations under the License. - -# TODO: - -# ADD PREVIOUS STATES -# ADD previous_state to EM and control to support that - -# FIX: TERMINATION CONDITION IS GETTING TRIGGED AFTER 1st TRIAL - -# FOR INPUT NODES: scheduler.add_condition(A, BeforeNCalls(A,1) -# Termination: AfterNCalls(Ctl,2) - -""" -QUESTIONS: - -NOTES: - *MUST* run Experience before Predict, as the latter requires retrieved_reward to be non-zero - (from last trial of Experience) in order to know to encode the next state (see control policy) - -**Overview** ------------- - -This implements a model of... - -The model is an example of... - -The script contains methods to construct, train, and run the model, and analyze the results of its execution: - -* `construct_model `: - takes as arguments parameters used to construct the model; for convenience, defaults are defined below, - (under "Construction parameters") - -* `train_network `: - ... - -* `run_model `: - ... - -* `analyze_results `: - takes as arguments the results of executing the model, and optionally a number of trials and EGO_level to analyze; - returns... - - -**The Model** -------------- - -The model is comprised of... - -.. _EGO_Fig: - -.. figure:: _static/` `Composition`. - - -**Construction and Execution** ------------------------------- - -.. _EGO_settings: - -*Settings* -~~~~~~~~~~ - -The default parameters are ones that have been fit to empirical data concerning human performance -(taken from `Kane et al., 2007 `_). - -See "Settings for running the script" to specify whether the model is trained and/or executed when the script is run, -and whether a graphic display of the network is generated when it is constructed. - -.. _EGO_stimuli: - -*Stimuli* -~~~~~~~~~ - -Sequences of stimuli are constructed either using `SweetPea `_ -(using the script in stim/SweetPea) or replicate those used in... - - .. note:: - Use of SweetPea for stimulus generation requires it be installed:: - >> pip install sweetpea - - -.. _EGO_training: - -*Training* -~~~~~~~~~~ - -MORE HERE - -.. _EGO_execution: - -*Execution* -~~~~~~~~~~~ - -MORE HERE - -.. _EGO_methods_reference: - -**Methods Reference** ---------------------- - - -""" - -import numpy as np -from enum import IntEnum - -from psyneulink import * -from psyneulink._typing import Union, Literal -from psyneulink.core.scheduling.condition import Any, And, AllHaveRun, AtRunStart - -# Settings for running script: - -NUM_EXP_SEQS = 5 # Number of sequences to run in EXPERIENCE Phase (includes baseline + revaluation) -NUM_PRED_TRIALS = 10 # Number of trials (ROLL OUTS) to run in PREDICTION Phase - -CONSTRUCT_MODEL = True # THIS MUST BE SET TO True to run the script -DISPLAY_MODEL = ( # Only one of the following can be uncommented: - # None # suppress display of model - {} # show simple visual display of model - # {'show_node_structure': True} # show detailed view of node structures and projections -) -# RUN_MODEL = True # True => run the model -RUN_MODEL = False # False => don't run the model -EXECUTION_MODE = ExecutionMode.Python -# EXECUTION_MODE = ExecutionMode.PyTorch -ANALYZE_RESULTS = False # True => output analysis of results of run -# REPORT_OUTPUT = ReportOutput.FULL # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] -REPORT_OUTPUT = ReportOutput.OFF # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] -REPORT_PROGRESS = ReportProgress.OFF # Sets console progress bar during run -PRINT_RESULTS = False # print model.results after execution -ANIMATE = False # {UNIT:EXECUTION_SET} # Specifies whether to generate animation of execution - - -#region PARAMETERS -# ====================================================================================================================== -# PARAMETERS -# ====================================================================================================================== - -# PyTorch Version Parameters: -model_params = dict( - n_participants=58, - n_simulations = 100, # number of rollouts per participant - num_seqs = 20, # total number of sequences to be executed (used to set size of EM) - n_steps = 3, # number of steps per rollout - state_d = 7, # length of state vector - context_d = 7, # length of context vector - time_d = 25, # length of time vector - self_excitation = .25, # rate at which old context is carried over to new context - input_weight = .5, # rate at which state is integrated into new context - retrieved_context_weight = .25, # rate at which context retrieved from EM is integrated into new context - time_noise=.01,# noise std for time integrator (drift is set to 0) - state_weight = .5, # weight of the state used during memory retrieval - context_weight = .3, # weight of the context used during memory retrieval - time_weight = .2, # weight of the time used during memory retrieval - temperature = .05 # temperature of the softmax used during memory retrieval (smaller means more argmax-like -) - -# Fixed (structural) parameters: - -# Names: -MODEL_NAME = "EGO Model CSW" -STATE_INPUT_LAYER_NAME = "STATE" -CONTEXT_LAYER_NAME = 'CONTEXT' -PREVIOUS_STATE_NAME = 'PREVIOUS_STATE' -EM_NAME = "EM" -PREDICTION_LAYER_NAME = "PREDICTION" - -EMFieldsIndex = IntEnum('EMFields', - ['STATE', - 'CONTEXT', - 'PREVIOUS_STATE'], - start=0) - - -# CONSTRUCTION PARAMETERS - -# Layer sizes: -STATE_SIZE = model_params['state_d'] # length of state vector -CONTEXT_SIZE = model_params['context_d'] # length of state vector - -# Context processing: -STATE_WEIGHT = model_params['input_weight'] # rate at which external vs. memory state are integrated in context_layer -CONTEXT_INTEGRATION_RATE = model_params['retrieved_context_weight'] # rate at which retrieved context (from EM) - # is integrated into context_layer -assert (model_params['retrieved_context_weight'] + STATE_WEIGHT + CONTEXT_INTEGRATION_RATE) == 1,\ - (f"Sum of STATE_WEIGHT ({STATE_WEIGHT}), CONTEXT_INTEGRATION_RATE ({CONTEXT_INTEGRATION_RATE}), " - f"and RETRIEVED_CONTEXT_WEIGHT ({model_params['retrieved_context_weight']}) must equal 1") - -# EM retrieval -STATE_RETRIEVAL_WEIGHT = model_params['state_weight'] # weight of state field in retrieval from EM -CONTEXT_RETRIEVAL_WEIGHT = model_params['context_weight'] # weight of context field in retrieval from EM -RETRIEVAL_SOFTMAX_GAIN = 1/model_params['temperature'] # gain on softmax retrieval function - -PREVIOUS_STATE_WEIGHT = 0 - -RANDOM_WEIGHTS_INITIALIZATION=RandomMatrix(center=0.0, range=0.1) # Matrix spec used to initialize all Projections - -#endregion - -#region ENVIRONMENT -# ====================================================================================================================== -# ENVIRONMENT -# ====================================================================================================================== - -# Task environment: -NUM_STIM_PER_SEQ = model_params['n_steps'] # number of stimuli in a sequence -NUM_SEQS = model_params['num_seqs'] # total number of sequences to be executed (to set size of EM) - -STIM_SEQS = [list(range(1,NUM_STIM_PER_SEQ*2,2)), - list(range(2,NUM_STIM_PER_SEQ*2+1,2))] -CURRICULUM_TYE = 'blocked' # 'blocked' or 'interleaved' - -#endregion - -#region MODEL -# ====================================================================================================================== -# MODEL -# ====================================================================================================================== - -def construct_model(model_name:str=MODEL_NAME, - - # Inputs: - state_input_name:str=STATE_INPUT_LAYER_NAME, - state_size:int=STATE_SIZE, - - # Context processing: - context_name:str=CONTEXT_LAYER_NAME, - state_weight:Union[float,int]=STATE_WEIGHT, - context_integration_rate:Union[float,int]=CONTEXT_INTEGRATION_RATE, - - # EM: - em_name:str=EM_NAME, - retrieval_softmax_gain=RETRIEVAL_SOFTMAX_GAIN, - state_retrieval_weight:Union[float,int]=STATE_RETRIEVAL_WEIGHT, - context_retrieval_weight:Union[float,int]=CONTEXT_RETRIEVAL_WEIGHT, - previous_state_name=PREVIOUS_STATE_NAME, - previous_state_weight:Union[float,int]=PREVIOUS_STATE_WEIGHT, - - # Output / decision processing: - PREDICTION_LAYER_NAME:str=PREDICTION_LAYER_NAME, - - )->Composition: - - # Apportionment of contributions of state (actual or em) vs. context (em) to context_layer integration: - - # FIX: THIS IS FOR MDP; NEEDS TO BE REVISED FOR CSW - # state input (EXPERIENCE) -\ - # --> state_weight -------\ - # state from em (PREDICT)---/ -> * (context_integration_rate) -----\ - # /-----> context_weight ---/ --> context - # context from em --------/ (=1- state_weight) / - # /---> 1 - context_integration_rate --/ - # context from prev. cycle -------------------------/ - - assert 0 <= context_integration_rate <= 1,\ - f"context_retrieval_weight must be a number from 0 to 1" - assert 0 <= state_weight <= 1,\ - f"context_retrieval_weight must be a number from 0 to 1" - context_weight = 1 - state_weight - state_weight *= context_integration_rate - context_weight *= context_integration_rate - - # ---------------------------------------------------------------------------------------------------------------- - # ------------------------------------------------- Nodes ------------------------------------------------------ - # ---------------------------------------------------------------------------------------------------------------- - - state_input_layer = ProcessingMechanism(name=state_input_name, size=state_size) - context_layer = RecurrentTransferMechanism(name=context_name, - size=state_size, - auto=1-context_integration_rate, - hetero=0.0) - em = EMComposition(name=em_name, - memory_template=[[0] * state_size, # state - [0] * state_size, # previous state - [0] * state_size], # context - memory_fill=(0,.01), - memory_capacity=NUM_SEQS, - softmax_gain=1.0, - # Input Nodes: - field_names=[state_input_name, - previous_state_name, - context_name, - ], - field_weights=(state_retrieval_weight, - previous_state_weight, - context_retrieval_weight - ) - ) - - prediction_layer = ProcessingMechanism(name=PREDICTION_LAYER_NAME) - - - # ---------------------------------------------------------------------------------------------------------------- - # ------------------------------------------------- EGO Composition -------------------------------------------- - # ---------------------------------------------------------------------------------------------------------------- - - - EGO_comp = Composition(name=model_name, - # # Terminate a Task.PREDICT trial after prediction_layer executes if a reward is retrieved - # termination_processing={ - # # TimeScale.TRIAL: And(Condition(lambda: task_input_layer.value == Task.PREDICT), - # # Condition(lambda: retrieved_reward_layer.value), - # # JustRan(prediction_layer))} - # # CRASHES: - # # TimeScale.TRIAL: Any(And(Condition(lambda: task_input_layer.value == Task.EXPERIENCE), - # # JustRan(em)), - # # And(Condition(lambda: task_input_layer.value == Task.PREDICT), - # # Condition(lambda: retrieved_reward_layer.value), - # # JustRan(prediction_layer)))} - # TimeScale.TRIAL: Any(And(Condition(lambda: task_input_layer.value == Task.EXPERIENCE), - # AllHaveRun()), - # And(Condition(lambda: task_input_layer.value == Task.PREDICT), - # Condition(lambda: retrieved_reward_layer.value), - # AllHaveRun()))} - ) - - # Nodes not included in (decision output) Pathway specified above - EGO_comp.add_nodes([state_input_layer, context_layer, em, prediction_layer]) - - # Projections: - QUERY = ' [QUERY]' - VALUE = ' [VALUE]' - RETRIEVED = ' [RETRIEVED]' - - # EM encoding -------------------------------------------------------------------------------- - # state -> em - EGO_comp.add_projection(MappingProjection(state_input_layer, - em.nodes[state_input_name + QUERY])) - # context -> em - EGO_comp.add_projection(MappingProjection(context_layer, - em.nodes[context_name + QUERY])) - - # Inputs to Context --------------------------------------------------------------------------- - # retrieved context -> context_layer - EGO_comp.add_projection(MappingProjection(state_input_layer, - context_layer, - matrix=np.eye(STATE_SIZE) * state_weight)) - - # Response pathway --------------------------------------------------------------------------- - # retrieved state -> prediction_layer - EGO_comp.add_projection(MappingProjection(em.nodes[state_input_name + RETRIEVED], - prediction_layer)) - - - # Validate construction - assert context_layer.input_port.path_afferents[0].sender.owner == context_layer # recurrent projection - assert context_layer.input_port.path_afferents[0].parameters.matrix.get()[0][0] == 1-context_integration_rate - # assert context_layer.input_port.path_afferents[1].sender.owner == em.nodes[CONTEXT_LAYER_NAME + RETRIEVED] # - assert context_layer.input_port.path_afferents[1].sender.owner == state_input_layer # - # memory of - # context - assert context_layer.input_port.path_afferents[1].parameters.matrix.get()[0][0] == state_weight - - return EGO_comp -#endregion - - -#region SCRIPT EXECUTION -# ====================================================================================================================== -# SCRIPT EXECUTION -# ====================================================================================================================== - -if __name__ == '__main__': - model = None - - if CONSTRUCT_MODEL: - print(f'Constructing {MODEL_NAME}') - model = construct_model() - assert 'DEBUGGING BREAK POINT' - - if DISPLAY_MODEL is not None: - if model: - model.show_graph(**DISPLAY_MODEL) - else: - print("Model not yet constructed") - - if RUN_MODEL: - experience_inputs = build_experience_inputs(state_size=STATE_SIZE, - time_drift_rate=TIME_DRIFT_RATE, - num_baseline_seqs=NUM_BASELINE_SEQS, - num_revaluation_seqs=NUM_REVALUATION_SEQS, - reward_vals=REWARD_VALS, - CURRICULUM_TYE=CURRICULUM_TYE, - ratio=RATIO, - stim_seqs=STIM_SEQS) - input_layers = [TIME_INPUT_LAYER_NAME, - TASK_INPUT_LAYER_NAME, - STATE_INPUT_LAYER_NAME, - REWARD_INPUT_LAYER_NAME] - - # Experience Phase - print(f"Presenting {model.name} with {TOTAL_NUM_EXPERIENCE_STIMS} EXPERIENCE stimuli") - model.run(inputs={k: v for k, v in zip(input_layers, experience_inputs)}, - execution_mode=EXECUTION_MODE, - report_output=REPORT_OUTPUT, - report_progress=REPORT_PROGRESS) - - # Prediction Phase - prediction_inputs = build_prediction_inputs(state_size=STATE_SIZE, - time_drift_rate=TIME_DRIFT_RATE, - num_roll_outs_per_stim=int(NUM_ROLL_OUTS / 2), - stim_seqs=STIM_SEQS, - reward_vals=REWARD_VALS, - seq_type=PREDICT_SEQ_TYPE) - print(f"Running {model.name} for {NUM_ROLL_OUTS} PREDICT (ROLL OUT) trials") - model.termination_processing = { - TimeScale.TRIAL: And(Condition(lambda: model.nodes[TASK_INPUT_LAYER_NAME].value == Task.PREDICT), - Condition(lambda: model.nodes[RETRIEVED_REWARD_NAME].value), - # JustRan(model.nodes[PREDICTION_LAYER_NAME]) - AllHaveRun() - ) - } - model.run(inputs={k: v for k, v in zip(input_layers, prediction_inputs)}, - report_output=REPORT_OUTPUT, - report_progress=REPORT_PROGRESS - ) - - if PRINT_RESULTS: - print(f"Predicted reward for last stimulus: {model.results}") - #endregion \ No newline at end of file diff --git a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition.py b/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition.py deleted file mode 100644 index b26e4d07f00..00000000000 --- a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition.py +++ /dev/null @@ -1,433 +0,0 @@ -# Princeton University licenses this file to You under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. You may obtain a copy of the License at: -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed -# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and limitations under the License. - -# TODO: - -# ADD PREVIOUS STATES -# ADD next_state to EM and control to support that -# - CONTROL FLOW: -# - UPDATE CONTEXT LAYER: INTEGRATE CURRENT STATE IN CONTEXT LAYER -# - USE UPDATED CONTEXT + CURRENT STATE TO RETRIEVE PREDICTED NEXT STATE -# - GET NEXT STATE -# - ENCODE "CURRENT" (I.E., PREVIOUS) STATE + "NEXT" (NOW ACTUALLY CURRENT) STATE + CONTEXT (PRIOR TO -# INTEGRATION OF "NEXT") INTO EM - -# - CONTROL FLOW (FROM VANTAGE OF "NEXT" STATE): -# - USE CONTEXT + PREVIOUS STATE TO RETRIEVE PREDICTION OF CURRENT STATE -# - ENCODE PREVIOUS STATE + CURRENT STATE + CONTEXT INTO EM -# - UPDATE CONTEXT LAYER: INTEGRATE CURRENT STATE IN CONTEXT LAYER: -# SO: -# - EM SHOULD EXECUTE FIRST: -# - USE VALUES OF WM (PREVIOUS STATE) NODE AND CONTEXT LAYER TO RETRIEVE PREDICTED CURRENT STATE -# - ENCODE VALUES OF WM (PREVIOUS STATE), CURRENT STATE (INPUT), AND CONTEXT LAYER IN EM -# - THEN WM SHOULD EXECUTE TO UPDATE WITH CURRENT STATE (INPUT) -# - THEN CONTEXT LAYER SHOULD EXECUTE, INTEGRATING CURRENT STATE (INPUT) [OR WM] -# - LEARNING SHOULD USE CURRENT STATE AS TARGET TO TRAIN PREDICTED CURRENT STATE - - - -# FIX: TERMINATION CONDITION IS GETTING TRIGGED AFTER 1st TRIAL - -# FOR INPUT NODES: scheduler.add_condition(A, BeforeNCalls(A,1) -# Termination: AfterNCalls(Ctl,2) - -""" -QUESTIONS: - -NOTES: - *MUST* run Experience before Predict, as the latter requires retrieved_reward to be non-zero - (from last trial of Experience) in order to know to encode the next state (see control policy) - -**Overview** ------------- - -This implements a model of... - -The model is an example of... - -The script contains methods to construct, train, and run the model, and analyze the results of its execution: - -* `construct_model `: - takes as arguments parameters used to construct the model; for convenience, defaults are defined below, - (under "Construction parameters") - -* `train_network `: - ... - -* `run_model `: - ... - -* `analyze_results `: - takes as arguments the results of executing the model, and optionally a number of trials and EGO_level to analyze; - returns... - - -**The Model** -------------- - -The model is comprised of... - -.. _EGO_Fig: - -.. figure:: _static/` `Composition`. - - -**Construction and Execution** ------------------------------- - -.. _EGO_settings: - -*Settings* -~~~~~~~~~~ - -The default parameters are ones that have been fit to empirical data concerning human performance -(taken from `Kane et al., 2007 `_). - -See "Settings for running the script" to specify whether the model is trained and/or executed when the script is run, -and whether a graphic display of the network is generated when it is constructed. - -.. _EGO_stimuli: - -*Stimuli* -~~~~~~~~~ - -Sequences of stimuli are constructed either using `SweetPea `_ -(using the script in stim/SweetPea) or replicate those used in... - - .. note:: - Use of SweetPea for stimulus generation requires it be installed:: - >> pip install sweetpea - - -.. _EGO_training: - -*Training* -~~~~~~~~~~ - -MORE HERE - -.. _EGO_execution: - -*Execution* -~~~~~~~~~~~ - -MORE HERE - -.. _EGO_methods_reference: - -**Methods Reference** ---------------------- - - -""" - -import numpy as np -from enum import IntEnum - -from psyneulink import * -from psyneulink._typing import Union, Literal -from psyneulink.core.scheduling.condition import Any, And, AllHaveRun, AtRunStart - -# Settings for running script: - -NUM_EXP_SEQS = 5 # Number of sequences to run in EXPERIENCE Phase (includes baseline + revaluation) -NUM_PRED_TRIALS = 10 # Number of trials (ROLL OUTS) to run in PREDICTION Phase - -CONSTRUCT_MODEL = True # THIS MUST BE SET TO True to run the script -DISPLAY_MODEL = ( # Only one of the following can be uncommented: - # None # suppress display of model - {} # show simple visual display of model - # {'show_node_structure': True} # show detailed view of node structures and projections -) -# RUN_MODEL = True # True => run the model -RUN_MODEL = False # False => don't run the model -EXECUTION_MODE = ExecutionMode.Python -# EXECUTION_MODE = ExecutionMode.PyTorch -ANALYZE_RESULTS = False # True => output analysis of results of run -# REPORT_OUTPUT = ReportOutput.FULL # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] -REPORT_OUTPUT = ReportOutput.OFF # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] -REPORT_PROGRESS = ReportProgress.OFF # Sets console progress bar during run -PRINT_RESULTS = False # print model.results after execution -ANIMATE = False # {UNIT:EXECUTION_SET} # Specifies whether to generate animation of execution - - -#region PARAMETERS -# ====================================================================================================================== -# PARAMETERS -# ====================================================================================================================== - -# PyTorch Version Parameters: -model_params = dict( - n_participants=58, - n_simulations = 100, # number of rollouts per participant - num_seqs = 20, # total number of sequences to be executed (used to set size of EM) - n_steps = 3, # number of steps per rollout - state_d = 7, # length of state vector - context_d = 7, # length of context vector - time_d = 25, # length of time vector - self_excitation = .25, # rate at which old context is carried over to new context - integration_rate = .5, # rate at which state is integrated into new context - state_weight = .5, # weight of the state used during memory retrieval - context_weight = .3, # weight of the context used during memory retrieval - time_noise=.01,# noise std for time integrator (drift is set to 0) - temperature = .05 # temperature of the softmax used during memory retrieval (smaller means more argmax-like -) - -# Fixed (structural) parameters: - -# Names: -MODEL_NAME = "EGO Model CSW" -STATE_INPUT_LAYER_NAME = "STATE" -CONTEXT_LAYER_NAME = 'CONTEXT' -NEXT_STATE_NAME = 'NEXT_STATE' -EM_NAME = "EM" -PREDICTION_LAYER_NAME = "PREDICTION" - -EMFieldsIndex = IntEnum('EMFields', - ['STATE', - 'CONTEXT', - 'NEXT_STATE'], - start=0) - - -# CONSTRUCTION PARAMETERS - -# Layer sizes: -STATE_SIZE = model_params['state_d'] # length of state vector -CONTEXT_SIZE = model_params['context_d'] # length of state vector - -# Context processing: -INTEGRATION_RATE = model_params['integration_rate'] # rate at which state is integrated into context_layer - -# EM retrieval -STATE_RETRIEVAL_WEIGHT = model_params['state_weight'] # weight of state field in retrieval from EM -CONTEXT_RETRIEVAL_WEIGHT = model_params['context_weight'] # weight of context field in retrieval from EM -RETRIEVAL_SOFTMAX_GAIN = 1/model_params['temperature'] # gain on softmax retrieval function - -NEXT_STATE_WEIGHT = 0 - -RANDOM_WEIGHTS_INITIALIZATION=RandomMatrix(center=0.0, range=0.1) # Matrix spec used to initialize all Projections - -#endregion - -#region ENVIRONMENT -# ====================================================================================================================== -# ENVIRONMENT -# ====================================================================================================================== - -# Task environment: -NUM_STIM_PER_SEQ = model_params['n_steps'] # number of stimuli in a sequence -NUM_SEQS = model_params['num_seqs'] # total number of sequences to be executed (to set size of EM) - -STIM_SEQS = [list(range(1,NUM_STIM_PER_SEQ*2,2)), - list(range(2,NUM_STIM_PER_SEQ*2+1,2))] -CURRICULUM_TYE = 'blocked' # 'blocked' or 'interleaved' - -#endregion - -#region MODEL -# ====================================================================================================================== -# MODEL -# ====================================================================================================================== - -def construct_model(model_name:str=MODEL_NAME, - - # Inputs: - state_input_name:str=STATE_INPUT_LAYER_NAME, - state_size:int=STATE_SIZE, - - # Context processing: - context_name:str=CONTEXT_LAYER_NAME, - integration_rate:Union[float,int]=INTEGRATION_RATE, - - # EM: - em_name:str=EM_NAME, - retrieval_softmax_gain=RETRIEVAL_SOFTMAX_GAIN, - state_retrieval_weight:Union[float,int]=STATE_RETRIEVAL_WEIGHT, - context_retrieval_weight:Union[float,int]=CONTEXT_RETRIEVAL_WEIGHT, - next_state_name=NEXT_STATE_NAME, - next_state_weight:Union[float,int]=NEXT_STATE_WEIGHT, - - # Output / decision processing: - PREDICTION_LAYER_NAME:str=PREDICTION_LAYER_NAME, - - )->Composition: - - # Apportionment of contributions of state (actual or em) vs. context (em) to context_layer integration: - - - assert 0 <= integration_rate <= 1,\ - f"context_retrieval_weight must be a number from 0 to 1" - - # ---------------------------------------------------------------------------------------------------------------- - # ------------------------------------------------- Nodes ------------------------------------------------------ - # ---------------------------------------------------------------------------------------------------------------- - - state_input_layer = ProcessingMechanism(name=state_input_name, size=state_size) - context_layer = RecurrentTransferMechanism(name=context_name, - size=state_size, - auto=1-integration_rate, - hetero=0.0) - em = EMComposition(name=em_name, - memory_template=[[0] * state_size, # state - [0] * state_size, # previous state - [0] * state_size], # context - memory_fill=(0,.01), - memory_capacity=NUM_SEQS, - softmax_gain=1.0, - # Input Nodes: - field_names=[state_input_name, - next_state_name, - context_name, - ], - field_weights=(state_retrieval_weight, - next_state_weight, - context_retrieval_weight - ) - ) - - prediction_layer = ProcessingMechanism(name=PREDICTION_LAYER_NAME) - - - # ---------------------------------------------------------------------------------------------------------------- - # ------------------------------------------------- EGO Composition -------------------------------------------- - # ---------------------------------------------------------------------------------------------------------------- - - - EGO_comp = Composition(name=model_name, - # # Terminate a Task.PREDICT trial after prediction_layer executes if a reward is retrieved - # termination_processing={ - # # TimeScale.TRIAL: And(Condition(lambda: task_input_layer.value == Task.PREDICT), - # # Condition(lambda: retrieved_reward_layer.value), - # # JustRan(prediction_layer))} - # # CRASHES: - # # TimeScale.TRIAL: Any(And(Condition(lambda: task_input_layer.value == Task.EXPERIENCE), - # # JustRan(em)), - # # And(Condition(lambda: task_input_layer.value == Task.PREDICT), - # # Condition(lambda: retrieved_reward_layer.value), - # # JustRan(prediction_layer)))} - # TimeScale.TRIAL: Any(And(Condition(lambda: task_input_layer.value == Task.EXPERIENCE), - # AllHaveRun()), - # And(Condition(lambda: task_input_layer.value == Task.PREDICT), - # Condition(lambda: retrieved_reward_layer.value), - # AllHaveRun()))} - ) - - # Nodes not included in (decision output) Pathway specified above - EGO_comp.add_nodes([state_input_layer, context_layer, em, prediction_layer]) - - # Projections: - QUERY = ' [QUERY]' - VALUE = ' [VALUE]' - RETRIEVED = ' [RETRIEVED]' - - # EM encoding -------------------------------------------------------------------------------- - # state -> em - EGO_comp.add_projection(MappingProjection(state_input_layer, - em.nodes[state_input_name + QUERY])) - # context -> em - EGO_comp.add_projection(MappingProjection(context_layer, - em.nodes[context_name + QUERY])) - - # Inputs to Context --------------------------------------------------------------------------- - # retrieved context -> context_layer - EGO_comp.add_projection(MappingProjection(state_input_layer, - context_layer, - # matrix=np.eye(STATE_SIZE) * state_weight - )) - - # Response pathway --------------------------------------------------------------------------- - # retrieved state -> prediction_layer - EGO_comp.add_projection(MappingProjection(em.nodes[next_state_name + RETRIEVED], - prediction_layer)) - - - # FIX: REMAINS TO BE FIXED: - # Validate construction - assert context_layer.input_port.path_afferents[0].sender.owner == context_layer # recurrent projection - assert context_layer.input_port.path_afferents[0].parameters.matrix.get()[0][0] == 1-integration_rate - # assert context_layer.input_port.path_afferents[1].sender.owner == em.nodes[CONTEXT_LAYER_NAME + RETRIEVED] # - assert context_layer.input_port.path_afferents[1].sender.owner == state_input_layer # - # memory of context - # assert context_layer.input_port.path_afferents[1].parameters.matrix.get()[0][0] == state_weight - - return EGO_comp -#endregion - - -#region SCRIPT EXECUTION -# ====================================================================================================================== -# SCRIPT EXECUTION -# ====================================================================================================================== - -if __name__ == '__main__': - model = None - - if CONSTRUCT_MODEL: - print(f'Constructing {MODEL_NAME}') - model = construct_model() - assert 'DEBUGGING BREAK POINT' - - if DISPLAY_MODEL is not None: - if model: - model.show_graph(**DISPLAY_MODEL) - else: - print("Model not yet constructed") - - if RUN_MODEL: - experience_inputs = build_experience_inputs(state_size=STATE_SIZE, - time_drift_rate=TIME_DRIFT_RATE, - num_baseline_seqs=NUM_BASELINE_SEQS, - num_revaluation_seqs=NUM_REVALUATION_SEQS, - reward_vals=REWARD_VALS, - CURRICULUM_TYE=CURRICULUM_TYE, - ratio=RATIO, - stim_seqs=STIM_SEQS) - input_layers = [TIME_INPUT_LAYER_NAME, - TASK_INPUT_LAYER_NAME, - STATE_INPUT_LAYER_NAME, - REWARD_INPUT_LAYER_NAME] - - # Experience Phase - print(f"Presenting {model.name} with {TOTAL_NUM_EXPERIENCE_STIMS} EXPERIENCE stimuli") - model.run(inputs={k: v for k, v in zip(input_layers, experience_inputs)}, - execution_mode=EXECUTION_MODE, - report_output=REPORT_OUTPUT, - report_progress=REPORT_PROGRESS) - - # Prediction Phase - prediction_inputs = build_prediction_inputs(state_size=STATE_SIZE, - time_drift_rate=TIME_DRIFT_RATE, - num_roll_outs_per_stim=int(NUM_ROLL_OUTS / 2), - stim_seqs=STIM_SEQS, - reward_vals=REWARD_VALS, - seq_type=PREDICT_SEQ_TYPE) - print(f"Running {model.name} for {NUM_ROLL_OUTS} PREDICT (ROLL OUT) trials") - model.termination_processing = { - TimeScale.TRIAL: And(Condition(lambda: model.nodes[TASK_INPUT_LAYER_NAME].value == Task.PREDICT), - Condition(lambda: model.nodes[RETRIEVED_REWARD_NAME].value), - # JustRan(model.nodes[PREDICTION_LAYER_NAME]) - AllHaveRun() - ) - } - model.run(inputs={k: v for k, v in zip(input_layers, prediction_inputs)}, - report_output=REPORT_OUTPUT, - report_progress=REPORT_PROGRESS - ) - - if PRINT_RESULTS: - print(f"Predicted reward for last stimulus: {model.results}") - #endregion \ No newline at end of file diff --git a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW with Integrator and Learning.py b/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW with Integrator and Learning.py deleted file mode 100644 index d9e8ac79432..00000000000 --- a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW with Integrator and Learning.py +++ /dev/null @@ -1,406 +0,0 @@ -# Princeton University licenses this file to You under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. You may obtain a copy of the License at: -# http://www.apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed -# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and limitations under the License. - -# CONTROL FLOW: -# - EM EXECUTES FIRST: -# - RETRIEVES USING PREVIOUS STATE NODE AND CONTEXT (PRE-INTEGRATION) TO RETRIEVE PREDICTED CURRENT STATE -# - STORES VALUES OF PREVIOUS STATE, CURRENT STATE (INPUT) AND CONTEXT (PRE-INTEGRATION) INTO EM -# - THEN: -# - PREVIOUS_STATE EXECUTES TO GET CURRENT_STATE_INPUT (FOR RETRIEVAL ON NEXT TRIAL) -# - INTEGRATOR LAYER EXECUTES, INTEGRATING CURRENT_STATE_INPUT INTO MEMORY -# - CONTEXT LAYER EXECUTES TO GET LEARNED CONTEXT (FOR RETRIEVAL ON NEXT TRIAL) -# - PREDICTED CURRENT STATE IS COMPARED WITH ACTUAL CURRENT STATE (TARGET) TO UPDATE INTEGRATOR -> CONTEXT WEIGHTS - - -# TODO: - -# SCRIPT STUFF: -# - REPLACE INTEGRATOR RECURRENTTRANSFERMECHANISM WITH TRANSFERMECHANISM IN INTEGRATOR MODE -# OR TRY USING LCA with DECAY? -# - ADD LEARNING: -# - SET LEARNABILITY OF OUTER COMP PROJECTIONS -# - ADD PROJECTION OF CURRENT STATE TO TARGET (GOTTEN FROM LEARNING COMPONENTS) -# - DEBUG LEARNING -# PNL STUFF: -# - BUG: -# ? autodiffcomposition LINE 538: infinite while loop -# ? try taking out the integrator layer and see if it works -# ? try removing learnable attribute from projections to STORE node -# ? STORE node shows up multiple times in queue (but should be existing tests for convergence in nested) -# ? divergengence of STATE to PREVIOUS_STATE and STATE to EM projections confuses _get_backprop_pathway -# when traversing EM.input_CIM projections in depth part of search (since -# STATE->PREVIOUS_STATE->PREVIOUS_STATE [QUERY] is a valid path) even though the only one wanted for learning -# is the direct STATE->EM->STATE [VALUE] projection -# (see _get_backprop_pathway in AutodiffComposition, LINE 591 onward) -# - ADD COMMENT TO autodiffcomposition LINE 552 explaining what the subsquent block of code does -# - WRITE METHOD IN AUTODIFFCOMPOSITION to show_learning in show_graph() -# - DOCUMENT API FOR SPECIFYING PROJECTIONS TO NODES OF NESTED COMPOSITION -# (VIZ, *HAVE* TO EXPLICILTY SPECIFY PROJECTIONS TO NODES OF NESTED COMPOSITION AND ALSO INCLUDE THE NESTED COMP) - -""" -QUESTIONS: - -NOTES: - *MUST* run Experience before Predict, as the latter requires retrieved_reward to be non-zero - (from last trial of Experience) in order to know to encode the next state (see control policy) - -**Overview** ------------- - -This implements a model of... - -The model is an example of... - -The script contains methods to construct, train, and run the model, and analyze the results of its execution: - -* `construct_model `: - takes as arguments parameters used to construct the model; for convenience, defaults are defined below, - (under "Construction parameters") - -* `train_network `: - ... - -* `run_model `: - ... - -* `analyze_results `: - takes as arguments the results of executing the model, and optionally a number of trials and EGO_level to analyze; - returns... - - -**The Model** -------------- - -The model is comprised of... - -.. _EGO_Fig: - -.. figure:: _static/` `Composition`. - - -**Construction and Execution** ------------------------------- - -.. _EGO_settings: - -*Settings* -~~~~~~~~~~ - -The default parameters are ones that have been fit to empirical data concerning human performance -(taken from `Kane et al., 2007 `_). - -See "Settings for running the script" to specify whether the model is trained and/or executed when the script is run, -and whether a graphic display of the network is generated when it is constructed. - -.. _EGO_stimuli: - -*Stimuli* -~~~~~~~~~ - -Sequences of stimuli are constructed either using `SweetPea `_ -(using the script in stim/SweetPea) or replicate those used in... - - .. note:: - Use of SweetPea for stimulus generation requires it be installed:: - >> pip install sweetpea - - -.. _EGO_training: - -*Training* -~~~~~~~~~~ - -MORE HERE - -.. _EGO_execution: - -*Execution* -~~~~~~~~~~~ - -MORE HERE - -.. _EGO_methods_reference: - -**Methods Reference** ---------------------- - - -""" - -import numpy as np -import graph_scheduler as gs -from enum import IntEnum - -from psyneulink import * -from psyneulink._typing import Union, Literal - -# Settings for running script: - -MEMORY_CAPACITY = 5 -CONSTRUCT_MODEL = True # THIS MUST BE SET TO True to run the script -DISPLAY_MODEL = ( # Only one of the following can be uncommented: - None # suppress display of model - # {} # show simple visual display of model - # {'show_node_structure': True} # show detailed view of node structures and projections -) -RUN_MODEL = True # True => run the model -# RUN_MODEL = False # False => don't run the model -EXECUTION_MODE = ExecutionMode.Python -# EXECUTION_MODE = ExecutionMode.PyTorch -ANALYZE_RESULTS = False # True => output analysis of results of run -# REPORT_OUTPUT = ReportOutput.FULL # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] -REPORT_OUTPUT = ReportOutput.OFF # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] -REPORT_PROGRESS = ReportProgress.OFF # Sets console progress bar during run -PRINT_RESULTS = False # print model.results after execution -ANIMATE = False # {UNIT:EXECUTION_SET} # Specifies whether to generate animation of execution - - -#region PARAMETERS -# ====================================================================================================================== -# PARAMETERS -# ====================================================================================================================== - -# PyTorch Version Parameters: -model_params = dict( - state_d = 11, # length of state vector - previous_state_d = 11, # length of state vector - integrator_d = 11, # length of integrator vector - context_d = 11, # length of context vector - integration_rate = .69, # rate at which state is integrated into new context - state_weight = .5, # weight of the state used during memory retrieval - context_weight = .5, # weight of the context used during memory retrieval - temperature = .01 # temperature of the softmax used during memory retrieval (smaller means more argmax-like -) - -# Fixed (structural) parameters: - -# Names: -MODEL_NAME = "EGO Model CSW" -STATE_INPUT_LAYER_NAME = "STATE" -PREVIOUS_STATE_LAYER_NAME = "PREVIOUS STATE" -INTEGRATOR_LAYER_NAME = 'INTEGRATOR' -CONTEXT_LAYER_NAME = 'CONTEXT' - -EM_NAME = "EM" -PREDICTION_LAYER_NAME = "PREDICTION" - -EMFieldsIndex = IntEnum('EMFields', - ['STATE', - 'CONTEXT', - 'PREVIOUS_STATE'], - start=0) - - -# CONSTRUCTION PARAMETERS - -# Layer sizes: -STATE_SIZE = model_params['state_d'] # length of state vector -INTEGRATOR_SIZE = model_params['integrator_d'] # length of state vector -CONTEXT_SIZE = model_params['context_d'] # length of state vector - -# Context processing: -INTEGRATION_RATE = model_params['integration_rate'] # rate at which state is integrated into integrator layer - -# EM retrieval -STATE_RETRIEVAL_WEIGHT = 0 -PREVIOUS_STATE_RETRIEVAL_WEIGHT = model_params['state_weight'] # weight of state field in retrieval from EM -CONTEXT_RETRIEVAL_WEIGHT = model_params['context_weight'] # weight of context field in retrieval from EM -RETRIEVAL_SOFTMAX_GAIN = 1/model_params['temperature'] # gain on softmax retrieval function - - -RANDOM_WEIGHTS_INITIALIZATION=RandomMatrix(center=0.0, range=0.1) # Matrix spec used to initialize all Projections - -#endregion - -#region ENVIRONMENT -# ====================================================================================================================== -# ENVIRONMENT -# ====================================================================================================================== - -# Task environment: -import Environment -CURRICULUM_TYPE = 'Blocked' # 'Blocked' or 'Interleaved' -INPUTS = Environment.generate_dataset(condition=CURRICULUM_TYPE).xs.numpy()[:5] -# INPUTS = [env_inputs[i][:10] for i in range(len(env_inputs))] - - -#endregion - -#region MODEL -# ====================================================================================================================== -# MODEL -# ====================================================================================================================== - -def construct_model(model_name:str=MODEL_NAME, - - # Input layer: - state_input_name:str=STATE_INPUT_LAYER_NAME, - state_size:int=STATE_SIZE, - - # Previous state - previous_state_input_name:str=PREVIOUS_STATE_LAYER_NAME, - - # Integrator: - integrator_name:str=INTEGRATOR_LAYER_NAME, - integrator_size:int=INTEGRATOR_SIZE, - integration_rate:Union[float,int]=INTEGRATION_RATE, - - # Context representation (learned): - context_name:str=CONTEXT_LAYER_NAME, - context_size:Union[float,int]=CONTEXT_SIZE, - - # EM: - em_name:str=EM_NAME, - retrieval_softmax_gain=RETRIEVAL_SOFTMAX_GAIN, - state_retrieval_weight:Union[float,int]=STATE_RETRIEVAL_WEIGHT, - previous_state_retrieval_weight:Union[float,int]=PREVIOUS_STATE_RETRIEVAL_WEIGHT, - context_retrieval_weight:Union[float,int]=CONTEXT_RETRIEVAL_WEIGHT, - - # Output / decision processing: - prediction_layer_name:str=PREDICTION_LAYER_NAME, - - )->Composition: - - assert 0 <= integration_rate <= 1,\ - f"integrator_retrieval_weight must be a number from 0 to 1" - - # ---------------------------------------------------------------------------------------------------------------- - # ------------------------------------------------- Nodes ------------------------------------------------------ - # ---------------------------------------------------------------------------------------------------------------- - - state_input_layer = ProcessingMechanism(name=state_input_name, size=state_size) - previous_state_layer = ProcessingMechanism(name=previous_state_input_name, size=state_size) - integrator_layer = RecurrentTransferMechanism(name=integrator_name, - function=Tanh, - size=integrator_size, - auto=1-integration_rate, - hetero=0.0) - # integrator_layer = TransferMechanism(name=integrator_name, - # function=Tanh, - # size=integrator_size - # ) - context_layer = ProcessingMechanism(name=context_name, size=context_size) - - em = EMComposition(name=em_name, - memory_template=[[0] * state_size, # state - [0] * state_size, # previous state - [0] * state_size], # context - # memory_fill=(0,.01), - memory_capacity=MEMORY_CAPACITY, - memory_decay_rate=0, - softmax_gain=1.0, - # Input Nodes: - field_names=[state_input_name, - previous_state_input_name, - context_name, - ], - field_weights=(state_retrieval_weight, - previous_state_retrieval_weight, - context_retrieval_weight - ), - # enable_learning=True, - learn_field_weights=False - ) - - prediction_layer = ProcessingMechanism(name=prediction_layer_name, size=state_size) - - - # ---------------------------------------------------------------------------------------------------------------- - # ------------------------------------------------- EGO Composition -------------------------------------------- - # ---------------------------------------------------------------------------------------------------------------- - - QUERY = ' [QUERY]' - VALUE = ' [VALUE]' - RETRIEVED = ' [RETRIEVED]' - - # Pathways - state_to_previous_state_pathway = [state_input_layer, previous_state_layer] - state_to_integrator_pathway = [state_input_layer, - np.eye(STATE_SIZE) * integration_rate, - integrator_layer] - state_to_em_pathway = [state_input_layer, - MappingProjection(state_input_layer, em.nodes[state_input_name+VALUE]), - em] - previous_state_to_em_pathway = [previous_state_layer, - MappingProjection(previous_state_layer, em.nodes[previous_state_input_name+QUERY]), - em] - context_learning_pathway = [integrator_layer, - context_layer, - MappingProjection(context_layer, em.nodes[context_name + QUERY]), - em, - MappingProjection(em.nodes[state_input_name + RETRIEVED], prediction_layer), - prediction_layer] - - # Composition - EGO_comp = AutodiffComposition([state_to_previous_state_pathway, - state_to_integrator_pathway, - state_to_em_pathway, - previous_state_to_em_pathway, - context_learning_pathway], - name=model_name) - - # EGO_comp.show_graph(show_learning=True) - - # Ensure EM is executed (to encode previous state and context, and predict current state) - # before updating state and context - EGO_comp.scheduler.add_condition(em, BeforeNodes(previous_state_layer, integrator_layer)) - - # Validate construction - assert integrator_layer.input_port.path_afferents[0].sender.owner == integrator_layer # recurrent projection - assert integrator_layer.input_port.path_afferents[0].parameters.matrix.get()[0][0] == 1-integration_rate - assert integrator_layer.input_port.path_afferents[1].sender.owner == state_input_layer # - - return EGO_comp -#endregion - - -#region SCRIPT EXECUTION -# ====================================================================================================================== -# SCRIPT EXECUTION -# ====================================================================================================================== - -if __name__ == '__main__': - model = None - - if CONSTRUCT_MODEL: - print(f'Constructing {MODEL_NAME}') - model = construct_model() - assert 'DEBUGGING BREAK POINT' - # print(model.scheduler.consideration_queue) - # gs.output_graph_image(model.scheduler.graph, 'EGO_comp-scheduler.png') - - if DISPLAY_MODEL is not None: - if model: - model.show_graph(**DISPLAY_MODEL) - else: - print("Model not yet constructed") - - if RUN_MODEL: - # print("MODEL NOT YET FULLY EXECUTABLE") - print(f'Running {MODEL_NAME}') - # model.run(inputs={STATE_INPUT_LAYER_NAME:INPUTS}, - # # report_output=REPORT_OUTPUT, - # # report_progress=REPORT_PROGRESS - # ) - model.learn(inputs={STATE_INPUT_LAYER_NAME:INPUTS}, - # report_output=REPORT_OUTPUT, - # report_progress=REPORT_PROGRESS - ) - print(model.nodes['EM'].parameters.memory.get(context=MODEL_NAME)) - - if PRINT_RESULTS: - print("MODEL NOT YET FULLY EXECUTABLE SO NO RESULTS") - #endregion diff --git a/Scripts/Models (Under Development)/EGO/EGO Model - MDP OLD.py b/Scripts/Models (Under Development)/EGO/EGO Model - MDP OLD.py deleted file mode 100644 index b12538e4488..00000000000 --- a/Scripts/Models (Under Development)/EGO/EGO Model - MDP OLD.py +++ /dev/null @@ -1,500 +0,0 @@ -""" - -FIX: THIS VERSION HAS ONLY PARTIAL CONTROLLER - - -- - -**Overview** ------------- - -This implements a model of... - -The model is an example of... - -The script contains methods to construct, train, and run the model, and analyze the results of its execution: - -* `construct_model `: - takes as arguments parameters used to construct the model; for convenience, defaults are defined below, - (under "Construction parameters") - -* `train_network `: - takes as arguments the feedforward neural network Composition (FFN_COMPOSITION) and number of epochs to train. - Note: learning_rate is set at construction (can specify using LEARNING_RATE under "Training parameters" below). - -* `run_model `: - takes as arguments the drift rate in the temporal context vector to be applied on each trial, - and the number of trials to execute, as well as reporting and animation specifications - (see "Execution parameters"). - -* `analyze_results `: - takes as arguments the results of executing the model, and optionally a number of trials and EGO_level to analyze; - returns d-prime statistics and plots results for different conditions at each EGO_level executed. - - -**The Model** -------------- - -The model is comprised of... - -.. _EGO_Fig: - -.. figure:: _static/N-Back_Model_movie.gif - :align: left - :alt: N-Back Model Animation - -.. _EGO_model_composition: - -*EGO_model Composition* -~~~~~~~~~~~~~~~~~~~~~~~~~ - -This is comprised of three input Mechanisms, and the nested `ffn ` `Composition`. - -.. _EGO_ffn_composition: - -*FFN Composition* -~~~~~~~~~~~~~~~~~ - -The temporal context is provided by a randomly drifting high dimensional vector that maintains a constant norm (i.e., -drifts on a sphere). The FFN is trained, given an n-back level of *n*, to identify when the current stimulus matches -one stored in EM with a temporal context vector that differs by an amount corresponding to *n* time steps of drift. -During n-back performance, the model encodes the current stimulus and temporal context, retrieves an item from EM -that matches the current stimulus, weighted by the similarity of its temporal context vector (i.e., most recent), and -then uses the FFN to evaluate whether it is an n-back match. The model responds "match" if the FFN detects a match; -otherwise, it either uses the current stimulus and temporal context to retrieve another sample from EM and repeat the -evaluation or, with a fixed probability (hazard rate), it responds "non-match". - -The ffn Composition is trained using the train_network() method - - -**Construction and Execution** ------------------------------- - -.. _EGO_settings: - -*Settings* -~~~~~~~~~~ - -The default parameters are ones that have been fit to empirical data concerning human performance -(taken from `Kane et al., 2007 `_). - -See "Settings for running the script" to specify whether the model is trained and/or executed when the script is run, -and whether a graphic display of the network is generated when it is constructed. - -.. _EGO_stimuli: - -*Stimuli* -~~~~~~~~~ - -Sequences of stimuli are constructed either using `SweetPea `_ -(using the script in stim/SweetPea) or replicate those used in the study by `Kane et al., -2007 `_ (from stimulus files in stim/Kane_et_al). - - .. note:: - Use of SweetPea for stimulus generation requires it be installed:: - >> pip install sweetpea - -.. _EGO_training: - -*Training* -~~~~~~~~~~ - -MORE HERE - -.. _EGO_execution: - -*Execution* -~~~~~~~~~~~ - -MORE HERE - -.. _EGO_methods_reference: - -**Methods Reference** ---------------------- - - -""" - -import os -import random -import time -import timeit -import numpy as np -from typing import Union -from enum import Enum, IntEnum -from pathlib import Path - -from graph_scheduler import * - -from psyneulink import * - -# Settings for running script: -CONSTRUCT_MODEL = True # THIS MUST BE SET TO True to run the script -DISPLAY_MODEL = ( # Only one of the following can be uncommented: - # None # suppress display of model - {} # show simple visual display of model - # {'show_node_structure': True} # show detailed view of node structures and projections -) -RUN_MODEL = False # True => run the model -ANALYZE_RESULTS = False # True => output analysis of results of run -REPORT_OUTPUT = ReportOutput.ON # Sets console output during run -REPORT_PROGRESS = ReportProgress.OFF # Sets console progress bar during run -ANIMATE = False # {UNIT:EXECUTION_SET} # Specifies whether to generate animation of execution - -#region ========================================= PARAMETERS =========================================================== - -# Fixed (structural) parameters: - -# Names: -MODEL_NAME = "EGO Model" -TASK_INPUT_LAYER_NAME = "TASK" -STATE_INPUT_LAYER_NAME = "STATE" -TIME_INPUT_LAYER_NAME = "TIME" -ATTENTION_LAYER_NAME = "STATE ATTENTION" -ATTENTIONAL_CONTROL_LAYER_NAME = "ATTENTIONAL CONTROL" -ACTUAL_STATE_INPUT = 'ACTUAL_STATE_INPUT' -RETRIEVED_STATE_INPUT = 'RETRIEVED_STATE' -CONTEXT_LAYER_NAME = 'CONTEXT' -REWARD_INPUT_LAYER_NAME = "REWARD" -RETRIEVED_TIME_NAME = "RETRIEVED TIME" -RETRIEVED_REWARD_NAME = "RETRIEVED REWARD" -EM_NAME = "EPISODIC MEMORY" -DECISION_LAYER_NAME = "DECISION" - -class Task(IntEnum): - EXPERIENCE = 0 - PREDICT = 1 - -# CONSTRUCTION PARAMETERS - -# Layer sizes: -TASK_SIZE = 1 # length of task vector -STATE_SIZE = 8 # length of state vector -TIME_SIZE = 25 # length of time vector -REWARD_SIZE = 1 # length of reward vector -DECISION_SIZE = 2 # length of decision vector - -# Context processing: -STATE_WEIGHT = .1 # rate at which actual vs. retrieved state (from EM) are integrated in context_layer -CONTEXT_INTEGRATION_RATE = .1 # rate at which retrieved context (from EM) is integrated into context_layer -TIME_DRIFT_NOISE = 0.0 # noise used by DriftOnASphereIntegrator (function of Context mech) - -# EM retrieval -STATE_RETRIEVAL_WEIGHT = 1 # weight of state field in retrieval from EM -TIME_RETRIEVAL_WEIGHT = 1 # weight of time field in retrieval from EM -CONTEXT_RETRIEVAL_WEIGHT = 1 # weight of context field in retrieval from EM -REWARD_RETRIEVAL_WEIGHT = 0 # weight of reward field in retrieval from EM -RETRIEVAL_SOFTMAX_GAIN = 10 # gain on softmax retrieval function -# RETRIEVAL_HAZARD_RATE = 0.04 # rate of re=sampling of em following non-match determination in a pass through ffn - -RANDOM_WEIGHTS_INITIALIZATION=RandomMatrix(center=0.0, range=0.1) # Matrix spec used to initialize all Projections - -# Execution parameters: - -# Temporal context vector generation as input to time_input_layer of model -CONTEXT_DRIFT_RATE=.1 # drift rate used for DriftOnASphereIntegrator (function of Context mech) on each trial -time_fct = DriftOnASphereIntegrator(initializer=np.random.random(TIME_SIZE - 1), - noise=TIME_DRIFT_NOISE, - dimension=TIME_SIZE) -# Task environment: -NUM_EXPERIENCE_TRIALS = 9 # number of trials for Task.EXPERIENCE (passive encoding into EM) -NUM_PREDICT_TRIALS = 9 # number of trials Task.PREDICT (active retrieval from EM and reward prediction) -NUM_ROLL_OUT = 3 # number of trials of roll-out under OCM control -NUM_TRIALS = NUM_EXPERIENCE_TRIALS + NUM_PREDICT_TRIALS # total number of trials -assert NUM_PREDICT_TRIALS % NUM_ROLL_OUT == 0, \ - f"NUM_PREDICT_TRIALS ({NUM_PREDICT_TRIALS}) " \ - f"must be evenly divisible by NUM_ROLL_OUT ({NUM_ROLL_OUT})" - -inputs = {STATE_INPUT_LAYER_NAME: [[1],[2],[3]] * STATE_SIZE * NUM_TRIALS, - TIME_INPUT_LAYER_NAME: np.array([time_fct(i) for i in range(NUM_TRIALS)]).reshape(NUM_TRIALS,TIME_SIZE,1), - REWARD_INPUT_LAYER_NAME: [[0],[0],[1]] * REWARD_SIZE * NUM_TRIALS, - TASK_INPUT_LAYER_NAME: [[Task.EXPERIENCE.value]] * NUM_EXPERIENCE_TRIALS - + [[Task.PREDICT.value]] * NUM_PREDICT_TRIALS} -def gen_baseline_trials_exp1(dim=STATE_SIZE, num_trials=NUM_EXPERIENCE_TRIALS): - # Generate one-hots - state_reps = np.eye(dim) - visited_states, rewards = [], [] - - for trial_idx in range(num_trials): - if np.random.random()<.5: - visited_states.extend([1,3,5]) - rewards.extend([0,0,10]) - else: - visited_states.extend([2,4,6]) - rewards.extend([0,0,1]) - - # Pick one-hots corresponding to each state - visited_states = state_reps[visited_states] - rewards = np.array(rewards) - - return visited_states, rewards -def gen_reward_revaluation_trials_exp1(dim=STATE_SIZE, num_trials=NUM_PREDICT_TRIALS): - # Generate one-hots - state_reps = np.eye(dim) - visited_states, rewards = [], [] - - for trial_idx in range(num_trials): - if np.random.random()<.5: - visited_states.extend([3,5]) - rewards.extend([0,1]) - else: - visited_states.extend([4,6]) - rewards.extend([0,10]) - - # Pick one-hots corresponding to each state - visited_states = state_reps[visited_states] - rewards = np.array(rewards) - - return visited_states, rewards - -assert True - -def construct_model(model_name:str=MODEL_NAME, - - # Inputs: - task_input_name:str=TASK_INPUT_LAYER_NAME, - task_size:int=1, - state_input_name:str=STATE_INPUT_LAYER_NAME, - state_size:int=STATE_SIZE, - time_input_name:str=TIME_INPUT_LAYER_NAME, - time_size:int=TIME_SIZE, - reward_input_name = REWARD_INPUT_LAYER_NAME, - reward_size:int=REWARD_SIZE, - - # Context processing: - attention_layer_name=ATTENTION_LAYER_NAME, - attentional_control_name=ATTENTIONAL_CONTROL_LAYER_NAME, - context_name:str=CONTEXT_LAYER_NAME, - state_weight:Union[float,int]=STATE_WEIGHT, - context_integration_rate:Union[float,int]=CONTEXT_INTEGRATION_RATE, - - # EM: - em_name:str=EM_NAME, - retrieval_softmax_gain=RETRIEVAL_SOFTMAX_GAIN, - # retrieval_hazard_rate=RETRIEVAL_HAZARD_RATE, - state_retrieval_weight:Union[float,int]=STATE_RETRIEVAL_WEIGHT, - time_retrieval_weight:Union[float,int]=TIME_RETRIEVAL_WEIGHT, - context_retrieval_weight:Union[float,int]=CONTEXT_RETRIEVAL_WEIGHT, - reward_retrieval_weight:Union[float,int]=REWARD_RETRIEVAL_WEIGHT, - # retrieved_time_name:str=RETRIEVED_TIME_NAME, - retrieved_reward_name:str=RETRIEVED_REWARD_NAME, - - # Output / decision processing: - decision_layer_name:str=DECISION_LAYER_NAME, - decision_size:int=DECISION_SIZE, - - )->Composition: - - # Apportionment of contributions of state (actual or em) vs. context (em) to context_layer integration: - - # state input (EXPERIENCE) -\ - # --> state_weight -------\ - # state from em (PREDICT)---/ -> * (context_integration_rate) -----\ - # /-----> context_weight ---/ --> context - # context from em --------/ (=1- state_weight) / - # /---> 1 - context_integration_rate --/ - # context from prev. cycle -------------------------/ - - assert 0 <= context_integration_rate <= 1,\ - f"context_retrieval_weight must be a number from 0 to 1" - assert 0 <= state_weight <= 1,\ - f"context_retrieval_weight must be a number from 0 to 1" - context_weight = 1 - state_weight - state_weight *= context_integration_rate - context_weight *= context_integration_rate - - task_input_layer = ProcessingMechanism(name=task_input_name, - size=task_size) - - state_input_layer = ProcessingMechanism(name=state_input_name, - size=state_size) - - time_input_layer = ProcessingMechanism(name=time_input_name, - size=time_size) - - context_layer = RecurrentTransferMechanism(name=context_name, - size=state_size, - auto=1-context_integration_rate, - hetero=0.0) - - reward_input_layer = ProcessingMechanism(name=reward_input_name, - size=reward_size) - - attention_layer = ProcessingMechanism(name=ATTENTION_LAYER_NAME, - size=(state_size,state_size), - input_ports=[ACTUAL_STATE_INPUT, RETRIEVED_STATE_INPUT], - function=LinearCombination) - - # retrieved_time_layer = TransferMechanism(name=retrieved_time_name, - # size=time_size) - - retrieved_reward_layer = TransferMechanism(name=retrieved_reward_name, - size=reward_size) - - em = EpisodicMemoryMechanism(name=em_name, - input_ports=[{NAME:state_input_name, SIZE:state_size}, - {NAME:time_input_name, SIZE:time_size}, - {NAME:context_name, SIZE:state_size}, - {NAME:reward_input_name, SIZE:reward_size} - ], - function=ContentAddressableMemory( - initializer=[[0] * state_size, # state - [0] * time_size, # time - [0] * state_size, # context - [0] * reward_size], # reward - distance_field_weights=[state_retrieval_weight, - time_retrieval_weight, - context_retrieval_weight, - reward_retrieval_weight], - selection_function=SoftMax(gain=retrieval_softmax_gain))) - - decision_layer = TransferMechanism(name=decision_layer_name, - size=decision_size, - function=SoftMax(output=PROB)) - - def encoding_control_function(variable,context): - """Used by attention_layer to control encoding of state info in context_layer and storing in EM - - If task is: - - Task.EXPERIENCE (0): - - stores state info in em on every trial (control_signal[0]=1) - - always attend to actual state (control_signal[1]=1, control_signal[2]=0) - - Task.PREDICT: (1): - - never store info in em (control_signal[0]=0) - - attend to actual state on first trial (control_signal[1]=1, control_signal[2]=0) - - attend to retrieved state on all subsequent trials (control_signal[1]=0, control_signal[2]=1) - - Returns: - control_signal[0]: 1 if store, 0 otherwise - control_signal[1]: 1 if attend to actual state, 0 otherwise - control_signal[2]: 1 if attend to retrieved state, 0 otherwise - """ - - # Get task and trial number - task = int(variable) - if context and context.composition: - trial = int([context.composition.get_current_execution_time(context)[TimeScale.TRIAL]]) - else: - trial = 0 - - # if task == Task.EXPERIENCE: - # attend_actual = 1 - # elif task == Task.PREDICT: - # attend_actual = 1 if not (trial % NUM_ROLL_OUT) else 1 - # attend_retrieved = 1 if (trial % NUM_ROLL_OUT) else 0 - # else: - # raise ValueError(f"Unrecognized task value in encoding_control_function: {task}") - # - # # Store to EM to - # store = 1 if task == Task.EXPERIENCE.value else 0 - - if task == Task.EXPERIENCE.value: - attend_actual = 1 - store = 1 - - # FIX: ADD CONNECTION FROM REWARD RETRIEVAL TO CONTROLLER - # ADD COUNTER - # ADD CONTROL SIGNAL FOR GATING TO COUNTER AND DECISION - # MAKE DECISION A DDM (OR SIMPLE INTEGRATOR) - # ADD TERMINATION CONDITION FOR TRIAL EITHER: - # - FOR WHEN COUNTER == (or %) NUM_ROLL_OUTS (AND RESET DECISION LAYER AT TRIAL START) - # - OR OUTPUT GATE DECISION TO RESPONSE NODE, AND PUT TERMINATION ON RESPONSE NODE > 0 - - if task == Task.PREDICT.value: - attend_actual = 0 if trial % NUM_ROLL_OUT else 1 - attend_retrieved = 1 if trial % NUM_ROLL_OUT else 0 - store = 0 - - control_signals = [store, attend_actual, attend_retrieved] - - return control_signals - - # Control Mechanism - # Uses the encoding_control_function (see above) to control: - # - encoding of state info in context_layer (from stimulus vs. em) - # - storage of info in em - attentional_control_layer = ControlMechanism(name=attentional_control_name, - monitor_for_control=task_input_layer, - function = encoding_control_function, - control=[(STORAGE_PROB, em), - attention_layer.input_ports[ACTUAL_STATE_INPUT], - attention_layer.input_ports[RETRIEVED_STATE_INPUT]]) - - EGO_comp = Composition(name=model_name, - pathways=[retrieved_reward_layer, decision_layer], # Decision - # # Use this to terminate a Task.PREDICT trial - termination_processing={ - TimeScale.TRIAL: And(WhenFinished(decision_layer), - )} - ) - - # Nodes not included in (decision output) Pathway specified above - EGO_comp.add_nodes([task_input_layer, - state_input_layer, - time_input_layer, - attention_layer, - attentional_control_layer, - context_layer, - reward_input_layer, - # retrieved_time_layer, - em]) - EGO_comp.exclude_node_roles(task_input_layer, NodeRole.OUTPUT) - - # Projections not included in (decision output) Pathway specified above - # EM encoding - EGO_comp.add_projection(MappingProjection(state_input_layer, em.input_ports[STATE_INPUT_LAYER_NAME])) - EGO_comp.add_projection(MappingProjection(time_input_layer, em.input_ports[TIME_INPUT_LAYER_NAME])) - EGO_comp.add_projection(MappingProjection(context_layer, em.input_ports[CONTEXT_LAYER_NAME])) - EGO_comp.add_projection(MappingProjection(reward_input_layer, em.input_ports[REWARD_INPUT_LAYER_NAME])) - - # Inputs to Context - # actual state -> attention_layer - EGO_comp.add_projection(MappingProjection(state_input_layer, - attention_layer.input_ports[ACTUAL_STATE_INPUT])) - # retrieved state -> attention_layer - EGO_comp.add_projection(MappingProjection(em.output_ports[f'RETRIEVED_{STATE_INPUT_LAYER_NAME}'], - attention_layer.input_ports[RETRIEVED_STATE_INPUT])) - # attention_layer -> context_layer - EGO_comp.add_projection(MappingProjection(attention_layer, - context_layer, - matrix=np.eye(STATE_SIZE) * state_weight)) - # retrieved context -> context_layer - EGO_comp.add_projection(MappingProjection(em.output_ports[f'RETRIEVED_{CONTEXT_LAYER_NAME}'], - context_layer, - matrix=np.eye(STATE_SIZE) * context_weight)) - - # Rest of EM retrieval - # EGO_comp.add_projection(MappingProjection(em.output_ports[f'RETRIEVED_{TIME_INPUT_LAYER_NAME}'], - # retrieved_time_layer)), - EGO_comp.add_projection(MappingProjection(em.output_ports[f'RETRIEVED_{REWARD_INPUT_LAYER_NAME}'], - retrieved_reward_layer)) - - # Validate construction - assert context_layer.input_port.path_afferents[0].sender.owner == context_layer - assert context_layer.input_port.path_afferents[0].parameters.matrix.get()[0][0] == 1-context_integration_rate - assert context_layer.input_port.path_afferents[1].sender.owner == attention_layer - assert context_layer.input_port.path_afferents[1].parameters.matrix.get()[0][0] == state_weight - assert context_layer.input_port.path_afferents[2].sender.owner == em - assert context_layer.input_port.path_afferents[2].parameters.matrix.get()[0][0] == context_weight - - print(f'{model_name} constructed') - return EGO_comp - -# Script execution: - -model = None - -if CONSTRUCT_MODEL: - model = construct_model() - -if DISPLAY_MODEL is not None: - if model: - model.show_graph(**DISPLAY_MODEL) - else: - print("Model not yet constructed") - -if RUN_MODEL: - model.run(inputs=inputs) diff --git a/Scripts/Models (Under Development)/EGO/Tutorial/Declan's EGO Tutorial.ipynb b/Scripts/Models (Under Development)/EGO/Tutorial/Declan's EGO Tutorial.ipynb new file mode 100644 index 00000000000..32106c057de --- /dev/null +++ b/Scripts/Models (Under Development)/EGO/Tutorial/Declan's EGO Tutorial.ipynb @@ -0,0 +1,399 @@ +{ + "cells": [ + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-08-11T16:39:44.885605Z", + "start_time": "2024-08-11T16:39:44.093609Z" + } + }, + "source": [ + "# reload modules before executing code so we can modify modules and test without restarting kernel\n", + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "import sys\n", + "import warnings\n", + "sys.path.append('..')\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.patches import Patch\n", + "import numpy as np\n", + "import pandas as pd\n", + "from scipy.stats import ttest_ind\n", + "import seaborn as sns\n", + "from sklearn.metrics.pairwise import cosine_similarity\n", + "import torch\n", + "from torch import nn\n", + "from torch.utils.data import DataLoader\n", + "from tqdm import tqdm\n", + "\n", + "import run as run\n", + "from models import *\n", + "import utils" + ], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'seaborn'", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mModuleNotFoundError\u001B[0m Traceback (most recent call last)", + "\u001B[0;32m/var/folders/6s/88zfvkmj43xftjg_1tf_pfkc0000gp/T/ipykernel_80467/2553525170.py\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 13\u001B[0m \u001B[0;32mimport\u001B[0m \u001B[0mpandas\u001B[0m \u001B[0;32mas\u001B[0m \u001B[0mpd\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 14\u001B[0m \u001B[0;32mfrom\u001B[0m \u001B[0mscipy\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mstats\u001B[0m \u001B[0;32mimport\u001B[0m \u001B[0mttest_ind\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m---> 15\u001B[0;31m \u001B[0;32mimport\u001B[0m \u001B[0mseaborn\u001B[0m \u001B[0;32mas\u001B[0m \u001B[0msns\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 16\u001B[0m \u001B[0;32mfrom\u001B[0m \u001B[0msklearn\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mmetrics\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mpairwise\u001B[0m \u001B[0;32mimport\u001B[0m \u001B[0mcosine_similarity\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 17\u001B[0m \u001B[0;32mimport\u001B[0m \u001B[0mtorch\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;31mModuleNotFoundError\u001B[0m: No module named 'seaborn'" + ] + } + ], + "execution_count": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "#### 1. Load the EGO model and initialize its parameters." + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-08-11T16:39:19.926857Z", + "start_time": "2024-08-11T16:39:19.906657Z" + } + }, + "source": [ + "from PIL import Image\n", + "# Display the EGO model architecture\n", + "model_image = Image.open('ego_model.png')\n", + "display(model_image)" + ], + "outputs": [ + { + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: 'ego_model.png'", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mFileNotFoundError\u001B[0m Traceback (most recent call last)", + "\u001B[0;32m/var/folders/6s/88zfvkmj43xftjg_1tf_pfkc0000gp/T/ipykernel_80467/384252142.py\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 1\u001B[0m \u001B[0;32mfrom\u001B[0m \u001B[0mPIL\u001B[0m \u001B[0;32mimport\u001B[0m \u001B[0mImage\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 2\u001B[0m \u001B[0;31m# Display the EGO model architecture\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m----> 3\u001B[0;31m \u001B[0mmodel_image\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mImage\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mopen\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0;34m'ego_model.png'\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 4\u001B[0m \u001B[0mdisplay\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mmodel_image\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;32m/opt/anaconda3/envs/python39/lib/python3.9/site-packages/PIL/Image.py\u001B[0m in \u001B[0;36mopen\u001B[0;34m(fp, mode, formats)\u001B[0m\n\u001B[1;32m 2973\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 2974\u001B[0m \u001B[0;32mif\u001B[0m \u001B[0mfilename\u001B[0m\u001B[0;34m:\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m-> 2975\u001B[0;31m \u001B[0mfp\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mbuiltins\u001B[0m\u001B[0;34m.\u001B[0m\u001B[0mopen\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mfilename\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0;34m\"rb\"\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 2976\u001B[0m \u001B[0mexclusive_fp\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0;32mTrue\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 2977\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;31mFileNotFoundError\u001B[0m: [Errno 2] No such file or directory: 'ego_model.png'" + ] + } + ], + "execution_count": 1 + }, + { + "cell_type": "code", + "metadata": { + "ExecuteTime": { + "end_time": "2024-08-11T16:39:31.849095Z", + "start_time": "2024-08-11T16:39:31.839877Z" + } + }, + "source": [ + "def prep_recurrent_network(rnet, state_d, persistance=-0.6):\n", + " '''Prepare a recurrent context module that functions as a leaky integrator of the input state.\n", + " '''\n", + " with torch.no_grad():\n", + " # Most weights/biases are set to zero or identity matrices here, except for the learnable output from context to EM.\n", + " rnet.state_to_hidden.weight.copy_(torch.eye(state_d, dtype=torch.float))\n", + " rnet.state_to_hidden.bias.zero_()\n", + " rnet.hidden_to_hidden.weight.zero_()\n", + " rnet.hidden_to_hidden.bias.zero_()\n", + " rnet.state_to_hidden_wt.weight.zero_()\n", + " # Set the integration constant (not exactly a leaky integrator, but close enough)\n", + " rnet.state_to_hidden_wt.bias.copy_(torch.ones((len(rnet.state_to_hidden_wt.bias),), dtype=torch.float) * persistance)\n", + " rnet.hidden_to_hidden_wt.weight.zero_()\n", + " rnet.hidden_to_hidden_wt.bias.zero_()\n", + " # Set hidden to context weights as an identity matrix.\n", + " rnet.hidden_to_context.weight.copy_(torch.eye(state_d, dtype=torch.float))\n", + " rnet.hidden_to_context.bias.zero_()\n", + "\n", + " # Set requires_grad to True for hidden_to_context.weight before freezing other parameters\n", + " rnet.hidden_to_context.weight.requires_grad = True\n", + " rnet.hidden_to_context.bias.requires_grad = True\n", + "\n", + " # Freeze recurrent weights to stabilize training\n", + " for name, p in rnet.named_parameters():\n", + " if 'hidden_to_context' not in name:\n", + " p.requires_grad = False\n", + " else:\n", + " p.requires_grad = True\n", + " return rnet\n", + "\n", + "# Hyperparameters for the CSW experiments.\n", + "softmax_temperature = 0.1\n", + "state_d = 11 # dimensionality of the input state vector\n", + "context_d = 11 # dimensionality of the context vector (should be the same as the state vector for these experiments)\n", + "persistance = -0.8 # how much of the incoming state information is integrated into the context\n", + "\n", + "# Initialize the recurrent context module.\n", + "context_module = RecurrentContextModule(state_d, state_d, context_d)\n", + "em_module = EMModule(softmax_temperature)\n", + "context_module = prep_recurrent_network(context_module, state_d, persistance)\n", + "print(context_module)" + ], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'RecurrentContextModule' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", + "\u001B[0;32m/var/folders/6s/88zfvkmj43xftjg_1tf_pfkc0000gp/T/ipykernel_80467/1904193476.py\u001B[0m in \u001B[0;36m\u001B[0;34m\u001B[0m\n\u001B[1;32m 36\u001B[0m \u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 37\u001B[0m \u001B[0;31m# Initialize the recurrent context module.\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0;32m---> 38\u001B[0;31m \u001B[0mcontext_module\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mRecurrentContextModule\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mstate_d\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mstate_d\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mcontext_d\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[0m\u001B[1;32m 39\u001B[0m \u001B[0mem_module\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mEMModule\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0msoftmax_temperature\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n\u001B[1;32m 40\u001B[0m \u001B[0mcontext_module\u001B[0m \u001B[0;34m=\u001B[0m \u001B[0mprep_recurrent_network\u001B[0m\u001B[0;34m(\u001B[0m\u001B[0mcontext_module\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mstate_d\u001B[0m\u001B[0;34m,\u001B[0m \u001B[0mpersistance\u001B[0m\u001B[0;34m)\u001B[0m\u001B[0;34m\u001B[0m\u001B[0;34m\u001B[0m\u001B[0m\n", + "\u001B[0;31mNameError\u001B[0m: name 'RecurrentContextModule' is not defined" + ] + } + ], + "execution_count": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2. Generate some toy data for the CSW task." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAADIAAAAULCAYAAADvaziwAAEAAElEQVR4Aez9f6xd1X0n/K9747jG44CD+aahxRgmD07UNLWN0plxRcCU9IcSfk5TIzVSMHKkb0mfAZv88aRTEiCh0zx6BAZGLf1KsTCRWgk3GQiQaJqG2pConk6rYDdNlZjJxGAmpHkwuVCPcQixv+dznAOX67322ef3Pue8lnR97t0/13rtfc+613e995o53ihJIUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQqK3AbG1rpmIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNAQEQNwIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOYCAiA1v0CqR4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAQAHEPECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRqLiAAUvMLpHoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQEQ9wABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOYCAiA1v0CqR4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAQAHEPECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRqLiAAUvMLpHoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQEQ9wABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoOYCAiA1v0CqR4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYhIDApAvs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IesJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAiMWEAAZ8QVwegIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAOwEBkHZC1hMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIERiwgADLiC+D0BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIF2AjPHG6XdRtYTIECgE4Fv/vML6cWjPy7dZeXypems05aWbmMlAQIECBAgQIAAAQLjI/CTHz6dXnn+6dIKz55yWnrjz72rdBsrCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEigUEQIpdLCVAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI1EZgtjY1URECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFCAQGQQhYLCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL1ERAAqc+1UBMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKGAAEghi4UECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfoICIDU51qoCQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgUEAApJDFQgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAfQQEQOpzLdSEAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAoIABSyGIhAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA+AgIg9bkWakKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKBQQAClksZAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUB8BAZD6XAs1IUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUCgiAFLJYSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoj4AASH2uhZoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoFBEAKWSwkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNRHQACkPtdCTQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEChQICIIUsFhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE6iMgAFKfa6EmBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFCAQGQQhYLCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL1ERAAqc+1UBMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKGAAEghi4UECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfoICIDU51qoCQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgUEAApJDFQgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAfQQEQOpzLdSEAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAoIABSyGIhAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA+AgIg9bkWakKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKBQQAClksZAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUB8BAZD6XAs1IUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUCgiAFLJYSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoj4AASH2uhZoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoFBEAKWSwkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNRHQACkPtdCTQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEChQICIIUsFhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE6iMgAFKfa6EmBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFCAQGQQhYLCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL1ERAAqc+1UBMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKGAAEghi4UECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfoICIDU51qoCQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgUEAApJDFQgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAfQQEQOpzLdSEAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAoIABSyGIhAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA+AgIg9bkWakKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKBQQAClksZAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUB8BAZD6XAs1IUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUCgiAFLJYSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoj4AASH2uhZoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoFBEAKWSwkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNRHQACkPtdCTQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEChQICIIUsFhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE6iMgAFKfa6EmBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFCAQGQQhYLCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL1ERAAqc+1UBMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKGAAEghi4UECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfoICIDU51qoCQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgUEAApJDFQgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAfQQEQOpzLdSEAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAoIABSyGIhAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA+AgIg9bkWakKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKBQQAClksZAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUB8BAZD6XAs1IUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUCgiAFLJYSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoj4AASH2uhZoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoFBEAKWSwkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNRHQACkPtdCTQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEChQICIIUsFhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE6iMgAFKfa6EmBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFCAQGQQhYLCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQL1ERAAqc+1UBMCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQKGAAEghi4UECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgfoICIDU51qoCQECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgUEAApJDFQgIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAfQQEQOpzLdSEAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAoIABSyGIhAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA+AgIg9bkWakKAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKBQQAClksZAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUB8BAZD6XAs1IUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUCgiAFLJYSIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoj4AASH2uhZoQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoFBEAKWSwkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNRHQACkPtdCTQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEChQICIIUsFhIgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE6iMgAFKfa6EmBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIFCAQGQQhYLCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg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KMFEo34UmWCSoqnMigACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIlEqABJBS7Q4qgwACCCCAAAIIIIAAAggggEA1BJSksbKyYpS00WkZHh6ORvyYm5szGgGEggACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIILBZgASQzSZMQQABBBBAAAEEEEAAAQQQQACBAAElaxw/ftwogaOTcvToUXPgwIFOVsGyCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBA7QVIAKn9LqaBCCCAAAIIIIAAAggggAACCBQjMDMzYwYHB83q6mpHG5ienjZjY2Mdr6ejSrAwAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCBQcgESQEq+g6geAggggAACCCCAAAIIIIAAAmUTuHjxYpT4MTs7m1vVtM6RkRGjpJJbt27ltl5WhAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAII1EWABJC67EnagQACCCCAAAIIIIAAAggggEDBAkrMmJycjEbruHbtWiFbU1KJEkGWlpYKWT8rRQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEqirQd2+jVLXy3a637kaqR5py6dIl7zIHDhwwo6OjaVZpDh8+bIaHh1Mtw8wIIIAAAp0JrK6upg5CLKIPUL+hBwUBBBBAAAEEEOi2wPz8vFFyRjdH59Dn37m5ObN3795uN5ftIYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACpRMgASTFLtHdTQcHB1Mskf+sAwMD5urVq0bPFAQQQACB7gko0FF9QDcDHm2tUx9AAKRNhmkIIIAAAgggUJSAEmGnp6e9NzdwbVufXU+cOBElsHa6jqmpKddmmI4AAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCDRCoL8RrcypkQq4nZiYyGlt2VZz/Phxkj+y0bEUAggg0JGAghd1Du5lUR9E8kcv9wDbRgABBBBAoFkCSnydmZkxIyMjmZI/NHrHysqKUeKGRrFcXl42Z86cSf2ZVvVQ8ojqoWQUCgIIIIAAAggggAACCCCAAAIIIIAA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w9VQBwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPRWoFYJICvpItgrgoAj+CsCAEa1xB/9Y5TH+KO/kd5H9SprFwECnQpEH9AcBT4CgUe1CPwa1SurXQQI9Epg1JJBItlv79696cknn2wkf/TKyXEIECAwigKj1gc0P/vrA0bxbtUmAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIfCtQ2wSQbwlSIwnkww8/HJlkEIFfK6+u5wQIECgXGLVkEIFf5dfbWgIECOQEIhD47Nmz6dy5c5X6XhAJH3v27GkkfEj4zl1dywkQIFAu0JwZJPqA6AuiT6hCiff9ZsKHPqAKV0wdCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0L2ABJBVhhEIfHJ5VpDmH/1XrR7aXwV+De2lUTECBCokEH1ABHxFUmA8VqUI/KrKlVJPAgSqJBB9QvzE94Lm842ufyT5xef+ycnJxmM8VwgQIECg9wIrkwKHqQ+Iz/2R9Bfv//qA3l93RyRAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEAVBCSAlFylGAEy/tAfQcDNwK9YttElAr/80X+jr4LzEyBQB4F4/4+fmZmZxuMw9gHRH0S/oBAgQIBA/wWiT4ig4PiJ7wfN7wu9PnPM6Bc/8R7/3e9+txHk6/2+18qOR4AAgc4EVvcBsXcs63Vp9gHxeP/99zf6gOayXp/L8QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgegISQDq8ZhHs1Rz98fLly43gr/i9H0HBzUQPf/Tv8CLZnAABAn0SiD4gfiLQq999QDQhRvWNviBGeo/A3/iJPkEhQIAAgeETWBkEvPJ5q5rGe3u810dZ+byxwD8ECBAgUAmBlf8vtPJ5q8qvfN+X5NFKy3oCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQCAEJID28D1b+kb+ToK9mFSLQN0oEgEUQgEKAAAEC1RFY2QesfN5uC/QB7UrZjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQTwEJIPW87lpNgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIVEhgrEJ1VVUCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQC0FJIDU8rJrNAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAlAQkgVbpa6kqAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUUkACSC0vu0YTIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECVRKQAFKlq6WuBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQC0FJIDU8rJrNAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFAlAQkgVbpa6kqAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUUuD/B5pkvigYYnf3AAAAAElFTkSuQmCC", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "csw_img = Image.open('csw.png')\n", + "display(csw_img)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Time')" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkUAAAG1CAYAAAD3BIBFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABWiUlEQVR4nO3deXgUVfr//XcnZIcE2UKAEBBhkGUQWUR2RgVkmUFR3AF1dFR0ZBhUcFRgHEVx+fkouDAqqCjiiAiCjuB3WERQQAkCyqZhMRADCglJSGer549Dp9NJd5MOSS/x87quurq76q7quwvovjl16hybZVkWIiIiIr9xYYFOQERERCQYqCgSERERQUWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiABQJ9AJhIqSkhIOHz5MvXr1sNlsgU5HREREKsGyLE6ePEmzZs0IC/PeFqSiqJIOHz5McnJyoNMQERGRKjh06BAtWrTwGqOiqJLq1asHwKHdu4k//dxFeDhERztf5+Z6PlhYGMTEVC02Lw88DUJus0FsbNViT52CkhLPecTFVS02Px+Ki6snNjbW5A1gt0NRUfXExsSY8wxQUACFhdUTGx1t/l74GltYaOI9iYqCOnV8jy0qMufCk8hIiIjwPba42PzZeRIRYeJ9jS0pMX/XqiO2Th1zLsD8m8jLq55YX/7d6zvCfexv9TsiLw/OOw+ApkAhEOH5qOQDjj+pcCDSS6wdKKlCbBgQ5SW2AHCc/axffgmZ74js7GySk5NLf8e9sWmaj8rJzs4mISGBrKws4uPjA52OiIiEstxcqFsXgDjAS+kdlEKpdPDl91sdrUVERERQUSQiIiICqCgSERHxvzp1YNw45gNeejOJn4VsUfTiiy/SunVroqOj6datG59//rnX+LVr19KtWzeio6M599xzefnll/2UqYiISDlRUTB/PjdjOjBLcAjJomjRokVMnDiRf/zjH2zdupV+/fpx+eWXc/DgQbfxaWlpDBs2jH79+rF161YefPBB/vrXv7J48WI/Zy4iIiLBKiTvPrvooou48MILeemll0rXnX/++YwaNYqZM2dWiH/ggQdYtmwZ33//fem6O+64g23btrFx40a372G327GXud3QcUuf7j4TEZGzdnq4h7i6dUPuzjPQ3WdBo6CggK+//prBgwe7rB88eDAbNmxw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TFJSEnPnzqVbt27Y7XbeeustLrnkEtasWUP//v3d7jNz5kxmzJhRQ1lLbaO7uMSbULw7UX+n5bco5G/JHzJkCJGRkXz00Uc+7Tdy5EhsNhvLli1zu91ut2O320tfZ2dnk5ycrFvyRcRnKoqkgpIS+P578/z8880I11IjfLklP6Rbig4cOMBnn33GBx984PO+vXr1YsGCBR63R0VFERUVdTbpiYiIuBcWBh07BjoLKSekS9N58+bRpEkThg8f7vO+W7duJSkpqQayEhERkVAUsi1FJSUlzJs3j3HjxlGnjuvHmDp1Kunp6bz55psAPPfcc7Rq1YqOHTuWdsxevHgxixcvDkTqIiLyW1dQAI8/bp4/+CBERgY2HwFCuCj67LPPOHjwILfcckuFbUeOHOHgwYOlrwsKCpg8eTLp6enExMTQsWNHVqxYwbBhw/yZsoiIiFFYCI6bee67T0VRkAj5jtb+ornPRKSq1NFaKtDcZ36juc9EREREfKSiSERERAQVRSIiIiKAiiIRERERQEWRiIiICBDCt+SLiIiErOho2LTJ+VyCgooiERERfwsPhx49Ap2FlKPLZyIiIiKopUhERMT/Cgrg//v/zPN779WI1kHirEa03rp1KwsXLmTXrl3k5eXx2WefAWb2+q+++opLL72UBg0aVFuygaQRrUWkqjSitVSgEa39xpff7yq3FN1///0888wzpf9wyv6jtyyL66+/nmeeeYZ77723qm8hIiIi4jdV6lM0b948nn76aUaMGMG3337L1KlTXba3atWKnj17smzZsmpJUkQklFmWFXKLzWYLuUXkbFWppejFF1/k/PPPZ/HixdSpU4dIN9dC27dvX3o5TURERCTYVaml6LvvvuOyyy6jTh3PNVViYiKZmZlVTkxERETEn6pUFNWpU4eCggKvMYcPH6auoxOZiIiISJCrUlHUuXNnVq9eTUlJidvtjjvRunXrdlbJiYiIiPhLlYqiW265hd27d3PnnXdWaDHKzs5m/PjxZGRkcNttt1VLkiIiIrVKdDSsXm0WTfMRNKo8TtENN9zAwoULqVu3LvXr1yc9PZ1u3brx/fffk5uby/jx43n99derO9+A0ThFIvJbEop3c2lsJXHHl9/vKk/z8fbbb/PKK6/QunVr0tPTsSyLLVu20LJlS1566aVaVRCJiIhI7XdWI1o7nDp1iuPH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+fPnu90nPz+/hj+NiIiIG3l50LGjWTTNR9AIuj5Fubm5dOnShZtvvpnRo0dX2H7kyBGX15988gm33nqr29iy4uPj2b17t8u66Ojos09YRETEV5YF333nfC5BIeiKossvv5zLL7/c4/amTZu6vF66dCmDBg3i3HPP9Xpcm81WYV8RERERh6C7fOaLn3/+mRUrVnDrrbeeMTYnJ4eUlBRatGjBiBEj2Lp1q9d4u91Odna2yyIiIiK1V0gXRW+88Qb16tXjyiuv9BrXvn175s+fz7Jly1i4cCHR0dH06dOHvXv3etxn5syZJCQklC7JycnVnb5IwFmWFXKLp36FwbyISGiwWVbwXsy02WwsWbKEUaNGud3evn17LrvsMl544QWfjltSUsKFF15I//79ef75593G2O127HZ76evs7GySk5PJysoiPj7ep/cTkeoTikVGEH/NSqDk5kLduuZ5Tg7ExQU2n1osOzubhISESv1+B12fosr6/PPP2b17N4sWLfJ537CwMHr06OG1pSgqKoqoqKizSVFERERCSMgWRa+99hrdunWjS5cuPu9rWRapqal07ty5BjITERE5A5sNUlKczyUoBF1RlJOTw759+0pfp6WlkZqaSoMGDWjZsiVgmsL+85//8Mwzz7g9xtixY2nevDkzZ84EYMaMGfTq1Yu2bduSnZ3N888/T2pqKnPmzKn5DyQiIlJebCzs3x/oLKScoCuKtmzZwqBBg0pfT5o0CYBx48Yxf/58AN59910sy+K6665ze4yDBw8SFubsQ37ixAluv/12MjIySEhIoGvXrqxbt46ePXvW3AcRERGRkBLUHa2DiS8dtUSk5qijtYj4wpff75C+JV9ERCQknToFPXqY5dSpQGcjpwXd5TMREZFar6QEtmxxPpegoJYiEREREVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUB3n4mIiARGo0aBzkDKUVEkIiLib3FxcPRooLOQcnT5TERERAQVRSIiIiKALp+JSIjRPGLiSSjNixcNfAIMHDAAPvkEYmICnZKgliIRERG/CwMGAqxdq2k+goiKIhERERFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiEhA5ALExgY6DSlD4xSJiIj4WR5QF7BycwOdipShliIRERERVBSJiIiIACqKRERE/C4KWA4wfDjk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EREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSkRCSl5fH448/zoUXXkjdunWJjo6mRYsW9OvXj6lTp/LDDz+UxrZq1YpWrVpVy/vOnz8fm83G/Pnzq+V4IhKcNCGsiISEkydP0rdvX7799lvOO+88brzxRurXr8+hQ4fYuXMnTzzxBG3atKFNmzaBTlVEQpSKIhEJCc899xzffvstt956K//+97+x2Wwu29PS0rDb7QHKTkRqA10+E5GQsHHjRgDuvvvuCgURQOvWrWnfvj379+/HZrNx4MABDhw4gM1mK12mT58OQEFBAS+88AJDhgwhOTmZqKgomjRpwpVXXsnWrVtdjjt+/HhuvvlmAG6++WaX45V18uRJpk2bRseOHYmJiaF+/foMHTqU9evX18DZEJGaoJYiEQkJDRo0AGDfvn1ccMEFHuPq16/PtGnTeO655wCYOHFi6baBAwcC8OuvvzJx4kT69evHsGHDOOecc/jxxx9ZtmwZn3zyCevWraNHjx4AjBo1ihMnTrB06VL+9Kc/uX3vX3/9lf79+7Nz50769evHkCFDyMrKYunSpQwaNIj//Oc/jBo1qhrOgojUJJtlWVagkxAROZOlS5cyatQo4uPjufPOOxk8eDBdu3blnHPOcRvv6GS9f//+CtvsdjvHjh2jefPmLut37txJr1696NWrF6tWrSpdP3/+fG6++WbmzZvH+PHjKxzvhhtu4J133uH1118vbVUC+Pnnn+nRowf5+fkcPHiQ6Oho3z+4iPiNLp+JSEj405/+xKxZsygpKeHJJ5/kkksuoUGDBpx33nncfffd7N27t9LHioqKqlAQAXTs2JFBgwaxbt06CgsLK3WsY8eOsWjRIi655BKXggggMTGR++67j6NHj/LZZ59VOj8RCQxdPhORkHHfffdxxx138N///pcNGzawZcsWvvrqK+bMmcNrr73GokWL+OMf/1ipY6WmpjJr1izWr19PRkZGhSLo2LFjJCUlnfE4mzdvpri4mPz8/NI+S2U5irVdu3YxYsSISuUmIoGhokhEQkq9evW4+uqrufrqqwHIysriwQcf5MUXX+TWW28lPT2dyMhIr8fYsGEDf/jDHwAYPHgwbdu2pW7duthsNj788EO2bdtW6TvZfv31VwC++OILvvjiC49xubm5lTqeiASOiiIRCWkJCQnMnj2bFStWcODAAbZv3063bt287vPYY49ht9tZv349ffr0cdn25Zdfsm3btkq/f3x8PAB///vfefrpp33/ACISNNSnSERCns1mIzY21mVdeHg4xcXFbuN/+OEHGjRoUKEgysvL45tvvqkQHx4eDuD2eD169MBms5UOGSAioUtFkYiEhFdeeYXNmze73fbBBx+wa9cu6tevT6dOnQBzC/+xY8fIz8+vEJ+SksLx48fZuXNn6bri4mImT57M0aNHK8Q7hgP46aefKmxr2rQpY8aMYcOGDTz11FO4u6H3q6++Ii8vr3IfVEQCRrfki0hIGDVqFEuXLuW8886jT58+NGvWjJycHFJTU/n8888JCwtjwYIFXHfddQA88MADzJo1i0svvZR+/foRGRlJ37596du3L8uXL2fkyJHUr1+fMWPGEB0dzZo1a0hPT6dz586sWbOGtLS00tv6f/31V1q0aEFUVBS33HILjRs3BmDKlCml2y+55BJSU1Pp3LkzF198MQkJCRw6dIivv/6avXv3cuTIEZo2bRqQcycilWSJiISAXbt2WbNmzbIuu+wyq3Xr1lZ0dLQVHR1ttWnTxho3bpy1ZcsWl/iTJ09at912m5WUlGSFhYVZgDVt2rTS7e+//7514YUXWrGxsVajRo2sMWPGWD/88IM1btw4C7DS0tJcjrdixQqrR48eVkxMjAVY5b8+8/LyrFmzZlndunWz4uLirJiYGKt169bWqFGjrDfffNMqLCysqVMjItVELUUiIiIiqE+RiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQHg/wfqaO+Mf+qPVAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from random import randint\n", + "from datasets import CSWDataset\n", + "\n", + "probs = [1, 1, 1] # Probability of the context appropriate transition for the 2nd-4th state. Deterministic for now.\n", + "contexts_to_load = [0,1,0,1,0] # indices of the contexts for each trial (5 states per trial)\n", + "n_samples_per_context = [1,1,1,1,1] # number of times to visit each context before transitioning\n", + "ds = CSWDataset(n_samples_per_context, contexts_to_load, probs=probs)\n", + "\n", + "# Plot some example data from the CSW task.\n", + "plt.imshow(ds.xs[:20], cmap='Greys', aspect='auto')\n", + "for i, x in enumerate(np.linspace(0, 15, 4)):\n", + " plt.axhline(x-0.5, color='red', linestyle='--')\n", + " if i%2 == 0:\n", + " plt.text(5, x+1, 'Context 0', fontsize=16, color='blue')\n", + " else:\n", + " plt.text(5, x+1, 'Context 1', fontsize=16, color='darkorange')\n", + "plt.axvline(8.5, color='red', linestyle='--')\n", + "plt.xlabel('State', fontsize=14)\n", + "plt.ylabel('Time', fontsize=14)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "from run import gen_data_loader, gen_model\n", + "\n", + "def calc_prob(em_preds, test_ys):\n", + " '''Calculate the probability of the EM model predicting the correct state through EM retrieval.\n", + " '''\n", + " # Only consider the terminal three states (they are the only predictable transitions).\n", + " em_preds_new, test_ys_new = em_preds[:, 2:-1, :], test_ys[:, 2:-1, :]\n", + " em_probability = (em_preds_new*test_ys_new).sum(-1).mean(-1)\n", + " trial_probs = (em_preds*test_ys)\n", + " return em_probability, trial_probs\n", + "\n", + "def run_participant(params, training_paradigm):\n", + " performance_data = {'seed':[], 'paradigm':[], 'trial':[], 'probability':[]}\n", + " loss_fn = nn.BCELoss()\n", + " data_loader = gen_data_loader(training_paradigm, params['probs'])\n", + " context_module, em_module = gen_model(params)\n", + " optimizer = torch.optim.SGD(lr=params.episodic_lr, params=context_module.parameters())\n", + " em_preds = []\n", + " utils.set_random_seed(params.seed)\n", + " for trial, (x,_,y) in enumerate(data_loader):\n", + " for _ in range(params['n_optimization_steps']):\n", + " context = context_module(x)\n", + " if trial > 0:\n", + " optimizer.zero_grad()\n", + " pred_em = em_module(x,context)\n", + " loss = loss_fn(pred_em,y)\n", + " loss.backward()\n", + " optimizer.step()\n", + " else:\n", + " pred_em = torch.zeros([1,params.output_d]).float()\n", + " with torch.no_grad():\n", + " em_module.write(x,context,y)\n", + " em_preds.append(pred_em.cpu().detach().numpy())\n", + "\n", + " # Collect some metrics from the training run for analysis.\n", + " em_preds = np.stack(em_preds).squeeze()\n", + " em_preds = np.vstack([em_preds, np.zeros([1,11])]).reshape(-1,5,11)\n", + " test_ys = np.vstack([data_loader.dataset.ys.cpu().numpy(), np.zeros([1,11])]).reshape(-1,5,11)\n", + " correct_prob, _ = calc_prob(em_preds, test_ys)\n", + " performance_data['probability'].extend(correct_prob)\n", + " performance_data['seed'].extend([params.seed]*len(correct_prob))\n", + " performance_data['paradigm'].extend([training_paradigm]*len(correct_prob))\n", + " performance_data['trial'].extend(list(range(len(correct_prob))))\n", + " return pd.DataFrame(performance_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Set up the parameters for the experiment.\n", + "params = utils.Map(\n", + " n_participants = 1,\n", + " state_d = 11, # dimensionality of the state input\n", + " context_d = 11, # dimensionality of the learned context representations\n", + " output_d = 11, # dimensionality of the output layer\n", + " episodic_lr = 1, # learning rate for the episodic pathway\n", + " persistance = -0.8, # bias towards memory retention in the recurrent context module\n", + " temperature = 0.1, # temperature for EM retrieval (lower is more argmax-like)\n", + " n_optimization_steps = 10, # number of optimization steps to take for each state\n", + " probs = [1, 1, 1], # probability of the context appropriate transition for the 2nd-4th state\n", + " seed = 0 # random seed for reproducibility\n", + ")\n", + "\n", + "# Run a single participant through the CSW task using the Blocked paradigm.\n", + "blocked_results = run_participant(params, 'Blocked')\n", + "interleaved_results = run_participant(params, 'Interleaved')\n", + "\n", + "# Plot the performance of the model on the CSW task during the test phase\n", + "results_df = pd.concat([blocked_results, interleaved_results])\n", + "test_phase = results_df[results_df.trial >=160]\n", + "sns.violinplot(data=test_phase, x='paradigm', y='probability', inner='point', scale='count')\n", + "plt.ylim(0,1)\n", + "plt.ylabel('Probability of Correct Prediction')\n", + "plt.xlabel('Training Paradigm')\n", + "plt.title('CSW Test Phase Performance')\n", + "plt.axhline(0.5, color='black', linestyle='--')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4. Put it all together!" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6BC9LZ/PO+Fw2PnYxz5Gb3v22WcrXtvw8LADwPnOd75TNc5yVqxY4axbt67q9q6uLgeAc99999HbLr74YqehocEZHBwcdZsjueKKKxwATqFQGNf9h4eHnfPPP98B4ABwJElyzj33XOfOO+900ul0xX2/853vOACcl19+2XEcx/nmN7/ptLe3O47jODt27HAAONu2bXMcx3Fuv/12B4CzY8eOCY2fwWDMLFgFmMFgTEscx6E/79u3D7t27cIHPvABAIBpmvTfVVddhb6+PuzevXvU7b388suIxWK48cYbKx5v2zauuOIKvP7668hmsxWPede73lVzW6tXr0ZnZyf9fdmyZQCACy+8sMInTG4/dOjQmK939erVmDNnDv3d4/FgyZIloz42HA5j4cKF+I//+A9861vfwsaNG2Hb9pjPVY9cLofnn38e119/PZqbm496O+MhEongxRdfxOuvv46vf/3ruO6667Bnzx7cdtttWLlyJYaHh+l9y33A5P9169YBcN/jlpYWaoN47rnn0NraSt97BoNxcsIEMIPBmHZks1lEo1F0dHQAAAYGBgAAn/nMZyBJUsW/T3ziEwBQIZhqQbbx7ne/u2obd911FxzHQSwWq3hMrYgtwBWe5ciyPOrthUJhzNcciUSqblMUZVT7BMdxePrpp3H55Zfj7rvvxumnn47m5mbccsstSKfTYz7nSOLxOCzLOqpFekS8d3V1TehxZ5xxBj73uc/hoYceQm9vLz796U/j4MGDFQvhVq5ciaamJjz77LPU/0sEMAC8/e1vx3PPPQdN07B+/Xpmf2AwGCwFgsFgTD/+7//+D5Zl4cILLwQANDU1AQBuu+02vPOd76z5mFNOOWXUbZJtfP/736+bfDAycWI6LKKaO3cufvaznwEA9uzZgwcffBBf/vKXoet6hW95PITDYQiCgO7u7gmP4/LLL8dPfvITPPbYY/j85z8/4ccDgCRJ+NKXvoRvf/vb2LZtG72d4zisW7cOf/zjH/Haa68hkUhUCOB169bhy1/+MtavX49CocAEMIPBYAKYwWBMLw4fPozPfOYzCIVC+NjHPgbAFbeLFy/G5s2b6SK3eiiKAgBVldPzzjsPDQ0N2LFjBz75yU8em8GfYJYsWYIvfOELeOSRRyqaToxVSSaoqop169bhoYcewh133EEnDePhuuuuw8qVK3HnnXfi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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Set up the parameters for the experiment.\n", + "params.n_participants = 10\n", + "params.paradigms = ['Blocked', 'Interleaved']\n", + "params.sim_thresh = 0.1 # filtering criterion that will be useful later.\n", + "df, _, context_reps, _ = run.run_experiment(params)\n", + "fig = utils.plot_results(df, 'Deterministic CSW')\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "analysis", + "language": "python", + "name": "python3" + }, + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Scripts/Models (Under Development)/EGO/Using EMComposition/DeclanParams.py b/Scripts/Models (Under Development)/EGO/Using EMComposition/DeclanParams.py new file mode 100644 index 00000000000..4707ad758ef --- /dev/null +++ b/Scripts/Models (Under Development)/EGO/Using EMComposition/DeclanParams.py @@ -0,0 +1,93 @@ +""" +DECLAN Params: ************************************************************************** +√ episodic_lr = 1 # learning rate for the episodic pathway +√ temperature = 0.1 # temperature for EM retrieval (lower is more argmax-like) +√ n_optimization_steps = 10 # number of update steps +sim_thresh = 0.8 # threshold for discarding bad seeds -- can probably ignore this for now +Filter runs whose context representations are too uniform (i.e. not similar to "checkerboard" foil) + +May need to pad the context reps because there will be 999 reps +def filter_run(run_em, thresh=0.8): + foil = np.zeros([4,4]) + foil[::2, ::2] = 1 + foil[1::2, 1::2] = 1 + run_em = run_em.reshape(200, 5, 11).mean(axis=1) + mat = cosine_similarity(run_em, run_em) + vec = mat[:160, :160].reshape(4, 40, 4, 40).mean(axis=(1, 3)).ravel() + return cosine_similarity(foil.reshape(1, -1), vec.reshape(1, -1))[0][0] + +# Stack the model predictions (should be 999x11), pad with zeros, and reshape into trials for averaging. +em_preds = np.vstack([em_preds, np.zeros([1,11])]).reshape(-1,5,11) + +# Stack the ground truth states (should be 999x11), pad with zeros, and reshape into trials for averaging. +ys = np.vstack([data_loader.dataset.ys.cpu().numpy(), np.zeros([1,11])]).reshape(-1,5,11) + +# compute the probability as a performance metric +def calc_prob(em_preds, test_ys): + em_preds, test_ys = em_preds[:, 2:-1, :], test_ys[:, 2:-1, :] + em_probability = (em_preds*test_ys).sum(-1).mean(-1) + trial_probs = (em_preds*test_ys) + return em_probability, trial_probs + +Calculate the retrieval probability of the correct response as a performance metric (probs) +probs, trial_probs = calc_prob(em_preds, test_ys) +""" +from psyneulink.core.llvm import ExecutionMode +from psyneulink.core.globals.keywords import ALL, ADAPTIVE, CONTROL, CPU, Loss, MPS, OPTIMIZATION_STEP, RUN, TRIAL + +model_params = dict( + + # Names: + name = "EGO Model CSW", + state_input_layer_name = "STATE", + previous_state_layer_name = "PREVIOUS STATE", + context_layer_name = 'CONTEXT', + em_name = "EM", + prediction_layer_name = "PREDICTION", + + # Structural + state_d = 11, # length of state vector + previous_state_d = 11, # length of state vector + context_d = 11, # length of context vector + memory_capacity = ALL, # number of entries in EM memory; ALL=> match to number of stims + memory_init = (0,.0001), # Initialize memory with random values in interval + # memory_init = None, # Initialize with zeros + concatenate_keys = False, + # concatenate_keys = True, + + # environment + # curriculum_type = 'Interleaved', + curriculum_type = 'Blocked', + # num_stims = 100, # Integer or ALL + num_stims = ALL, # Integer or ALL + + # Processing + integration_rate = .69, # rate at which state is integrated into new context + # state_weight = 1, # weight of the state used during memory retrieval + # context_weight = 1, # weight of the context used during memory retrieval + state_weight = .5, # weight of the state used during memory retrieval + context_weight = .5, # weight of the context used during memory retrieval + normalize_field_weights = False, # whether to normalize the field weights during memory retrieval + # normalize_field_weights = True, # whether to normalize the field weights during memory retrieval + # softmax_temperature = None, # temperature of the softmax used during memory retrieval (smaller means more argmax-like + softmax_temperature = .1, # temperature of the softmax used during memory retrieval (smaller means more argmax-like + # softmax_temperature = ADAPTIVE, # temperature of the softmax used during memory retrieval (smaller means more argmax-like + # softmax_temperature = CONTROL, # temperature of the softmax used during memory retrieval (smaller means more argmax-like + # softmax_threshold = None, # threshold used to mask out small values in softmax + softmax_threshold = .001, # threshold used to mask out small values in softmax + enable_learning=[True, False, False], # Enable learning for PREDICTION (STATE) but not CONTEXT or PREVIOUS STATE + learn_field_weights = False, + loss_spec = Loss.BINARY_CROSS_ENTROPY, + # loss_spec = Loss.MSE, + learning_rate = .5, + # num_optimization_steps = 1, + num_optimization_steps = 10, + synch_weights = RUN, + synch_values = RUN, + synch_results = RUN, + # execution_mode = ExecutionMode.Python, + execution_mode = ExecutionMode.PyTorch, + device = CPU, + # device = MPS, +) +#endregion \ No newline at end of file diff --git a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition with WM.py b/Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - CSW with RNN.py similarity index 98% rename from Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition with WM.py rename to Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - CSW with RNN.py index 00fe97f5e74..8a45bb6ab14 100644 --- a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW using EMComposition with WM.py +++ b/Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - CSW with RNN.py @@ -147,8 +147,8 @@ MEMORY_CAPACITY = 5 CONSTRUCT_MODEL = True # THIS MUST BE SET TO True to run the script DISPLAY_MODEL = ( # Only one of the following can be uncommented: - None # suppress display of model - # {} # show simple visual display of model + # None # suppress display of model + {} # show simple visual display of model # {'show_node_structure': True} # show detailed view of node structures and projections ) RUN_MODEL = True # True => run the model @@ -404,7 +404,7 @@ def construct_model(model_name:str=MODEL_NAME, model = construct_model() assert 'DEBUGGING BREAK POINT' # print(model.scheduler.consideration_queue) - # gs.output_graph_image(model.scheduler.graph, 'EGO_comp-scheduler.png') + # gs.output_graph_image(model.scheduler.graph, 'show_graph OUTPUT/EGO_comp-scheduler.png') if DISPLAY_MODEL is not None: if model: diff --git a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW with Learning.py b/Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - CSW with Simple Integrator.py similarity index 65% rename from Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW with Learning.py rename to Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - CSW with Simple Integrator.py index b62564dd1ea..5cb51d00181 100644 --- a/Scripts/Models (Under Development)/EGO/EGO Model (sim 2) - CSW with Learning.py +++ b/Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - CSW with Simple Integrator.py @@ -3,37 +3,36 @@ # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and limitations under the License. - -# CONTROL FLOW: -# - EM EXECUTES FIRST: -# - RETRIEVES USING PREVIOUS STATE NODE AND CONTEXT (PRE-INTEGRATION) TO RETRIEVE PREDICTED CURRENT STATE -# - STORES VALUES OF PREVIOUS STATE, CURRENT STATE (INPUT) AND CONTEXT (PRE-INTEGRATION) INTO EM -# - THEN: -# - PREVIOUS_STATE EXECUTES TO GET CURRENT_STATE_INPUT (FOR RETRIEVAL ON NEXT TRIAL) -# - INTEGRATOR LAYER EXECUTES, INTEGRATING CURRENT_STATE_INPUT INTO MEMORY -# - CONTEXT LAYER EXECUTES TO GET LEARNED CONTEXT (FOR RETRIEVAL ON NEXT TRIAL) -# - PREDICTED CURRENT STATE IS COMPARED WITH ACTUAL CURRENT STATE (TARGET) TO UPDATE INTEGRATOR -> CONTEXT WEIGHTS - -# ISSUES: -# * Using TransferMechanism (to avoid recurrent in PyTorch): -# -> input is always just linearly integrated, and the integral is tanh'd -# (not sure tanh is even necessary, since integral is always between 0 and 1) -# -> how is recurrence implemented in PyTorch? -# * ??Possible bug: for nodes in nested composition (such as EMComposition): calling of execute_node on the -# nested Composition rather than the outer one to which they now belong in -# PytorchCompositionWrapper - -# TODO: -# -# SCRIPT STUFF: -# √ REPLACE INTEGRATOR RECURRENTTRANSFERMECHANISM WITH TRANSFERMECHANISM IN INTEGRATOR MODE -# OR TRY USING LCA with DECAY? -# - CHECK THAT VERSION WITH TRANSFERMECHANISM FOR CONTEXT PRODUCES CORRECT EM ENTRIES PER PREVOUS BENCHMARKING -# - DEBUG LEARNING -# """ + +CONTROL FLOW: + - EM EXECUTES FIRST: + - RETRIEVES USING PREVIOUS STATE NODE AND CONTEXT (PRE-INTEGRATION) TO RETRIEVE PREDICTED CURRENT STATE + - STORES VALUES OF PREVIOUS STATE, CURRENT STATE (INPUT) AND CONTEXT (PRE-INTEGRATION) INTO EM + - THEN: + - PREVIOUS_STATE EXECUTES TO GET CURRENT_STATE_INPUT (FOR RETRIEVAL ON NEXT TRIAL) + - INTEGRATOR LAYER EXECUTES, INTEGRATING CURRENT_STATE_INPUT INTO MEMORY + - CONTEXT LAYER EXECUTES TO GET LEARNED CONTEXT (FOR RETRIEVAL ON NEXT TRIAL) + - PREDICTED CURRENT STATE IS COMPARED WITH ACTUAL CURRENT STATE (TARGET) TO UPDATE INTEGRATOR -> CONTEXT WEIGHTS + +ISSUES: + * Using TransferMechanism (to avoid recurrent in PyTorch): + -> input is always just linearly integrated, and the integral is tanh'd + (not sure tanh is even necessary, since integral is always between 0 and 1) + -> how is recurrence implemented in PyTorch? + * ??Possible bug: for nodes in nested composition (such as EMComposition): calling of execute_node on the + nested Composition rather than the outer one to which they now belong in + PytorchCompositionWrapper + +TODO: + +SCRIPT STUFF: +√ REPLACE INTEGRATOR RECURRENTTRANSFERMECHANISM WITH TRANSFERMECHANISM IN INTEGRATOR MODE + OR TRY USING LCA with DECAY? +- CHECK THAT VERSION WITH TRANSFERMECHANISM FOR CONTEXT PRODUCES CORRECT EM ENTRIES PER PREVOUS BENCHMARKING +- DEBUG LEARNING + QUESTIONS: NOTES: @@ -131,134 +130,63 @@ """ -import matplotlib.pyplot as plt + import numpy as np import graph_scheduler as gs +from importlib import import_module from enum import IntEnum - +import matplotlib.pyplot as plt import torch torch.manual_seed(0) - from psyneulink import * from psyneulink._typing import Union, Literal -#region SCRIPT SETTINGS -# ====================================================================================================================== -# SCRIPT SETTINGS -# ====================================================================================================================== -# Settings for running script: - -CONSTRUCT_MODEL = True # THIS MUST BE SET TO True to run the script -DISPLAY_MODEL = ( # Only one of the following can be uncommented: - None # suppress display of model - # { # show simple visual display of model - # 'show_pytorch': True, # show pytorch graph of model - # 'show_learning': True - # # 'show_projections_not_in_composition': True, - # # 'exclude_from_gradient_calc_style': 'dashed'# show target mechanisms for learning - # # {'show_node_structure': True # show detailed view of node structures and projections - # } -) -RUN_MODEL = True, # True => run the model -# RUN_MODEL = False # False => don't run the model -# EXECUTION_MODE = ExecutionMode.Python -EXECUTION_MODE = ExecutionMode.PyTorch -# REPORT_OUTPUT = ReportOutput.FULL # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] -REPORT_OUTPUT = ReportOutput.OFF # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] -REPORT_PROGRESS = ReportProgress.OFF # Sets console progress bar during run -PRINT_RESULTS = True # print model.results to console after execution -SAVE_RESULTS = False # save model.results to disk -# PLOT_RESULTS = True # plot results (PREDICTIONS) vs. TARGETS -PLOT_RESULTS = False # plot results (PREDICTIONS) vs. TARGETS -ANIMATE = False # {UNIT:EXECUTION_SET} # Specifies whether to generate animation of execution -#endregion +from ScriptControl import (MODEL_PARAMS, CONSTRUCT_MODEL, DISPLAY_MODEL, RUN_MODEL, + REPORT_OUTPUT, REPORT_PROGRESS, PRINT_RESULTS, SAVE_RESULTS, PLOT_RESULTS) +import Environment +import_module(MODEL_PARAMS) +model_params = import_module(MODEL_PARAMS).model_params + -#region ENVIRONMENT +#region TASK ENVIRONMENT # ====================================================================================================================== -# ENVIRONMENT +# TASK ENVIRONMENT # ====================================================================================================================== -# Task environment: -import Environment - -# CURRICULUM_TYPE = 'Blocked' # 'Blocked' or 'Interleaved' -CURRICULUM_TYPE = 'Interleaved' # 'Blocked' or 'Interleaved' - -NUM_STIMS = 7 # Integer or ALL -dataset = Environment.generate_dataset(condition=CURRICULUM_TYPE) -if NUM_STIMS is ALL: +dataset = Environment.generate_dataset(condition=model_params['curriculum_type'],) +if model_params['num_stims'] is ALL: INPUTS = dataset.xs.numpy() TARGETS = dataset.ys.numpy() else: - INPUTS = dataset.xs.numpy()[:NUM_STIMS] - TARGETS = dataset.ys.numpy()[:NUM_STIMS] + INPUTS = dataset.xs.numpy()[:model_params['num_stims']] + TARGETS = dataset.ys.numpy()[:model_params['num_stims']] TOTAL_NUM_STIMS = len(INPUTS) #endregion -#region PARAMETERS +#region MODEL # ====================================================================================================================== -# MODEL PARAMETERS +# MODEL # ====================================================================================================================== -model_params = dict( - - # Names: - name = "EGO Model CSW", - state_input_layer_name = "STATE", - previous_state_layer_name = "PREVIOUS STATE", - context_layer_name = 'CONTEXT', - em_name = "EM", - prediction_layer_name = "PREDICTION", - - # Structral - state_d = 11, # length of state vector - previous_state_d = 11, # length of state vector - context_d = 11, # length of context vector - memory_capacity = TOTAL_NUM_STIMS, # number of entries in EM memory - memory_init = (0,.001), # Initialize memory with random values in interval - # memory_init = None, # Initialize with zeros - concatenate_keys = False, - - # Processing - integration_rate = .69, # rate at which state is integrated into new context - state_weight = 1, # weight of the state used during memory retrieval - context_weight = 1, # weight of the context used during memory retrieval - normalize_field_weights = True, # whether to normalize the field weights during memory retrieval - # softmax_temperature = None, # temperature of the softmax used during memory retrieval (smaller means more argmax-like - softmax_temperature = .1, # temperature of the softmax used during memory retrieval (smaller means more argmax-like - # softmax_temperature = ADAPTIVE, # temperature of the softmax used during memory retrieval (smaller means more argmax-like - # softmax_temperature = CONTROL, # temperature of the softmax used during memory retrieval (smaller means more argmax-like - # softmax_threshold = None, # threshold used to mask out small values in softmax - softmax_threshold = .001, # threshold used to mask out small values in softmax - enable_learning=[True, False, False], # Enable learning for PREDICTION (STATE) but not CONTEXT or PREVIOUS STATE - learn_field_weights = False, - loss_spec = Loss.BINARY_CROSS_ENTROPY, - # loss_spec = Loss.MSE, - learning_rate = .5, - device = CPU, - # device = MPS, -) - -# EM structdural params: +# EM structural params: EMFieldsIndex = IntEnum('EMFields', ['STATE', 'CONTEXT', 'PREVIOUS_STATE'], start=0) -STATE_RETRIEVAL_WEIGHT = 0 +state_retrieval_weight = 0 RANDOM_WEIGHTS_INITIALIZATION=RandomMatrix(center=0.0, range=0.1) # Matrix spec used to initialize all Projections if is_numeric_scalar(model_params['softmax_temperature']): # translate to gain of softmax retrieval function - RETRIEVAL_SOFTMAX_GAIN = 1/model_params['softmax_temperature'] + retrieval_softmax_gain = 1/model_params['softmax_temperature'] else: # pass along ADAPTIVE or CONTROL spec - RETRIEVAL_SOFTMAX_GAIN = model_params['softmax_temperature'] -#endregion + retrieval_softmax_gain = model_params['softmax_temperature'] -#region MODEL -# ====================================================================================================================== -# MODEL -# ====================================================================================================================== +if model_params['memory_capacity'] is ALL: + memory_capacity = TOTAL_NUM_STIMS +elif not isinstance(model_params['memory_capacity'], int): + raise ValueError(f"memory_capacity must be an integer or ALL; got {model_params['memory_capacity']}") def construct_model(model_name:str=model_params['name'], @@ -276,15 +204,15 @@ def construct_model(model_name:str=model_params['name'], # EM: em_name:str=model_params['em_name'], - retrieval_softmax_gain=RETRIEVAL_SOFTMAX_GAIN, + retrieval_softmax_gain=retrieval_softmax_gain, retrieval_softmax_threshold=model_params['softmax_threshold'], - state_retrieval_weight:Union[float,int]=STATE_RETRIEVAL_WEIGHT, + state_retrieval_weight:Union[float,int]=state_retrieval_weight, previous_state_retrieval_weight:Union[float,int]=model_params['state_weight'], context_retrieval_weight:Union[float,int]=model_params['context_weight'], normalize_field_weights = model_params['normalize_field_weights'], concatenate_keys = model_params['concatenate_keys'], learn_field_weights = model_params['learn_field_weights'], - memory_capacity = model_params['memory_capacity'], + memory_capacity = memory_capacity, memory_init=model_params['memory_init'], # Output: @@ -421,7 +349,7 @@ def construct_model(model_name:str=model_params['name'], model = None if CONSTRUCT_MODEL: - print(f'Constructing {model_params["name"]}') + print(f"Constructing '{model_params['name']}'...") model = construct_model() assert 'DEBUGGING BREAK POINT' # print(model.scheduler.consideration_queue) @@ -445,12 +373,21 @@ def print_stuff(**kwargs): print('\nPrediction: \n', model.nodes['PREDICTION'].parameters.value.get(kwargs['context'])) # print('\nLoss: \n', - # model.parameters.tracked_loss._get(kwargs['context'])) + # model.parameters.minibatch_loss._get(kwargs['context'])) print('\nProjections from context to EM: \n', model.projections[7].parameters.matrix.get(kwargs['context'])) print('\nEM Memory: \n', model.nodes['EM'].parameters.memory.get(model.name)) - # print("MODEL NOT YET FULLY EXECUTABLE") - print(f"Running {model_params['name']}") + if INPUTS[0][9]: + sequence_context = 'context 1' + else: + sequence_context = 'context 2' + if INPUTS[1][1]: + sequence_state = 'state 1' + else: + sequence_state = 'state 2' + + print(f"Running '{model_params['name']}' with {MODEL_PARAMS} for {model_params['num_stims']} stims " + f"using {model_params['curriculum_type']} training starting with {sequence_context}, {sequence_state}...") context = model_params['name'] start_time = timeit.default_timer() model.learn(inputs={model_params['state_input_layer_name']:INPUTS}, @@ -460,10 +397,14 @@ def print_stuff(**kwargs): # model.projections[7].parameters.matrix.get(context)), # # model.projections[7].matrix) # call_after_minibatch=print_stuff, - optimizations_per_minibatch=1, + # optimizations_per_minibatch=model_params['num_optimization_steps'], + synch_projection_matrices_with_torch=model_params['synch_weights'], + synch_node_values_with_torch=model_params['synch_values'], + synch_results_with_torch=model_params['synch_results'], learning_rate=model_params['learning_rate'], - execution_mode=ExecutionMode.PyTorch, - # minibatch_size=3, + execution_mode= model_params['execution_mode'], + # minibatch_size=1, + # epochs=1 ) stop_time = timeit.default_timer() print(f"Elapsed time: {stop_time - start_time}") @@ -471,27 +412,30 @@ def print_stuff(**kwargs): model.show_graph(**DISPLAY_MODEL) if PRINT_RESULTS: print("MEMORY:") - print(model.nodes['EM'].parameters.memory.get(model.name)) - model.run(inputs={model_params["state_input_layer_name"]:INPUTS[4]}, - # report_output=REPORT_OUTPUT, - # report_progress=REPORT_PROGRESS - ) + print(np.round(model.nodes['EM'].parameters.memory.get(model.name),3)) + # model.run(inputs={model_params["state_input_layer_name"]:INPUTS[TOTAL_NUM_STIMS-1]}, + # # report_output=REPORT_OUTPUT, + # # report_progress=REPORT_PROGRESS + # ) print("CONTEXT INPUT:") - print(model.nodes['CONTEXT'].parameters.variable.get(model.name)) + print(np.round(model.nodes['CONTEXT'].parameters.variable.get(model.name),3)) print("CONTEXT OUTPUT:") - print(model.nodes['CONTEXT'].parameters.value.get(model.name)) - print("PREDICTION OUTPUT:") - print(model.nodes['PREDICTION'].parameters.value.get(model.name)) - print("CONTEXT WEIGHTS:") - print(model.projections[7].parameters.matrix.get(model.name)) - plt.imshow(model.projections[7].parameters.matrix.get(model.name)) - def test_weights(weight_mat): + print(np.round(model.nodes['CONTEXT'].parameters.value.get(model.name),3)) + print("STATE:") + print(np.round(model.nodes['STATE'].parameters.value.get(model.name),3)) + print("PREDICTION:") + print(np.round(model.nodes['PREDICTION'].parameters.value.get(model.name),3)) + # print("CONTEXT WEIGHTS:") + # print(model.projections[7].parameters.matrix.get(model.name)) + + + def eval_weights(weight_mat): # checks whether only 5 weights are updated. weight_mat -= np.eye(11) col_sum = weight_mat.sum(1) row_sum = weight_mat.sum(0) return np.max([(row_sum != 0).sum(), (col_sum != 0).sum()]) - print(test_weights(model.projections[7].parameters.matrix.get(model.name))) + print(eval_weights(model.projections[7].parameters.matrix.get(model.name))) if SAVE_RESULTS: np.save('EGO PREDICTIONS', model.results) @@ -499,8 +443,18 @@ def test_weights(weight_mat): np.save('EGO TARGETS', TARGETS) if PLOT_RESULTS: - plt.plot(1 - np.abs(model.results[2:TOTAL_NUM_STIMS,2]-TARGETS[:TOTAL_NUM_STIMS-2])) + fig, axes = plt.subplots(3, 1, figsize=(5, 12)) + # Weight matrix + axes[0].imshow(model.projections[7].parameters.matrix.get(model.name), interpolation=None) + # L1 of loss + axes[1].plot((1 - np.abs(model.results[1:TOTAL_NUM_STIMS,2]-TARGETS[:TOTAL_NUM_STIMS-1])).sum(-1)) + axes[1].set_xlabel('Stimuli') + axes[1].set_ylabel(model_params['loss_spec']) + # Logit of loss + axes[2].plot( (model.results[1:TOTAL_NUM_STIMS,2]*TARGETS[:TOTAL_NUM_STIMS-1]).sum(-1) ) + axes[2].set_xlabel('Stimuli') + axes[2].set_ylabel('Correct Logit') + plt.suptitle(f"{model_params['curriculum_type']} Training") plt.show() - plt.savefig('EGO PLOT.png') - + # plt.savefig('../show_graph OUTPUT/EGO PLOT.png') #endregion diff --git a/Scripts/Models (Under Development)/EGO/EGO Model (sim 1) - MDP using EMComposition.py b/Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - Revaluation.py similarity index 99% rename from Scripts/Models (Under Development)/EGO/EGO Model (sim 1) - MDP using EMComposition.py rename to Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - Revaluation.py index 3420f1191d8..c9e827cf197 100644 --- a/Scripts/Models (Under Development)/EGO/EGO Model (sim 1) - MDP using EMComposition.py +++ b/Scripts/Models (Under Development)/EGO/Using EMComposition/EGO Model - Revaluation.py @@ -125,8 +125,8 @@ CONSTRUCT_MODEL = True # THIS MUST BE SET TO True to run the script DISPLAY_MODEL = ( # Only one of the following can be uncommented: - None # suppress display of model - # {} # show simple visual display of model + # None # suppress display of model + {} # show simple visual display of model # {'show_node_structure': True} # show detailed view of node structures and projections ) RUN_MODEL = True # True => run the model diff --git a/Scripts/Models (Under Development)/EGO/Environment.py b/Scripts/Models (Under Development)/EGO/Using EMComposition/Environment.py similarity index 100% rename from Scripts/Models (Under Development)/EGO/Environment.py rename to Scripts/Models (Under Development)/EGO/Using EMComposition/Environment.py diff --git a/Scripts/Models (Under Development)/EGO/Using EMComposition/ScriptControl.py b/Scripts/Models (Under Development)/EGO/Using EMComposition/ScriptControl.py new file mode 100644 index 00000000000..8b40d9403ca --- /dev/null +++ b/Scripts/Models (Under Development)/EGO/Using EMComposition/ScriptControl.py @@ -0,0 +1,29 @@ +from psyneulink.core.compositions.report import ReportOutput, ReportProgress + +# Settings for running script: + +# MODEL_PARAMS = 'TestParams' +MODEL_PARAMS = 'DeclanParams' + +CONSTRUCT_MODEL = True # THIS MUST BE SET TO True to run the script +DISPLAY_MODEL = ( # Only one of the following can be uncommented: + None # suppress display of model + # { # show simple visual display of model + # 'show_pytorch': True, # show pytorch graph of model + # 'show_learning': True + # # 'show_projections_not_in_composition': True, + # # 'exclude_from_gradient_calc_style': 'dashed'# show target mechanisms for learning + # # {'show_node_structure': True # show detailed view of node structures and projections + # } +) +# RUN_MODEL = False # False => don't run the model +RUN_MODEL = True, # True => run the model +# REPORT_OUTPUT = ReportOutput.FULL # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] +REPORT_OUTPUT = ReportOutput.OFF # Sets console output during run [ReportOutput.ON, .TERSE OR .FULL] +REPORT_PROGRESS = ReportProgress.OFF # Sets console progress bar during run +# PRINT_RESULTS = False # don't print model.results to console after execution +PRINT_RESULTS = True # print model.results to console after execution +SAVE_RESULTS = False # save model.results to disk +# PLOT_RESULTS = False # don't plot results (PREDICTIONS) vs. TARGETS +PLOT_RESULTS = True # plot results (PREDICTIONS) vs. TARGETS +ANIMATE = False # {UNIT:EXECUTION_SET} # Specifies whether to generate animation of execution diff --git a/Scripts/Models (Under Development)/EGO/Using EMComposition/TestParams.py b/Scripts/Models (Under Development)/EGO/Using EMComposition/TestParams.py new file mode 100644 index 00000000000..39a4c9ccbc3 --- /dev/null +++ b/Scripts/Models (Under Development)/EGO/Using EMComposition/TestParams.py @@ -0,0 +1,56 @@ +from psyneulink.core.llvm import ExecutionMode +from psyneulink.core.globals.keywords import ALL, ADAPTIVE, CONTROL, CPU, Loss, MPS, OPTIMIZATION_STEP, RUN, TRIAL + +model_params = dict( + + # Names: + name = "EGO Model CSW", + state_input_layer_name = "STATE", + previous_state_layer_name = "PREVIOUS STATE", + context_layer_name = 'CONTEXT', + em_name = "EM", + prediction_layer_name = "PREDICTION", + + # Structural + state_d = 11, # length of state vector + previous_state_d = 11, # length of state vector + context_d = 11, # length of context vector + memory_capacity = ALL, # number of entries in EM memory; ALL=> match to number of stims + memory_init = (0,.0001), # Initialize memory with random values in interval + # memory_init = None, # Initialize with zeros + # concatenate_keys = False, + concatenate_keys = True, + + # environment + # curriculum_type = 'Interleaved', + curriculum_type = 'Blocked', + num_stims = 7, # Integer or ALL + # num_stims = ALL, # Integer or ALL + + # Processing + integration_rate = .69, # rate at which state is integrated into new context + state_weight = 1, # weight of the state used during memory retrieval + context_weight = 1, # weight of the context used during memory retrieval + normalize_field_weights = False, # whether to normalize the field weights during memory retrieval + # normalize_field_weights = True, # whether to normalize the field weights during memory retrieval + # softmax_temperature = None, # temperature of the softmax used during memory retrieval (smaller means more argmax-like + softmax_temperature = .1, # temperature of the softmax used during memory retrieval (smaller means more argmax-like + # softmax_temperature = ADAPTIVE, # temperature of the softmax used during memory retrieval (smaller means more argmax-like + # softmax_temperature = CONTROL, # temperature of the softmax used during memory retrieval (smaller means more argmax-like + # softmax_threshold = None, # threshold used to mask out small values in softmax + softmax_threshold = .001, # threshold used to mask out small values in softmax + enable_learning=[True, False, False], # Enable learning for PREDICTION (STATE) but not CONTEXT or PREVIOUS STATE + learn_field_weights = False, + loss_spec = Loss.BINARY_CROSS_ENTROPY, + # loss_spec = Loss.MSE, + learning_rate = .5, + num_optimization_steps = 10, + # execution_mode = ExecutionMode.Python, + synch_weights = RUN, + synch_values = RUN, + synch_results = RUN, + execution_mode = ExecutionMode.PyTorch, + device = CPU, + # device = MPS, +) +#endregion \ No newline at end of file diff --git a/Scripts/Models (Under Development)/EGO/Using EMComposition/__init__.py b/Scripts/Models (Under Development)/EGO/Using EMComposition/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Scripts/Models (Under Development)/EGO/EGO Model - MDP.py b/Scripts/Models (Under Development)/EGO/Using EpisodicMemoryMechanism/EGO Model - MDP.py similarity index 100% rename from Scripts/Models (Under Development)/EGO/EGO Model - MDP.py rename to Scripts/Models (Under Development)/EGO/Using EpisodicMemoryMechanism/EGO Model - MDP.py diff --git a/Scripts/Models (Under Development)/EGO/Using EpisodicMemoryMechanism/__init__.py b/Scripts/Models (Under Development)/EGO/Using EpisodicMemoryMechanism/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Scripts/Models (Under Development)/EGO/__init__.py b/Scripts/Models (Under Development)/EGO/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Scripts/Models (Under Development)/nback/nback.py b/Scripts/Models (Under Development)/nback/nback.py index 5930c3ef6c0..c1513137d36 100644 --- a/Scripts/Models (Under Development)/nback/nback.py +++ b/Scripts/Models (Under Development)/nback/nback.py @@ -890,7 +890,7 @@ def network_test(network:AutodiffComposition, coded_responses, stats = analyze_results([network.results,conditions], test=True) import torch cross_entropy_loss = \ - [network.loss(torch.Tensor(output[0]),torch.Tensor(np.array(target))).detach().numpy().tolist() + [network.loss_function(torch.Tensor(output[0]),torch.Tensor(np.array(target))).detach().numpy().tolist() for output, target in zip(network.results, targets)] coded_responses_flat = [] diff --git a/Scripts/Models (Under Development)/nback/nback_og_pnl.py b/Scripts/Models (Under Development)/nback/nback_og_pnl.py index aa1b9f0fc30..fcbab06dc66 100644 --- a/Scripts/Models (Under Development)/nback/nback_og_pnl.py +++ b/Scripts/Models (Under Development)/nback/nback_og_pnl.py @@ -882,7 +882,7 @@ def network_test(network:AutodiffComposition, coded_responses, stats = analyze_results([network.results,conditions], test=True) import torch cross_entropy_loss = \ - [network.loss(torch.Tensor(output[0]),torch.Tensor(np.array(target))).detach().numpy().tolist() + [network.loss_function(torch.Tensor(output[0]),torch.Tensor(np.array(target))).detach().numpy().tolist() for output, target in zip(network.results, targets)] coded_responses_flat = [] for nback_level in nback_levels: diff --git a/psyneulink/core/components/component.py b/psyneulink/core/components/component.py index 305226c7712..ba8f0755585 100644 --- a/psyneulink/core/components/component.py +++ b/psyneulink/core/components/component.py @@ -1463,7 +1463,7 @@ def _get_compilation_params(self): "objective_mechanism", "agent_rep", "projections", "outcome_input_ports", "state_input_ports", # autodiff specific types - "pytorch_representation", "optimizer", + "pytorch_representation", "optimizer", "synch_projection_matrices_with_torch", # duplicate "allocation_samples", "control_allocation_search_space", # not used in computation @@ -1490,10 +1490,14 @@ def _get_compilation_params(self): "error_matrix", "error_signal", "activation_input", "activation_output", "error_sources", "covariates_sources", "target", "sample", "learning_function", - "device", + "minibatch_size", "optimizations_per_minibatch", "device", + "retain_torch_trained_outputs", "retain_torch_targets", "retain_torch_losses" + "torch_trained_outputs", "torch_targets", "torch_losses", # should be added to relevant _gen_llvm_function... when aug: # SoftMax: - 'mask_threshold', 'adapt_scale', 'adapt_base', 'adapt_entropy_weighting' + 'mask_threshold', 'adapt_scale', 'adapt_base', 'adapt_entropy_weighting', + # LCAMechanism + "mask" } # Mechanism's need few extra entries: # * matrix -- is never used directly, and is flatened below diff --git a/psyneulink/core/compositions/composition.py b/psyneulink/core/compositions/composition.py index 79177e1c3b2..c2216c625a4 100644 --- a/psyneulink/core/compositions/composition.py +++ b/psyneulink/core/compositions/composition.py @@ -3504,6 +3504,8 @@ class Composition(Composition_Base, metaclass=ComponentsMeta): include_probes_in_output=False \ disable_learning=False, \ learning_rate=None, \ + minibatch_size=1, \ + optimizations_per_minibatch=1, \ controller=None, \ enable_controller=None, \ controller_mode=AFTER, \ @@ -3571,6 +3573,19 @@ class Composition(Composition_Base, metaclass=ComponentsMeta): that do not have their own `learning_rate ` otherwise specified (see `Composition_Learning_Rate` for additional details). + minibatch_size : int : default 1 + specifies the default for the Composition for the number of distinct inputs from the training set used to + compute the `error_signal ` in one step of learning; it can be overridden by + specifying the **minibatch_size** argument in the `learn ` method (see `minibatch_size + ` for additional details. + + optimizations_per_minibatch : int : default 1 + specifies the default for the Composition for the number of repetitions of each stimulus in the training set + is used to compute the `error_signal ` for a given `minibatch + `; it can be overridden by specifying the **minibatch_size** argument in the `learn + ` method (see `optimizations_per_minibatch ` for + additional details. + controller : `OptimizationControlMechanism` : default None specifies the `OptimizationControlMechanism` to use as the `Composition's controller `. @@ -3842,6 +3857,16 @@ class Composition(Composition_Base, metaclass=ComponentsMeta): ` Parameter of a LearningMechanism (see `Composition_Learning_Rate` for additional details). + minibatch_size : int + determines the number of input stimuli from the training set used to compute the `error_signal + ` in one gradient step of learning if this is not specified in the call to + `learn ` (see `minibatch ` for additional details). + + optimizations_per_minibatch : int + determines the number of repetitions of each stimulus in the training set used to compute an `error_signal + ` for single gradient step in learning if this is not specified in the call + to `learn ` (see `minibatch ` for additional details). + learning_components : list[list] a list of the learning-related components in the Composition, all or many of which may have been created automatically in a call to one of its `add_<*learning_type*>_pathway' methods (see @@ -3936,6 +3961,18 @@ class Parameters(Composition_Base.Parameters): :default value: [] :type: ``list`` + minibatch_size + see `minibatch_size ` + + :default value: 1 + :type: ``int`` + + optimizations_per_minibatch + see `optimizations_per_minibatch ` + + :default value: 1 + :type: ``int`` + results see `results ` @@ -3954,6 +3991,8 @@ class Parameters(Composition_Base.Parameters): :default value: [] :type: ``list`` """ + minibatch_size = Parameter(1, modulable=True, pnl_internal=True) + optimizations_per_minibatch = Parameter(1, modulable=True, pnl_internal=True) results = Parameter([], loggable=False, pnl_internal=True) learning_results = Parameter([], loggable=False, pnl_internal=True) simulation_results = Parameter([], loggable=False, pnl_internal=True) @@ -3961,6 +4000,15 @@ class Parameters(Composition_Base.Parameters): input_specification = Parameter(None, stateful=False, loggable=False, pnl_internal=True) value = Parameter(NotImplemented, read_only=True) # replaces deletion in constructor below + def _validate_minibatch_size(self, minibatch_size): + if minibatch_size < 1: + raise CompositionError(f"`minibatch_size` ({minibatch_size}) must an int greater than or equal to 1.") + + def _validate_optimizations_per_minibatch(self, optimizations_per_minibatch): + if optimizations_per_minibatch < 1: + raise CompositionError(f"`optimizations_per_minibatch` ({optimizations_per_minibatch}) " + f"must an int greater than or equal to 1.") + class _CompilationData(ParametersBase): execution = None @@ -3974,6 +4022,8 @@ def __init__( include_probes_in_output: bool = False, disable_learning: bool = False, learning_rate:Optional[Union[float, int]] = None, + minibatch_size:int = 1, + optimizations_per_minibatch:int = 1, controller: ControlMechanism = None, enable_controller=None, controller_mode: Literal['before', 'after'] = 'after', @@ -4059,6 +4109,8 @@ def __init__( self._initialize_parameters( **param_defaults, + minibatch_size=minibatch_size, + optimizations_per_minibatch=optimizations_per_minibatch, retain_old_simulation_data=retain_old_simulation_data, context=context ) @@ -9917,7 +9969,7 @@ def _infer_target_nodes(self, targets: dict, execution_mode): if execution_mode is pnlvm.ExecutionMode.PyTorch: # Reassign target inputs from output Nodes to target mechanisms constructed for PyTorch execution - return {target: value for target, value in zip(self.target_output_map.keys(), targets.values())} + return {target: value for target, value in zip(self.targets_from_outputs_map.keys(), targets.values())} ret = {} for node, values in targets.items(): @@ -10143,7 +10195,7 @@ def _parse_input_dict(self, inputs, context=None): # If Composition is in learning mode, not called from COMMAND_LINE, and not still preparing, # presumably inputs have already been parsed so shouldn't do it again - # FIX: 11/3/23 - NOTE: This circumvents parsing of inputs when they are a func and called from autodiff_training + # FIX: 11/3/23 - NOTE: This circumvents parsing of inputs when they are a func and called from autodiff_forward if (context and (context.runmode & ContextFlags.LEARNING_MODE) and (context.source & ContextFlags.COMPOSITION) and not (context.execution_phase & ContextFlags.PREPARING)): @@ -10862,7 +10914,7 @@ def run( context=None, base_context=Context(execution_id=None), **kwargs - ): + )->list: """Pass inputs to Composition, then execute sets of nodes that are eligible to run until termination conditions are met. @@ -11326,6 +11378,8 @@ def run( content='run_start', context=context) + self.TRIAL_NUM = -1 + # Loop over the length of the list of inputs - each input represents a TRIAL for trial_num in range(num_trials): @@ -11353,7 +11407,7 @@ def run( break # execute processing, passing stimuli for this trial - # IMPLEMENTATION NOTE: for autdoiff, the following is the forward pass for the current trial + # IMPLEMENTATION NOTE: for autodiff, the following executes the forward pass for a single input trial_output = self.execute(inputs=execution_stimuli, scheduler=scheduler, termination_processing=termination_processing, @@ -11369,20 +11423,20 @@ def run( skip_initialization=True, execution_mode=execution_mode, report=report, - report_num=report_num + report_num=report_num, + **kwargs ) # --------------------------------------------------------------------------------- # store the result of this execution in case it will be the final result - - assert "AFFTER FOWARD PASS" - - # object.results.append(result) trial_output = copy_parameter_value(trial_output) - results.append(trial_output) - self.parameters.results._set(convert_to_np_array(results), context) + self._update_results(results, + trial_output, + execution_mode, + kwargs['synch_with_pnl_options'] if 'synch_with_pnl_options' in kwargs else None, + context) if not self.parameters.retain_old_simulation_data._get(): if self.controller is not None: @@ -11464,19 +11518,18 @@ def learn( num_trials: Optional[int] = None, epochs: int = 1, learning_rate: Optional[Union[int,float]]=None, - minibatch_size: int = 1, - optimizations_per_minibatch: int = 1, + minibatch_size:Optional[int]=None, + optimizations_per_minibatch:Optional[int]=None, patience: Optional[int] = None, min_delta: int = 0, - synchronize_pnl_values: bool = True, - context: Optional[Context] = None, execution_mode: pnlvm.ExecutionMode = pnlvm.ExecutionMode.Python, randomize_minibatches=False, call_before_minibatch=None, call_after_minibatch=None, + context: Optional[Context] = None, *args, **kwargs - ): + )->list: """ Runs the composition in learning mode - that is, any components with disable_learning False will be executed in learning mode. See `Composition_Learning` for details. @@ -11521,12 +11574,15 @@ def learn( the learn method (see `Composition_Learning_Rate` for additional details). minibatch_size : int (default=1) - specifies the size of the minibatches to use. The input trials will be batched and run, after which - learning mechanisms with learning mode TRIAL will update weights + specifies the number of inputs used to calculate the `error_signal ` + for one step (gradient update) of learning, after which LearningMechanisms with learning mode TRIAL + will update the `matrix ` parameter of the `MappingProjection` for which + they are responsible; this overrides the Composition's default value. optimizations_per_minibatch : int (default=1) - specified the number of executions and weight updates of learnable pathways are carried out for - each set of stimuli in a minibatch. + specifies the number of executions and weight updates of learnable pathways that are carried out for + each set of stimuli in a `minibatch `; this overrides the Composition's + default value. .. hint:: This can be used to implement the `backprop-to-activation proceedure @@ -11536,7 +11592,7 @@ def learn( downstream purpose. randomize_minibatch: bool (default=False) - specifies whether the order of the input trials should be randomized on each epoch + specifies whether the order of the input trials should be randomized in each epoch patience : int or None (default=None) used for early stopping of training; If a model has more than `patience` bad consecutive epochs, @@ -11547,19 +11603,10 @@ def learn( Any reduction less than this value is considered to be a bad epoch. Used for early stopping of training, in combination with `patience`. - synchronize_pnl_values : bool : default True - specifies whether to synchronize the `values ` of the `Mechanisms ` - in the PsyNeuLink Composition with the corresponding modules of the PyTorch implementation after each - forward pass when an `AutodiffComposition` is used is executed in ``PyTorch mode - `. - scheduler : Scheduler the scheduler object that owns the conditions that will instruct the execution of the Composition If not specified, the Composition will use its automatically generated scheduler. - context - context will be set to self.default_execution_id if unspecified - call_before_minibatch : callable called before each minibatch is executed @@ -11587,6 +11634,9 @@ def learn( specifies where output and progress should be reported; see `Report_To_Device` for additional details and `ReportDevices` for options. + context + context will be set to self.default_execution_id if unspecified + Returns --------- @@ -11609,14 +11659,12 @@ def learn( warnings.warn(f"learn() method called on '{self.name}', but it has no learning components; " f"it will be run but no learning will occur.") + # Prepare graph and context for learning context.add_flag(ContextFlags.LEARNING_MODE) - execution_phase_at_entry = context.execution_phase context.execution_phase=ContextFlags.PREPARING - self._analyze_graph() self._check_nested_target_mechs() - context.execution_phase = execution_phase_at_entry result = runner.run_learning( @@ -11625,11 +11673,14 @@ def learn( num_trials=num_trials, epochs=epochs, learning_rate=learning_rate, - minibatch_size=minibatch_size, - optimizations_per_minibatch=optimizations_per_minibatch, + minibatch_size=minibatch_size + or self.parameters.minibatch_size._get(context) + or self.parameters.minibatch_size.default_value, + optimizations_per_minibatch=optimizations_per_minibatch + or self.parameters.optimizations_per_minibatch._get(context) + or self.parameters.optimizations_per_minibatch.default_value, patience=patience, min_delta=min_delta, - synchronize_pnl_values=synchronize_pnl_values, randomize_minibatches=randomize_minibatches, call_before_minibatch=call_before_minibatch, call_after_minibatch=call_after_minibatch, @@ -11727,7 +11778,8 @@ def execute( report_to_devices:ReportDevices=None, report=None, report_num=None, - ): + **kwargs + )->np.ndarray: """ Passes inputs to any `Nodes ` receiving inputs directly from the user (via the "inputs" argument) then coordinates with the `Scheduler` to execute sets of Nodes that are eligible to execute until @@ -11809,7 +11861,7 @@ def execute( Returns --------- - output_values : List + output_values : np.ndarray These are the values of the Composition's output_CIM.output_ports, excluding those the source of which are from a (potentially nested) Node with NodeRole.PROBE in its enclosing Composition. """ @@ -12812,7 +12864,15 @@ def get_results_by_nodes(self, else: return {k:np.array(v).tolist() for k,v in result_set} - def _update_learning_parameters(self, context): + def _update_results(self, results, trial_output, execution_mode, synch_with_pnl_options, context): + """Update results by appending most recent trial_output + This is included as a helper so it can be overriden by subclasses (such as AutodiffComposition) + that may need to do this less frequently for scallable exeuction + """ + results.append(trial_output) + self.parameters.results._set(convert_to_np_array(results), context) + + def do_gradient_optimization(self, retain_in_pnl_options, context, optimization_num=None): pass @handle_external_context(fallback_most_recent=True) diff --git a/psyneulink/core/compositions/showgraph.py b/psyneulink/core/compositions/showgraph.py index feb22cc7cde..29177bd5398 100644 --- a/psyneulink/core/compositions/showgraph.py +++ b/psyneulink/core/compositions/showgraph.py @@ -826,13 +826,6 @@ def show_graph(self, rcvrs = list(processing_graph.keys()) for rcvr in rcvrs: - # # MODIFIED 7/10 NEW: - # # FIX: NOT SURE WHAT THE PURPOSE OF THIS WAS, AND DOESN'T EVER SEEM TO GET CALLED: - # if any(n is rcvr for nested_comp in self._get_nodes(composition, context) - # if isinstance(nested_comp, Composition) for n in self._get_nodes(nested_comp, context)): - # continue - # # MODIFIED 7/10 END - # If show_controller is true, objective mechanism is handled in _assign_controller_components if (show_controller and composition.controller diff --git a/psyneulink/core/globals/keywords.py b/psyneulink/core/globals/keywords.py index c688746286c..4ed8c8335a9 100644 --- a/psyneulink/core/globals/keywords.py +++ b/psyneulink/core/globals/keywords.py @@ -28,8 +28,8 @@ 'ADAPTIVE', 'ADAPTIVE_INTEGRATOR_FUNCTION', 'ADAPTIVE_MECHANISM', 'ADD_INPUT_PORT', 'ADD_OUTPUT_PORT', 'ADDITIVE', 'ADDITIVE_PARAM', 'AFTER', 'ALL', 'ALLOCATION_SAMPLES', 'ALLOW_PROBES', 'ANGLE', 'ANGLE_FUNCTION', 'ANY', 'ARGUMENT_THERAPY_FUNCTION', 'ARRANGEMENT', 'ASSERT', 'ASSIGN', 'ASSIGN_VALUE', 'AUTO','AUTO_ASSIGN_MATRIX', - 'AUTO_ASSOCIATIVE_PROJECTION', 'HAS_INITIALIZERS', 'AUTOASSOCIATIVE_LEARNING_MECHANISM', 'AUTODIFF_COMPOSITION', - 'BACKPROPAGATION_FUNCTION', 'BINOMIAL_DISTORT_FUNCTION', + 'AUTO_ASSOCIATIVE_PROJECTION', 'HAS_INITIALIZERS', 'AUTOASSOCIATIVE_LEARNING_MECHANISM', + 'AUTODIFF_COMPOSITION', 'AUTODIFF_RESULTS', 'BACKPROPAGATION_FUNCTION', 'BINOMIAL_DISTORT_FUNCTION', 'BEFORE', 'BETA', 'BIAS', 'BOLD', 'BOTH', 'BOUNDS', 'BUFFER_FUNCTION', 'CHANGED', 'CLAMP_INPUT', 'COMBINATION_FUNCTION_TYPE', 'COMBINE', 'COMBINE_MEANS_FUNCTION', 'COMBINE_OUTCOME_AND_COST_FUNCTION', 'COMMAND_LINE', 'comparison_operators', 'COMPARATOR_MECHANISM', 'COMPONENT', @@ -48,9 +48,10 @@ 'DRIFT_DIFFUSION_INTEGRATOR_FUNCTION', 'DRIFT_ON_A_SPHERE_INTEGRATOR_FUNCTION', 'DROPOUT_FUNCTION', 'DUAL_ADAPTIVE_INTEGRATOR_FUNCTION', 'EFFERENTS', 'EID_SIMULATION', 'EID_FROZEN', 'EITHER', 'ENABLE_CONTROLLER', 'ENABLED', 'ENERGY', 'ENTROPY', - 'EM_COMPOSITION', 'EM_STORAGE_FUNCTION', 'EM_STORAGE_MECHANISM', 'EPISODIC_MEMORY_MECHANISM', 'EPOCHS', 'EQUAL', - 'ERROR_DERIVATIVE_FUNCTION', 'EUCLIDEAN', 'EVC_MECHANISM', 'EVC_SIMULATION', 'EXAMPLE_FUNCTION_TYPE', - 'EXECUTE_UNTIL_FINISHED', 'EXECUTING', 'EXECUTION', 'EXECUTION_COUNT', 'EXECUTION_ID', 'EXECUTION_PHASE', + 'EM_COMPOSITION', 'EM_STORAGE_FUNCTION', 'EM_STORAGE_MECHANISM', 'EPISODIC_MEMORY_MECHANISM', 'EPOCH', 'EPOCHS', + 'EQUAL', 'ERROR_DERIVATIVE_FUNCTION', 'EUCLIDEAN', 'EVC_MECHANISM', 'EVC_SIMULATION', 'EXAMPLE_FUNCTION_TYPE', + 'EXECUTE_UNTIL_FINISHED', 'EXECUTING', + 'EXECUTION', 'EXECUTION_COUNT', 'EXECUTION_ID', 'EXECUTION_MODE', 'EXECUTION_PHASE', 'EXPONENTIAL', 'EXPONENT', 'EXPONENTIAL_DIST_FUNCTION', 'EXPONENTIAL_FUNCTION', 'EXPONENTS', 'FEEDBACK', 'FITZHUGHNAGUMO_INTEGRATOR_FUNCTION', 'FINAL', 'FLAGS', 'FULL', 'FULL_CONNECTIVITY_MATRIX', 'FUNCTION', 'FUNCTIONS', 'FUNCTION_COMPONENT_CATEGORY','FUNCTION_CHECK_ARGS', @@ -60,26 +61,27 @@ 'GAUSSIAN', 'GAUSSIAN_FUNCTION', 'GILZENRAT_INTEGRATOR_FUNCTION', 'GREATER_THAN', 'GREATER_THAN_OR_EQUAL', 'GRADIENT_OPTIMIZATION_FUNCTION', 'GRID_SEARCH_FUNCTION', 'HARD_CLAMP', 'HEBBIAN_FUNCTION', 'HETERO', 'HIGH', 'HOLLOW_MATRIX', 'IDENTITY_MATRIX', 'INCREMENT', 'INDEX', - 'INIT_EXECUTE_METHOD_ONLY', 'INIT_FULL_EXECUTE_METHOD', 'INIT_FUNCTION_METHOD_ONLY', 'INITIALIZE_CYCLE_VALUES', - 'INITIALIZE_CYCLE', 'INITIALIZATION', 'INITIALIZED', 'INITIALIZER', 'INITIALIZING', 'INITIALIZATION_STATUS', + 'INIT_EXECUTE_METHOD_ONLY', 'INIT_FULL_EXECUTE_METHOD', 'INIT_FUNCTION_METHOD_ONLY', + 'INITIALIZE', 'INITIALIZED', 'INITIALIZER', 'INITIALIZE_CYCLE', 'INITIALIZE_CYCLE_VALUES', + 'INITIALIZING', 'INITIALIZATION', 'INITIALIZATION_STATUS', 'INPUT', 'INPUTS', 'INPUT_CIM_NAME', 'INPUT_LABELS_DICT', 'INPUT_PORT', 'INPUT_PORTS', 'INPUT_PORT_PARAMS', 'INPUT_PORT_VARIABLES', 'INPUTS_DIM', 'INSET', 'CURRENT_VALUE', 'INTEGRATION_TYPE', 'INTEGRATOR_FUNCTION','INTEGRATOR_FUNCTION', 'INTEGRATOR_FUNCTION_TYPE', 'INTEGRATOR_MECHANISM', 'LAST_INTEGRATED_VALUE', 'INTERCEPT', 'INTERNAL', 'INTERNAL_ONLY', 'K_VALUE', 'KOHONEN_FUNCTION', 'KOHONEN_MECHANISM', 'KOHONEN_LEARNING_MECHANISM', 'KWTA_MECHANISM', - 'LABELS', 'LCA_MECHANISM', 'LEAKY_COMPETING_INTEGRATOR_FUNCTION', 'LEAK', 'LEARNABLE', - 'LEARNED_PROJECTIONS', 'LEARNING', 'LEARNING_FUNCTION', 'LEARNING_FUNCTION_TYPE', - 'LEARNING_OBJECTIVE', 'LEARNING_MECHANISM', 'LEARNING_MECHANISMS', 'LEARNING_PATHWAY', 'LEARNING_PROJECTION', - 'LEARNING_PROJECTION_PARAMS', 'LEARNING_RATE', 'LEARNING_SIGNAL', 'LEARNING_SIGNAL_SPECS', 'LEARNING_SIGNALS', - 'LESS_THAN', 'LESS_THAN_OR_EQUAL', 'LINEAR', 'LINEAR_COMBINATION_FUNCTION', 'LINEAR_FUNCTION', - 'LINEAR_MATRIX_FUNCTION', 'LOG_ENTRIES', 'LOGISTIC_FUNCTION', 'Loss', 'LOW', 'LVOC_CONTROL_MECHANISM', + 'LABELS', 'LCA_MECHANISM', 'LEAKY_COMPETING_INTEGRATOR_FUNCTION', 'LEAK', 'LEARNABLE', 'LEARNED_PROJECTIONS', + 'LEARNING', 'LEARNING_FUNCTION', 'LEARNING_FUNCTION_TYPE', 'LEARNING_OBJECTIVE', 'LEARNING_MECHANISM', + 'LEARNING_MECHANISMS', 'LEARNING_PATHWAY', 'LEARNING_PROJECTION', 'LEARNING_PROJECTION_PARAMS', 'LEARNING_RATE', + 'LEARNING_SCALE', 'LEARNING_SCALE_LITERALS', 'LEARNING_SCALE_NAMES', 'LEARNING_SIGNAL', 'LEARNING_SIGNAL_SPECS', + 'LEARNING_SIGNALS', 'LESS_THAN', 'LESS_THAN_OR_EQUAL', 'LINEAR', 'LINEAR_COMBINATION_FUNCTION', 'LINEAR_FUNCTION', + 'LINEAR_MATRIX_FUNCTION', 'LOG_ENTRIES', 'LOGISTIC_FUNCTION', 'Loss', 'LOSSES', 'LOW', 'LVOC_CONTROL_MECHANISM', 'MAPPING_PROJECTION', 'MAPPING_PROJECTION_PARAMS', 'MASKED_MAPPING_PROJECTION', 'MATRIX', 'MATRIX_KEYWORD_NAMES', 'MATRIX_KEYWORD_SET', 'MATRIX_KEYWORD_VALUES', 'MATRIX_KEYWORDS','MatrixKeywords', - 'MAX_ABS_DIFF', 'MAX_ABS_INDICATOR', 'MAX_ONE_HOT', 'MAX_ABS_ONE_HOT', 'MAX_ABS_VAL', + 'MATRIX_WEIGHTS', 'MAX_ABS_DIFF', 'MAX_ABS_INDICATOR', 'MAX_ONE_HOT', 'MAX_ABS_ONE_HOT', 'MAX_ABS_VAL', 'MAX_EXECUTIONS_BEFORE_FINISHED', 'MAX_INDICATOR', 'MAX_VAL', 'MAYBE', 'MEAN', 'MECHANISM', 'MECHANISM_COMPONENT_CATEGORY', 'MECHANISM_DEFAULT', 'MECHANISM_DEFAULT_INPUT_VALUE', 'MECHANISM_DEFAULTParams', 'MECHANISM_EXECUTED_LOG_ENTRY', 'MECHANISM_NAME', 'MECHANISM_PARAM_VALUE', - 'MECHANISM_TYPE', 'MECHANISM_VALUE', 'MEDIAN', 'METRIC', 'MIN_VAL', 'MIN_ABS_VAL', 'MIN_ABS_INDICATOR', + 'MECHANISM_TYPE', 'MECHANISM_VALUE', 'MEDIAN', 'METRIC', 'MIN_VAL', 'MIN_ABS_VAL', 'MIN_ABS_INDICATOR', 'MINIBATCH', 'MOD_AFFERENTS', 'MODE', 'MODULATES','MODULATION', 'MODULATORY_PROJECTION', 'MODULATORY_SIGNAL', 'MODULATORY_SIGNALS', 'MONITOR', 'MONITOR_FOR_CONTROL', 'MONITOR_FOR_LEARNING', 'MONITOR_FOR_MODULATION', 'MODEL_SPEC_ID_GENERIC', 'MODEL_SPEC_ID_INPUT_PORTS', 'MODEL_SPEC_ID_OUTPUT_PORTS', @@ -88,11 +90,13 @@ 'MODEL_SPEC_ID_PARAMETER_INITIAL_VALUE', 'MODEL_SPEC_ID_PARAMETER_SOURCE', 'MPS', 'MODEL_SPEC_ID_PARAMETER_VALUE', 'MODEL_SPEC_ID_TYPE', 'MULTIPLICATIVE', 'MULTIPLICATIVE_PARAM', 'MUTUAL_ENTROPY', - 'NAME', 'NESTED', 'NEWEST', 'NODE', 'NODES', 'NOISE', 'NORMAL_DIST_FUNCTION', 'NORMALIZE', 'NORMED_L0_SIMILARITY', + 'NAME', 'NESTED', 'NEWEST', 'NODE', 'NODES', 'NODE_VALUES', 'NODE_VARIABLES', 'NOISE', + 'NORMAL_DIST_FUNCTION', 'NORMALIZE', 'NORMED_L0_SIMILARITY', 'NOT_EQUAL', 'NUM_EXECUTIONS_BEFORE_FINISHED', 'OBJECTIVE_FUNCTION_TYPE', 'OBJECTIVE_MECHANISM', 'OBJECTIVE_MECHANISM_OBJECT', 'OFF', 'OFFSET', 'OLDEST', 'ON', - 'ONLINE', 'ONLY', 'OPERATION', 'OPTIMIZATION_FUNCTION_TYPE', 'ORIGIN','ORNSTEIN_UHLENBECK_INTEGRATOR_FUNCTION', - 'OUTCOME', 'OUTCOME_FUNCTION', 'OUTPUT', 'OUTPUT_CIM_NAME', 'OUTPUT_LABELS_DICT', 'OUTPUT_MECHANISM', + 'ONLINE', 'ONLY', 'OPERATION', 'OPTIMIZATION_FUNCTION_TYPE', 'OPTIMIZATION_STEP', 'ORIGIN', + 'ORNSTEIN_UHLENBECK_INTEGRATOR_FUNCTION', + 'OUTCOME', 'OUTCOME_FUNCTION', 'OUTPUT', 'OUTPUTS', 'OUTPUT_CIM_NAME', 'OUTPUT_LABELS_DICT', 'OUTPUT_MECHANISM', 'OUTPUT_PORT', 'OUTPUT_PORT_PARAMS', 'output_port_spec_to_parameter_name', 'OUTPUT_PORTS', 'OUTPUT_TYPE', 'OVERRIDE', 'OVERRIDE_PARAM', 'OVERWRITE', 'OWNER', 'OWNER_EXECUTION_COUNT', 'OWNER_EXECUTION_TIME', 'OWNER_VALUE', 'OWNER_VARIABLE', @@ -113,13 +117,13 @@ 'SAMPLE', 'SAVE_ALL_VALUES_AND_POLICIES', 'SCALAR', 'SCALE', 'SCHEDULER', 'SELF', 'SENDER', 'SEPARATE', 'SEPARATOR_BAR', 'SHADOW_INPUT_NAME', 'SHADOW_INPUTS', 'SIMPLE', 'SIMPLE_INTEGRATOR_FUNCTION', 'SIMULATIONS', 'SINGLE', 'SINGLETON', 'SIZE', 'SLOPE', 'SOFT_CLAMP', 'SOFTMAX_FUNCTION', 'SOURCE', 'STABILITY_FUNCTION', - 'STANDARD_ARGS', 'STANDARD_DEVIATION', 'STANDARD_OUTPUT_PORTS', 'SUBTRACTION', 'SUM', + 'STANDARD_ARGS', 'STANDARD_DEVIATION', 'STANDARD_OUTPUT_PORTS', 'STORE', 'SUBTRACTION', 'SUM', 'TARGET', 'TARGET_MECHANISM', 'TARGET_LABELS_DICT', 'TERMINAL', 'TARGETS', 'TERMINATION_MEASURE', 'TERMINATION_THRESHOLD', 'TERMINATION_COMPARISION_OP', 'TERSE', 'TEXT', 'THRESHOLD', - 'TIME', 'TIME_STEP_SIZE', 'TIME_STEPS_DIM', 'TRAINING_SET', + 'TIME', 'TIME_STEP_SIZE', 'TIME_STEPS_DIM', 'TRAINED_OUTPUTS', 'TRAINING_SET', 'TRANSFER_FUNCTION_TYPE', 'TRANSFER_MECHANISM', 'TRANSFER_WITH_COSTS_FUNCTION', 'TRIAL', 'TRIALS_DIM', - 'UNCHANGED', 'UNIFORM_DIST_FUNCTION', 'USER_DEFINED_FUNCTION', 'USER_DEFINED_FUNCTION_TYPE', + 'UNCHANGED', 'UNIFORM_DIST_FUNCTION', 'UPDATE', 'USER_DEFINED_FUNCTION', 'USER_DEFINED_FUNCTION_TYPE', 'VALUES', 'VALIDATE', 'VALIDATION', 'VALUE', 'VALUE_ASSIGNMENT', 'VALUE_FUNCTION', 'VARIABLE', 'VARIANCE', 'VECTOR', 'WALD_DIST_FUNCTION', 'WEIGHT', 'WEIGHTS', 'X_0', 'ZEROS_MATRIX', 'SHARED_COMPONENT_TYPES', ] @@ -133,6 +137,8 @@ from psyneulink._typing import Literal +#region ----------------------------------------- MATRICES ----------------------------------------------------------- + class MatrixKeywords: """ Attributes @@ -206,7 +212,9 @@ def _names(self): MATRIX_KEYWORD_SET = MATRIX_KEYWORDS._set() MATRIX_KEYWORD_VALUES = MATRIX_KEYWORDS._values() MATRIX_KEYWORD_NAMES = MATRIX_KEYWORDS._names() +#endregion +#region ---------------------------------------- DISTANCE METRICS ---------------------------------------------------- class DistanceMetrics: """Distance between two arrays. @@ -305,6 +313,72 @@ def _is_metric(metric): # ENTROPY = 'entropy' CONVERGENCE = 'CONVERGENCE' +#endregion + +#region ------------------------------------------- LEARNING ----------------------------------------------------- + + +class LearningScale: + """Scales at which `learning ` occurs + + Used to specify the scales over which learning-related events occur when `learning ` is + executed in a `Composition`. + + Attributes + ---------- + + OPTIMIZATION_STEP + a single step of gradient calculation, of which there can be one or more in a `minibatch + `, based on a Composition's `mini_batch_size ` + Parameter. + + TRIAL + identical to MINIBACH when `minibatch_size `= 1; otherwise a warning is raised, + and unanticipated results can occur. + + MINIBATCH + a subset of the training set used to calculate an `error_signal ` + (i.e. one step along the gradient) used to and update the weights of a MappingProjection's + `matrix ` Parameter. + + EPOCH + a complete pass through the training set; the number of gradient calculations and weight updates that occur + in an epoch depends on the `mini_batch_size ` and `optimizations_per_minibatch + ` Parameters of the Composition. + + RUN + a complete execution of the `learn ` method of the Composition, involving + `num_epochs ` epochs. + + """ + def __init__(self): + self.OPTIMIZATION_STEP = OPTIMIZATION_STEP + self.TRIAL = MINIBATCH + self.MINIBATCH = MINIBATCH + self.EPOCH = EPOCH + self.RUN = RUN + + def _values(self): + return list(self.__dict__.values()) + + def _set(self): + return set(self.__dict__.values()) + + def _names(self): + return list(self.__dict__) + + +OPTIMIZATION_STEP = 'optimization_step' +# TRIAL = 'trial' # defined below in section on Composition +MINIBATCH = 'minibatch' +EPOCH = 'epoch' +RUN = 'run' + +LEARNING_SCALE = LearningScale() +LEARNING_SCALE_SET = LEARNING_SCALE._set() +LEARNING_SCALE_VALUES = LEARNING_SCALE._values() +LEARNING_SCALE_NAMES = LEARNING_SCALE._names() +LEARNING_SCALE_LITERALS = Literal[tuple(LEARNING_SCALE_VALUES)] # Used for type hinting class Loss(Enum): @@ -363,6 +437,10 @@ class Loss(Enum): SUM = L0 +LOSSES = 'losses' + +#endregion + # ********************************************************************************************************************** # ****************************************** CONSTANTS ************************************************************* # ********************************************************************************************************************** @@ -404,11 +482,15 @@ class Loss(Enum): FLAGS = 'flags' INITIALIZATION_STATUS = 'initialization_status' EXECUTION_PHASE = 'execution_phase' +EXECUTION_MODE = 'execution_mode' SOURCE = 'source' +INITIALIZE = "initialize" # Used as instruction to some methods INITIALIZING = " INITIALIZING " # Used as status and context for Log INITIALIZED = " INITIALIZED " # Used as status EXECUTING = " EXECUTING " # Used in context for Log and ReportOutput pref ASSIGN_VALUE = ': Assign value' +UPDATE = 'update' +STORE = 'store' VALIDATE = 'Validate' COMMAND_LINE = "COMMAND_LINE" CHANGED = 'CHANGED' @@ -420,6 +502,7 @@ class Loss(Enum): COUNT = 'COUNT' INPUT = 'input' OUTPUT = 'output' +OUTPUTS = 'outputs' PARAMETER = 'parameter' RANDOM = 'random' BEFORE = 'before' @@ -432,6 +515,8 @@ class Loss(Enum): DICT = 'dict' TEXT = 'text' +ADD = 'add' +SUBTRACT = 'subtract' LESS_THAN = '<' LESS_THAN_OR_EQUAL = '<=' EQUAL = '==' @@ -485,6 +570,7 @@ class Loss(Enum): # Composition Categories COMPOSITION = 'Composition' AUTODIFF_COMPOSITION = 'AutodiffComposition' +AUTODIFF_RESULTS = 'AutodiffResults' COMPOSITION_FUNCTION_APPROXIMATOR = 'CompositionFunctionApproximator' EM_COMPOSITION = 'EMComposition' @@ -499,6 +585,8 @@ class Loss(Enum): LEARNING_PATHWAY = "learning_pathway" NODE = 'NODE' NODES = 'NODES' +NODE_VARIABLES = 'node_variables' +NODE_VALUES = 'node_values' INPUTS = 'inputs' TARGETS = 'targets' EPOCHS = 'epochs' @@ -749,8 +837,9 @@ class Loss(Enum): #region ------------------------------------------ AUTODIFF COMPOSITION ---------------------------------------------- -TRAINING_SET = 'training set' LEARNING_RATE = "learning_rate" +TRAINING_SET = 'training set' +TRAINED_OUTPUTS = 'trained_outputs' #endregion @@ -967,6 +1056,7 @@ class Loss(Enum): FEEDBACK = 'feedback' MONITOR_FOR_LEARNING = 'monitor_for_learning' LEARNABLE = 'learnable' +MATRIX_WEIGHTS = 'matrix_weights' AUTO = 'auto' HETERO = 'hetero' diff --git a/psyneulink/core/globals/parameters.py b/psyneulink/core/globals/parameters.py index d4dea623080..e2204c6ecdd 100644 --- a/psyneulink/core/globals/parameters.py +++ b/psyneulink/core/globals/parameters.py @@ -1672,7 +1672,7 @@ def _log_value(self, value, context=None): context_str = ContextFlags._get_context_string(ContextFlags.COMMAND_LINE) log_condition_satisfied = True - # standard loggingd + # standard logging else: if self.log_condition is None or self.log_condition is LogCondition.OFF: return diff --git a/psyneulink/library/components/mechanisms/modulatory/learning/EMstoragemechanism.py b/psyneulink/library/components/mechanisms/modulatory/learning/EMstoragemechanism.py index 869d86b7051..0e1c814782f 100644 --- a/psyneulink/library/components/mechanisms/modulatory/learning/EMstoragemechanism.py +++ b/psyneulink/library/components/mechanisms/modulatory/learning/EMstoragemechanism.py @@ -642,7 +642,7 @@ def _validate_params(self, request_set, target_set=None, context=None): f"a list or 2d np.array containing entries that have the same shape " f"({memory_matrix.shape}) as an entry (row) in 'memory_matrix' arg.") - # Ensure the number of fields is equal to the number of items in variable + # Ensure the number of fields is equal to the numbder of items in variable if FIELDS in request_set: fields = request_set[FIELDS] if len(fields) != len(self.variable): diff --git a/psyneulink/library/components/projections/pathway/autoassociativeprojection.py b/psyneulink/library/components/projections/pathway/autoassociativeprojection.py index 2b281fc3dab..dbf0b5ef076 100644 --- a/psyneulink/library/components/projections/pathway/autoassociativeprojection.py +++ b/psyneulink/library/components/projections/pathway/autoassociativeprojection.py @@ -108,6 +108,7 @@ from psyneulink.core.components.functions.nonstateful.transferfunctions import LinearMatrix from psyneulink.core.components.functions.function import get_matrix from psyneulink.core.components.projections.pathway.mappingprojection import MappingError, MappingProjection +from psyneulink.library.components.projections.pathway.maskedmappingprojection import MaskedMappingProjection from psyneulink.core.components.projections.projection import projection_keywords from psyneulink.core.components.shellclasses import Mechanism from psyneulink.core.components.ports.outputport import OutputPort @@ -129,7 +130,7 @@ class AutoAssociativeError(MappingError): pass -class AutoAssociativeProjection(MappingProjection): +class AutoAssociativeProjection(MaskedMappingProjection): """ AutoAssociativeProjection( ) diff --git a/psyneulink/library/compositions/autodiffcomposition.py b/psyneulink/library/compositions/autodiffcomposition.py index a93e94f23f8..c851c32afd2 100644 --- a/psyneulink/library/compositions/autodiffcomposition.py +++ b/psyneulink/library/compositions/autodiffcomposition.py @@ -166,6 +166,13 @@ *PyTorch mode* ~~~~~~~~~~~~~~ +# 7/10/24 - FIX: +.. _AutodiffComposition_PyTorch_LearningScale: + ADD DESCRIPTION OF HOW LearningScale SPECIFICATIONS MAP TO EXECUTOIN OF pytorch_rep: + OPTIMIZATION STEP: + for AutodiffCompositions, this corresponds to a single call to `foward()` and `backward()` + methods of the Pytorch model + This is the default for an AutodiffComposition, but, can be specified explicitly by setting **execution_mode** = `ExecutionMode.PyTorch` in the `learn ` method (see `example ` in `BasicsAndPrimer`). In this mode, the AutodiffComposition is automatically translated to a `PyTorch @@ -323,6 +330,7 @@ import collections from packaging import version from pathlib import Path, PosixPath +from typing import Optional try: import torch @@ -335,10 +343,8 @@ from psyneulink.library.compositions.pytorchwrappers import PytorchCompositionWrapper from psyneulink.library.compositions.pytorchshowgraph import PytorchShowGraph -from psyneulink.core.components.functions.stateful.statefulfunction import StatefulFunction from psyneulink.core.components.mechanisms.processing.processingmechanism import ProcessingMechanism from psyneulink.core.components.mechanisms.processing.compositioninterfacemechanism import CompositionInterfaceMechanism -from psyneulink.core.components.mechanisms.processing.transfermechanism import TransferMechanism from psyneulink.core.components.mechanisms.modulatory.modulatorymechanism import ModulatoryMechanism_Base from psyneulink.core.components.projections.modulatory.modulatoryprojection import ModulatoryProjection_Base from psyneulink.core.components.ports.inputport import InputPort @@ -346,8 +352,12 @@ from psyneulink.core.compositions.report import (ReportOutput, ReportParams, ReportProgress, ReportSimulations, ReportDevices, EXECUTE_REPORT, LEARN_REPORT, PROGRESS_REPORT) from psyneulink.core.globals.context import Context, ContextFlags, handle_external_context, CONTEXT -from psyneulink.core.globals.keywords import AUTODIFF_COMPOSITION, CPU, CUDA, Loss, MPS, SOFT_CLAMP -from psyneulink.core.globals.utilities import is_numeric_scalar, get_torch_tensor +from psyneulink.core.globals.keywords import (AUTODIFF_COMPOSITION, CPU, CUDA, EXECUTION_MODE, + LEARNING_SCALE_LITERALS, LEARNING_SCALE_NAMES, LEARNING_SCALE_VALUES, + Loss, LOSSES, MATRIX_WEIGHTS, MINIBATCH, MPS, NODE_VALUES, NODE_VARIABLES, + OPTIMIZATION_STEP, RESULTS, RUN, SOFT_CLAMP, + TARGETS, TRAINED_OUTPUTS, TRIAL) +from psyneulink.core.globals.utilities import is_numeric_scalar from psyneulink.core.scheduling.scheduler import Scheduler from psyneulink.core.globals.parameters import Parameter, check_user_specified from psyneulink.core.scheduling.time import TimeScale @@ -361,6 +371,30 @@ 'AutodiffComposition' ] +def _get_torch_trained_outputs(owning_component=None, context=None): + if not context.execution_id: + return None + pytorch_rep = owning_component.parameters.pytorch_representation._get(context) + if not pytorch_rep: + return None + return np.array(pytorch_rep.retained_trained_outputs) + +def _get_torch_targets(owning_component=None, context=None): + if not context.execution_id: + return None + pytorch_rep = owning_component.parameters.pytorch_representation._get(context) + if not pytorch_rep: + return None + return np.array(pytorch_rep.retained_targets) + +def _get_torch_losses(owning_component, context): + if not context.execution_id: + return None + pytorch_rep = owning_component.parameters.pytorch_representation._get(context) + if not pytorch_rep: + return None + return np.array(pytorch_rep.retained_losses) + class AutodiffCompositionError(CompositionError): def __init__(self, error_value): @@ -372,8 +406,25 @@ def __str__(self): class AutodiffComposition(Composition): """ + AutodiffComposition( \ + optimizer_type='sgd', + loss_spec=Loss.MSE, + weight_decay=0, + learning_rate=0.001, + disable_learning=False, + synch_projection_matrices_with_torch=RUN, + synch_node_variables_with_torch=None, + synch_node_values_with_torch=RUN, + synch_results_with_torch=RUN, + retain_torch_trained_outputs=MINIBATCH, + retain_torch_targets=MINIBATCH, + retain_torch_losses=MINIBATCH, + device=CPU + ) + Subclass of `Composition` that trains models using either LLVM compilation or `PyTorch `_; - see and `Composition ` for additional arguments and attributes. + see and `Composition ` for additional arguments and attributes. See `Composition` + for additional arguments to constructor. Arguments --------- @@ -389,18 +440,69 @@ class AutodiffComposition(Composition): learning_rate : float : default 0.001 specifies the learning rate passed to the optimizer if none is specified in the `learn - ` method of the AutodiffComposition - (see `learning_rate ` for additional details). + ` method of the AutodiffComposition; + see `learning_rate ` for additional details. disable_learning : bool: default False specifies whether the AutodiffComposition should disable learning when run in `learning mode `. - device : torch.device : default device-dependnet + synch_projection_matrices_with_torch : `LearningScale` : default RUN + specifies the default for the AutodiffComposition for when to copy Pytorch parameters to PsyNeuLink + `Projection matrices ` (connection weights), which can be overridden by specifying + the **synch_projection_matrices_with_torch** argument in the `learn ` method; + see `synch_projection_matrices_with_torch ` + for additional details. + + synch_node_variables_with_torch : `LearningScale` : default None + specifies the default for the AutodiffComposition for when to copy the current input to Pytorch nodes + to the PsyNeuLink `variable ` attribute of the corresponding PsyNeuLink `nodes + `, which can be overridden by specifying the **synch_node_variables_with_torch** argument + in the `learn ` method; see `synch_node_variables_with_torch + ` for additional details. + + synch_node_values_with_torch : `LearningScale` : default RUN + specifies the default for the AutodiffComposition for when to copy the current output of Pytorch nodes to the + PsyNeuLink `value ` attribute of the corresponding PsyNeuLink `nodes `, + which can be overridden by specifying the **synch_node_values_with_torch** argument in the `learn + ` method; see `synch_node_values_with_torch + ` for additional details. + + synch_results_with_torch : `LearningScale` : default RUN + specifies the default for the AutodiffComposition for when to copy the outputs of the Pytorch model + to the AutodiffComposition's `results ` attribute, which can be overridden by + specifying the **synch_results_with_torch** argument in the `learn ` method. + Note that this differs from **retain_torch_trained_outputs**, which specifies the frequency at which + the outputs of the PyTorch model are tracked, all of which are stored in the AutodiffComposition's + `torch_trained_outputs ` attribute at the end of the run; + see `synch_results_with_torch ` for + additional details. + + retain_torch_trained_outputs : `LearningScale` : default MINIBATCH + specifies the default for the AutodiffComposition for scale at which the outputs of the Pytorch + model are tracked, all of which are stored in the AutodiffComposition's `torch_trained_outputs + ` attribute at the end of the run; this can be overridden + by specifying the **retain_torch_trained_outputs** argument in the `learn ` method. + Note that this differs from **synch_results_with_torch**, which specifies the frequency with + which values are called to the AutodiffComposition's `results` attribute; see `retain_torch_trained_outputs + ` for additional details. + + retain_torch_targets : `LearningScale` : default MINIBATCH + specifies the default for the AutodiffComposition for when to copy the targets used for training the + Pytorch model to the AutodiffComposition's `torch_targets ` attribute, which can be + overridden by specifying the **retain_torch_targets** argument in the `learn ` method; + see `retain_torch_targets ` for additional details. + + retain_torch_losses : `LearningScale` : default MINIBATCH + specifies the default for the AutodiffComposition for the scale at which the losses of the Pytorch model + are tracked, all of which are stored in the AutodiffComposition's `torch_losses ` + attribute at the end of the run; see `retain_torch_losses ` for + additional details. + + device : torch.device : default device-dependent specifies the device on which the model is run. If None, the device is set to 'cuda' if available, then 'mps`, otherwise 'cpu'. - Attributes ---------- @@ -430,17 +532,77 @@ class AutodiffComposition(Composition): **learnable** parameter of its constructor as `False`; this applies to MappingProjections at any level of `nesting `. - device : torch.device - the device on which the model is run. - - losses : list of floats - tracks the average loss after each weight update (i.e. each minibatch) during learning. - + synch_projection_matrices_with_torch : OPTIMIZATION_STEP, MINIBATCH, EPOCH or RUN + determines when to copy PyTorch parameters to PsyNeuLink `Projection matrices ` + (connection weights) if this is not specified in the call to `learn `. Copying more + frequently keeps the PsyNeuLink representation more closely synchronized with parameter updates in Pytorch, + but slows performance (see `AutodiffComposition_PyTorch_LearningScale` for information about settings). + + synch_node_variables_with_torch : OPTIMIZATION_STEP, TRIAL, MINIBATCH, EPOCH, RUN or None + determines when to copy the current input to Pytorch nodes (modules) to the PsyNeuLink `variable + ` attribute of the corresponding PsyNeuLink `nodes `, if this is not + specified in the call to `learn `. + COMMENT: + 8/8/24 - FIX: ADD EXPLANATION OF WHY THIS IS NOT GENERALLY USEFUL ALONG THE LINES OF THE FOLLOWING + This is supported for inspection and debugging, but is not generally useful, as PsyNeuLink uses `Lazy + Evaluation `, in which the variable of a node is determined by the input it receives + during execution. + COMMENT + Copying more frequently keeps the PsyNeuLink + representation more closely copying more frequently keeps them synchronized with parameter updates in Pytorch, + but slows performance (see `AutodiffComposition_PyTorch_LearningScale` for information about settings). + + synch_node_values_with_torch : OPTIMIZATION_STEP, MINIBATCH, EPOCH or RUN + determines when to copy the current output of Pytorch nodes (modules) to the PsyNeuLink `value + ` attribute of the corresponding PsyNeuLink `nodes `, if this is not + specified in the call to `learn `. Copying more frequently keeps the PsyNeuLink + representation more closely copying more frequently keeps them synchronized with parameter updates in Pytorch, + but slows performance (see `AutodiffComposition_PyTorch_LearningScale` for information about settings). + + synch_results_with_torch : OPTIMIZATION_STEP, TRIAL, MINIBATCH, EPOCH or RUN + determines when to copy the current outputs of Pytorch nodes to the PsyNeuLink `results + ` attribute of the AutodiffComposition if this is not specified in + the call to `learn `. Copying more frequently keeps the PsyNeuLink + representation more closely synchronized with parameter updates in Pytorch, but slows performance + (see `AutodiffComposition_PyTorch_LearningScale` for information about settings). + + retain_torch_trained_outputs : OPTIMIZATION_STEP, MINIBATCH, EPOCH, RUN or None + determines the scale at which the outputs of the Pytorch model are tracked, all of which are stored in the + AutodiffComposition's `results ` attribute at the end of the run if this is not specified + in the call to `learn `(see `AutodiffComposition_PyTorch_LearningScale` for + information about settings) + + retain_torch_targets : OPTIMIZATION_STEP, TRIAL, MINIBATCH, EPOCH, RUN or None + determines the scale at which the targets used for training the Pytorch model are tracked, all of which + are stored in the AutodiffComposition's `targets ` attribute at the end of the run + if this is not specified in the call to `learn ` + (see `AutodiffComposition_PyTorch_LearningScale` for information about settings). + + retain_torch_losses : OPTIMIZATION_STEP, MINIBATCH, EPOCH, RUN or None + determines the scale at which the losses of the Pytorch model are tracked, all of which are stored in + the AutodiffComposition's `torch_losses ` attribute at the end of the run + if this is nota specified in the call to `learn ` + (see `AutodiffComposition_PyTorch_LearningScale` for information about settings). + + torch_trained_outputs : List[ndarray] + stores the outputs (converted to np arrays) of the Pytorch model trained during learning, at the frequency + specified by `retain_torch_trained_outputs ` if it is set + to *MINIBATCH*, *EPOCH*, or *RUN*; see `retain_torch_trained_outputs + ` for additional details. + + torch_targets : List[ndarray] + stores the targets used for training the Pytorch model during learning at the frequency specified by + `retain_torch_targets ` if it is set to *MINIBATCH*, *EPOCH*, + or *RUN*; see `retain_torch_targets ` for additional details. + + torch_losses : list of floats + stores the average loss after each weight update (i.e. each minibatch) during learning, at the frequency + specified by `retain_torch_trained_outputs ` if it is set to *MINIBATCH*, + *EPOCH*, or *RUN*; see `retain_torch_losses ` for additonal details. + + COMMENT: FIX: NOT CURRENTLY BEING POPULTED, BUT SEEMS TO BE USED BY _get_total_loss() and early_stopper trial_losses = Parameter([]) - - tracked_loss = Parameter(None, pnl_internal=True) - - tracked_loss_count = Parameter(0, pnl_internal=True) + COMMENT last_saved_weights : path path for file to which weights were last saved. @@ -448,6 +610,8 @@ class AutodiffComposition(Composition): last_loaded_weights : path path for file from which weights were last loaded. + device : torch.device + the device on which the model is run. """ componentCategory = AUTODIFF_COMPOSITION @@ -459,15 +623,71 @@ class Parameters(Composition.Parameters): pytorch_representation = None optimizer = None learning_rate = Parameter(.001, fallback_default=True) - losses = Parameter([]) - trial_losses = Parameter([]) - tracked_loss = Parameter(None, pnl_internal=True) - tracked_loss_count = Parameter(0, pnl_internal=True) + synch_projection_matrices_with_torch = Parameter(RUN, fallback_default=True) + synch_node_variables_with_torch = Parameter(None, fallback_default=True) + synch_node_values_with_torch = Parameter(RUN, fallback_default=True) + synch_results_with_torch = Parameter(RUN, fallback_default=True) + retain_torch_trained_outputs = Parameter(MINIBATCH, fallback_default=True) + retain_torch_targets = Parameter(MINIBATCH, fallback_default=True) + retain_torch_losses = Parameter(MINIBATCH, fallback_default=True) + torch_trained_outputs = Parameter([], getter=_get_torch_trained_outputs) + torch_targets = Parameter([], getter=_get_torch_targets) + torch_losses = Parameter([], getter=_get_torch_losses) + trial_losses = Parameter([]) # FIX <- related to early_stopper, but not getting assigned anywhere device = None - def _validate_memory_template(self, device): - if isinstance(device, str) and device not in [CPU, CUDA, MPS]: - raise AutodiffCompositionError(f"Device must be one of {CPU}, {CUDA}, or {MPS}") + # def _validate_memory_template(self, device): + # if isinstance(device, str) and device not in [CPU, CUDA, MPS]: + # raise AutodiffCompositionError(f"Device must be one of {CPU}, {CUDA}, or {MPS}") + # + def _validate_synch_projection_matrices_with_torch(self, spec): + if spec is not None and spec not in LEARNING_SCALE_VALUES: + raise AutodiffCompositionError(f"Value of 'synch_projection_matrices_with_torch' arg " + f"must be one of the following keywords: " + f"{', '.join(LEARNING_SCALE_NAMES)}") + + def _validate_synch_node_variables_with_torch(self, spec): + if spec is not None and spec not in LEARNING_SCALE_VALUES: + raise AutodiffCompositionError(f"Value of 'synch_node_variables_with_torch' arg " + f"must be one of the following keywords: " + f"{', '.join(LEARNING_SCALE_NAMES)}") + + def _validate_synch_node_values_with_torch(self, spec): + if spec is not None and spec not in LEARNING_SCALE_VALUES: + raise AutodiffCompositionError(f"Value of 'synch_node_values_with_torch' arg " + f"must be one of the following keywords: " + f"{', '.join(LEARNING_SCALE_NAMES)}") + + def _validate_synch_results_with_torch(self, spec): + if spec is not None and spec not in LEARNING_SCALE_VALUES: + raise AutodiffCompositionError(f"Value of 'synch_results_with_torch' arg " + f"must be one of the following keywords: " + f"{', '.join(LEARNING_SCALE_NAMES)}") + if spec is OPTIMIZATION_STEP: + arg_vals = LEARNING_SCALE_NAMES.copy() + arg_vals.remove('OPTIMIZATION_STEP') + raise AutodiffCompositionError(f"'OPTIMIZATION_STEP can't be used with 'synch_results_with_torch';" + f"use another value of {', '.arg_vals}") + + + def _validate_retain_torch_trained_outputs(self, spec): + if spec is not None and spec not in LEARNING_SCALE_VALUES: + raise AutodiffCompositionError(f"Value of `retain_torch_trained_outputs` arg " + f"must be one of the following keywords: " + f"{', '.join(LEARNING_SCALE_NAMES)}") + + def _validate_retain_torch_targets(self, spec): + if spec is not None and spec not in LEARNING_SCALE_VALUES: + raise AutodiffCompositionError(f"Value of `retain_torch_targets` arg " + f"must be one of the following keywords: " + f"{', '.join(LEARNING_SCALE_NAMES)}") + + def _validate_retain_torch_losses(self, spec): + if spec is not None and spec not in LEARNING_SCALE_VALUES: + raise AutodiffCompositionError(f"Value of `retain_torch_losses` arg " + f"must be one of the following keywords: " + f"{', '.join(LEARNING_SCALE_NAMES)}") + # TODO (CW 9/28/18): add compositions to registry so default arg for name is no longer needed @check_user_specified @@ -480,6 +700,13 @@ def __init__(self, disable_learning=False, force_no_retain_graph=False, refresh_losses=False, + synch_projection_matrices_with_torch:Optional[str]=RUN, + synch_node_variables_with_torch:Optional[str]=None, + synch_node_values_with_torch:Optional[str]=RUN, + synch_results_with_torch:Optional[str]=RUN, + retain_torch_trained_outputs:Optional[str]=MINIBATCH, + retain_torch_targets:Optional[str]=MINIBATCH, + retain_torch_losses:Optional[str]=MINIBATCH, device=None, disable_cuda=True, cuda_index=None, @@ -492,16 +719,25 @@ def __init__(self, show_graph_attributes = kwargs.pop('show_graph_attributes', {}) - super(AutodiffComposition, self).__init__(name = name, - pathways=pathways, - optimizer_type = optimizer_type, - loss_spec = loss_spec, - learning_rate = learning_rate, - weight_decay = weight_decay, - **kwargs) + super(AutodiffComposition, self).__init__( + name = name, + pathways=pathways, + optimizer_type = optimizer_type, + loss_spec = loss_spec, + learning_rate = learning_rate, + weight_decay = weight_decay, + synch_projection_matrices_with_torch = synch_projection_matrices_with_torch, + synch_node_variables_with_torch = synch_node_variables_with_torch, + synch_node_values_with_torch = synch_node_values_with_torch, + synch_results_with_torch = synch_results_with_torch, + retain_torch_trained_outputs = retain_torch_trained_outputs, + retain_torch_targets = retain_torch_targets, + retain_torch_losses = retain_torch_losses, + **kwargs) self._built_pathways = False - self.target_output_map = {} + self.targets_from_outputs_map = {} # Map from TARGETS nodes to any OUTPUT nodes from which they receive input + self.outputs_to_targets_map = {} # Map from trained OUTPUT nodes to their TARGETS self.optimizer_type = optimizer_type self.loss_spec = loss_spec self._runtime_learning_rate = None @@ -509,7 +745,7 @@ def __init__(self, self.refresh_losses = refresh_losses self.weight_decay = weight_decay self.disable_learning = disable_learning - self.loss = None + self.loss_function = None self.last_saved_weights = None self.last_loaded_weights = None @@ -520,7 +756,6 @@ def __init__(self, self.execution_sets = None # # MODIFIED 7/10/24 OLD: - # FIX: REMOVE WHEN SUPPORT FOR MPS ADDED BELOW if not disable_cuda and torch.cuda.is_available(): if cuda_index is None: self.device = torch.device('cuda') @@ -530,7 +765,7 @@ def __init__(self, self.device = torch.device('cpu') else: self.device = device - # # MODIFIED 7/10/24 NEW: + # # MODIFIED 7/10/24 NEW: NEEDED FOR torch MPS SUPPORT # FIX: ADD AFTER USE OF utilities.get_torch_tensor() AND COMPATIBLITY WITH MPS IS VALIDATED # if device is None: # # Try setting device by default @@ -739,7 +974,7 @@ def create_pathway(node)->list: for value in mech.value], dtype=object), name= 'TARGET for ' + mech.name) - for mech in output_mechs_for_learning if mech not in self.target_output_map.values()] + for mech in output_mechs_for_learning if mech not in self.targets_from_outputs_map.values()] # Suppress warnings about role assignments context = Context(source=ContextFlags.METHOD) self.add_nodes(target_mechs, required_roles=[NodeRole.TARGET, NodeRole.LEARNING], context=context) @@ -747,7 +982,7 @@ def create_pathway(node)->list: self.exclude_node_roles(target_mech, NodeRole.OUTPUT, context) for output_port in target_mech.output_ports: output_port.parameters.require_projection_in_composition.set(False, override=True) - self.target_output_map.update({target: output for target, output + self.targets_from_outputs_map.update({target: output for target, output in zip(target_mechs, output_mechs_for_learning)}) else: # Construct entire PNL backpropagation learning pathways for each INPUT Node @@ -755,6 +990,7 @@ def create_pathway(node)->list: self.add_backpropagation_learning_pathway(pathway=pathway, loss_spec=self.loss_spec) + self.outputs_to_targets_map = {output: target for target, output in self.targets_from_outputs_map.items()} self._analyze_graph() return self.learning_components @@ -768,7 +1004,6 @@ def _build_pytorch_representation(self, context=None, refresh=False): model = self.pytorch_composition_wrapper_type(composition=self, device=self.device, context=context) - self.parameters.pytorch_representation._set(model, context, skip_history=True, skip_log=True) # Set up optimizer function @@ -777,15 +1012,16 @@ def _build_pytorch_representation(self, context=None, refresh=False): if old_opt is None or refresh: opt = self._make_optimizer(self.optimizer_type, learning_rate, self.weight_decay, context) self.parameters.optimizer._set(opt, context, skip_history=True, skip_log=True) + self.parameters.pytorch_representation._get(context).optimizer = opt # Set up loss function - if self.loss is not None: - logger.warning("Overwriting loss function for AutodiffComposition {}! Old loss function: {}".format( - self, self.loss)) + if self.loss_function is not None: + logger.warning("Overwriting 'loss_function' for AutodiffComposition {}! Old loss function: {}".format( + self, self.loss_function)) if callable(self.loss_spec): - self.loss = self.loss_spec + self.loss_function = self.loss_spec else: - self.loss = self._get_loss(self.loss_spec) + self.loss_function = self._get_loss(self.loss_spec) return self.parameters.pytorch_representation._get(context) @@ -830,132 +1066,136 @@ def _get_loss(self, loss_spec): elif loss_spec == Loss.KL_DIV: return nn.KLDivLoss(reduction='sum') else: - raise AutodiffCompositionError(f"Loss type {loss_spec} not recognized. Loss argument must be a " + raise AutodiffCompositionError(f"Loss type {loss_spec} not recognized. 'loss_function' argument must be a " f"Loss enum or function. Currently, the recognized loss types are: " f"L1 (Mean), SSE (sum squared error), CROSS_ENTROPY, NLL (negative log " f"likelihood), POISSONNLL (Poisson negative log likelihood, " f"and KL_DIV (KL divergence.") - def autodiff_training(self, inputs, targets, synchronize_pnl_values:bool=True, context=None, scheduler=None): - """Perform learning/training on all input-target pairs received for given number of epochs""" + def autodiff_forward(self, inputs, targets, + synch_with_pnl_options, retain_in_pnl_options, + execution_mode, scheduler, context): + """Perform forward pass of model and compute loss for a single trial (i.e., a single input) in Pytorch mode. + Losses are accumulated in pytorch_rep.track_losses, over calls to this method within a minibatch; + at the end of a minibatch, they are averaged and backpropagated by compositionrunner.run_learning() + before the next time it calls run(), in a call to backward() by do_gradient_optimization() + in _batch_inputs() or _batch_function_inputs(), + """ + assert execution_mode == pnlvm.ExecutionMode.PyTorch + pytorch_rep = self.parameters.pytorch_representation._get(context) - # Compute total loss over OUTPUT nodes for current trial - tracked_loss = self.parameters.tracked_loss._get(context) - if tracked_loss is None: - self.parameters.tracked_loss._set(torch.zeros(1, device=self.device).double(), - context=context, - skip_history=True, - skip_log=True) - tracked_loss = self.parameters.tracked_loss._get(context) + # --------- Do forward computation on current inputs ------------------------------------------------- + # should return 2d values for each component - curr_tensor_inputs = {} - curr_tensor_targets = {} + # Get value of INPUT nodes for current trial + curr_tensors_for_inputs = {} for component in inputs.keys(): - curr_tensor_inputs[component] = torch.tensor(inputs[component], device=self.device).double() + curr_tensors_for_inputs[component] = torch.tensor(inputs[component], device=self.device).double() + + # Get value of all OUTPUT nodes for current trial + curr_tensors_for_outputs = pytorch_rep.forward(curr_tensors_for_inputs, None, context) + + # --------- Compute the loss (TARGET-OUTPUT) for each trained OUTPUT node --------------------------- + + # Get value of OUTPUT nodes that are being trained (i.e., for which there are TARGET nodes) + curr_tensors_for_trained_outputs = {k:v for k,v in curr_tensors_for_outputs.items() + if k in self.outputs_to_targets_map} # Get value of TARGET nodes for current trial + curr_tensors_for_targets = {} for component in targets.keys(): - curr_tensor_targets[self.target_output_map[component]] = [torch.tensor(np.atleast_1d(target), - device=self.device).double() - for target in targets[component]] - - # Do forward computation on current inputs - # should return 2d values for each component - pytorch_rep = self.parameters.pytorch_representation._get(context) - curr_tensor_outputs = pytorch_rep.forward(curr_tensor_inputs, context) - - # Update values of all PNL nodes executed in forward pass (if specified) - if synchronize_pnl_values: - pytorch_node_values = {} - for pnl_node, pytorch_node in pytorch_rep.nodes_map.items(): - if pytorch_node.value is None: - assert pytorch_node.exclude_from_gradient_calc, \ - (f"PROGRAM ERROR: Value of PyTorch wrapper for {pnl_node.name} is None " - f"but it is not excluded from gradient calculation.") - continue - if isinstance(pytorch_node.value, list): - value = np.array([val.detach().cpu().numpy() for val in pytorch_node.value], dtype=object) - else: - value = pytorch_node.value.detach().cpu().numpy() - pnl_node.parameters.value._set(value, context) - if isinstance(pnl_node.function, StatefulFunction): - pnl_node.function.parameters.previous_value._set(value, context) - # 7/10/24 - FIX: THIS NEEDS TO BE ALIGNED WITH HANDLING OF INTEGRATION BEFORE NONLINEARITY IN PYTORCH - # HANDLED IN forward() METHOD OF PytorchMechanismWrapper?? - # if isinstance(pnl_node, TransferMechanism) and pnl_node.integrator_mode: - # pnl_node.integrator_function.parameters.previous_value._set(value, context) - pytorch_node_values[pnl_node] = value - - # Compute the loss (TARGET-OUTPUT) for each trained OUTPUT node - outputs_for_targets = {k:v for k,v in curr_tensor_outputs.items() if k in self.target_output_map.values()} - for component in outputs_for_targets.keys(): - # possibly add custom loss option, which is a loss function that takes many args - # (outputs, targets, weights, and more) and returns a scalar - new_loss = 0 - for i in range(len(outputs_for_targets[component])): - new_loss += self.loss(outputs_for_targets[component][i], - curr_tensor_targets[component][i]) - tracked_loss += new_loss + curr_tensors_for_targets[component] = [torch.tensor(np.atleast_1d(target), + device=self.device).double() + for target in targets[component]] + + # Get value of TARGET nodes for trained OUTPUT nodes + curr_target_tensors_for_trained_outputs = {} + for trained_output, target in self.outputs_to_targets_map.items(): + curr_target_tensors_for_trained_outputs[trained_output] = curr_tensors_for_targets[target] + + # Calculate and track the loss over the trained OUTPUT nodes + for component in curr_tensors_for_trained_outputs.keys(): + trial_loss = 0 + for i in range(len(curr_tensors_for_trained_outputs[component])): + trial_loss += self.loss_function(curr_tensors_for_trained_outputs[component][i], + curr_target_tensors_for_trained_outputs[component][i]) + pytorch_rep.minibatch_loss += trial_loss + pytorch_rep.minibatch_loss_count += 1 + + # --------- Return the values of OUTPUT of trained nodes and all nodes --------------------------------------- # Get values of trained OUTPUT nodes - trained_outputs = [] + trained_output_values = [] trained_outputs_CIM_input_ports = [port for port in self.output_CIM.input_ports - if port.path_afferents[0].sender.owner in self.target_output_map.values()] + if port.path_afferents[0].sender.owner in self.targets_from_outputs_map.values()] for input_port in trained_outputs_CIM_input_ports: assert (len(input_port.all_afferents) == 1), \ f"PROGRAM ERROR: {input_port.name} of ouput_CIM for '{self.name}' has more than one afferent." port, source, _ = self.output_CIM._get_source_info_from_output_CIM(input_port) idx = source.output_ports.index(port) - trained_outputs += [outputs_for_targets[source][idx].detach().cpu().numpy().copy().tolist()] + trained_output_values += [curr_tensors_for_trained_outputs[source][idx].detach().cpu().numpy().copy().tolist()] # Get values of all OUTPUT nodes - all_outputs = [] + all_output_values = [] for input_port in self.output_CIM.input_ports: assert (len(input_port.all_afferents) == 1), \ f"PROGRAM ERROR: {input_port.name} of ouput_CIM for '{self.name}' has more than one afferent." port, component, _ = self.output_CIM._get_source_info_from_output_CIM(input_port) idx = component.output_ports.index(port) - all_outputs += [curr_tensor_outputs[component][idx].detach().cpu().numpy().copy().tolist()] - - # Update tracked loss and loss count - self.parameters.tracked_loss_count._set(np.array(self.parameters.tracked_loss_count._get(context=context) + 1), - context=context, - skip_history=True, - skip_log=True) - - return trained_outputs, all_outputs + all_output_values += [curr_tensors_for_outputs[component][idx].detach().cpu().numpy().copy().tolist()] + pytorch_rep.all_output_values = all_output_values + + # Get values of TARGET nodes + target_values = [value[0].detach().cpu().numpy().copy().tolist() + for value in list(curr_tensors_for_targets.values())] + pytorch_rep.target_values = target_values + + # Synchronize outcomes after every trial if specified + # IMPLEMENTATION NOTE: RESULTS is not included here as it is handled in call to autodiff._update_results() + pytorch_rep.synch_with_psyneulink(synch_with_pnl_options, + [OPTIMIZATION_STEP, TRIAL], + context, + [NODE_VARIABLES, NODE_VALUES]) + pytorch_rep.retain_for_psyneulink({TRAINED_OUTPUTS: trained_output_values, + TARGETS: target_values}, + retain_in_pnl_options, + context) + + return trained_output_values, all_output_values def clear_losses(self, context=None): self.losses = [] - self.parameters.losses.set([], context=context) + if self.pytorch_representation: + self.pytorch_representation.retained_losses = [] - def _update_learning_parameters(self, context): - """Carry out backpropagation learning (backward computation) for one or more trials. - Update parameters (weights) based on trials run since last update, - using Pytorch backward method to compute gradients and update weights - Then execute (i.e., do forward computation for) nodes in pytorch_rep._nodes_to_execute_after_gradient_calc + def do_gradient_optimization(self, retain_in_pnl_options, context, optimization_num=None): + """Compute loss and use in call to autodiff_backward() to compute gradients and update PyTorch parameters. + Update parameters (weights) based on trial(s) executed since last optimization, + Reinitizalize minibatch_loss and minibatch_loss_count """ - optimizer = self.parameters.optimizer._get(context=context) pytorch_rep = self.parameters.pytorch_representation._get(context=context) + minibatch_loss = pytorch_rep.minibatch_loss / pytorch_rep.minibatch_loss_count - optimizer.zero_grad() + self.autodiff_backward(minibatch_loss, context) - # Compute and log average loss over all trials since last update - tracked_loss = self.parameters.tracked_loss._get(context=context) / int(self.parameters.tracked_loss_count._get(context=context)) - tracked_loss.backward(retain_graph=not self.force_no_retain_graph) - self.parameters.losses._get(context=context).append(tracked_loss.detach().cpu().numpy()[0]) - self.parameters.tracked_loss._set(torch.zeros(1, device=self.device).double(), context=context, skip_history=True, skip_log=True) - self.parameters.tracked_loss_count._set(np.array(0), context=context, skip_history=True, skip_log=True) + # # Save loss for current round of optimization + pytorch_rep.retain_for_psyneulink({LOSSES: minibatch_loss}, retain_in_pnl_options, context) + # Reset minibatch_loss for next round of optimization + pytorch_rep.minibatch_loss = torch.zeros(1, device=self.device).double() + pytorch_rep.minibatch_loss_count = 0 + + def autodiff_backward(self, minibatch_loss, context): + """Calculate gradients and apply to PyTorch model parameters (weights)""" + pytorch_rep = self.parameters.pytorch_representation._get(context=context) + optimizer = pytorch_rep.optimizer + + # Gradient updates + optimizer.zero_grad() + # Compute and log average loss over all trials since last update + minibatch_loss.backward(retain_graph=not self.force_no_retain_graph) # Update weights and copy to PNL optimizer.step() - pytorch_rep.detach_all() - pytorch_rep.copy_weights_to_psyneulink(context) - - # do forward computation on nodes that should be executed after gradient calculation - with torch.no_grad(): - for node, variable in pytorch_rep._nodes_to_execute_after_gradient_calc.items(): - node.wrapper_type.execute_node(node, variable, context) def _gen_llvm_function(self, *, ctx:pnlvm.LLVMBuilderContext, tags:frozenset): if "run" in tags: @@ -987,7 +1227,7 @@ def _get_autodiff_inputs_values(self, input_dict: dict): def _get_autodiff_targets_values(self, input_dict): """Return dict with values for TARGET Nodes - Get Inputs to TARGET Nodes used for computation of loss in autodiff_training(). + Get Inputs to TARGET Nodes used for computation of loss in autodiff_forward(). Uses input_dict to get values for TARGET Nodes that are INPUT Nodes of the AutodiffComposition, If a TARGET Node is not an INPUT Node, it is assumed to be the target of a projection from an INPUT Node and the value is determined by searching recursively for the input Node that projects to the TARGET Node. @@ -1006,7 +1246,7 @@ def get_target_value(target): target = target.path_afferents[0].sender.owner return get_target_value(target) - for target in self.target_output_map: + for target in self.targets_from_outputs_map: target_values[target] = get_target_value(target) return target_values @@ -1044,12 +1284,29 @@ def _identify_target_nodes(self, context): return target_nodes @handle_external_context() - def learn(self, *args, synchronize_pnl_values:bool = True, **kwargs): - execution_phase_at_entry = kwargs[CONTEXT].execution_phase - kwargs[CONTEXT].execution_phase = ContextFlags.PREPARING + def learn(self, + *args, + synch_projection_matrices_with_torch:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + synch_node_variables_with_torch:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + synch_node_values_with_torch:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + synch_results_with_torch:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + retain_torch_trained_outputs:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + retain_torch_targets:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + retain_torch_losses:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + **kwargs)->list: + """Override to handle synch and retain args + Note: defaults for synch and retain args are set to NotImplemented, so that the user can specify None if + they want to locally override the default values for the AutodiffComposition (see docstrings for run() + and _parse_synch_and_retain_args() for additonal details). + """ + + context = kwargs[CONTEXT] + + execution_phase_at_entry = context.execution_phase + context.execution_phase = ContextFlags.PREPARING execution_mode = self._get_execution_mode(kwargs.pop('execution_mode', None)) - kwargs[CONTEXT].execution_phase = execution_phase_at_entry + context.execution_phase = execution_phase_at_entry any_nested_comps = [node for node in self.nodes if isinstance(node, Composition)] if any_nested_comps: @@ -1068,10 +1325,100 @@ def learn(self, *args, synchronize_pnl_values:bool = True, **kwargs): f"that are not AutodiffCompositions: {' ,'.join(nested_comps)}.") if self._built_pathways is False: - self.infer_backpropagation_learning_pathways(execution_mode, context=kwargs[CONTEXT]) + self.infer_backpropagation_learning_pathways(execution_mode, context=context) self._built_pathways = True - return super().learn(*args, execution_mode=execution_mode, **kwargs) + synch_with_pnl_options, retain_in_pnl_options = ( + self._parse_synch_and_retain_args(synch_projection_matrices_with_torch, + synch_node_variables_with_torch, + synch_node_values_with_torch, + synch_results_with_torch, + retain_torch_trained_outputs, + retain_torch_targets, + retain_torch_losses, + **kwargs)) + + return super().learn(*args, + synch_with_pnl_options=synch_with_pnl_options, + retain_in_pnl_options=retain_in_pnl_options, + execution_mode=execution_mode, + **kwargs) + + def _parse_synch_and_retain_args(self, + synch_projection_matrices_with_torch:Optional[LEARNING_SCALE_LITERALS], + synch_node_variables_with_torch:Optional[LEARNING_SCALE_LITERALS], + synch_node_values_with_torch:Optional[LEARNING_SCALE_LITERALS], + synch_results_with_torch:Optional[LEARNING_SCALE_LITERALS], + retain_torch_trained_outputs:Optional[LEARNING_SCALE_LITERALS], + retain_torch_targets:Optional[LEARNING_SCALE_LITERALS], + retain_torch_losses:Optional[LEARNING_SCALE_LITERALS], + **kwargs + ): + # Remove args from kwargs in case called from run() (won't be there if called from learn() + if synch_projection_matrices_with_torch == NotImplemented: + synch_projection_matrices_with_torch = kwargs.pop('synch_projection_matrices_with_torch', NotImplemented) + if synch_projection_matrices_with_torch == NotImplemented: + synch_projection_matrices_with_torch = self.parameters.synch_projection_matrices_with_torch.default_value + if synch_node_variables_with_torch == NotImplemented: + synch_node_variables_with_torch = kwargs.pop('synch_node_variables_with_torch', NotImplemented) + if synch_node_variables_with_torch == NotImplemented: + synch_node_variables_with_torch = self.parameters.synch_node_variables_with_torch.default_value + if synch_node_values_with_torch == NotImplemented: + synch_node_values_with_torch = kwargs.pop('synch_node_values_with_torch', NotImplemented) + if synch_node_values_with_torch == NotImplemented: + synch_node_values_with_torch = self.parameters.synch_node_values_with_torch.default_value + if synch_results_with_torch == NotImplemented: + synch_results_with_torch = kwargs.pop('synch_results_with_torch', NotImplemented) + if synch_results_with_torch == NotImplemented: + synch_results_with_torch = self.parameters.synch_results_with_torch.default_value + if retain_torch_trained_outputs == NotImplemented: + retain_torch_trained_outputs = kwargs.pop('retain_torch_trained_outputs', NotImplemented) + if retain_torch_trained_outputs == NotImplemented: + retain_torch_trained_outputs = self.parameters.retain_torch_trained_outputs.default_value + if retain_torch_targets == NotImplemented: + retain_torch_targets = kwargs.pop('retain_torch_targets', NotImplemented) + if retain_torch_targets == NotImplemented: + retain_torch_targets = self.parameters.retain_torch_targets.default_value + if retain_torch_losses == NotImplemented: + retain_torch_losses = kwargs.pop('retain_torch_losses', NotImplemented) + if retain_torch_losses == NotImplemented: + retain_torch_losses = self.parameters.retain_torch_losses.default_value + + if self.minibatch_size > 1: + args_str = [] + if retain_torch_trained_outputs in {OPTIMIZATION_STEP, TRIAL}: + args_str.append('retain_torch_trained_outputs') + if retain_torch_losses in {OPTIMIZATION_STEP,TRIAL}: + args_str.append('retain_torch_losses') + if retain_torch_targets in {OPTIMIZATION_STEP,TRIAL}: + args_str.append('retain_torch_targets') + if args_str: + arg_args = 'args' if len(args_str) == 1 else 'arg' + is_are = 'is' if len(args_str) == 1 else 'are' + raise AutodiffCompositionError(f"The {' ,'.join(args_str)} {arg_args} in the learn() method for " + f"'{self.name}' {is_are} specifed as 'OPTIMIZATION' or 'TRIAL', but " + f"'minibatch_size` ({self.minibatch_size}) != 1, so " + f"{', '.join([arg.split('_')[-1] for arg in args_str])} " + f"will be updated only at the end of a minibatch; " + f"use 'MINIBATCH' for the {arg_args} to avoid this warning.") + + # Package options for synching and tracking into dictionaries as arguments to learning and exec methods + context = kwargs[CONTEXT] + synch_with_pnl_options = {MATRIX_WEIGHTS: synch_projection_matrices_with_torch + or self.parameters.synch_projection_matrices_with_torch._get(context), + NODE_VARIABLES: synch_node_variables_with_torch + or self.parameters.synch_node_variables_with_torch._get(context), + NODE_VALUES: synch_node_values_with_torch + or self.parameters.synch_node_values_with_torch._get(context), + RESULTS: synch_results_with_torch + or self.parameters.synch_results_with_torch._get(context)} + + retain_in_pnl_options = {TRAINED_OUTPUTS: retain_torch_trained_outputs + or self.parameters.retain_torch_trained_outputs._get(context), + TARGETS: retain_torch_targets or self.parameters.retain_torch_targets._get(context), + LOSSES: retain_torch_losses or self.parameters.retain_torch_losses._get(context)} + + return synch_with_pnl_options, retain_in_pnl_options def _get_execution_mode(self, execution_mode): """Parse execution_mode argument and return a valid execution mode for the learn() method @@ -1091,6 +1438,7 @@ def execute(self, inputs=None, num_trials=None, minibatch_size=1, + optimizations_per_minibatch=1, do_logging=False, scheduler=None, termination_processing=None, @@ -1108,7 +1456,8 @@ def execute(self, runtime_params=None, execution_mode:pnlvm.ExecutionMode = pnlvm.ExecutionMode.PyTorch, skip_initialization=False, - synchronize_pnl_values=True, + synch_with_pnl_options:Optional[dict]=None, + retain_in_pnl_options:Optional[dict]=None, report_output:ReportOutput=ReportOutput.OFF, report_params:ReportOutput=ReportParams.OFF, report_progress:ReportProgress=ReportProgress.OFF, @@ -1116,8 +1465,8 @@ def execute(self, report_to_devices:ReportDevices=None, report=None, report_num=None, - ): - """Override to execute autodiff_training() in learning mode if execute_mode is not Python""" + )->np.ndarray: + """Override to execute autodiff_forward() in learning mode if execute_mode is not Python""" if (self._is_learning(context) and execution_mode is not pnlvm.ExecutionMode.PyTorch and any([isinstance(node, Composition) for node in self.nodes])): @@ -1146,6 +1495,7 @@ def execute(self, autodiff_inputs = self._get_autodiff_inputs_values(inputs) autodiff_targets = self._get_autodiff_targets_values(inputs) + # Begin reporting of learning TRIAL: report(self, LEARN_REPORT, # EXECUTE_REPORT, @@ -1155,18 +1505,19 @@ def execute(self, context=context) self._build_pytorch_representation(context) - trained_outputs, all_outputs = self.autodiff_training(inputs=autodiff_inputs, + trained_output_values, all_output_values = \ + self.autodiff_forward(inputs=autodiff_inputs, targets=autodiff_targets, - synchronize_pnl_values=True, - context=context, - scheduler=scheduler) - + synch_with_pnl_options=synch_with_pnl_options, + retain_in_pnl_options=retain_in_pnl_options, + execution_mode=execution_mode, + scheduler=scheduler, + context=context) execution_phase = context.execution_phase context.execution_phase = ContextFlags.PROCESSING - - self.output_CIM.execute(all_outputs, context=context) context.execution_phase = execution_phase + # Complete TRIAL Panel for output report, and report progress report(self, # [LEARN_REPORT], [EXECUTE_REPORT, PROGRESS_REPORT], @@ -1177,7 +1528,7 @@ def execute(self, scheduler.get_clock(context)._increment_time(TimeScale.TRIAL) - return all_outputs + return all_output_values # Call Composition execute in Python mode return super(AutodiffComposition, self).execute(inputs=inputs, @@ -1197,6 +1548,73 @@ def execute(self, report_num=report_num ) + @handle_external_context() + def run(self, *args, + synch_projection_matrices_with_torch:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + synch_node_variables_with_torch:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + synch_node_values_with_torch:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + synch_results_with_torch:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + retain_torch_trained_outputs:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + retain_torch_targets:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + retain_torch_losses:Optional[LEARNING_SCALE_LITERALS]=NotImplemented, + **kwargs): + """Override to handle synch and retain args if run called directly from run() rather than learn() + Note: defaults for synch and retain args are NotImplemented, so that the user can specify None if they want + to locally override the default values for the AutodiffComposition (see _parse_synch_and_retain_args() + for details). This is distinct from the user assigning the Parameter default_values(s), which is done + in the AutodiffComposition constructor and handled by the Parameter._specify_none attribute. + """ + + if not ('synch_with_pnl_options' in kwargs and 'retain_in_pnl_options' in kwargs): + # No synch_with_pnl_options and retain_in_pnl_options dicts: + # - so must have been called from run directly rather than learn + # - therefore, must validate, parse and package options into those dicts + if synch_results_with_torch is NotImplemented: + # IMPLEMENTATION NOTE: + # If synch_results_with_torch is not specified by the user in call from run(), set it to + # MINIBATCH (rather than RUN, which is the default_value for calls from AutodiffComposition); + # this is required for calling _update_results() from Composition.run(), which does not itself + # know about synch and retain options, and the expected default behavior of which is to update + # results on every try in a call to run(). + synch_results_with_torch = MINIBATCH + synch_with_pnl_options, retain_in_pnl_options = ( + self._parse_synch_and_retain_args(synch_projection_matrices_with_torch, + synch_node_variables_with_torch, + synch_node_values_with_torch, + synch_results_with_torch, + retain_torch_trained_outputs, + retain_torch_targets, + retain_torch_losses, + **kwargs)) + kwargs['synch_with_pnl_options'] = synch_with_pnl_options + kwargs['retain_in_pnl_options'] = retain_in_pnl_options + + # If called from AutodiffComposition in Pytorch mode, provide chance to update results after run() + results = super(AutodiffComposition, self).run(*args, **kwargs) + if EXECUTION_MODE in kwargs and kwargs[EXECUTION_MODE] is pnlvm.ExecutionMode.PyTorch: + # Synchronize specified outcomes at end of learning run + context = kwargs[CONTEXT] + pytorch_rep = self.parameters.pytorch_representation.get(context) + if pytorch_rep: + pytorch_rep.synch_with_psyneulink(kwargs['synch_with_pnl_options'], RUN,context) + return results + + def _update_results(self, results, trial_output, execution_mode, synch_with_pnl_options, context): + if execution_mode is pnlvm.ExecutionMode.PyTorch: + # FIX: FOR NOW, USE THIS FOR BOTH TRIAL AND MINIBATCH, SINCE CURRENTLY NO DIFFERENCE; + # NEED TO FIGURE OUT WHAT TO DO ABOUT UPDATING RESULTS ONCE TRUE BATCHING IS IMPLEMENTED + if (RESULTS in synch_with_pnl_options + and synch_with_pnl_options[RESULTS] in {TRIAL, MINIBATCH}): + # Use Composition's own _update_results method since no savings when done trial-by-trial + super()._update_results(results, trial_output, execution_mode, synch_with_pnl_options, context) + elif (RESULTS in synch_with_pnl_options + and synch_with_pnl_options[RESULTS] == RUN): + # Use pytorch_reps method to keep a local list of results that are copied to autodiff.results after run + self.parameters.pytorch_representation._get(context).retain_results(trial_output) + else: + super()._update_results(results, trial_output, execution_mode, synch_with_pnl_options, context) + + @handle_external_context(fallback_most_recent=True) def save(self, path:PosixPath=None, directory:str=None, filename:str=None, context=None): """Saves all weight matrices for all MappingProjections in the AutodiffComposition diff --git a/psyneulink/library/compositions/compositionrunner.py b/psyneulink/library/compositions/compositionrunner.py index 108e732b267..6888977be4f 100644 --- a/psyneulink/library/compositions/compositionrunner.py +++ b/psyneulink/library/compositions/compositionrunner.py @@ -9,12 +9,16 @@ # ********************************************* AutodiffComposition ************************************************* import numpy as np +from typing import Optional +from types import GeneratorType from psyneulink.core.llvm import ExecutionMode from psyneulink.core.compositions.composition import Composition from psyneulink.core.compositions.report import Report, ReportProgress, ReportDevices, LEARN_REPORT, PROGRESS_REPORT from psyneulink.core.components.mechanisms.modulatory.learning.learningmechanism import LearningMechanism -from psyneulink.core.globals.keywords import OBJECTIVE_MECHANISM, TRAINING_SET +from psyneulink.core.globals.keywords import (EPOCH, MATRIX_WEIGHTS, MINIBATCH, OBJECTIVE_MECHANISM, OPTIMIZATION_STEP, + RUN, TRAINING_SET, TRIAL, NODE_VALUES, NODE_VARIABLES) +from psyneulink.core.globals.context import Context from psyneulink.core.globals.parameters import copy_parameter_value from inspect import isgeneratorfunction @@ -48,19 +52,22 @@ def _batch_inputs(self, inputs: dict, epochs: int, num_trials: int, - batch_size: int = 1, + minibatch_size: int = 1, optimizations_per_minibatch: int = 1, randomize: bool = True, + synch_with_pnl_options:Optional[dict] = None, + retain_in_pnl_options:Optional[dict] = None, call_before_minibatch=None, call_after_minibatch=None, early_stopper=None, execution_mode:ExecutionMode=ExecutionMode.Python, - context=None): + context=None)->GeneratorType: + """Execute inputs and update pytorch parameters for one minibatch at a time. + Partition inputs dict into ones of length minibatch_size (or, for the last set, the remainder) + Execute all inputs in that dict and then update weights (parameters), and repeat for all batches + within an epoch Synchronize weights, values and results with PsyNeuLink as specified in + synch_with_pnl_options and retain_in_pnl_options dicts. """ - Chunks input dict into pieces where each chunk is a dict with values of length batch_size - (or for the last chunk, the remainder) - """ - assert early_stopper is None or not self._is_llvm_mode, "Early stopper doesn't work in compiled mode" assert call_before_minibatch is None or not self._is_llvm_mode, "minibatch calls don't work in compiled mode" assert call_after_minibatch is None or not self._is_llvm_mode, "minibatch calls don't work in compiled mode" @@ -68,36 +75,71 @@ def _batch_inputs(self, #This is a generator for performance reasons, # since we don't want to copy any data (especially for very large inputs or epoch counts!) for epoch in range(epochs): - indices = list(range(0, num_trials)) + indices_of_all_trials = list(range(0, num_trials)) if randomize: - np.random.shuffle(indices) - for i in range(0, num_trials, batch_size): + np.random.shuffle(indices_of_all_trials) + + # Cycle over minibatches + for i in range(0, num_trials, minibatch_size): if call_before_minibatch: call_before_minibatch() - curr_indices = indices[i:i + batch_size] - for idx in curr_indices: - chunk = {} + + # Cycle over trials (stimui) within a minibatch + indices_of_trials_in_batch = indices_of_all_trials[i:i + minibatch_size] + + # FIX: IMPLEMENT PARALLELIZATION FOR minibatch_size > 1 + # # assert IF MINIBATCH > 1 THEN OPTIMIZATIONS_PER_STIMULUS == 1 + # if minibatch_size > 1 and optimizations_per_minibatch == 1: + # yield DICT WITH STIMULI FOR BATCH RUN THROUGH copy_parameter_value(stim) + # FIX: _gen_pytorch_fct's need to be refactored to handle batch dimension + + for trial_idx in indices_of_trials_in_batch: + inputs_for_minibatch = {} + # Get inputs for the current minibatch for k, v in inputs.items(): - chunk[k] = v[idx % len(v)] - for rep_idx in range(optimizations_per_minibatch): - # Return current stimulus - yield copy_parameter_value(chunk) + inputs_for_minibatch[k] = v[trial_idx % len(v)] + + # Cycle over optimizations per trial (stimulus + for optimization_num in range(optimizations_per_minibatch): + # Return current set of stimuli for minibatch + yield copy_parameter_value(inputs_for_minibatch) # Update weights if in PyTorch execution_mode; # handled by Composition.execute in Python mode and in compiled version in LLVM mode if execution_mode is ExecutionMode.PyTorch: - self._composition._update_learning_parameters(context) + self._composition.do_gradient_optimization(retain_in_pnl_options, context, optimization_num) + from torch import no_grad + pytorch_rep = self._composition.parameters.pytorch_representation.get(context) + with no_grad(): + for node, variable in pytorch_rep._nodes_to_execute_after_gradient_calc.items(): + node._composition_wrapper_owner.execute_node(node, variable, + optimization_num, context) + + # Synchronize after every optimization step for a given stimulus (i.e., trial) if specified + pytorch_rep.synch_with_psyneulink(synch_with_pnl_options, OPTIMIZATION_STEP, context, + [MATRIX_WEIGHTS, NODE_VARIABLES, NODE_VALUES]) - if call_after_minibatch: - try: - # Try with the hope that the function uses **kwargs (or these args) - call_after_minibatch(epoch=epoch, - batch=i // batch_size, - num_batches=num_trials // batch_size, - context=context) - except TypeError: - # If not, try without the args - call_after_minibatch() + if execution_mode is ExecutionMode.PyTorch: + # Synchronize specified outcomes after every stimulus (i.e., trial) + pytorch_rep.synch_with_psyneulink(synch_with_pnl_options, TRIAL, context) + + if execution_mode is ExecutionMode.PyTorch: + # Synchronize specified outcomes after every minibatch + pytorch_rep.synch_with_psyneulink(synch_with_pnl_options, MINIBATCH, context) + + if call_after_minibatch: + try: + # Try with the hope that the function uses **kwargs (or these args) + call_after_minibatch(epoch=epoch, + minibatch = i // minibatch_size, + num_minibatches = num_trials // minibatch_size, + context = context) + except TypeError: + # If not, try without the args + call_after_minibatch() + + if execution_mode is ExecutionMode.PyTorch: + pytorch_rep.synch_with_psyneulink(synch_with_pnl_options, EPOCH, context) # Compiled mode does not need more identical inputs. # number_of_runs will be set appropriately to cycle over the set @@ -108,16 +150,24 @@ def _batch_inputs(self, # end early if patience exceeded pass + if execution_mode is ExecutionMode.PyTorch: + # Synchronize specified outcomes at end of learning run + pytorch_rep.synch_with_psyneulink(synch_with_pnl_options, RUN, context) + + # 8/8/24 - FIX: THIS NEEDS TO BE BROUGHT INTO ALINGMENT WITH REFACTORING OF _batch_inputs ABOVE def _batch_function_inputs(self, inputs: dict, epochs: int, num_trials: int, batch_size: int = 1, + optimizations_per_minibatch: int = 1, + synch_with_pnl_options:Optional[dict] = None, + retain_in_pnl_options:Optional[dict] = None, call_before_minibatch=None, call_after_minibatch=None, early_stopper=None, execution_mode:ExecutionMode=ExecutionMode.Python, - context=None): + context=None)->GeneratorType: assert early_stopper is None or not self._is_llvm_mode, "Early stopper doesn't work in compiled mode" assert call_before_minibatch is None or not self._is_llvm_mode, "minibatch calls don't work in compiled mode" @@ -147,10 +197,12 @@ def _batch_function_inputs(self, if call_after_minibatch: call_after_minibatch() + # 7/10/24 - FIX: REVISE TO ACCOMODATE optimizations_per_minibatch + # AND ADD HANDLING OF synch_with_pnl_options AND retain_in_pnl_options # Update weights if in PyTorch execution_mode; # handled by Composition.execute in Python mode and in compiled version in LLVM mode if execution_mode is ExecutionMode.PyTorch: - self._composition._update_learning_parameters(context) + self._composition.do_gradient_optimization(retain_in_pnl_options, context) else: break @@ -171,11 +223,13 @@ def run_learning(self, patience: int = None, min_delta: int = 0, randomize_minibatches: bool = True, + synch_with_pnl_options:Optional[dict] = None, + retain_in_pnl_options:Optional[dict] = None, call_before_minibatch = None, call_after_minibatch = None, context=None, execution_mode:ExecutionMode = ExecutionMode.Python, - **kwargs): + **kwargs)->np.ndarray: """ Runs the composition repeatedly with the specified parameters. @@ -258,6 +312,9 @@ def run_learning(self, stim_epoch, num_trials, minibatch_size, + optimizations_per_minibatch=optimizations_per_minibatch, + synch_with_pnl_options=synch_with_pnl_options, + retain_in_pnl_options=retain_in_pnl_options, call_before_minibatch=call_before_minibatch, call_after_minibatch=call_after_minibatch, early_stopper=early_stopper, @@ -267,9 +324,11 @@ def run_learning(self, minibatched_input = self._batch_inputs(inputs=stim_input, epochs=stim_epoch, num_trials=num_trials, - batch_size=minibatch_size, + minibatch_size=minibatch_size, optimizations_per_minibatch=optimizations_per_minibatch, randomize=randomize_minibatches, + synch_with_pnl_options=synch_with_pnl_options, + retain_in_pnl_options=retain_in_pnl_options, call_before_minibatch=call_before_minibatch, call_after_minibatch=call_after_minibatch, early_stopper=early_stopper, @@ -285,21 +344,36 @@ def run_learning(self, # (Passing num_trials * stim_epoch + 1 works) run_trials = num_trials * stim_epoch if self._is_llvm_mode else None + # IMPLEMENTATION NOTE: for autodiff composition, the following executes an MINIBATCH's worth of training self._composition.run(inputs=minibatched_input, num_trials=run_trials, skip_initialization=skip_initialization, skip_analyze_graph=True, + optimizations_per_minibatch=optimizations_per_minibatch, + synch_with_pnl_options=synch_with_pnl_options, + retain_in_pnl_options=retain_in_pnl_options, execution_mode=execution_mode, context=context, **kwargs) skip_initialization = True + if execution_mode == ExecutionMode.PyTorch: + pytorch_rep = (self._composition.parameters.pytorch_representation._get(context). + copy_weights_to_psyneulink(context)) + if pytorch_rep and synch_with_pnl_options[MATRIX_WEIGHTS] == MINIBATCH: + pytorch_rep.copy_weights_to_psyneulink(context) + num_epoch_results = num_trials // minibatch_size # number of results expected from final epoch # return self._composition.parameters.results.get(context)[-1 * num_epoch_results:] # assign results from last *epoch* to learning_results self._composition.parameters.learning_results._set( self._composition.parameters.results.get(context)[-1 * num_epoch_results:], context) # return result of last *trial* (as usual for a call to run) + + if execution_mode == ExecutionMode.PyTorch and synch_with_pnl_options[MATRIX_WEIGHTS] == EPOCH: + # Copy weights at end of learning run + pytorch_rep.copy_weights_to_psyneulink(context) + return self._composition.parameters.results.get(context)[-1] class EarlyStopping(object): diff --git a/psyneulink/library/compositions/emcomposition.py b/psyneulink/library/compositions/emcomposition.py index d5cf790d205..a6da921c761 100644 --- a/psyneulink/library/compositions/emcomposition.py +++ b/psyneulink/library/compositions/emcomposition.py @@ -2433,7 +2433,8 @@ def _encode_memory(self, context=None): # Assign updated matrix to Projection self.retrieved_nodes[i].path_afferents[0].parameters.matrix.set(field_memories, context) - def learn(self, *args, **kwargs): + # 7/10/24 - FIX: WHY BOTHER WITH OVERRIDE IF NOTHING IS DONE: + def learn(self, *args, **kwargs)->list: return super().learn(*args, **kwargs) def _get_execution_mode(self, execution_mode): @@ -2469,5 +2470,6 @@ def infer_backpropagation_learning_pathways(self, execution_mode, context=None): raise EMCompositionError(f"EMComposition does not support learning with 'concatenate_keys'=True.") super().infer_backpropagation_learning_pathways(execution_mode, context=context) - def _update_learning_parameters(self, context): + def do_gradient_optimization(self, retain_in_pnl_options, context, optimization_num=None): + # 7/10/24 - MAKE THIS CONTEXT DEPENDENT: CALL super() IF BEING EXECUTED ON ITS OWN? pass diff --git a/psyneulink/library/compositions/pytorchEMcompositionwrapper.py b/psyneulink/library/compositions/pytorchEMcompositionwrapper.py index b2e3b915cf6..38c67017cac 100644 --- a/psyneulink/library/compositions/pytorchEMcompositionwrapper.py +++ b/psyneulink/library/compositions/pytorchEMcompositionwrapper.py @@ -57,12 +57,15 @@ def __init__(self, *args, **kwargs): self.retrieve_projection_wrappers = [self.projections_map[pnl_retrieve_proj] for pnl_retrieve_proj in pnl_retrieve_projs] - def execute_node(self, node, variable, context): + def execute_node(self, node, variable, optimization_num, context): """Override to handle storage of entry to memory_matrix by EMStorage Function""" if node is self.storage_node: - self.store_memory(variable, context) + # Only execute store after last optimization repetition for current mini-batch + # 7/10/24: FIX: MOVE PASSING OF THESE PARAMETERS TO context + if not (optimization_num + 1) % context.composition.parameters.optimizations_per_minibatch.get(context): + self.store_memory(variable, context) else: - super().execute_node(node, variable, context) + super().execute_node(node, variable, optimization_num, context) @property def memory(self)->Optional[torch.Tensor]: @@ -77,6 +80,9 @@ def memory(self)->Optional[torch.Tensor]: for j in range(num_fields)]) for i in range(memory_capacity)])) + # # MODIFIED 7/29/24 NEW: NEEDED FOR torch MPS SUPPORT + # @torch.jit.script_method + # MODIFIED 7/29/24 END def store_memory(self, memory_to_store, context): """Store variable in memory_matrix (parallel EMStorageMechanism._execute) @@ -108,13 +114,20 @@ def store_memory(self, memory_to_store, context): storage_prob = mech.parameters.storage_prob._get(context) # modulable, so use getter field_weights = mech.parameters.field_weights.get(context) # modulable, so use getter concatenation_node = mech.concatenation_node + # MODIFIED 7/29/24 OLD: num_match_fields = 1 if concatenation_node else len([i for i in mech.field_types if i==1]) + # # MODIFIED 7/29/24 NEW: NEEDED FOR torch MPS SUPPORT + # if concatenation_node: + # num_match_fields = 1 + # else: + # num_match_fields = 0 + # for i in mech.field_types: + # if i==1: + # num_match_fields += 1 + # MODIFIED 7/29/24 END # Find weakest memory (i.e., with lowest norm) - field_norms = torch.empty((len(memory),len(memory[0]))) - for row in range(len(memory)): - for col in range(len(memory[0])): - field_norms[row][col] = torch.linalg.norm(memory[row][col]) + field_norms = torch.linalg.norm(memory, dim=2) if field_weights is not None: field_norms *= field_weights row_norms = torch.sum(field_norms, axis=1) @@ -126,7 +139,7 @@ def store_memory(self, memory_to_store, context): # For match projections, get entry to store from value of sender of Projection matrix # (this is to accomodate concatenation_node) axis = 0 - entry_to_store = field_projection.sender.value + entry_to_store = field_projection.sender.output if concatenation_node is None: assert (entry_to_store == memory_to_store[i]).all(), \ f"PROGRAM ERROR: misalignment between inputs and fields for storing them" diff --git a/psyneulink/library/compositions/pytorchshowgraph.py b/psyneulink/library/compositions/pytorchshowgraph.py index 46d8ebbc6c2..6452ccf9f6a 100644 --- a/psyneulink/library/compositions/pytorchshowgraph.py +++ b/psyneulink/library/compositions/pytorchshowgraph.py @@ -36,9 +36,9 @@ class PytorchShowGraph(ShowGraph): in `PyTorch mode ` (also see `AutodiffComposition_PyTorch`). In this mode, any `nested Compositions ` are "flattened" (i.e., incorporated into the outermost Composition); also, any `Nodes `` designated as `exclude_from_gradient_calc - ` will be moved to the end of the graph (as they are executed + ` are moved to the end of the graph (as they are executed after the gradient calculation), and any Projections designated as `exclude_in_autodiff - ` will not be shown as they are not used in the gradient calculations at all. + ` are not shown as they are not used in the gradient calculations at all. Arguments --------- diff --git a/psyneulink/library/compositions/pytorchwrappers.py b/psyneulink/library/compositions/pytorchwrappers.py index f739cfc259c..48737faa556 100644 --- a/psyneulink/library/compositions/pytorchwrappers.py +++ b/psyneulink/library/compositions/pytorchwrappers.py @@ -8,50 +8,154 @@ # ********************************************* PytorchComponent ************************************************* """PyTorch wrappers for Composition, Mechanism, Projection, and Functions for use in AutodiffComposition""" +from psyneulink._typing import Optional, Literal, Union import graph_scheduler import torch import torch.nn as nn +import numpy as np + +from enum import Enum, auto from psyneulink.core.components.functions.nonstateful.combinationfunctions import LinearCombination, PRODUCT, SUM from psyneulink.core.components.functions.stateful.integratorfunctions import IntegratorFunction +from psyneulink.core.components.functions.stateful import StatefulFunction +from psyneulink.core.components.mechanisms.processing.transfermechanism import TransferMechanism from psyneulink.core.compositions.composition import NodeRole, CompositionInterfaceMechanism from psyneulink.library.compositions.pytorchllvmhelper import * from psyneulink.library.compositions.compiledoptimizer import AdamOptimizer, SGDOptimizer from psyneulink.library.compositions.compiledloss import MSELoss, CROSS_ENTROPYLoss -from psyneulink.core.globals.keywords import AFTER, BEFORE, DEFAULT_VARIABLE, Loss, NODE, TARGET_MECHANISM +from psyneulink.core.globals.keywords import (ADD, AFTER, ALL, BEFORE, DEFAULT_VARIABLE, EPOCH, INPUTS, + LEARNING_SCALE_LITERALS, Loss, LOSSES, MATRIX_WEIGHTS, + NODE, NODE_VALUES, NODE_VARIABLES, OUTPUTS, RESULTS, RUN, + TARGETS, TARGET_MECHANISM, ) from psyneulink.core.globals.context import Context, ContextFlags, handle_external_context -from psyneulink.core.globals.utilities import get_deepcopy_with_shared +from psyneulink.core.globals.utilities import convert_to_np_array, get_deepcopy_with_shared, convert_to_list from psyneulink.core.globals.log import LogCondition from psyneulink.core import llvm as pnlvm __all__ = ['PytorchCompositionWrapper', 'PytorchMechanismWrapper', 'PytorchProjectionWrapper'] +class DataTypeEnum(Enum): + + TRAINED_OUTPUTS = 0 + TARGETS = auto() + LOSSES = auto() + +# # MODIFIED 7/29/24 OLD: class PytorchCompositionWrapper(torch.nn.Module): +# # MODIFIED 7/29/24 NEW: NEEDED FOR torch MPS SUPPORT +# class PytorchCompositionWrapper(torch.jit.ScriptModule): +# MODIFIED 7/29/24 END """Wrapper for a Composition as a Pytorch Module - Set up parameters of PyTorch model & information required for forward computation + Class that wraps a `Composition ` as a PyTorch module. + + Two main responsibilities: + + 1) Set up parameters of PyTorch model & information required for forward computation: + Handle nested compositions (flattened in infer_backpropagation_learning_pathways): + Deal with Projections into and/or out of a nested Composition as shown in figure below: + (note: Projections in outer Composition to/from a nested Composition's CIMs are learnable, + and ones in a nested Composition from/to its CIMs are not) + [ OUTER ][ NESTED ][ OUTER ] + \\learnable// \\not learnable// \\not learnable// \\learnable// + ---> [Node] ----> [input_CIM] ~~~> [INPUT Node] ----> [OUTPUT Node] ~~~> [output_CIM] ----> [Node] ---> + sndr rcvr nested_rcvr nested_sndr sndr rcvr + ^--projection-->^ ^---projection-->^ + ^----PytorchProjectionWrapper---->^ ^----PytorchProjectionWrapper---->^ + ENTRY EXIT + + 2) Handle coordination of passing data and outcomes back to PsyNeuLink objects, handled by two main methods: + + - synch_with_psyneulink() + Copies matrix weights, node variables, node values, and/or autoutdiff results + at user-specified intervals (LearningScale: OPTIMIZATION_STEP, TRIAL, MINIBATCH, EPOCH, RUN); + these are specified by the user in the following arguments to run() or learn(): + synch_projection_matrices_with_torch=RUN, + synch_node_variables_with_torch=None, + synch_node_values_with_torch=RUN, + synch_results_with_torch=RUN, + and consolidated in the synch_with_pnl_options dict used by synch_with_psyneulink + + - retain_for_psyneulink() + Retains learning-specific data used and outcomes generated during execution of PyTorch model + (TRAINED_OUTPUT_VALUES, corresponding TARGETS and LOSSES), that are copied to PsyNeuLink + at the end of a call to learn(); these are specified by the user in the following arguments + to learn(): + retain_torch_trained_outputs=MINIBATCH, + retain_torch_targets=MINIBATCH, + retain_torch_losses=MINIBATCH, + and consolidated in the retain_in_pnl_options dict used by retain_for_psyneulink + + - Note: RESULTS is handled in an idiosyncratic way: it is specified along with the synchronization + parameters, since it is a value ordinarily generated in the execution of a Composition; + however it's helper parallels the retain_for_psyneulink helper methods, and it is called + from _update_results if TRIAL is specified, in order to integrate with the standard execution + of a Composition. + + Arguments + --------- - Handle nested compositions (flattened in infer_backpropagation_learning_pathways): - Deal with Projections into or out of a nested Composition as follows: - - [ OUTER ][ NESTED ][ OUTER ] - \\learnable// \\not learnable// \\not learnable// \\learnable// - ---> [Node] ----> [input_CIM] ~~~> [INPUT Node] ----> [OUTPUT Node] ~~~> [output_CIM] ----> [Node] ---> - sndr rcvr nested_rcvr nested_sndr sndr rcvr - ^--projection-->^ ^---projection-->^ - ^----PytorchProjectionWrapper---->^ ^----PytorchProjectionWrapper---->^ - ENTRY EXIT Attributes ---------- - nodes : List[PytorchMechanismWrapper] + _composition: Composition + `AutodiffComposition` being wrapped. + + wrapped_nodes : List[PytorchMechanismWrapper] + list of nodes in the PytorchCompositionWrapper corresponding to PyTorch modules. Generally these are + `Mechanisms ` wrapped in a `PytorchMechanismWrapper`, however, if the `AutodiffComposition` + being wrapped is itself a nested Composition, then the wrapped nodes are `PytorchCompositionWrapper` objects. + When the PyTorch model is executed these are "flattened" into a single PyTorch module, which can be visualized + using the AutodiffComposition's `show_graph ` method and setting its *show_pytorch* + argument to True (see `PytorchShowGraph` for additional information). + + nodes_map : Dict[Node: PytorchMechanismWrapper or PytorchCompositionWrapper] + maps psyneulink `Nodes ` to PytorchCompositionWrapper nodes. + + projection_wrappers = List[PytorchProjectionWrapper] + list of PytorchCompositionWrappers in the PytorchCompositionWrapper, each of which wraps a `Projection` + in the AutodiffComposition being wrapped. + + projections_map : Dict[Projection: PytorchProjectionWrapper] + maps `Projections ` in the AutodiffComposition being wrapped to `PytorchProjectionWrappers` in + the PytorchCompositionWrapper. + + _nodes_to_execute_after_gradient_calc : Dict[node : torch.Tensor] + contains nodes specified as `exclude_from_gradient_calc` as keys, and their current variable as values - projections_map : Dict[Projection, PytorchProjectionWrapper] - keys are Projections in the Composition being wrapped, and keys are the ProjectionWrappers to which they - are mapped (see above). + optimizer : torch + assigned by AutodffComposition after the wrapper is created, which passes the parameters to the optimizer + device : torch.device + device used to process torch Tensors in PyTorch modules + + params : nn.ParameterList() + list of PyTorch parameters (connection weight matrices) in the PyTorch model. + + minibatch_loss : torch.Tensor + accumulated loss over all trials (stimuli) within a batch. + + minibatch_loss_count : int + count of losses (trials) within batch, used to calculate average loss per batch. + + retained_results : List[ndarray] + list of the `output_values ` of the AutodiffComposition for ever trial executed + in a call to `run ` or `learn `. + + retained_trained_outputs : List[ndarray] + values of the trained `OUTPUT ` Node (i.e., ones associated with `TARGET `. + + retained_targets : List[ndarray] + values of the `TARGET `. + + retained_losses : List[ndarray] + losses per batch, epoch or run accumulated over a call to learn() """ + def __init__(self, composition, device, @@ -62,19 +166,38 @@ def __init__(self, from psyneulink.library.compositions.autodiffcomposition import AutodiffComposition + # Assign attributes self.name = f"PytorchCompositionWrapper[{composition.name}]" + self._composition = composition + self.device = device + self.optimizer = None # This gets assigned by self._composition after the wrapper is created, + # as the latter is needed to pass the parameters to the optimizer self.wrapped_nodes = [] # can be PytorchMechanismWrapper or PytorchCompositionWrapper - self.nodes_map = {} # maps Node (Mech or nested Comp) -> PytorchMechanismWrapper or PytorchCompositionWrapper + self.nodes_map = {} # maps Node (Mech or nested Comp) -> PytorchMechanismWrapper or PytorchCompositionWrapper + self._nodes_to_execute_after_gradient_calc = {} # Nodes requiring execution after Pytorch forward/backward pass self.projection_wrappers = [] # PytorchProjectionWrappers self.projections_map = {} # maps Projections -> PytorchProjectionWrappers self.params = nn.ParameterList() - self.device = device - self._composition = composition - self._nodes_to_execute_after_gradient_calc = {} # Nodes requiring execution after Pytorch forward/backward pass + self.minibatch_loss = torch.zeros(1, device=self.device).double() # Accumulated losses within a batch + self.minibatch_loss_count = 0 # Count of losses within batch + + # Data retained by the wrapper during execution and copied to pnl as specified by retain_for_psyneulink + self.retained_results = [] # Values of all output NODES + self.retained_trained_outputs = [] # Values of trained output NODES (i.e. associated with TARGETS) + self.retained_targets = [] # # Values of targets for all trials + self.retained_losses = [] # Losses per trial or batch accumulated over a run + + # The following is a list of methods called in retain_for_psyneulink, indexed by keywords using DataTypeEnum + # (this is constructed as a form of hash table for efficiency since that method can be called alot; + # it is constructed here to avoid doing so in the retain_for_psyneulink method itself) + self.retain_method = [None] * len(DataTypeEnum) + self.retain_method[DataTypeEnum.TRAINED_OUTPUTS.value] = self.retain_trained_outputs + self.retain_method[DataTypeEnum.TARGETS.value] = self.retain_targets + self.retain_method[DataTypeEnum.LOSSES.value] = self.retain_losses # Instantiate pytorch Mechanisms nodes = list(set(composition.nodes) - set(composition.get_nodes_by_role(NodeRole.LEARNING))) @@ -205,7 +328,7 @@ def _assign_input_nodes(nodes): self.execution_sets = [x for x in self.execution_sets if len(x) > 0] - # Flattening for forward() and AutodiffComposition._update_learning_parameters + # Flattening for forward() and AutodiffComposition.do_gradient_optimization # Flatten nested execution sets: nested_execution_sets = {} @@ -223,7 +346,7 @@ def _assign_input_nodes(nodes): # Flatten maps for node_wrapper in self.wrapped_nodes: if isinstance(node_wrapper, PytorchCompositionWrapper): - # For copying weights back to PNL in AutodiffComposition._update_learning_parameters + # For copying weights back to PNL in AutodiffComposition.do_gradient_optimization self.projections_map.update(node_wrapper.projections_map) # Not sure if this is needed, but just to be safe self.nodes_map.update(node_wrapper.nodes_map) @@ -231,7 +354,7 @@ def _assign_input_nodes(nodes): self.nodes_map = {k: v for k, v in self.nodes_map.items() if not isinstance(v, PytorchCompositionWrapper)} # Flatten projections so that they are all in the outer Composition and visible by _regenerate_paramlist - # needed for call to backward() in AutodiffComposition._update_learning_parameters + # needed for call to backward() in AutodiffComposition.do_gradient_optimization # FIX: MAYBE SHOULD DO THIS AS LIST IS CREATED ABOVE? self.projection_wrappers = list(self.projections_map.values()) @@ -336,7 +459,8 @@ def _gen_llvm_training_backprop(self, ctx, optimizer, loss): if node._mechanism in input_nodes: continue node_z_value = z_values[node] - activation_func_derivative = node._gen_llvm_execute_derivative_func(ctx, builder, state, params, node_z_value) + activation_func_derivative = node._gen_llvm_execute_derivative_func(ctx, builder, + state, params, node_z_value) error_val = builder.alloca(z_values[node].type.pointee) error_dict[node] = error_val @@ -351,7 +475,9 @@ def _gen_llvm_training_backprop(self, ctx, optimizer, loss): node_target = builder.gep(model_input, [ctx.int32_ty(0), ctx.int32_ty(target_idx)]) # 2) Lookup desired output value - node_output = builder.gep(model_output, [ctx.int32_ty(0), ctx.int32_ty(0), ctx.int32_ty(node._idx), ctx.int32_ty(0)]) + node_output = builder.gep(model_output, [ctx.int32_ty(0), ctx.int32_ty(0), + ctx.int32_ty(node._idx), + ctx.int32_ty(0)]) tmp_loss = loss.gen_inject_lossfunc_call( ctx, builder, loss_fn, node_output, node_target) @@ -404,17 +530,24 @@ def _gen_llvm_training_backprop(self, ctx, optimizer, loss): continue for proj in node.afferents: # get a_(l-1) - afferent_node_activation = builder.gep(model_output, [ctx.int32_ty(0), ctx.int32_ty(0), ctx.int32_ty(proj.sender._idx), ctx.int32_ty(0)]) + afferent_node_activation = builder.gep(model_output, [ctx.int32_ty(0), + ctx.int32_ty(0), + ctx.int32_ty(proj.sender._idx), + ctx.int32_ty(0)]) # get dimensions of weight matrix weights_llvmlite = proj._extract_llvm_matrix(ctx, builder, state, params) - pnlvm.helpers.printf_float_matrix(builder, weights_llvmlite, prefix= f"{proj.sender._mechanism} -> {proj.receiver._mechanism}\n", override_debug=False) + pnlvm.helpers.printf_float_matrix(builder, weights_llvmlite, + prefix= f"{proj.sender._mechanism} -> {proj.receiver._mechanism}\n", + override_debug=False) # update delta_W node_delta_w = builder.gep(delta_w, [ctx.int32_ty(0), ctx.int32_ty(proj._idx)]) dim_x, dim_y = proj.matrix.shape - with pnlvm.helpers.for_loop_zero_inc(builder, ctx.int32_ty(dim_x), "weight_update_loop_outer") as (b1, weight_row): - with pnlvm.helpers.for_loop_zero_inc(b1, ctx.int32_ty(dim_y), "weight_update_loop_inner") as (b2, weight_column): + with pnlvm.helpers.for_loop_zero_inc(builder, ctx.int32_ty(dim_x), + "weight_update_loop_outer") as (b1, weight_row): + with pnlvm.helpers.for_loop_zero_inc(b1, ctx.int32_ty(dim_y), + "weight_update_loop_inner") as (b2, weight_column): a_val = b2.load(b2.gep(afferent_node_activation, [ctx.int32_ty(0), weight_row])) d_val = b2.load(b2.gep(err_val, @@ -469,7 +602,7 @@ def _get_compiled_optimizer(self): return optimizer @handle_external_context() - def forward(self, inputs, context=None)->dict: + def forward(self, inputs, optimization_rep, context=None)->dict: """Forward method of the model for PyTorch and LLVM modes Returns a dictionary {output_node:value} of output values for the model """ @@ -480,7 +613,7 @@ def forward(self, inputs, context=None)->dict: # If node is nested Composition (wrapped in PytorchCompositionWrapper), # calls its forward method recursively if isinstance(node, PytorchCompositionWrapper): - node.forward(inputs=None) + node.forward(inputs=None, optimization_rep=optimization_rep, context=context) continue elif node._is_input or node._is_bias: @@ -524,6 +657,7 @@ def forward(self, inputs, context=None)->dict: if node.exclude_from_gradient_calc: if node.exclude_from_gradient_calc == AFTER: + # Cache variable for later exce execution self._nodes_to_execute_after_gradient_calc[node] = variable continue elif node.exclude_from_gradient_calc == BEFORE: @@ -533,14 +667,15 @@ def forward(self, inputs, context=None)->dict: (f'PROGRAM ERROR: Bad assignment to {node.name}.exclude_from_gradient_calc: ' f'{node.exclude_from_gradient_calc}; only {AFTER} is currently supported') - # Execute the node using wrapper_type for Composition to which it belongs + # Execute the node using composition_wrapper_owner for Composition wrapper to which it belongs # Note: this is to support overrides of execute_node method by subclasses (such as in EMComposition) - node.wrapper_type.execute_node(node, variable, context) + node._composition_wrapper_owner.execute_node(node, variable, optimization_rep, context) + # 7/20/24 FIX: CACHE get_nested_output_nodes_at_all_levels() IN composition # Add entry to outputs dict for OUTPUT Nodes of pytorch representation # note: these may be different than for actual Composition, as they are flattened if (node._mechanism in self._composition.get_nested_output_nodes_at_all_levels()): - outputs[node._mechanism] = node.value + outputs[node._mechanism] = node.output # NOTE: Context source needs to be set to COMMAND_LINE to force logs to update independently of timesteps # if not self._composition.is_nested: @@ -552,44 +687,193 @@ def forward(self, inputs, context=None)->dict: return outputs - def execute_node(self, node, variable, context=None): + def execute_node(self, node, variable, optimization_num, context=None): """Execute node and store the result in the node's value attribute - Implemented as method (and includes context as arg) so that it can be overridden - by subclasses of PytorchCompositionWrapper + Implemented as method (and includes optimization_rep and context as args) + so that it can be overridden by subclasses of PytorchCompositionWrapper """ value = node.execute(variable, context) - assert 'DEBUGGING BREAK POINT' - def detach_all(self): - for projection in self.projections_map.values(): - projection.matrix.detach() + def synch_with_psyneulink(self, + synch_with_pnl_options:dict, + current_condition:LEARNING_SCALE_LITERALS, + context:Context, + params:Optional[list]=None): + """Copy weights, values, and/or results from Pytorch to PsyNeuLink at specified junctures + params can be used to restrict copy to a specific (set of) param(s). If params is not specified, all are copied; + """ + # 8/7/24: FIX - THIS COULD BE MADE TO BE MORE EFFICIENT ALONG THE LINES OF retain_for_psyneulink() + # AND REFACTORED TO USE DICT WITH DATATYPES AS KEYS AND PARAMS AS VALUES; + all = [MATRIX_WEIGHTS, NODE_VARIABLES, NODE_VALUES, RESULTS] + params = convert_to_list(params) or all + illegal_params = [param for param in params if param not in all] + assert not illegal_params, \ + f"PROGRAM ERROR: Illegal attributes ({' ,'.join(illegal_params)}) specified in call to synch_with_psyneulink" + + if MATRIX_WEIGHTS in params and synch_with_pnl_options[MATRIX_WEIGHTS] == current_condition: + self.copy_weights_to_psyneulink(context) + + if NODE_VARIABLES in params and synch_with_pnl_options[NODE_VARIABLES] == current_condition: + self.copy_node_variables_to_psyneulink(ALL, context) + + if NODE_VALUES in params and synch_with_pnl_options[NODE_VALUES] == current_condition: + self.copy_node_values_to_psyneulink(ALL, context) + + if RESULTS in params and synch_with_pnl_options[RESULTS] == current_condition: + self.copy_results_to_psyneulink(current_condition, context) def copy_weights_to_psyneulink(self, context=None): for projection, pytorch_rep in self.projections_map.items(): - projection.parameters.matrix._set( - pytorch_rep.matrix.detach().cpu().numpy(), context) - projection.parameters.matrix._set( - pytorch_rep.matrix.detach().cpu().numpy(), context) - projection.parameter_ports['matrix'].parameters.value._set( - pytorch_rep.matrix.detach().cpu().numpy(), context) + matrix = pytorch_rep.matrix.detach().cpu().numpy() + projection.parameters.matrix._set(matrix, context) + projection.parameters.matrix._set(matrix, context) + projection.parameter_ports['matrix'].parameters.value._set(matrix, context) def log_weights(self): for proj_wrapper in self.projection_wrappers: proj_wrapper.log_matrix() + def copy_node_variables_to_psyneulink(self, nodes:Optional[Union[list,Literal[ALL, INPUTS]]]=ALL, context=None): + """Copy input to Pytorch nodes to variable of AutodiffComposition nodes. + IMPLEMENTATION NOTE: list included in nodes arg to allow for future specification of specific nodes to copy + """ + if nodes == ALL: + nodes = self.nodes_map.items() + for pnl_node, pytorch_node in nodes: + # First get variable in numpy format + if isinstance(pytorch_node.input, list): + variable = np.array([val.detach().cpu().numpy() for val in pytorch_node.input], dtype=object) + else: + variable = pytorch_node.input.detach().cpu().numpy() + # Set pnl_node's value to value + pnl_node.parameters.variable._set(variable, context) + + def copy_node_values_to_psyneulink(self, nodes:Optional[Union[list,Literal[ALL, OUTPUTS]]]=ALL, context=None): + """Copy output of Pytorch nodes to value of AutodiffComposition nodes. + IMPLEMENTATION NOTE: list included in nodes arg to allow for future specification of specific nodes to copy + """ + if nodes == ALL: + nodes = self.nodes_map.items() + # elif nodes == OUTPUTS: + # nodes = [(node, self.nodes_map[node]) for node in self._composition.get_output_nodes()] + + def update_autodiff_all_output_values(): + """Update autodiff's output_values by executing its output_CIM's with pytorch_rep all_output_values""" + if self.all_output_values: + self._composition.output_CIM.execute(self.all_output_values, context=context) + + # Allow selective updating of just autodiff.output_values if specified + if nodes == OUTPUTS: + update_autodiff_all_output_values() + return + + for pnl_node, pytorch_node in nodes: + # Update each node's value with the output of the corresponding wrappter in the PyTorch representation + if pytorch_node.output is None: + assert pytorch_node.exclude_from_gradient_calc, \ + (f"PROGRAM ERROR: Value of PyTorch wrapper for {pnl_node.name} is None during forward pass, " + f"but it is not excluded from gradient calculation.") + continue + # First get value in numpy format + if isinstance(pytorch_node.output, list): + value = np.array([val.detach().cpu().numpy() for val in pytorch_node.output], dtype=object) + else: + value = pytorch_node.output.detach().cpu().numpy() + + # Set pnl_node's value to value + pnl_node.parameters.value._set(value, context) + + # If pnl_node's function is Stateful, assign value to its previous_value parameter + # so that if Python implementation is run it picks up where PyTorch execution left off + if isinstance(pnl_node.function, StatefulFunction): + pnl_node.function.parameters.previous_value._set(value, context) + # Do same for integrator_function of TransferMechanism if it is in integrator_mode + if isinstance(pnl_node, TransferMechanism) and pnl_node.integrator_mode: + pnl_node.integrator_function.parameters.previous_value._set(pytorch_node.integrator_previous_value, + context) + # Finally, update the output_values of the autodiff Composition by executing its output_CIM + update_autodiff_all_output_values() + def log_values(self): for node_wrapper in [n for n in self.wrapped_nodes if not isinstance(n, PytorchCompositionWrapper)]: node_wrapper.log_value() + def copy_results_to_psyneulink(self, current_condition, context=None): + """Copy outputs of Pytorch forward() to AutodiffComposition.results attribute.""" + # IMPLEMENTATION NOTE: no need to do amything for TRIAL or MINIBATCH, + # as Composition's _update_results() method is getting called to do that locally + if current_condition in {EPOCH, RUN}: + self._composition.parameters.results._set(convert_to_np_array(self.retained_results), context) + + def retain_for_psyneulink(self, + data:dict, + retain_in_pnl_options:dict, + context): + """Store outputs, targets, and losses from Pytorch execution for copying to PsyNeuLink at end of learn(). + Arguments + --------- + data : dict + specifies local data available to retain (for copying to pnl at end of run; + keys must be one or more of the keywords OUTPUTS, TARGETS, or LOSSES; value must be a torch.Tensor + retain_in_pnl_options : dict + specifies which data the user has requested be retained (and copied to pnl at end of run) + keys must be OUTPUTS, TARGETS, or LOSSES; value must be a LearningScale.name or None (which suppresses copy) + Note: does not actually copy data to pnl; that is done by _getter methods for the relevant autodiff Parameters + """ + try: + for data_type, data_val in data.items(): + try: + if retain_in_pnl_options[data_type]: + retain_method_idx = DataTypeEnum._member_map_[data_type.upper()].value + self.retain_method[retain_method_idx](data_val) + except KeyError: + assert False, \ + (f"PROGRAM ERROR: No entry for {data_type} found in retain_in_pnl_options " + f"in call to retain_for_psyneulink()") + except KeyError: + assert False, \ + (f"PROGRAM ERROR: Invalid key(s) specified in call to retain_for_psyneulink: {list(data.keys())}") + + def retain_results(self, results:list): + """Track outputs and copy to AutodiffComposition.pytorch_outputs at end of learn().""" + if len(results): + self.retained_results.append(results) + + def retain_trained_outputs(self, trained_outputs:list): + """Track outputs and copy to AutodiffComposition.pytorch_outputs at end of learn().""" + self.retained_trained_outputs.append(trained_outputs) + + def retain_targets(self, targets:list): + """Track targets and copy to AutodiffComposition.pytorch_targets at end of learn().""" + self.retained_targets.append(targets) + + def retain_losses(self, loss:torch.Tensor): + """Track losses and copy to AutodiffComposition.pytorch_targets at end of learn().""" + self.retained_losses.append(loss.detach().cpu().numpy().copy().tolist()) + + def detach_all(self): + for projection in self.projections_map.values(): + projection.matrix.detach() + class PytorchMechanismWrapper(): """Wrapper for a Mechanism in a PytorchCompositionWrapper + These comprise nodes of the PytorchCompositionWrapper, and generally correspond to modules of a Pytorch model. Attributes ---------- + _mechanism : Mechanism + the PsyNeuLink `Mechanism` being wrapped. + + afferents : List[PytorchProjectionWrapper] + list of `PytorchProjectionWrapper` objects that project to the PytorchMechanismWrapper. + + input : torch.Tensor + most recent input to the PytorchMechanismWrapper. + function : _gen_pytorch_fct - Pytorch version of the Mechanism's function assigned in __init__ + Pytorch version of the Mechanism's function assigned in __init__. integrator_function : _gen_pytorch_fct Pytorch version of the Mechanism's integrator_function assigned in __init__ if mechanism @@ -597,17 +881,27 @@ class PytorchMechanismWrapper(): that is used to determine whether to execute the integrator_function first, and use its result as the input to its function. + output : torch.Tensor + most recent output of the PytorchMechanismWrapper. + + efferents : List[PytorchProjectionWrapper] + list of `PytorchProjectionWrapper` objects that project from the PytorchMechanismWrapper. + exclude_from_gradient_calc : bool or str[BEFORE | AFTER]: False used to prevent a node from being included in the Pytorch gradient calculation by excluding it in calls to the forward() and backward(). If AFTER is specified, the node is executed after at the end of the `update_learning_parameters` method. BEFORE is not currently supported """ def __init__(self, - mechanism, # Mechanism to be wrapped - composition, # Composition to which node belongs (used for execution of nested Compositions) - component_idx, # index of the Mechanism in the Composition - device, # needed for Pytorch + mechanism, # Mechanism to be wrapped + composition_wrapper, # Composition wrapper to which node belongs (for executing nested Compositions) + component_idx, # index of the Mechanism in the Composition + device, # needed for Pytorch context=None): + # # MODIFIED 7/10/24 NEW: NEEDED FOR torch MPS SUPPORT + # super().__init__() + # MODIFIED 7/10/24 END + self.name = f"PytorchMechanismWrapper[{mechanism.name}]" self._mechanism = mechanism self._idx = component_idx self._context = context @@ -615,15 +909,17 @@ def __init__(self, self._is_bias = False self._curr_sender_value = None # Used to assign initializer or default if value == None (i.e., not yet executed) self.exclude_from_gradient_calc = False # Used to execute node before or after forward/backward pass methods - self.wrapper_type = composition + self._composition_wrapper_owner = composition_wrapper + + self.input = None + self.output = None - self.name = f"PytorchMechanismWrapper[{mechanism.name}]" - self.afferents = [] - self.efferents = [] if mechanism.parameters.has_initializers._get(context) and mechanism.parameters.value.initializer: - self.default_value = mechanism.parameters.value.initializer.get(context) + self.default_output = mechanism.parameters.value.initializer.get(context) else: - self.default_value = mechanism.defaults.value + self.default_output = mechanism.defaults.value + self.afferents = [] + self.efferents = [] from psyneulink.core.components.functions.function import FunctionError from psyneulink.library.compositions.autodiffcomposition import AutodiffCompositionError @@ -640,8 +936,6 @@ def __init__(self, except: raise AutodiffCompositionError(f"Function {pnl_fct} is not currently supported by AutodiffComposition") - self.value = None - self._target_mechanism = None def add_efferent(self, efferent): """Add ProjectionWrapper for efferent from MechanismWrapper. @@ -667,9 +961,9 @@ def aggregate_afferents(self, port=None): f"PROGRAM ERROR: No afferents found for '{self._mechanism.name}' in AutodiffComposition" for proj_wrapper in self.afferents: - curr_val = proj_wrapper.sender.value + curr_val = proj_wrapper.sender.output if curr_val is not None: - proj_wrapper._curr_sender_value = proj_wrapper.sender.value[proj_wrapper._value_idx] + proj_wrapper._curr_sender_value = proj_wrapper.sender.output[proj_wrapper._value_idx] else: proj_wrapper._curr_sender_value = torch.tensor(proj_wrapper.default_value) @@ -695,7 +989,7 @@ def aggregate_afferents(self, port=None): def execute(self, variable, context): """Execute Mechanism's _gen_pytorch version of function on variable. - Enforce result to be 2d, and assign to self.value + Enforce result to be 2d, and assign to self.output """ def execute_function(function, variable, fct_has_mult_args=False, is_combination_fct=False): """Execute _gen_pytorch_fct on variable, enforce result to be 2d, and return it @@ -705,8 +999,8 @@ def execute_function(function, variable, fct_has_mult_args=False, is_combination if ((isinstance(variable, list) and len(variable) == 1) or (isinstance(variable, torch.Tensor) and len(variable.squeeze(0).shape) == 1) or isinstance(self._mechanism.function, LinearCombination)): - # Enforce 2d on value of MechanismWrapper (using unsqueeze) - # for single InputPort or if CombinationFunction (which reduces output to single item from multi-item input) + # Enforce 2d on value of MechanismWrapper (using unsqueeze) for single InputPort + # or if CombinationFunction (which reduces output to single item from multi-item input) if isinstance(variable, torch.Tensor): variable = variable.squeeze(0) return function(variable).unsqueeze(0) @@ -730,16 +1024,14 @@ def execute_function(function, variable, fct_has_mult_args=False, is_combination fct_has_mult_args=True) # Keep track of previous value in Pytorch node for use in next forward pass self.integrator_previous_value = variable + + self.input = variable + # Compute main function of mechanism and return result from psyneulink.core.components.functions.nonstateful.combinationfunctions import CombinationFunction - self.value = execute_function(self.function, variable, + self.output = execute_function(self.function, variable, is_combination_fct=isinstance(self._mechanism.function, CombinationFunction)) - # Assign previous_value back to integrator_function of pnl node - # so that if Python implementation is run it picks up where PyTorch execution left off - if isinstance(self._mechanism.function, IntegratorFunction): - self._mechanism.integrator_function.parameters.previous_value._set(self.value, context) - - return self.value + return self.output def _gen_llvm_execute(self, ctx, builder, state, params, mech_input, data): mech_func = ctx.import_llvm_function(self._mechanism) @@ -761,13 +1053,16 @@ def _gen_llvm_execute(self, ctx, builder, state, params, mech_input, data): mech_input, mech_output]) - pnlvm.helpers.printf_float_array(builder, builder.gep(mech_output, [ctx.int32_ty(0), ctx.int32_ty(0)]), prefix=f"{self} output:\n", override_debug=False) + pnlvm.helpers.printf_float_array(builder, + builder.gep(mech_output, [ctx.int32_ty(0), ctx.int32_ty(0)]), + prefix=f"{self} output:\n", + override_debug=False) return mech_output def log_value(self): if self._mechanism.parameters.value.log_condition != LogCondition.OFF: - detached_value = self.value.detach().cpu().numpy() + detached_value = self.output.detach().cpu().numpy() self._mechanism.output_port.parameters.value._set(detached_value, self._context) self._mechanism.parameters.value._set(detached_value, self._context) @@ -825,6 +1120,19 @@ class PytorchProjectionWrapper(): actually being learned, and that projection will be referenced in the `PytorchCompositionWrapper.projections_map` (see `PytorchCompositionWrapper` for descriptive figure and additional details); the actual projection is stored in pnl_proj. + + Attributes + ---------- + + _projection : Projection + PsyNeuLink `Projection` being wrapped. + + sender : PytorchMechanismWrapper + the PytorchMechanismWrapper node from which the PytorchProjectionWrapper receives its variable. + + receiver : PytorchMechanismWrapper + the PytorchMechanismWrapper node from which the PytorchProjectionWrapper sends it value. + """ def __init__(self, projection, @@ -914,9 +1222,15 @@ def _gen_llvm_execute(self, ctx, builder, state, params, data): output_vec = gen_inject_vxm(ctx, builder, input_vec, proj_matrix) - pnlvm.helpers.printf_float_array(builder, input_vec, prefix=f"{self.sender._mechanism} -> {self.receiver._mechanism} input:\n", override_debug=False) - pnlvm.helpers.printf_float_matrix(builder, proj_matrix, prefix=f"{self.sender._mechanism} -> {self.receiver._mechanism} mat:\n", override_debug=False) - pnlvm.helpers.printf_float_array(builder, output_vec, prefix=f"{self.sender._mechanism} -> {self.receiver._mechanism} output:\n", override_debug=False) + pnlvm.helpers.printf_float_array(builder, input_vec, + prefix=f"{self.sender._mechanism} -> {self.receiver._mechanism} input:\n", + override_debug=False) + pnlvm.helpers.printf_float_matrix(builder, proj_matrix, + prefix=f"{self.sender._mechanism} -> {self.receiver._mechanism} mat:\n", + override_debug=False) + pnlvm.helpers.printf_float_array(builder, output_vec, + prefix=f"{self.sender._mechanism} -> {self.receiver._mechanism} output:\n", + override_debug=False) return output_vec diff --git a/tests/composition/test_autodiffcomposition.py b/tests/composition/test_autodiffcomposition.py index 2c561936bd0..858390f6581 100644 --- a/tests/composition/test_autodiffcomposition.py +++ b/tests/composition/test_autodiffcomposition.py @@ -27,6 +27,7 @@ # or override functions in Composition def _single_learn_results(composition, *args, **kwargs): + kwargs['synch_results_with_torch'] = 'run' composition.learn(*args, **kwargs) return composition.learning_results @@ -607,6 +608,8 @@ def test_pytorch_equivalence_with_autodiff_composition(self, autodiff_mode): D_h = nh D_o = nf * nd + np.random.seed(0) + wih = np.random.rand(D_i, D_h) * 0.02 - 0.01 wch = np.random.rand(D_c, D_h) * 0.02 - 0.01 wco = np.random.rand(D_c, D_o) * 0.02 - 0.01 @@ -617,7 +620,7 @@ def test_pytorch_equivalence_with_autodiff_composition(self, autodiff_mode): learning_rate = 100 il = TransferMechanism(size=D_i, name='input') - cl = TransferMechanism(size=D_c, name='control') + cl = TransferMechanism(size=D_c, name='task') hl = TransferMechanism(size=D_h, name='hidden', function=Logistic(bias=-2)) ol = TransferMechanism(size=D_o, name='output', @@ -710,7 +713,7 @@ def test_pytorch_equivalence_with_autodiff_composition(self, autodiff_mode): np.testing.assert_allclose(output,comparator, atol=1e-6) - def test_pytorch_equivalence_with_autodiff_training_disabled_on_proj(self): + def test_pytorch_equivalence_with_autodiff_forward_disabled_on_proj(self): iSs = np.array( [np.array([0.47360805, 0.8009108, 0.5204775, 0.53737324, 0.7586156, 0.1059076, 0.9025985, 0.44994998, 0.61306345, 0.75068617, @@ -831,7 +834,7 @@ def test_pytorch_equivalence_with_autodiff_training_disabled_on_proj(self): learning_rate = 100 il = TransferMechanism(size=D_i, name='input') - cl = TransferMechanism(size=D_c, name='control') + cl = TransferMechanism(size=D_c, name='task') hl = TransferMechanism(size=D_h, name='hidden', function=Logistic(bias=-2)) ol = TransferMechanism(size=D_o, name='output', @@ -871,10 +874,8 @@ def test_pytorch_equivalence_with_autodiff_training_disabled_on_proj(self): min_delta=min_delt, execution_mode=pnl.ExecutionMode.PyTorch, ) - - print(mnet.parameters.results.get(mnet)) mnet.run( - inputs=input_set['inputs'], + inputs=input_set['inputs'] ) output = np.array(mnet.parameters.results.get(mnet)[-15:]).reshape(225) @@ -3578,6 +3579,9 @@ def test_autodiff_logging(self): xor.learn(inputs={"inputs": {xor_in: xor_inputs}, "targets": {xor_out: xor_targets}, "epochs": num_epochs}, + synch_projection_matrices_with_torch=pnl.MINIBATCH, + synch_results_with_torch=pnl.MINIBATCH, + # synch_results_with_torch=pnl.RUN, execution_mode=pnl.ExecutionMode.PyTorch) exec_id = xor.default_execution_id @@ -3661,7 +3665,7 @@ def test_autodiff_loss_tracking(self): # and minibatch_size is 1, then there should be num_epochs * num_minibatches = num_epochs * 4 # total entries expected_loss_length = num_epochs * len(xor_inputs) - assert len(losses) == expected_loss_length + assert len(xor.torch_losses) == expected_loss_length # test clearing ad losses xor.clear_losses(context=xor) @@ -3934,8 +3938,8 @@ def test_cross_entropy_loss(self): # classes = torch.Tensor([2, 1]) # target = torch.Tensor([1]) # # Equation for loss taken from https://pytorch.org/docs/stable/nn.html#torch.nn.CrossEntropyLoss - # assert np.allclose(adc.loss(classes, target).detach().numpy(), -1 + np.log(np.exp(2) + np.exp(1))) - # assert np.allclose(adc.loss(output, target).detach().numpy(), -1 + np.log(np.exp(2) + np.exp(1))) + # assert np.allclose(adc.loss_function(classes, target).detach().numpy(), -1 + np.log(np.exp(2) + np.exp(1))) + # assert np.allclose(adc.loss_function(output, target).detach().numpy(), -1 + np.log(np.exp(2) + np.exp(1))) # Current implementation uses one-hot target specification: output = [2,1] @@ -3957,6 +3961,6 @@ def test_cross_entropy_loss(self): output = torch.Tensor(output) target = torch.Tensor(target) - ce_torch = adc.loss(output, target).detach().numpy() + ce_torch = adc.loss_function(output, target).detach().numpy() np.testing.assert_allclose(ce_numpy, ce_torch) diff --git a/tests/composition/test_emcomposition.py b/tests/composition/test_emcomposition.py index b42a8eab28b..ecfc2f2ef19 100644 --- a/tests/composition/test_emcomposition.py +++ b/tests/composition/test_emcomposition.py @@ -480,11 +480,11 @@ def test_multiple_trials_concatenation_and_storage_node(self, exec_mode, concate assert "EMComposition does not support learning with 'concatenate_keys'=True." in str(error.value) else: - if exec_mode == pnl.ExecutionMode.Python: - # FIX: Not sure why Python mode reverses last two rows/entries (dict issue?) - expected_memory = [[[0.15625, 0.3125, 0.46875], [0.171875, 0.328125, 0.484375]], - [[400., 500., 600.], [444., 555., 666.]], - [[25., 50., 75.], [27.75, 55.5, 83.25]], - [[2.5, 3.125, 3.75 ], [2.5625, 3.1875, 3.8125]]] + # if exec_mode == pnl.ExecutionMode.Python: + # # FIX: Not sure why Python mode reverses last two rows/entries (dict issue?) + expected_memory = [[[0.15625, 0.3125, 0.46875], [0.171875, 0.328125, 0.484375]], + [[400., 500., 600.], [444., 555., 666.]], + [[25., 50., 75.], [27.75, 55.5, 83.25]], + [[2.5, 3.125, 3.75 ], [2.5625, 3.1875, 3.8125]]] em.learn(inputs=inputs, execution_mode=exec_mode) np.testing.assert_equal(em.memory, expected_memory) diff --git a/tests/composition/test_report.py b/tests/composition/test_report.py index b6a9ecccb54..cdf4cc36e28 100644 --- a/tests/composition/test_report.py +++ b/tests/composition/test_report.py @@ -588,6 +588,8 @@ def test_autodiff_report(self): xor.learn(inputs= training_inputs, + synch_node_variables_with_torch=pnl.TRIAL, + synch_node_values_with_torch=pnl.TRIAL, report_output=ReportOutput.OFF, report_progress=ReportProgress.ON, report_to_devices=ReportDevices.DIVERT, @@ -627,9 +629,10 @@ def test_autodiff_report(self): report_output=ReportOutput.FULL, report_progress=ReportProgress.ON, report_to_devices=ReportDevices.DIVERT, + synch_node_values_with_torch='trial', execution_mode=pnl.ExecutionMode.PyTorch) actual_report = xor.rich_diverted_reports - expected_report = '\n ╔══ EXECUTION OF autodiff_composition ═══╗\n ║ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 0 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933057795354014]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 1 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.999331787548446]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 2 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317875516309]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 3 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998504229552773]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 4 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933055512239266]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 5 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317539824547]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 6 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317539856401]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 7 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998504138991838]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 8 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933053228968025]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 9 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317204136144]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 10 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317204168003]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 11 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.999850404842228]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ╚═════════════════════════════════════════╝\n\nautodiff_composition: Trained 12 trials\n' + expected_report = '\n ╔══ EXECUTION OF autodiff_composition ═══╗\n ║ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 0 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998504316537016]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 1 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933057795354014]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 2 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.999331787548446]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 3 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317875516309]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 4 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998504229552773]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 5 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933055512239266]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 6 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317539824547]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 7 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317539856401]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 8 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998504138991838]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 9 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933053228968025]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 10 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317204136144]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 11 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993317204168003]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ╚═════════════════════════════════════════╝\n\nautodiff_composition: Trained 12 trials\n' assert actual_report == expected_report xor.run(inputs={xor_in:xor_inputs}, @@ -667,7 +670,7 @@ def test_autodiff_report(self): execution_mode=pnl.ExecutionMode.PyTorch) actual_report = xor.rich_diverted_reports # expected_report = '\n ╔══ EXECUTION OF autodiff_composition ═══╗\n ║ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 0 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933044094317858]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 1 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315861097587]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 2 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315861129465]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 3 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503686057807]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 4 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933041810263933]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 5 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.999331552526669]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 6 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315525298574]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 7 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503595445122]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 8 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933039526053421]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 9 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315189407287]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 10 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315189439175]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 11 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.5]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503504823807]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ╚═════════════════════════════════════════╝\n\n' - expected_report = '\n ╔══ EXECUTION OF autodiff_composition ═══╗\n ║ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 0 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933044094317858]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 1 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315861097587]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 2 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315861129465]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 3 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503686057807]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 4 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933041810263933]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 5 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.999331552526669]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 6 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315525298574]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 7 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503595445122]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 8 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9933039526053421]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 9 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315189407287]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 10 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9993315189439175]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 11 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503504823807]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ╚═════════════════════════════════════════╝\n\n' + expected_report = '\n ╔══ EXECUTION OF autodiff_composition ═══╗\n ║ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 0 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 1 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 2 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 3 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 4 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 5 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 6 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 7 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 8 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 9 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 10 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ║ ┏━ autodiff_composition: Trial 11 ━┓ ║\n ║ ┃ ┃ ║\n ║ ┃ input: [[1.0, 1.0], [0.0]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┃ result: [[0.9998503773091209]] ┃ ║\n ║ ┃ ┃ ║\n ║ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ║\n ║ ║\n ╚═════════════════════════════════════════╝\n\n' assert actual_report == expected_report xor.run(inputs={xor_in:xor_inputs},