Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/em composition refactor learning mech #2754

Merged
merged 212 commits into from
Jul 30, 2023

Conversation

jdcpni
Copy link
Collaborator

@jdcpni jdcpni commented Jul 29, 2023

• emcomposition.py

  • add options whether or not:
    • to use storage_node
    • use gating for weighting
    • weight normalization by fields for identifying weakest entry
  • refactor and fix bugs in storage algorithm

• test_emcomposition.py

  • add tests for multiple trials

• composition.py

  • suppress warning for LearningProjections that execute in EXECUTION_PHASE

jdcpni added 30 commits July 2, 2023 12:22
  - all_entries_identical()
  first draft of module that implements episodic / external memory Composition
  - add error message for specifcation of default_control_allocation or default_gating_allocation
  - add error message for specifcation of default_control_allocation or default_gating_allocation
  - add error message for specifcation of default_control_allocation or default_gating_allocation
 - constructs but wiring still not right
 - first draft; needs to be run
 - add memory decay and storage
 - storage and retrieval working
 - exclude value_input_nodes as NodeRole.OUTPUT
 - TODO notes
 - suppress warning for no efferent projectsions
  - add storage_prob and related parameters
  - docs in progress
• emcomposition.py
  - doc mods
• emcomposition.py
  - normalize dot products for match_nodes
  (still needs compiled version)
• emcomposition.py
  - doc mods
• emcomposition.py
  - implement various Parameters
  - add keys to retrieval nodes
• emcomposition.py
  - field_names implemented
• emcomposition.py
  - adaptive softmax gain implemented
• emcomposition.py
  - match_nodes -> softmax_nodes
• emcomposition.py
  - split match_nodes and softmax_nodes
• emcomposition.py
  - implement adpative softmax control
@github-actions
Copy link

This PR causes the following changes to the html docs (ubuntu-latest-3.7-x64):

