a gradient-based optimizer. Average performance over all tasks is returned as fitness back to CoDeepNEAT. That fitness is assigned to each of the modules in the assembled network. If a module is used in multiple assembled networks, their fitnesses are averaged into module fitness. After evaluation is complete, standard NEAT mutation, crossover, and speciation operators are applied to create the next generation of the module population [@stanley:ec02].

Coevolution of Modules/Shared Routing {#subsec:cmsr}
-------------------------------------

Coevolution of Modules and Shared Routing (CMSR) extends CM to include blueprint evolution. Thus, the routing between various modules no longer follows the fixed grid-like structure, but instead an arbitrary DAG. Each node in the blueprint genotype points to a particular module species. During assembly, the blueprints are converted into deep multitask networks as follows:

1.  \[CMSR:zero\] For each blueprint in the population, an individual module is randomly chosen from each species.

2.  Each node in the blueprint is then replaced by the module from the appropriate species.

3.  If a module has multiple inputs from previous nodes in the blueprint, the inputs are soft merged first [@Meyerson:2018].

4.  The process is repeated from step \[CMSR:zero\] until reaching a target number of assembled networks.

As in CM, 