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();
    }