void SetProbabilities(DSL_network* Network, char* NodeName, double Probabilities[], int OutcomeNumber) { int Node=Network->FindNode(NodeName); DSL_doubleArray NodeProbabilities; NodeProbabilities.SetSize(OutcomeNumber); // it has to be an array for (int i=0; i<OutcomeNumber; i++) { NodeProbabilities[i] = Probabilities[i];} Network->GetNode(Node)->Definition()->SetDefinition(NodeProbabilities); };
void AddNode(DSL_network* Network, char* NodeName, char* Outcomes[], double Probabilities[], int OutcomeNumber) { int NewNode = Network->AddNode(DSL_CPT,NodeName); DSL_idArray NodeOutcomes; for (int i=0; i<OutcomeNumber; i++) { NodeOutcomes.Add(Outcomes[i]); } Network->GetNode(NewNode)->Definition()->SetNumberOfOutcomes(NodeOutcomes); NodeOutcomes.Flush(); DSL_doubleArray NodeProbabilities; NodeProbabilities.SetSize(OutcomeNumber); // it has to be an array for (int i=0; i<OutcomeNumber; i++) { NodeProbabilities[i] = Probabilities[i]; } Network->GetNode(NewNode)->Definition()->SetDefinition(NodeProbabilities); };
void fillCPTWithOR(vf2D &noisyORParameters) { probsSize = childDimension * sumParentDimensions + childDimension; //childDimension[rows] * sumParentDimensions[cols] + leak_column theProbs.SetSize(probsSize); int probsIdx = 0; //index of cpt vector int paramsRowIdx = 0; //index of minimal_parameter array int paramsColIdx = 0; //index of minimal_parameter array for (int parentIdx = 0; parentIdx < numberOfParents; ++parentIdx) { // for each column for(int parentStateIdx = 0; parentStateIdx < parentDimensions[parentIdx] ; ++parentStateIdx) { //for each subset of columns double sumColumn = 0.0; for(int childStateIdx = 0; childStateIdx < childDimension; ++childStateIdx) { //for each row //if (parentStateIdx == distinguishedStates[parentIdx]) { //if it's the distinguished state if (parentStateIdx == parentDimensions[parentIdx] - 1) { //if it's the distinguished state if (childStateIdx == childDimension - 1) { // if it's both distinguished for child and parent theProbs[probsIdx++] = 1; } else { sumColumn += theProbs[probsIdx++] = 0; } } else { if (childStateIdx == childDimension - 1) { // if it's the child's distinguished state theProbs[probsIdx++] = 1.0 - sumColumn; } else { // standard parameter sumColumn += theProbs[probsIdx++] = noisyORParameters[paramsRowIdx][paramsColIdx]; ++paramsRowIdx; if (paramsRowIdx == (childDimension - 1)) { ++paramsColIdx; paramsRowIdx = 0; } } } } } } double sumColumn = 0.0; for (int c_idx = 0; c_idx < childDimension; ++c_idx) { // LEAK parameters if (c_idx == childDimension - 1) { theProbs[probsIdx++] = 1.0 - sumColumn; } else { sumColumn += theProbs[probsIdx++] = noisyORParameters[paramsRowIdx][paramsColIdx]; ++paramsRowIdx; if (paramsRowIdx == (childDimension - 1)) { ++paramsColIdx; paramsRowIdx = 0; } } } childNode->Definition()->SetDefinition(theProbs); childNode->Definition()->GetMatrix()->Normalize(); }