#include "dynadag/DynaDAG.h"
#include "common/weightedMedian.h"
namespace DynaDAG {
void autoMVal(DDModel::Node *n, UpDown dir) {
doubV vec;
DDModel::Node *n2;
n2 = n;
if(dir==UP)
for(DDModel::inedge_iter ei = n->ins().begin(); ei!=n->ins().end(); ++ei)
vec.push_back(DDd((*ei)->tail).order);
else
for(DDModel::outedge_iter ei = n->outs().begin(); ei!=n->outs().end(); ++ei)
vec.push_back(DDd((*ei)->head).order);
if(!vec.size())
DDd(n).med[dir].exists = false;
else {
DDd(n).med[dir].exists = true;
DDd(n).med[dir].val = weightedMedian(vec);
}
DDd(n).med[dir].cached = true;
}
void InvalidateMVal(DDModel::Node *n, UpDown dir) {
DDd(n).med[dir].cached = false;
}
bool MValExists(DDModel::Node *n, UpDown dir) {
DDNode &ddn = DDd(n);
if(!ddn.med[dir].cached)
autoMVal(n,dir);
return ddn.med[dir].exists;
}
double MVal(DDModel::Node *n, UpDown dir) {
DDNode &ddn = DDd(n);
if(!ddn.med[dir].cached)
autoMVal(n,dir);
return ddn.med[dir].val;
}
void SetMVal(DDModel::Node *n, double val, UpDown dir) {
DDNode &ddn = DDd(n);
ddn.med[dir].exists = true;
ddn.med[dir].cached = true;
ddn.med[dir].val = val;
}
void InvalidateAdjMVals(DDModel::Node *n) {
for(DDModel::inedge_iter ini = n->ins().begin(); ini!=n->ins().end(); ++ini)
InvalidateMVal((*ini)->tail,DOWN);
for(DDModel::outedge_iter outi = n->outs().begin(); outi!=n->outs().end(); ++outi)
InvalidateMVal((*outi)->head,UP);
}
}