A rough implementation of data2draws is partly implemented. You can write the following python code:
model = StanVensimModel("ds_white_sterman", am, 0.0, list(range(0, 10))) # 0.0 is initial time, range(0, 10) is the integrations times
model.set_prior("inventory_adjustment_time", "normal", 0, 1)
model.set_prior("minimum_order_processing_time", "normal", 0, 1)
This (currently) results in the following generated code:
#include ds_white_sterman_functions.stan
data{
}
transformed data{
real initial_time = 0.0;
int T = 10;
array[T] real times = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
}
transformed parameters {
# Initial ODE values
real inventory_initial = 2 + 2 * 10000;
real expected_order_rate_initial = 10000;
real work_in_process_inventory_initial = 8 * max(0,10000 + 2 + 2 * 10000 - 2 + 2 * 10000 / 8);
vector[3] initial_outcome; # Initial ODE state vector
initial_outcome[1] = inventory;
initial_outcome[2] = expected_order_rate;
initial_outcome[3] = work_in_process_inventory;
vector[3] integrated_result[T] = ode_rk45(vensim_ode, initial_outcome, initial_time, times, minimum_order_processing_time, inventory_adjustment_time);
}
parameters{
real inventory_adjustment_time;
real minimum_order_processing_time;
}
model{
inventory_adjustment_time ~ normal(0, 1);
minimum_order_processing_time ~ normal(0, 1);
}
The problem is how we're going to expose vector[3] integrated_result[T] to the user. There are 2 ways the user would want to access it. 1. along the time axis(which results in a array of length T with a single stock) 2. for a single timestep(which results in a vector of length 3)
Another problem is linking the codegen with data specified by the user. I'm not sure what form the data would have to be inputted from the user. If data was specified, we'd have to construct the data block that matches the inputted data.
A rough implementation of data2draws is partly implemented. You can write the following python code:
This (currently) results in the following generated code:
The problem is how we're going to expose
vector[3] integrated_result[T]to the user. There are 2 ways the user would want to access it. 1. along the time axis(which results in a array of lengthTwith a single stock) 2. for a single timestep(which results in a vector of length 3)Another problem is linking the codegen with data specified by the user. I'm not sure what form the data would have to be inputted from the user. If data was specified, we'd have to construct the data block that matches the inputted data.