Currently, the user is expected to provide a list in the inference language named observers which contains the observation function for each simulator defined the simulators list (which lives in the modelling language).
The default pattern for the observation functions looks like:
define obs_cluster_id = (rowid, apogee, perigee, value, label) -> {
$label: observe sim_cluster_id( $rowid, $apogee, $perigee) = atom(value);
};
whereas a custom observation function might be:
define obs_period = (rowid, apogee, perigee, value, label) -> {
let theoretical_period = run(sample keplers_law($apogee, $perigee));
obs_error( rowid, apogee, perigee, value - theoretical_period, label); };
The first pattern can and should be fully automated by the vscgpm wrapper. The user can then "override" the default observation by defining a dictionary mapping output index to desired observer function, e.g.
assume simulators = [sim_period, sim_cluster_id, sim_error]
...
let observers = dict([0, obs_period])
The above code tells vscgpm that the observer for output index 0 (i.e. sim_period) is the obs_period procedure, whereas sim_cluster_id and sim_error should be observed using the "default pattern".
Currently, the user is expected to provide a list in the inference language named
observerswhich contains the observation function for each simulator defined thesimulatorslist (which lives in the modelling language).The default pattern for the observation functions looks like:
whereas a custom observation function might be:
The first pattern can and should be fully automated by the vscgpm wrapper. The user can then "override" the default observation by defining a dictionary mapping output index to desired observer function, e.g.
The above code tells vscgpm that the observer for output index 0 (i.e.
sim_period) is theobs_periodprocedure, whereassim_cluster_idandsim_errorshould be observed using the "default pattern".