void SplitLP::minimiseInput(stomap* conv, strvec& txs){ strvec externals = getExternals(); stomap obj; int nblock = 0; stomap::iterator cend = conv->end(); for (strvec::iterator it = externals.begin(); it != externals.end(); ++it){ string tx = getTransporterName(*it, 1); if (tx.size() > 0){ stomap::iterator ct = conv->find(*it); if (ct != cend && ct->second < 0){ obj[tx] = 1; } else{ block(tx, true); nblock++; } } } setObjective(&obj); Solve(true); conv->clear(); getConversion(conv); cleanTmpRows(nblock); }
strvec MtxLP::getTransporters()const{ strvec rv; strvec ext = getExternals(); for (strvec::iterator it = ext.begin(); it != ext.end(); ++it){ stomap *sto = getRowSto(*it); string tx = sto->begin()->first; rv.push_back(tx); delete sto; } return rv; }
strvec MtxLP::getImporters()const{ strvec rv; strvec ext = getExternals(); for (strvec::iterator it = ext.begin(); it != ext.end(); ++it){ stomap *sto = getRowSto(*it); for (stomap::iterator jt = sto->begin(); jt != sto->end(); ++jt) if (jt->second < 0) rv.push_back(jt->first); delete sto; } return rv; }
void SplitLP::minExchangeSets(solvec& solutions, stomap* obj, int dir, long nmax){ strvec externals = getExternals(); strvec txs(externals.size());// - obj->size()); strvec::iterator ti = txs.begin(); stomap::iterator oend = obj->end(); for (strvec::iterator it = externals.begin(); it != externals.end(); ++it){ string xname = *it; string txname = getTransporterName(xname, dir); stomap::iterator jt = obj->find(xname); if (jt != oend){ double coef = jt->second; coef /= this->vmax; fix(txname, coef, true, txname + "_mxs"); } else if (dir > 0){ fix(txname, 0, true); } *ti++ = get_opp_name(txname); } setObjDir(false); setLenObjective(txs, true); strvec itxs = get_int_names(txs); long i = 0; while(i < nmax){ stomap conv; stomap sol; Solve(true); getConversion(&conv); if (!isSolved()) break; getSolution(&sol, itxs, INT, false); if (!conv.empty()){ i++; if (dir < 0){ minimiseInput(&conv, txs); setLenObjective(txs, true); } solutions.push_back(conv); } if (i < nmax) cutSolution(&sol, true); } // cleanTmpRows(); }
void SplitLP::getConversion(stomap* comp, bool withzeroes) const{ strvec externals = getExternals(); for (strvec::iterator xi = externals.begin(); xi != externals.end(); ++xi){ string xname = *xi; stomap *rsto = getRowSto(xname); string txname = rsto->begin()->first; //getTransporterName(rsto, dir); string txopp = get_opp_name(txname); if(!is_pos(txname)){ string mid = txname; txname = txopp; txopp = mid; } double coef = (*rsto)[txname]; double flux = getColValue(txname) - getColValue(txopp); double conv = coef * flux * vmax; if (withzeroes || !is_zero(conv)) (*comp)[xname] = conv; delete rsto; } }
int init_module() { int res; if(!getExternals()) { printk(KERN_INFO "timerfd-lethe failed to find necessary external symbols"); return -EINVAL; } res = register_chrdev(TIMERFD_LETHE_MAJOR, "timerfd-lethe", &timerfd_fops); if(res < 0) { printk(KERN_INFO "Failed to register device number"); return res; } printk(KERN_INFO "Successfully installed timerfd-lethe module"); return 0; }