Beispiel #1
0
TableFunction *Bucket::FastCondition(const list<int> &ordering, const Assignment &cond) {
    if (functions.size() == 0)
        return new TableFunction();
    Scope newDomain;
    for (unsigned int i = 0; i < functions.size(); ++i) {
        newDomain = newDomain + functions[i]->GetScope();
    }
    newDomain = newDomain - cond;
    newDomain.SetOrdering(ordering);
    unsigned int card = newDomain.GetCard();
    vector<double> newValues(card, 1);
    Assignment a(newDomain);
    a.SetAllVal(0);
    int idx = 0;
    unsigned int ii = cond.GetVal(cond.GetOrdering().back());
    do {
        assert(idx < int(card));
        for (unsigned int i = 0; i < functions.size(); ++i) {
            newValues[idx] *= functions[i]->GetValElim(a, ii);
        }
        idx++;
    } while (a.Iterate());
    assert(newValues.size() == newDomain.GetCard());
    TableFunction *message = new TableFunction(newDomain, newValues);
    return message;
}
Beispiel #2
0
void TableFunction::Maximize(const Scope &maxVars) {
    Scope outScope = domain - maxVars;
    Scope elimVars = domain * maxVars;
    vector<double> newValues;
    Assignment a(domain);
    Assignment outScopeA(outScope);
    Assignment elimVarsA(elimVars);
    outScopeA.SetAllVal(0);
    elimVarsA.SetAllVal(0);

    do {
        a.SetAssign(outScopeA);
        double newVal = DOUBLE_MIN;
        do {
            a.SetAssign(elimVarsA);
            double temp = GetVal(a);
            if (temp > newVal) {
                newVal = temp;
            }
        } while (elimVarsA.Iterate());
        newValues.push_back(newVal);
    } while (outScopeA.Iterate());

    assert(newValues.size() == outScope.GetCard());
    domain = outScope;
    values = newValues;
}
Beispiel #3
0
TableFunction *Bucket::FlattenFast(const list<int> &ordering) {
    if (functions.size() == 0)
        return new TableFunction();
    Scope newDomain;
    for (unsigned int i = 0; i < functions.size(); ++i) {
        newDomain = newDomain + functions[i]->GetScope();
    }
    newDomain.SetOrdering(ordering);
    //unsigned int card = newDomain.GetCard();
    vector<double> newValues;
    Assignment a(newDomain);
    a.SetAllVal(0);
    vector<Assignment> fAssign;
    for (unsigned int i = 0; i < functions.size(); ++i) {
        fAssign.push_back(Assignment(functions[i]->GetScope()));
    }
    int idx = 0;
    do {
        newValues.push_back(1);
        for (unsigned int i = 0; i < functions.size(); ++i) {
            fAssign[i].SetAssign(a);
            newValues.back() *= functions[i]->GetVal(fAssign[i]);
        }
        idx++;
    } while (a.Iterate());
    assert(newValues.size() == newDomain.GetCard());
    TableFunction *message = new TableFunction(newDomain, newValues);
    return message;
}
Beispiel #4
0
TableFunction *Bucket::FastSumElimination(const list<int> &ordering, const Scope &elimVar) {
    if (functions.size() == 0)
        return new TableFunction();
    Scope newDomain;
    for (unsigned int i = 0; i < functions.size(); ++i) {
        newDomain = newDomain + functions[i]->GetScope();
    }
    newDomain = newDomain - elimVar;
    newDomain.SetOrdering(ordering);
    unsigned int card = newDomain.GetCard();
    vector<double> newValues(card, 0);
    Assignment a(newDomain);
    Assignment e(elimVar);
    a.SetAllVal(0);
    e.SetAllVal(0);
    /*
    vector<Assignment> fAssign;
    for (unsigned int i = 0; i < functions.size(); ++i) {
        fAssign.push_back(Assignment(functions[i]->GetScope()));
    }
    */

    int idx = 0;
    do {
        for (unsigned int ii = 0; ii < e.GetCard(); ++ii) {
            double combVal = 1;
            for (unsigned int i = 0; i < functions.size(); ++i) {
                /*
                fAssign[i].SetAssign(a);
                fAssign[i].SetAssign(e);
                */
                combVal *= functions[i]->GetValElim(a, ii);
            }
            newValues[idx] += combVal;
        }
        idx++;
    } while (a.Iterate());
    assert(newValues.size() == newDomain.GetCard());
    TableFunction *message = new TableFunction(newDomain, newValues);
    return message;
}
Beispiel #5
0
// Multiplies this function with another one
void TableFunction::Multiply(const TableFunction &t) {
    Scope newDomain = domain + t.domain;
    vector<double> newValues;
    Assignment a(newDomain);
    a.SetAllVal(0);
    Assignment lhsA(domain);
    Assignment rhsA(t.domain);
    do {
        lhsA.SetAssign(a);
        rhsA.SetAssign(a);
        newValues.push_back(GetVal(lhsA) * t.GetVal(rhsA));
    } while (a.Iterate());
    assert(newValues.size() == newDomain.GetCard());
    domain = newDomain;
    values = newValues;
}
Beispiel #6
0
void TableFunction::Condition(const Assignment &cond) {
    Scope outScope = domain - cond;
    vector<double> newValues;
    Assignment a(domain);
    Assignment outScopeA(outScope);
    outScopeA.SetAllVal(0);

    do {
        a.SetAssign(outScopeA);
        a.SetAssign(cond);
        newValues.push_back(GetVal(a));
    } while (outScopeA.Iterate());

    assert(newValues.size() == outScope.GetCard());
    domain = outScope;
    values = newValues;
}
Beispiel #7
0
// Specify the variables to eliminate
void TableFunction::Marginalize(const Scope &margVars) {
    Scope outScope = domain - margVars;
    Scope elimVars = domain * margVars;
    vector<double> newValues;
    Assignment a(domain);
    Assignment outScopeA(outScope);
    Assignment elimVarsA(elimVars);
    outScopeA.SetAllVal(0);
    elimVarsA.SetAllVal(0);

    do {
        a.SetAssign(outScopeA);
        double newVal = 0;
        do {
            a.SetAssign(elimVarsA);
            newVal += GetVal(a);
        } while (elimVarsA.Iterate());
        newValues.push_back(newVal);
    } while (outScopeA.Iterate());

    assert(newValues.size() == outScope.GetCard());
    domain = outScope;
    values = newValues;
}