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;
    }
}
Beispiel #2
0
void SubSystem::initialize(VEC_pD &params, 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
    }
}