diff -r docs-base/EMComposition.html docs-head/EMComposition.html
382c382
< are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
---
> are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
424c424
< <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>
---
> <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>
470c470
< from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
---
> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
475,476c475,476
< in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> through its Projection to each
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a> (which computes the dot product of the weighted softmax over
---
> in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> through its Projection to each
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a> (which computes the dot product of the weighted softmax over
483c483
< <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> attribute.</p>
---
> <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> attribute.</p>
513c513
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
---
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
515c515
< <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
---
> <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
521c521
< the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
---
> the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
539,540c539,540
< of the <a class="reference internal" href="MappingProjection.html"><span class="doc">MappingProjection</span></a> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retreival_weighting_node</span></code></a> to each
< of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate
...

See CI logs for the full diff.

def _validate_field_types(self, field_types):
if not len(field_types) or len(field_types) != len(self.fields):
return f"must be specified with a number of items equal to " \
f"the number of fields specified {len(self.fields)}"
if not all(item in {1,0} for item in field_types):
return f"must be a list of 1s (for keys) and 0s (for values)."

def _validate_field_weights(self, field_weights):

Check notice

Code scanning / CodeQL

Explicit returns mixed with implicit (fall through) returns Note

Mixing implicit and explicit returns may indicate an error as implicit returns always return None.
# Get matrix containing memories for the field from the Projection
field_memory_matrix = field_projection.parameters.matrix.get(context)

value.append(super(LearningMechanism, self)._execute(variable=entry_to_store,

Check failure

Code scanning / CodeQL

First argument to super() is not enclosing class Error

First argument to super() should be EMStorageMechanism.
field_norms = np.array([np.linalg.norm(field, axis=1)
for field in [row for row in self.parameters.memory.get(context)]])
if purge_by_field_weights:
field_norms *= self.field_weights

Check warning

Code scanning / CodeQL

Unreachable code Warning

This statement is unreachable.
Comment on lines +1763 to +1772
# if concatenate_keys:
# projections = [self.concatenate_keys_node.input_ports[i].path_afferents[0] for i in range(self.num_keys)] + \
# [self.retrieved_nodes[i].input_port.path_afferents[0] for i in range(len(self.input_nodes))]
# variable = [self.input_nodes[i].value[0] for i in range(self.num_fields)]
# fields = [self.input_nodes[i] for i in range(self.num_fields)]
# else:
# variable = [self.input_nodes[i].value[0] for i in range(self.num_fields)]
# fields = [self.input_nodes[i] for i in range(self.num_fields)]
# projections = [self.match_nodes[i].input_port.path_afferents[0] for i in range(self.num_keys)] + \
# [self.retrieved_nodes[i].input_port.path_afferents[0] for i in range(len(self.input_nodes))]

Check notice

Code scanning / CodeQL

Commented-out code Note

This comment appears to contain commented-out code.
pytest.skip('Compilation not yet support for Composition.import.')

def temp(context):
memory = context.composition.parameters.memory.get(context)

Check notice

Code scanning / CodeQL

Unused local variable Note test

Variable memory is not used.
if comp_mode != pnl.ExecutionMode.Python:
pytest.skip('Compilation not yet support for Composition.import.')

def temp(context):

Check notice

Code scanning / CodeQL

Unused local variable Note test

Variable temp is not used.
@github-actions
Copy link

This PR causes the following changes to the html docs (ubuntu-latest-3.7-x64):

diff -r docs-base/EMComposition.html docs-head/EMComposition.html
382c382
< are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
---
> are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
424c424
< <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>
---
> <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>
470c470
< from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
---
> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
475,476c475,476
< in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> through its Projection to each
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a> (which computes the dot product of the weighted softmax over
---
> in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> through its Projection to each
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a> (which computes the dot product of the weighted softmax over
483c483
< <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> attribute.</p>
---
> <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> attribute.</p>
513c513
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
---
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
515c515
< <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
---
> <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
521c521
< the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
---
> the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
539,540c539,540
< of the <a class="reference internal" href="MappingProjection.html"><span class="doc">MappingProjection</span></a> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retreival_weighting_node</span></code></a> to each
< of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate
...

See CI logs for the full diff.

  - _parse_port_specific_specs(): fix bug in which COMBINE was not parsed
  - _parse_port_specific_specs(): fix bug in which COMBINE was not parsed when specified in an InputPort specification dict (though still some weirdness)
• port.py
  _parse_port_spec():
    add passing of Context.string for caller ID
@github-actions
Copy link

This PR causes the following changes to the html docs (ubuntu-latest-3.7-x64):

diff -r docs-base/EMComposition.html docs-head/EMComposition.html
382c382
< are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
---
> are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
424c424
< <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>
---
> <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>
470c470
< from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
---
> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
475,476c475,476
< in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> through its Projection to each
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a> (which computes the dot product of the weighted softmax over
---
> in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> through its Projection to each
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a> (which computes the dot product of the weighted softmax over
483c483
< <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> attribute.</p>
---
> <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> attribute.</p>
513c513
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
---
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
515c515
< <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
---
> <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
521c521
< the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
---
> the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
539,540c539,540
< of the <a class="reference internal" href="MappingProjection.html"><span class="doc">MappingProjection</span></a> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retreival_weighting_node</span></code></a> to each
< of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate
...

See CI logs for the full diff.

@github-actions
Copy link

This PR causes the following changes to the html docs (ubuntu-latest-3.7-x64):

diff -r docs-base/EMComposition.html docs-head/EMComposition.html
382c382
< are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
---
> are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
424c424
< <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>
---
> <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>
470c470
< from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
---
> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
475,476c475,476
< in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> through its Projection to each
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a> (which computes the dot product of the weighted softmax over
---
> in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> through its Projection to each
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a> (which computes the dot product of the weighted softmax over
483c483
< <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> attribute.</p>
---
> <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> attribute.</p>
513c513
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
---
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
515c515
< <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
---
> <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
521c521
< the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
---
> the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
539,540c539,540
< of the <a class="reference internal" href="MappingProjection.html"><span class="doc">MappingProjection</span></a> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retreival_weighting_node</span></code></a> to each
< of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate
...

See CI logs for the full diff.

  - passes tests sequentially but not in parallel.
    Error:
    >       num_fields = len(owning_component.fields)
E       TypeError: object of type 'NoneType' has no len()

../../psyneulink/library/components/mechanisms/modulatory/learning/EMstoragemechanism.py:211: TypeError
  - refactor memory_matrix to use learning_signals

 • emcomposition.py
   - refactor to use memory_matrix of storage_node if that is implemented
@github-actions
Copy link

This PR causes the following changes to the html docs (ubuntu-latest-3.7-x64):

diff -r docs-base/EMComposition.html docs-head/EMComposition.html
382c382
< are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
---
> are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
424c424
< <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>
---
> <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>
470c470
< from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
---
> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
475,476c475,476
< in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> through its Projection to each
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a> (which computes the dot product of the weighted softmax over
---
> in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> through its Projection to each
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a> (which computes the dot product of the weighted softmax over
483c483
< <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> attribute.</p>
---
> <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> attribute.</p>
513c513
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
---
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
515c515
< <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
---
> <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
521c521
< the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
---
> the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
539,540c539,540
< of the <a class="reference internal" href="MappingProjection.html"><span class="doc">MappingProjection</span></a> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retreival_weighting_node</span></code></a> to each
< of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate
...

See CI logs for the full diff.

@github-actions
Copy link

This PR causes the following changes to the html docs (ubuntu-latest-3.7-x64):

diff -r docs-base/EMComposition.html docs-head/EMComposition.html
382c382
< are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
---
> are retrieved and assigned as the <a class="reference internal" href="Mechanism.html#psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value" title="psyneulink.core.components.mechanisms.mechanism.Mechanism_Base.value"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">value</span></code></a> of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a>. This distinction between keys and value implements a standard “dictionary; however,
424c424
< <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>
---
> <p>All <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> and <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>
470c470
< from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
---
> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>. Memories associated with each key are also stored in the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameters of the <code class="xref any docutils literal notranslate"><span class="pre">MappingProjections</span></code> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.key_input_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">key_input_nodes</span></code></a> to each of the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.match_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.match_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">match_nodes</span></code></a>.
475,476c475,476
< in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> through its Projection to each
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_node</span></code></a> (which computes the dot product of the weighted softmax over
---
> in the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> through its Projection to each
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_node</span></code></a> (which computes the dot product of the weighted softmax over
483c483
< <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> attribute.</p>
---
> <p>The outputs corresponding to retrieved value for each field are represented as <a class="reference internal" href="Composition.html#psyneulink.core.compositions.composition.NodeRole.INPUT" title="psyneulink.core.compositions.composition.NodeRole.INPUT"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">OUTPUT</span></code></a> <a class="reference internal" href="Composition.html#composition-nodes"><span class="std std-ref">Nodes</span></a> of the EMComposition, listed in its <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> attribute.</p>
513c513
< <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
---
> <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a>, which applies the corresponding <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.field_weights" title="psyneulink.library.compositions.emcomposition.EMComposition.field_weights"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">field_weight</span></code></a> to the softmaxed dot products of memories for each field, and then haddamard sums
515c515
< <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
---
> <li><p><strong>Retrieve values by field</strong>. The vector of weights for each memory generated by the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> is passed through the Projections to the each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a> to compute the retrieved value for each field.</p></li>
521c521
< the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
---
> the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.softmax_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">softmax_weighting_node</span></code></a> to each of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieved_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieved_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">matrix</span></code></a> parameter of the
539,540c539,540
< of the <a class="reference internal" href="MappingProjection.html"><span class="doc">MappingProjection</span></a> from the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_weighting_node"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retreival_weighting_node</span></code></a> to each
< of the <a class="reference internal" href="#psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes" title="psyneulink.library.compositions.emcomposition.EMComposition.retrieval_nodes"><code class="xref any py py-attr docutils literal notranslate"><span class="pre">retrieval_nodes</span></code></a>, as well as the <a class="reference internal" href="MappingProjection.html#psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix" title="psyneulink.core.components.projections.pathway.mappingprojection.MappingProjection.matrix"><code class="xref any py py-attr docutils literal notranslate
...

See CI logs for the full diff.

Comment on lines +197 to +201
# def _memory_matrix_getter(owning_component=None, context=None):
# if context.composition:
# return context.composition.parameters.memory._get(context)
# else:
# return None

Check notice

Code scanning / CodeQL

Commented-out code Note

This comment appears to contain commented-out code.
@coveralls
Copy link

Coverage Status

coverage: 84.569% (+0.002%) from 84.567% when pulling 705ac59 on feat/em_composition_REFACTOR_LEARNING_MECH into 2890038 on devel.

@jdcpni jdcpni merged commit 26d1386 into devel Jul 30, 2023
58 of 59 checks passed
@jdcpni jdcpni deleted the feat/em_composition_REFACTOR_LEARNING_MECH branch July 30, 2023 18:05
kmantel added a commit to kmantel/PsyNeuLink that referenced this pull request Aug 1, 2023
* origin/devel:
  tests/ParameterEstimationComposition: Reduce the number of estimates by 40x
  tests/ParameterEstimationComposition: Provide expected result instead of relying on tolerance
  requirements: update dill requirement from <0.3.7 to <0.3.8 (PrincetonUniversity#2743)
  Feat/em composition refactor learning mech (PrincetonUniversity#2754)
  Fix/input port combine (PrincetonUniversity#2755)
  requirements: update beartype requirement from <0.15.0 to <0.16.0 (PrincetonUniversity#2744)
kmantel pushed a commit that referenced this pull request Aug 1, 2023
• EMstoragemechanism.py
  - refactor memory_matrix to use learning_signals

 • emcomposition.py
   - refactor to use memory_matrix of storage_node if that is implemented

Co-authored-by: jdcpni <pniintel55>
kmantel added a commit that referenced this pull request Aug 2, 2023
kmantel added a commit to kmantel/PsyNeuLink that referenced this pull request Dec 12, 2023
* origin/master:
  tests/ParameterEstimationComposition: Reduce the number of estimates by 40x
  tests/ParameterEstimationComposition: Provide expected result instead of relying on tolerance
  requirements: update dill requirement from <0.3.7 to <0.3.8 (PrincetonUniversity#2743)
  Feat/em composition refactor learning mech (PrincetonUniversity#2754)
  Fix/input port combine (PrincetonUniversity#2755)
  requirements: update beartype requirement from <0.15.0 to <0.16.0 (PrincetonUniversity#2744)
kmantel added a commit to kmantel/PsyNeuLink that referenced this pull request Dec 12, 2023
Resolve all differences in favor of devel. master changes
are stale because they mirror old commits on devel.

* master:
  tests/ParameterEstimationComposition: Reduce the number of estimates by 40x
  tests/ParameterEstimationComposition: Provide expected result instead of relying on tolerance
  requirements: update dill requirement from <0.3.7 to <0.3.8 (PrincetonUniversity#2743)
  Feat/em composition refactor learning mech (PrincetonUniversity#2754)
  Fix/input port combine (PrincetonUniversity#2755)
  requirements: update beartype requirement from <0.15.0 to <0.16.0 (PrincetonUniversity#2744)
@kmantel kmantel mentioned this pull request Dec 12, 2023
kmantel added a commit to kmantel/PsyNeuLink that referenced this pull request Dec 12, 2023
Resolve all differences in favor of devel. master changes are stale
because they mirror old commits on devel.

* master:
  tests/ParameterEstimationComposition: Reduce the number of estimates by 40x
  tests/ParameterEstimationComposition: Provide expected result instead of relying on tolerance
  requirements: update dill requirement from <0.3.7 to <0.3.8 (PrincetonUniversity#2743)
  Feat/em composition refactor learning mech (PrincetonUniversity#2754)
  Fix/input port combine (PrincetonUniversity#2755)
  requirements: update beartype requirement from <0.15.0 to <0.16.0 (PrincetonUniversity#2744)
jdcpni added a commit that referenced this pull request Dec 13, 2023
* requirements: update beartype requirement from <0.15.0 to <0.16.0 (#2744)

* Fix/input port combine (#2755)

• inputport.py
  _parse_port_specific_specs(): fix bug in which COMBINE was not parsed when specified in an InputPort specification dict (though still some weirdness in passing spec through to constructor, requiring function assignment in place)

• port.py
  _parse_port_spec():  add passing of Context.string for local handling based on caller (e.g., warning messages)

* Feat/em composition refactor learning mech (#2754)

• EMstoragemechanism.py
  - refactor memory_matrix to use learning_signals

 • emcomposition.py
   - refactor to use memory_matrix of storage_node if that is implemented

Co-authored-by: jdcpni <pniintel55>

* requirements: update dill requirement from <0.3.7 to <0.3.8 (#2743)

* tests/ParameterEstimationComposition: Provide expected result instead of relying on tolerance

Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu>

* tests/ParameterEstimationComposition: Reduce the number of estimates by 40x

It's still enough to recover the parameters and reduces test time
significantly.

Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu>

---------

Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: jdcpni <jdc@princeton.edu>
Co-authored-by: Jan Vesely <jan.vesely@rutgers.edu>
kmantel added a commit to kmantel/PsyNeuLink that referenced this pull request Dec 13, 2023
Resolve all differences in favor of devel. master changes are stale
because they mirror old commits on devel.

* master:
  tests/ParameterEstimationComposition: Reduce the number of estimates by 40x
  tests/ParameterEstimationComposition: Provide expected result instead of relying on tolerance
  requirements: update dill requirement from <0.3.7 to <0.3.8 (PrincetonUniversity#2743)
  Feat/em composition refactor learning mech (PrincetonUniversity#2754)
  Fix/input port combine (PrincetonUniversity#2755)
  requirements: update beartype requirement from <0.15.0 to <0.16.0 (PrincetonUniversity#2744)
@kmantel kmantel mentioned this pull request Dec 13, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants