{#subsec:cm}
----------------------

In Coevolution of Modules (CM), CoDeepNEAT is used to search for promising module architectures, which then are inserted into appropriate positions to create an *enhanced soft ordering* network. The evolutionary process works as follows:

1.  \[CM:zero\] CoDeepNEAT initializes a population of modules $MP$. The blueprints are not used.

2.  Modules are randomly chosen from each species in $MP$, grouped into sets $M$ and are assembled into enhanced soft ordering networks.

3.  Each assembled network is trained/evaluated on some task and its performance is returned as fitness.

4.  Fitness is attributed to the modules, and NEAT evolutionary operators are applied to evolve the modules.

5.  The proess is repeated from step \[CM:zero\] until CoDeepNEAT terminates, i.e. no further progress is observed for a given number of generations.

Unlike in soft ordering [@Meyerson:2018], the number of modules and the depth of the network are not fixed but are evolved as global hyperparameters by CoDeepNEAT (however the layout is still a grid-like structure). Since the routing layout is fixed, the blueprint population of CoDeepNEAT, which determines how the modules are connected, is not used. Thus one key operation in the original CoDeepNEAT, i.e. inserting modules into each node of the blueprint 