# Modulatory Projections¶

## Overview¶

A ModulatoryProjection is a subclass of Projection that takes the value of a ModulatorySignal belonging to an AdaptiveMechanism, and uses that to modulate the function of the State to which it projects. There are three types of ModulatoryProjections, that modulate different types of Components and their States:

## Creating a ModulatoryProjection¶

A ModulatoryProjection is a base class, and cannot be instantiated directly. However, the three types of ModulatoryProjections listed above can be created directly, by calling the constructor for the desired type. More commonly, however, ModulatoryProjections are either specified in the context of the States to or from which they project (Projections in State, and Projection_Specification>), or are created automatically, the details of which are described in the documentation for each type of ModulatoryProjection.

## Structure¶

A ModulatoryProjection has the same basic structure as a Projection, augmented by type-specific attributes and methods described under each type of ModulatoryProjection. The ModulatoryProjections received by a State are listed in the State’s mod_afferents attribute.

## Execution¶

A ModulatoryProjection, like any Projection, cannot be executed directly. It is executed when the State to which it projects — its receiver — is updated; that occurs when the State’s owner Mechanism is executed. When a ModulatoryProjection executes, it conveys both the value of the ModulatorySignal from which it projects, and the ModulatorySignal’s modulation attribute, to the State that receives the Projection. The State assigns the value to the parameter of the State’s function specified by the modulation attribute, and then calls the function to determine the value of the State.

Note

The change made to the parameter of the State’s Function in response to the execution of a ModulatoryProjection are not applied until the State is updated which, in turn, does not occur until the Mechanism to which the State belongs is next executed; see Lazy Evaluation for an explanation of “lazy” updating).