12 Processes and Statistics

Processes in PDP++ play the role of orchestrating and coordinating the interactions between different object types in order to carry out particular tasks. Processes are objects (see section 8.1.1 What is an Object?), which means that they can have their own variables and functions. This is fundamentally different from the idea of a process as something that simply acts on a data structure. There are many different kinds of process objects which have been designed to perform specific kinds of tasks.

The scheduling processes coordinate the overall scheduling of processing during training and testing of networks, and are the "backbone" of processing system. They are organized into a hierarchy of objects, each of which performs a specific level of processing:

TrainProcess (loop over epochs)
    EpochProcess (loop over trials)
        TrialProcess (present a single pattern)
        .
        .
    .
    .

The rest of the processes hang off of the schedule processes in different places, and perform specific tasks. The largest category of such processes are statistics, which compute and record data about the network, environment or other processes, and make this data available to the logs for displaying.

Statistics often need to be viewed at multiple levels of processing. Thus, one often wants to simultaneously view the trial-wise and the aggregated epoch-summed squared error. This is accomplished in PDP++ by having statistics which actually compute the squared-error for a given event in the trial process, but also copies of this squared-error statistic at subsequent (higher) levels of processing which perform the aggregation of the statistic over these higher levels.

Since the different time-grains of processing are represented by the schedule process hierarchy, other things like updating displays and logging data, which can also happen at different time-grains, are tied to the schedule process hierarchy. Thus, one can decide to log data at the TrialProcess, EpochProcess, and/or TrainProcess level, and similarly for updating displays like the network viewer.

Finally, the code to control a Process can either be hard-coded C++ code, or a pointer to a CSS script file. This means that one can change the behavior of a Process simply a writing a CSS script and setting the Process to use it (see section 12.9 Processes and CSS Scripts).

The best way to interact and configure processes is throught the project viewer (see section 9.2 The Project Viewer).