void SiftMatrix::checkWithConfig() { for(Data::iterator li = data.begin(); li!=data.end(); ++li) { Layer &l = li->second; for(unsigned o = 0; o<l.size(); o++) for(unsigned o2 = 0; o2<l.size(); ++o2) { DDModel::Node *u = config.ranking.GetRank(li->first)->order[o], *v = config.ranking.GetRank(li->first)->order[o2]; dgassert(getCrossings(u,v,false)==weigh(uvcross(u,v,true,false))); dgassert(getCrossings(u,v,true)==weigh(uvcross(u,v,false,true))); } } }
void SiftMatrix::recompute() { for(Config::Ranks::iterator ri = config.ranking.begin(); ri!=config.ranking.end(); ++ri) { Rank *rank = *ri; unsigned r = config.ranking.IndexOfIter(ri); unsigned wid = rank->order.size(); Layer &l = data[r]; l.resize(wid); for(unsigned o = 0; o<wid; ++o) { l[o].resize(wid); for(unsigned o2 = 0; o2<wid; ++o2) { CrossCount cr = make_pair(weigh(uvcross(rank->order[o],rank->order[o2],true,false)), weigh(uvcross(rank->order[o],rank->order[o2],false,true))); dgassert(cr.first>=0); dgassert(cr.second>=0); l[o][o2] = cr; } } } }
Crossings calculateCrossings(Config &config) { Crossings cc; for(Config::Ranks::iterator ri = config.ranking.begin(); ri!=config.ranking.end(); ++ri) { Rank *r = *ri; for(NodeV::iterator ni1 = r->order.begin(); ni1!=r->order.end(); ++ni1) for(NodeV::iterator ni2 = ni1+1; ni2!=r->order.end(); ++ni2) cc += uvcross(*ni1,*ni2,false,true); } return cc; }