/** * @anchor MonteCarloPage * @page LEVEL2 Monte Carlo and Optimization * * Monte Carlo is the process of iteratively calling a simulation over a set of predetermined or auto-generated inputs. * Trick has designed its Monte Carlo capability to run distributed. * * @section LEVEL3 Structure * In particular, Monte Carlo is designed after a "master/slave" model. The master is in charge of creating slaves and * tasking them to work. There may be any number of slaves distributed over a network. Master and slave communicate through * sockets. Theoretically, a master and slave need not have the same file system. Each slave is responsible for requesting * work, accomplishing work and reporting results. The work at hand is running a single simulation iteratively over an input * space. * * @subsection LEVEL4 The Master * The master is the command center of a Monte Carlo simulation. The master tasks slaves to run the simulation with a given * set of inputs. The master will task slaves to run in parallel. The master is responsible for keeping the slaves as busy as * possible. To keep things running smoothly, the master is designed to reassign work when a slave is either dead or running * too slowly. the master is only in charge of tasking work. The master does not run the simulation itself. The master will * continue issuing work to the slaves until it is satisfied all simulation runs are complete. * * The master's life cycle consists of the following: * * - Initialize * - While there are unresolved runs: * - Spawn any uninitialized slaves. * - Dispatch runs to ready slaves. * - Resolve run based on slave's exit status. * - Receive results from finished slave's child. * - Check for timeouts. * - Shutdown the slaves and terminate. * * @see Trick::MonteCarlo * * @anchor MonteCarloSlaves * @subsection LEVEL4 Slaves * * A slave consists of a parent and fork()ed children. A slave parent spawns a child using the fork() system call. A * slave child runs the simulation in its own address space. Only one child exists at a time in a slave. Per slave, * simulation execution is sequential. * * A slave is responsible for requesting work from the master, running a Trick simulation with inputs given by the master, * dumping recorded data to disk and informing the master when it is finished running its task. * * The slave's life cycle consists of the following: * * - Initialize * - Connect to and inform the master of the port over which the slave is listening for dispatches. * - Until the connection to the master is lost or the master commands a shutdown: * - Wait for a new dispatch. * - Process the dispatch. * - Slave fork()s child. * - Child runs simulation with varied input. * - Write the run number processed to the master at child shutdown. * - Write the exit status to the master. * - Run the shutdown jobs and terminate. * * @see Trick::MonteSlave * * @section LEVEL3 Simulation Inputs * * The goal of Monte Carlo is to run the simulation over a set of inputs. The inputs that the master passes to the slaves * are either generated by a statistical algorithm or they are hard-coded by the user in a data file. Inputs may also be * generated exclusively by user calculations. * * @section LEVEL3 Monte Carlo Output * * For each simulation run within a Monte Carlo suite of runs, a directory called "MONTE_" is created. Slave output * is directed to this "MONTE_" directory. Trick recorded data is written in a set of "RUN_" directories within the parent * "MONTE_" directory. Along with recorded data, stdout, stderr, and send_hs files are written. A file that contains the * summary of all runs is written to the "MONTE_" directory. * * @section LEVEL3 Data Processing * * The trick_dp is desinged to understand "MONTE_" directories. When choosing to plot a "MONTE_" directory, trick_dp * will overlay all curves from each "RUN_" directory within the parent "MONTE_" directory. The plot widget has built * in features that allow the developer to distinguish what curve goes with what simulation run. * * @section LEVEL3 Optimization * * Optimization is made possible by creating a framework whereby the developer can change simulation inputs based on * simulation results. Trick offers a set of job classes that allow the developer to enter the Monte Carlo loop and * thereby enter the decision making on-the-fly. No canned optimization is available. * * This special set of job classes work in concert together in master and slaves. Trick schedules jobs within the master * at critical points so that they may create inputs to send to the slave as well as receive results from the slave. * Slave jobs are scheduled to receive simulation inputs from the master as well as send simulation results back to the * master. * * The jobs are specified in the S_define. The jobs are created by the developer. */