/*! * Performs the postprocessing for toroidal, * which is setting the number of iterations that are to be performed * @param dat Map containing the input values * \sa controller::postprocess, item_dim::postprocess */ void toroidal::postprocess(input& dat){ controller::postprocess(dat); num_int=0; int _iterations; dat.retrieve(_iterations, "iterations", this); dat.retrieve(initial_inc, "initial_inc", this); dat.retrieve(mul_fac, "mul_fac", this); iterations = _iterations; if(mul_fac==0){ err("Multiply factor, mul_fac, must not be equal to zero", "toroidal::postprocess", "controller/toroidal.cpp", FATAL_ERROR); } if(initial_inc==0){ err("The initial increment, initial_inc, must not be equal to zero", "toroidal::postprocess", "controller/toroidal.cpp", FATAL_ERROR); } //temporary hack to help with c_elegans holder->index = index*iterations; //find the controllers place in the number of iterations }
/*! * Initializes the rhs_CNLS class */ void rhs_CNLS::postprocess(input& dat){ rhs::postprocess(dat); NUM_TIME_STEPS = dimension/2; if(NUM_TIME_STEPS*2 != dimension){ err("dimension not even, which is required for rhs_CNLS", "rhs_CNLS::postprocess", "rhs/rhs_CNLS.cpp", FATAL_ERROR); } dat.retrieve(LENGTH_T, "t_int", this); if(LENGTH_T <= 0){ std::string errmess = "t_int is invalid, must be >= 0"; err(errmess, "rhs_CNLS::postprocess", "rhs/rhs_CNLS.cpp", dat["t_int"], FATAL_ERROR); } dt = LENGTH_T/NUM_TIME_STEPS; dat.retrieve(g0, "g0", this); dat.retrieve(e0, "e0", this); memp.create(NUM_TIME_STEPS, &u1, &u2, &comp_in, &comp_in_r, &comp_out, &comp_out_r, &sq1, &sq2, &k, &ksq); //create k values double mulval=(2.0*PI/LENGTH_T)*(NUM_TIME_STEPS/2.0); for(size_t i=0; i<NUM_TIME_STEPS/2; i++){ k[i] = mulval * (2.0*i/(1.0*NUM_TIME_STEPS)); ksq[i] = k[i]*k[i]; } for(size_t i=NUM_TIME_STEPS/2; i<NUM_TIME_STEPS; i++){ k[i] = mulval * 2.0*((int)i-(int)NUM_TIME_STEPS)/(NUM_TIME_STEPS*1.0); ksq[i] = k[i]*k[i]; } }
/*! * This function process data that has been generated from an input file * All of the names returned in the dependencies file exist and have been processed * @param dat The data structure containing the variable names */ void example_rhs::postprocess(input& dat){ //warning so nobody ever actually constructs one of these //please don't have warnings that always throw in your code ever err("Example_rhs created, mysteriously fails on some architectures seemingly from AVX instructions. Also does nothing useful", "rhs::create", "rhs/rhs.cpp", WARNING); rhs::postprocess(dat);//always postprocess the parent class first //Any class that inherits from rhs, or item_dim, has access to a variable //called dimension, which represents the dimension of the problem at hand //dimension is initialized in the item_dep, which is why the parent postprocessing //must be called first //There are two types of errors, warning and fatal errors. //Warnings print something to the screen to warn the user, //but do not stop the program. A fatal error causes an immediate exit //These are caused by the function err. Details can be found in the documentation // //Lets throw a fatal error if the dimension is less than 10 if(dimension > 10){ err("dimension > 10, which is required for example_rhs", "example_rhs::postprocess", "rhs/example_rhs.cpp", FATAL_ERROR); } //Lets also throw an error if the dimension is equal to 5 if(dimension==5){ err("dimension=5, which gets a warning from example_rhs", "example_rhs::postprocess", "rhs/example_rhs.cpp", WARNING); } //The map contains item*, which point to an item of arbitrary type. //I plan to implement type checking of the dependencies. //But sometime later // //To retrieve a value, you can call the retrieve function of the variable at hand //you just pass the name of parameter that is being retrieved to the map, which returns //an item*. Then this pointer is called to retrieve the value, and is passed the address //of val1 dat.retrieve(val1, "val1", this); dat.retrieve(val2, "val2", this); dat.retrieve(random_info, "random_info", this); //now, we are going to allocate some memory to something //This may be useful for storing temporary calculations during the RHS. //Inheriting from item_dim provides access to a memory pool, memp. //just pass memp.create the dimension of the problem and the //addresses of the pointers and the alignment, allocation, and deallocation is //taken care of! // //memp.create(dimension, &ptr1, &ptr2, &ptr3, etc) //for custom alignment(standard is 32 byte) //memp.create(alignment, dimension, &ptr1, &prt2, etc) // memp.create(32, dimension, &value_holder); for(size_t i = 0; i < dimension; i++){ value_holder[i] = Id*(double)i*val1 + (dimension-i)*val2; } }
void example_integrator_tmpl<T>::postprocess(input& in){ //perform postprocessing of integrator class //note how we skip example_integrator in this chain since example integrator is //only a proxy that performs type erasure integrator::postprocess(in); item* some_class; in.retrieve(some_class, "test_class", this); //this allows us to have a consistent representation in the input file. //If the variable in question is not part of the hardcore numerical analysis code, //it may be better to just use a double and not deal with this in the postprocessing double _rval1 = 0; in.retrieve(_rval1, "rval1", this); rval1=_rval1; //note how we pass a default parameter since rval2 isn't necesarily going to exist in.retrieve(rval2, "rval2", this, 0); in.retrieve(unsigned_var, "unsigned_var", this); in.retrieve(something, "something", this); update(); }
void n_pulse_score::postprocess(input& invals){ objective::postprocess(invals); int _n_pulse = 0; invals.retrieve(_n_pulse, "num_pulses", this); n_pulse = _n_pulse; if(dimension%n_pulse){ err("n_pulse_score requires a dimension divisible by the number of pulses", "bi_pulse_score::postprocess", "objective/bi_pulse_score.cpp", FATAL_ERROR); } nts = dimension/n_pulse; memp.create(nts, &help, &kurtosis_help); }
void jones_optical::postprocess(input& invals){ #ifdef gen_t_dat func_dat=fopen("python/grad_data2.out", "w"); func_score = fopen("python/score_data2.out", "w"); #else func_dat=fopen("python/grad_data.out", "w"); func_score = fopen("python/score_data.out", "w"); #endif stable_spectral_pde_1d_tmpl<comp>::postprocess(invals); if(dimension%2){ err("System jones_optical requires an even dimension", "jones_optical::postprocess", "system/jones_optical.cpp", FATAL_ERROR); } int num_segments; invals.retrieve(num_segments, "num_jones_segments", this); if(num_segments < 0){ err("Number of jones segments must be greater than or equal to zero", "jones_optical::postprocess", "system/jones_optical.cpp", FATAL_ERROR); } invals.retrieve(jones_int_dist, "jones_int_dist", this); if(jones_int_dist<0){ err("The distance between jones segments, jones_int_dist, must be greater than or equal to zero", "jones_optical::postprocess", "system/jones_optical.cpp", FATAL_ERROR); } memp.add(dimension, &nvec1); memp.add(nts, &help, &t, &kurtosis_help, &phold, &nvec2); double dt = 60.0/nts; gaussian_noise(ucur, dimension, 0, 0.2); for(size_t i = 0; i < nts; i++){ t[i] = dt*(i-nts/2.0); } for(size_t i = 0; i < nts; i++){ ucur[i] = ucur[i+nts] = 1.00/cosh(t[i]/2.0); help[i] = _real(ucur[i]); nvec1[i] = ucur[i]; } for(size_t i = 0; i < num_pulses; i++){ fft(nvec1 + i*nts, nvec1 +1*nts, nts); } //generate variables for the jones matrices //create jones matrices std::string name_base = "jones_system_vars"; std::string mat_base = "jones_system_matrices"; for(int i = 0; i < num_segments; i++){ std::vector<std::shared_ptr<variable> > vv(4); for(auto& val : vv){ val = std::make_shared<variable>(); val->setname(get_unique_name(name_base)); val->holder=holder; val->parse("0.1"); #ifdef gen_t_dat val->set(0*2*3.1415*(rand()*1.0/RAND_MAX)); #else val->set(0); #endif invals.insert_item(val); cont->addvar(val); } std::shared_ptr<jones_matrix> m = std::make_shared<jones_matrix>(get_unique_name(mat_base), i, holder); invals.insert_item(m); m->setup(vv); jones_matrices.push_back(m); } }
/*! * This function initializes the internal memory and variables in the initiator class * When called, all parameters returned by dependencies are promised to have been processed * at the appropriate level of detail * \sa item_dim::postprocess */ void integrator::postprocess(input& dat){ item_dim::postprocess(dat); dat.retrieve(rh_val, "rhs", this); }
/*! * This function does the processing for the c_elegans class. * * It initializes the various matrices and reads values from the input files */ void c_elegans::postprocess(input& in){ rhs_type::postprocess(in); if(dimension != num_neur*2){ err("Dimension must be 558, which is double the number of neurons", "", "", FATAL_ERROR); } in.retrieve(beta, "beta", this); in.retrieve(tau, "tau", this); in.retrieve(gelec, "gelec", this); in.retrieve(gchem, "gchem", this); in.retrieve(memV, "memV", this); in.retrieve(memG, "memG", this); in.retrieve(EchemEx, "EchemEx", this); in.retrieve(EchemInh, "EchemInh", this); in.retrieve(ar, "ar", this); in.retrieve(ad, "ad", this); std::string ag_fname, a_fname; in.retrieve(ag_fname, "ag_mat", this); in.retrieve(a_fname, "a_mat", this); sparse_type a_m(num_neur, num_neur); ag_full.resize(num_neur, num_neur); laplacian.resize(num_neur, num_neur); read_mat(ag_fname, ag_full); read_mat(a_fname, a_m); //create transposed sparse matrix AEchem AEchem_trans_full.resize(num_neur, num_neur); AEchem_trans_full = a_m.transpose(); AEchem_trans.resize(num_neur, num_neur); //do any needed fake iterations, must make more general at some point size_t num_comb; int iterations; in.retrieve(num_comb, "num_comb", this); in.retrieve(iterations, "iterations", this); in.retrieve(cur_ind, "!start_ind", this); abl_neur.resize(num_comb); for(auto& val : abl_neur){ val = 0; } if(abl_neur.size() != 1){ next_comb(abl_neur, num_neur); } for(int i = 0; i < cur_ind; i++){ for(int j = 0; j < iterations; j++){ if(next_comb(abl_neur, num_neur)){ char ind_str[20];//won't ever have a 20 digit index //handy buffer to overflow for those hacking this. sprintf(ind_str, "%d", (int)cur_ind); err(std::string("Combinations exhausted in index ") + ind_str, "c_elegans::postprocess","rhs/c_elegans.cpp", FATAL_ERROR); } } } auto dat_inds = std::shared_ptr<writer>(new writer(true)); dat_inds->add_data(data::create("Ablations", abl_neur.data(), abl_neur.size()), writer::OTHER); holder->add_writer(dat_inds); //write first ablation data //set up dummy connection to toroidal controller for now controller* cont; in.retrieve(cont, "controller", this); auto val = std::make_shared<variable>(); val->setname("c_elegans_quickfix"); val->holder = holder; val->parse("0.1"); in.insert_item(val); cont->addvar(val); in.retrieve(dummy, val->name(), this); has_gone=true; //is true at first to allow update of zero index to occur first_round=true; update(); }