/** Sets up the species and the source compartment. We use the pre-defined drift-diffusion method gpgmp::DT_ORNSTEIN_UHLENBECK and set the kernel parameters accordingly. \see setComputeDriftDiffusivityMethod \see setParameter */ OrnsteinUhlenbeckProblem::OrnsteinUhlenbeckProblem(Real length, int dx, int dy, Real diffusivityX, Real diffusivityY, Real gxx, Real gxy, Real gyx, Real gyy, int numMolecules) : DiffusionModel(length, dx, dy) { // one species Species *speciesA = addSpecies("A", 1.); // set boundary mask const cl_int4 boundaryMask = {{1, 1, 1, 1}}; const cl_int4 sourceMask = {{0, 0, 0, 0}}; setBoundaryMasks(boundaryMask, sourceMask); // add source compartment Compartment *compartmentSource = new Compartment("TrueSource", dx/4,dy/4, dx/4, dy/4); compartmentSource->setInitialAmount(speciesA, numMolecules, gpgmp::HomogeneousDistribution); addCompartment(compartmentSource); // add user parameters for kernel setParameter("diffX", diffusivityX); setParameter("diffY", diffusivityY); setParameter("gammaXX", gxx); setParameter("gammaXY", gxy); setParameter("gammaYX", gyx); setParameter("gammaYY", gyy); // set OU method setComputeDriftDiffusivityMethod(gpgmp::DT_ORNSTEIN_UHLENBECK); }
bool CModelExpansion::SetOfModelElements::addObject(const CCopasiObject* x) { if (dynamic_cast<const CCompartment*>(x)) { addCompartment(dynamic_cast<const CCompartment*>(x)); return true; } if (dynamic_cast<const CMetab*>(x)) { addMetab(dynamic_cast<const CMetab*>(x)); return true; } if (dynamic_cast<const CReaction*>(x)) { addReaction(dynamic_cast<const CReaction*>(x)); return true; } if (dynamic_cast<const CModelValue*>(x)) { addGlobalQuantity(dynamic_cast<const CModelValue*>(x)); return true; } if (dynamic_cast<const CEvent*>(x)) { addEvent(dynamic_cast<const CEvent*>(x)); return true; } return false; }
void CModelExpansion::SetOfModelElements::fillComplete(const CModel* pModel) { if (!pModel) return; size_t i; for (i = 0; i < pModel->getCompartments().size(); ++i) addCompartment(pModel->getCompartments()[i]); for (i = 0; i < pModel->getMetabolites().size(); ++i) addMetab(pModel->getMetabolites()[i]); for (i = 0; i < pModel->getReactions().size(); ++i) addReaction(pModel->getReactions()[i]); for (i = 0; i < pModel->getModelValues().size(); ++i) addGlobalQuantity(pModel->getModelValues()[i]); for (i = 0; i < pModel->getEvents().size(); ++i) addEvent(pModel->getEvents()[i]); }
// FIXME: check for memory leaks JSONcontext* Network::readJSON(const char* file){ JsonParser *parser; JsonObject *obj; JsonArray *jnodes; JsonArray *jedges; int i,k; JSONcontext* ctx=new JSONcontext(); GError *error; g_type_init (); parser = json_parser_new (); error = NULL; json_parser_load_from_file (parser, file, &error); if (error) { g_print ("Unable to parse `%s': %s\n", file, error->message); g_error_free (error); g_object_unref (parser); abort(); } addCompartment(0,"unknown"); // add dummy compartment, may be overwritten by compartment from json ctx->root = json_node_copy(json_parser_get_root(parser)); // needs to be copied ?? obj=json_node_get_object (ctx->root); jnodes=json_object_get_array_member(obj,"nodes"); jedges=json_object_get_array_member(obj,"edges"); g_print ("%i nodes\n",json_array_get_length(jnodes)); for (i=0;i<json_array_get_length(jnodes);i++){ JsonObject *n=json_array_get_object_element(jnodes,i); JsonObject *data=json_object_get_object_member(n,"data"); const char* type=json_object_get_string_member(n,"type"); const char* id=json_object_get_string_member(n,"id"); if (json_object_has_member(n,"is_abstract") && (json_object_get_boolean_member(n,"is_abstract") || json_object_get_int_member(n,"is_abstract"))){ continue; } if (!json_object_has_member(n,"index")){ g_print ("no index defined for %s %s\n",type,id); abort(); } int idx=json_object_get_int_member(n,"index"); g_print ("node %d %s id %s\n",idx,type,id); if(strcmp(type,"Compartment")==0){ addCompartment(idx,id); } else { double x=json_object_get_double_member(data,"x"); double y=json_object_get_double_member(data,"y"); double w=json_object_get_double_member(data,"width"); double h=json_object_get_double_member(data,"height"); double d=json_object_get_double_member(data,"dir"); int c=json_object_get_int_member(data,"compartmentidx"); for(k=0;k<7;k++){ if(strcmp(jnodetypes[k],type)==0)break; } if (k==7){ g_print ("unknown node type %s\n",type); abort(); } addNode(idx,inodetypes[k],id,w,h,x,y,d,c); if (idx>=ctx->nodeidx->size()) ctx->nodeidx->resize(idx+1); (*(ctx->nodeidx))[idx]=i; } } g_print ("%i edges\n",json_array_get_length(jedges)); for (i=0;i<json_array_get_length(jedges);i++){ JsonObject *e=json_array_get_object_element(jedges,i); const char* type=json_object_get_string_member(e,"type"); if ((!json_object_has_member(e,"sourceidx")) || (!json_object_has_member(e,"targetidx"))){ g_print ("no source/targetindex defined for edge %s %i",type,i); abort; } for(k=0;k<7;k++){ if(strcmp(edgetypes[k],type)==0)break; } int from=json_object_get_int_member(e,"sourceidx"); int to=json_object_get_int_member(e,"targetidx"); addEdge(from,to,(Edgetype)k); g_print ("edge %s %i -> %i\n",edgetypes[k],from,to); } g_object_unref(parser); return ctx; }
void Network::read(const char* file){ try { int numc,ci,i,n,m,p,q,k,_index; int ret; Nodetype _type; char s[100],t[100]; float _x,_y, _width, _height,_dir; FILE* old_stdin=stdin; printf("importing network\n"); if (file) freopen(file,"r",stdin); ret=1; while (ret>0){ret=scanf(" #%[^\n]",s);}; // remove comment lines if (ret<0) throw "error reading input"; MSCANF(" %d\n",&numc); // num compartments if (numc>2000){ fprintf(stderr,"too many compartments %d",numc); abort(); } printf("number of compartments: %d\n",numc); for(i=0;i<numc;i++){ MSCANF2(" %d %s\n",&_index,t); if (_index>numc+1){ // not starting at zero fprintf(stderr,"compartment index out of bound %d",_index); abort(); } addCompartment(_index,t); } addCompartment(0,"unknown"); numc++; MSCANF(" %s\n",s); // "///" MSCANF(" %d",&n); //number of nodes printf("number of nodes: %d\n",n); if (n>10000){ fprintf(stderr,"too many nodes %d",n); abort(); } for(i=0;i<n;i++){ MSCANF(" %d\n",&_index); if (_index>=n){ fprintf(stderr,"node index out of bound %d",_index); abort(); } MSCANF(" %s\n",t); if(strcmp(t,"Compound")==0)_type=compound; else if(strcmp(t,"Reaction")==0)_type=reaction; else if(strcmp(t,"Other")==0)_type=other; else _type=none; MSCANF("%s\n",s); MSCANF("%d\n",&ci); MSCANF2("%f%f",& _x,& _y); MSCANF3("%f%f%f",& _width,& _height,& _dir); addNode(_index, _type, s, _width, _height, _x, _y, _dir,ci); printf("added %s %s %i\n",t,s,_index); } MSCANF(" %s\n",s); // "///" MSCANF(" %d\n",&m); // numer of edges printf("number of edges: %d\n",m); if (m>40000){ fprintf(stderr,"too many edges %d",m); abort(); } fflush(stdout); for(i=0;i<m;i++){ MSCANF3("%s %d %d\n",s,&p,&q); if (p>=n){ fprintf(stderr,"edge node index out of bound %d",p); abort(); } if (q>=n){ fprintf(stderr,"edge node index out of bound %d",q); abort(); } for(k=0;k<7;k++){ if(strcmp(edgetypes[k],s)==0)break; } addEdge(p,q,(Edgetype)k); } } catch (char* err){ cout << err <<endl; abort(); } }
void CModelExpansion::SetOfModelElements::fillDependencies(const CModel* pModel) { if (!pModel) return; //create a combined set of all elements we know are to be copied std::set< const CCopasiObject * > combinedSet; std::set<const CCompartment*>::const_iterator itComp; for (itComp = mCompartments.begin(); itComp != mCompartments.end(); ++itComp) { std::set< const CCopasiObject * > tmp = (*itComp)->getDeletedObjects(); combinedSet.insert(tmp.begin(), tmp.end()); } std::set<const CMetab*>::const_iterator itMetab; for (itMetab = mMetabs.begin(); itMetab != mMetabs.end(); ++itMetab) { std::set< const CCopasiObject * > tmp = (*itMetab)->getDeletedObjects(); combinedSet.insert(tmp.begin(), tmp.end()); } std::set<const CReaction*>::const_iterator itReac; for (itReac = mReactions.begin(); itReac != mReactions.end(); ++itReac) { std::set< const CCopasiObject * > tmp = (*itReac)->getDeletedObjects(); combinedSet.insert(tmp.begin(), tmp.end()); } std::set<const CModelValue*>::const_iterator itQuant; for (itQuant = mGlobalQuantities.begin(); itQuant != mGlobalQuantities.end(); ++itQuant) { std::set< const CCopasiObject * > tmp = (*itQuant)->getDeletedObjects(); combinedSet.insert(tmp.begin(), tmp.end()); } /* Events do not contain any relevant objects. std::set<const CEvent*>::const_iterator itEvent; for (itEvent = mEvents.begin(); itEvent != mEvents.end(); ++itEvent) { std::set< const CCopasiObject * > tmp = (*itEvent)->getDeletedObjects(); combinedSet.insert(tmp.begin(), tmp.end()); } */ //ask the model for the dependencies std::set< const CCopasiObject * > reacs, metabs, comps, values, events; pModel->appendDependentModelObjects(combinedSet, reacs, metabs, comps, values, events); //incorporate the results into the local sets std::set< const CCopasiObject * >::const_iterator it; for (it = reacs.begin(); it != reacs.end(); ++it) addReaction(dynamic_cast<const CReaction*>(*it)); for (it = metabs.begin(); it != metabs.end(); ++it) addMetab(dynamic_cast<const CMetab*>(*it)); for (it = comps.begin(); it != comps.end(); ++it) addCompartment(dynamic_cast<const CCompartment*>(*it)); for (it = values.begin(); it != values.end(); ++it) addGlobalQuantity(dynamic_cast<const CModelValue*>(*it)); for (it = events.begin(); it != events.end(); ++it) addEvent(dynamic_cast<const CEvent*>(*it)); }