void Constraint::redirectParams(MAP_pD_pD redirectionmap) { int i=0; for (VEC_pD::iterator param=origpvec.begin(); param != origpvec.end(); ++param, i++) { MAP_pD_pD::const_iterator it = redirectionmap.find(*param); if (it != redirectionmap.end()) pvec[i] = it->second; } }
void SubSystem::initialize(VEC_pD ¶ms, MAP_pD_pD &reductionmap) { csize = static_cast<int>(clist.size()); // tmpplist will contain the subset of parameters from params that are // relevant for the constraints listed in clist VEC_pD tmpplist; { SET_pD s1(params.begin(), params.end()); SET_pD s2; for (std::vector<Constraint *>::iterator constr=clist.begin(); constr != clist.end(); ++constr) { (*constr)->revertParams(); // ensure that the constraint points to the original parameters VEC_pD constr_params = (*constr)->params(); s2.insert(constr_params.begin(), constr_params.end()); } std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::back_inserter(tmpplist) ); } plist.clear(); MAP_pD_I rindex; if (reductionmap.size() > 0) { int i=0; MAP_pD_I pindex; for (VEC_pD::const_iterator itt=tmpplist.begin(); itt != tmpplist.end(); ++itt) { MAP_pD_pD::const_iterator itr = reductionmap.find(*itt); if (itr != reductionmap.end()) { MAP_pD_I::const_iterator itp = pindex.find(itr->second); if (itp == pindex.end()) { // the reduction target is not in plist yet, so add it now plist.push_back(itr->second); rindex[itr->first] = i; pindex[itr->second] = i; i++; } else // the reduction target is already in plist, just inform rindex rindex[itr->first] = itp->second; } else if (pindex.find(*itt) == pindex.end()) { // not in plist yet, so add it now plist.push_back(*itt); pindex[*itt] = i; i++; } } } else plist = tmpplist; psize = static_cast<int>(plist.size()); pvals.resize(psize); pmap.clear(); for (int j=0; j < psize; j++) { pmap[plist[j]] = &pvals[j]; pvals[j] = *plist[j]; } for (MAP_pD_I::const_iterator itr=rindex.begin(); itr != rindex.end(); ++itr) pmap[itr->first] = &pvals[itr->second]; c2p.clear(); p2c.clear(); for (std::vector<Constraint *>::iterator constr=clist.begin(); constr != clist.end(); ++constr) { (*constr)->revertParams(); // ensure that the constraint points to the original parameters VEC_pD constr_params_orig = (*constr)->params(); SET_pD constr_params; for (VEC_pD::const_iterator p=constr_params_orig.begin(); p != constr_params_orig.end(); ++p) { MAP_pD_pD::const_iterator pmapfind = pmap.find(*p); if (pmapfind != pmap.end()) constr_params.insert(pmapfind->second); } for (SET_pD::const_iterator p=constr_params.begin(); p != constr_params.end(); ++p) { // jacobi.set(*constr, *p, 0.); c2p[*constr].push_back(*p); p2c[*p].push_back(*constr); } // (*constr)->redirectParams(pmap); // redirect parameters to pvec } }