25 #include <eigen3/Eigen/Core>
29 bool next_comb(std::vector<size_t>& inval,
size_t max_num){
32 typedef std::vector<size_t>::iterator iter_t;
33 typedef std::vector<size_t>::const_iterator c_iter_t;
34 static bool do_next(iter_t cur, c_iter_t end,
size_t max_num){
44 if((*cur) >= max_num){
59 if(do_next(temp, end, max_num)){
66 return comb_helper::do_next(inval.begin(), inval.end(), max_num);
75 double* restr dv = dx;
76 double* restr ds = dv+
dim_v;
77 double* restr s = v+
dim_v;
79 Map<Array<double, dim_v, 1>> vmap(v);
80 Map<Array<double, dim_v, 1>> dvmap(dv);
81 Map<Array<double, dim_v, 1>> smap(s);
82 Map<Array<double, dim_v, 1>> dsmap(ds);
85 dsmap =
ar*(
sig * (1.0-smap)) -
ad*smap;
103 dv[276]+= (1.0/
tau)*amp;
104 dv[278]+= (1.0/
tau)*amp;
133 in_f.open(fname.c_str());
134 std::vector<Eigen::Triplet<double, int> > intr;
138 in_f >> row >> col >> val;
139 intr.push_back(Triplet<double, int>(row-1, col-1, val));
141 in_mat.setFromTriplets(intr.begin(), intr.end());
151 err(
"Dimension must be 558, which is double the number of neurons",
165 in.
retrieve(ag_fname,
"ag_mat",
this);
166 in.
retrieve(a_fname,
"a_mat",
this);
179 in.
retrieve(num_comb,
"num_comb",
this);
180 in.
retrieve(iterations,
"iterations",
this);
186 if(abl_neur.size() != 1){
189 for(
int i = 0; i <
cur_ind; i++){
190 for(
int j = 0; j < iterations; j++){
194 sprintf(ind_str,
"%d", (
int)cur_ind);
196 "c_elegans::postprocess",
"rhs/c_elegans.cpp",
FATAL_ERROR);
210 std::shared_ptr<writer>(
new writer(
true));
218 in.
retrieve(cont,
"controller",
this);
219 auto val = std::make_shared<variable>();
220 val->setname(
"c_elegans_quickfix");
238 sprintf(ind_str,
"%d",
cur_ind);
240 "c_elegans::update",
"rhs/c_elegans.cpp",
FATAL_ERROR);
243 std::shared_ptr<writer>(
new writer(
true));
257 auto fncval = [
this](
int i,
int j,
double val)->
bool{
258 for(
int kk = 0; kk < (int)this->
abl_neur.size(); kk++){
267 ag_dense = ag_m * Matrix<double, num_neur, num_neur>::Identity();
268 auto sumvals = ag_dense.colwise().sum();
271 std::vector<Triplet<double, int> > temp_tr;
272 for(
int i = 0; i < (int)
num_neur; i++){
273 temp_tr.push_back(Triplet<double, int>(i, i, sumvals[i]));
275 temp.setFromTriplets(temp_tr.begin(), temp_tr.end());
278 for(
size_t i = 0; i <
num_neur; i++){
287 for(
size_t i = 0; i <
num_neur; i++){
293 Matrix<double, Dynamic, Dynamic> ldense(num_neur,num_neur);
294 ldense =
laplacian*Matrix<double, num_neur, num_neur>::Identity();
295 Matrix<double, Dynamic, Dynamic> aedense(num_neur, num_neur);
296 aedense=
AEchem_trans*Matrix<double, num_neur, num_neur>::Identity();
297 Matrix<double, Dynamic, Dynamic> C(num_neur, num_neur);
299 C=
memG*Matrix<double, num_neur, num_neur>::Identity() +
gelec*ldense;
301 Matrix<double, num_neur, 1> tmp =(
gchem * aedense *
eqS.matrix());
302 for(
size_t i = 0; i <
num_neur; i++){
305 Matrix<double, num_neur, 1> Ivals;
310 Matrix<double, num_neur, 1> b;
313 for(
size_t i = 0; i <
num_neur; i++){
317 eqV.matrix() = C.inverse()*b;
326 std::string deps[] = {
"beta",
"memV",
"memG",
"gchem",
"gelec",
"num_comb",
327 "tau",
"EchemEx",
"EchemInh",
"ar",
"ad",
"ag_mat",
"a_mat",
"iterations",
329 return make_append(deps, rhs_type::dependencies());
337 for(
size_t i = 0; i <
num_neur; i++){