Beispiel #1
0
CGraph* CreateGraphWithPyramidSpecific(int& num_nodes, int num_indep_nodes, 
                                       int num_layers)
{
    PNL_CHECK_LEFT_BORDER( num_indep_nodes, 1 );
    PNL_CHECK_LEFT_BORDER( num_layers, 1 );

    int i, j, k;
    
    CGraph *pGraph = CGraph::Create(0, NULL, NULL, NULL);
    PNL_CHECK_IF_MEMORY_ALLOCATED( pGraph );
    
    srand((unsigned int)time(NULL));

    num_nodes = num_indep_nodes;
	int num_nodes_into_curr_layer = num_indep_nodes;
	for (i = 0; i < num_layers - 1; i++)
	{
		num_nodes += num_nodes_into_curr_layer * 2 + 1;
		num_nodes_into_curr_layer = num_nodes_into_curr_layer * 2 + 1;
	}

	pGraph->AddNodes(num_nodes);
    
    int StartParent = 0,
        EndParent = num_indep_nodes - 1,
        StartCurrLayer,
        EndCurrLayer;
    int Child1,
        Child2,
        Child3;
    int NumParents;

    for (int layer = 0; layer < num_layers - 1; layer++ )
    {
        StartCurrLayer = EndParent + 1;
        EndCurrLayer = StartCurrLayer + 2 * (EndParent - StartParent + 1);
        NumParents = 0;

        for (j = StartParent; j <= EndParent; j++ )
        {
            Child1 = EndParent + NumParents * 2 + 1;
            Child2 = EndParent + NumParents * 2 + 2;
            Child3 = EndParent + NumParents * 2 + 3;

            pGraph->AddEdge(j, Child1, 1);
            pGraph->AddEdge(j, Child2, 1);
            pGraph->AddEdge(j, Child3, 1);

            NumParents++;
        }
        StartParent = StartCurrLayer;
        EndParent = EndCurrLayer;
    }    

    return pGraph;
}
Beispiel #2
0
CGraph* CreateGraphWithRegularGridSpecific(int& num_nodes, int width, 
    int height, int num_layers)
{
    PNL_CHECK_LEFT_BORDER( width, 2 );
    PNL_CHECK_LEFT_BORDER( height, 2 );
    PNL_CHECK_LEFT_BORDER( num_layers, 1 );

    int i, j, k;

    CGraph *pGraph = CGraph::Create(0, NULL, NULL, NULL);
    PNL_CHECK_IF_MEMORY_ALLOCATED( pGraph );

    srand((unsigned int)time(NULL));

    int num_nodes_one_layer = width * height;
    num_nodes = num_nodes_one_layer * num_layers;
    pGraph->AddNodes(num_nodes);
    
    for (i = 0; i < num_layers; i++)
    {
        for (j = 1; j < width; j++)
            pGraph->AddEdge(
                i * num_nodes_one_layer + j - 1,
                i * num_nodes_one_layer + j, 1);
        for (k = 1; k < height; k++)
            pGraph->AddEdge(
                i * num_nodes_one_layer + (k - 1) * width,
                i * num_nodes_one_layer + k * width, 1);

        for (j = 1; j < width; j++)
            for (k = 1; k < height; k++)
            {
                pGraph->AddEdge(
                    i * num_nodes_one_layer + (k - 1) * width + j, 
                    i * num_nodes_one_layer + k * width + j, 1);
                pGraph->AddEdge(
                    i * num_nodes_one_layer + k * width + j - 1,
                    i * num_nodes_one_layer + k * width + j, 1);
            }

        if (i)
        {
            for (j = 0; j < width; j++)
                for (k = 0; k < height; k++)
                    pGraph->AddEdge(
                        (i - 1) * num_nodes_one_layer + k * width + j,
                        i * num_nodes_one_layer + k * width + j, 1);
        }
    }
    
    return pGraph;
}
Beispiel #3
0
CGraph* CreateCompleteGraph(int num_nodes)
{
    PNL_CHECK_LEFT_BORDER( num_nodes, 1 );

    int i, j, k;
    
    CGraph *pGraph = CGraph::Create(0, NULL, NULL, NULL);
    PNL_CHECK_IF_MEMORY_ALLOCATED( pGraph );
    
    srand((unsigned int)time(NULL));

    pGraph->AddNodes(num_nodes);
    
    for (j = 1; j < num_nodes; j++ )
        for (i = 0; i < j; i++ )
            pGraph->AddEdge(i, j, 1);

    return pGraph;
}
Beispiel #4
0
CGraph* CreateRandomGraphWithToyQMRSpecific(int num_nodes, 
    int num_indep_nodes, int max_size_family)
{
    PNL_CHECK_LEFT_BORDER( num_nodes, 10 );
    PNL_CHECK_RANGES( num_indep_nodes, 1, num_nodes-1 );
    PNL_CHECK_RANGES( max_size_family, 2, num_nodes );
    
    int i, j, k;
    
    CGraph *pGraph = CGraph::Create(0, NULL, NULL, NULL);
    PNL_CHECK_IF_MEMORY_ALLOCATED( pGraph );
    
    srand((unsigned int)time(NULL));

    pGraph->AddNodes(num_nodes);
    
    int num_parents;
    int ind_parent;
    intVector prev_nodes(0);
    for ( i = num_indep_nodes; i < num_nodes; i++)
    {
        prev_nodes.resize(0);
        for ( j = 0; j < num_indep_nodes; j++) 
            prev_nodes.push_back(j);

        num_parents = rand() % (max_size_family - 1);
        num_parents += 1;
        num_parents = (num_parents > i) ? i : num_parents;
    
        for ( j = 0; j < num_parents; j++)
        {
            ind_parent = rand() % prev_nodes.size();
            pGraph->AddEdge(prev_nodes[ind_parent], i, 1);
            prev_nodes.erase(prev_nodes.begin() + ind_parent);
        }
    }

    return pGraph;
}
Beispiel #5
0
CGraph* CreateRandomAndSpecificForIDNetGraph(int num_nodes,
  int num_indep_nodes, int max_size_family)
{
  PNL_CHECK_LEFT_BORDER(num_nodes, 10);
  PNL_CHECK_RANGES(num_indep_nodes, 1, num_nodes-1);
  PNL_CHECK_RANGES(max_size_family, 2, num_nodes);
  
  int i, j, k;
  
  CGraph *pGraph = CGraph::Create(0, NULL, NULL, NULL);
  PNL_CHECK_IF_MEMORY_ALLOCATED(pGraph);
  
  srand((unsigned int)time(NULL));
  
  pGraph->AddNodes(num_nodes);
  
  int num_parents;
  int ind_parent;
  intVector prev_nodes(0);
  for (i = num_indep_nodes; i < num_nodes; i++)
  {
    prev_nodes.resize(0);
    for (j = 0; j < i; j++)
      prev_nodes.push_back(j);
    
    num_parents = rand() % (max_size_family - 1);
    num_parents += 1;
    num_parents = (num_parents > i) ? i : num_parents;
    
    for (j = 0; j < num_parents; j++)
    {
      ind_parent = rand() % prev_nodes.size();
      pGraph->AddEdge(prev_nodes[ind_parent], i, 1);
      prev_nodes.erase(prev_nodes.begin() + ind_parent);
    }
  }
  
  intVector parents(0);
  intVector childs(0);
  for (i = 0; i < num_nodes; i++)
  {
    if (pGraph->GetNumberOfChildren(i) == 0)
    {
      pGraph->GetParents(i, &parents);
      for (j = 0; j < parents.size(); j++)
      {
        pGraph->GetChildren(parents[j], &childs);
        for (k = 0; k < childs.size(); k++)
          if ((childs[k] != i) && 
            (pGraph->GetNumberOfChildren(childs[k]) == 0) &&
            (pGraph->GetNumberOfParents(childs[k]) == 1))
          {
            if (i < childs[k])
            {
              pGraph->RemoveEdge(parents[j], childs[k]);
              pGraph->AddEdge(i, childs[k], 1);
            }
            else
            {
              pGraph->AddEdge(childs[k], i, 1);
            }
          }
      }
    }
  }
  
  return pGraph;
}
Beispiel #6
0
CIDNet* CreateLIMIDWith2DecInClick()
{
  const int nnodes = 7;
  const int numberOfNodeTypes = 7;
  
  int i;
  
  CGraph *pGraph = CGraph::Create(0, NULL, NULL, NULL);
  pGraph->AddNodes(nnodes);
  pGraph->AddEdge(0,1,1);
  pGraph->AddEdge(2,3,1);
  pGraph->AddEdge(1,4,1);
  pGraph->AddEdge(3,4,1);
  pGraph->AddEdge(1,5,1);
  pGraph->AddEdge(4,6,1);
  
  CNodeType *nodeTypes = new CNodeType [numberOfNodeTypes];
  
  nodeTypes[0].SetType(1, 2, nsChance);
  nodeTypes[1].SetType(1, 2, nsDecision);
  nodeTypes[2].SetType(1, 2, nsChance);
  nodeTypes[3].SetType(1, 2, nsDecision);
  nodeTypes[4].SetType(1, 2, nsChance);
  nodeTypes[5].SetType(1, 1, nsValue);
  nodeTypes[6].SetType(1, 1, nsValue);
  
  int *nodeAssociation = new int[nnodes];
  for (i = 0; i < nnodes; i++)
  {
    nodeAssociation[i] = i;
  }
  
  CIDNet *pIDNet = CIDNet::Create(nnodes, numberOfNodeTypes, nodeTypes,
    nodeAssociation, pGraph);
  
  CModelDomain* pMD = pIDNet->GetModelDomain();
  
  CFactor **myParams = new CFactor*[nnodes];
  int *nodeNumbers = new int [nnodes];
  
  int domain0[] = { 0 };
  nodeNumbers[0] =  1;
  int domain1[] = { 0, 1 };
  nodeNumbers[1] =  2;
  int domain2[] = { 2 };
  nodeNumbers[2] =  1;
  int domain3[] = { 2, 3 };
  nodeNumbers[3] =  2;
  int domain4[] = { 1, 3, 4 };
  nodeNumbers[4] =  3;
  int domain5[] = { 1, 5 };
  nodeNumbers[5] =  2;
  int domain6[] = { 4, 6 };
  nodeNumbers[6] =  2;
  
  int *domains[] = { domain0, domain1, domain2, domain3, domain4,
    domain5, domain6 };
  
  pIDNet->AllocFactors();
  
  for (i = 0; i < nnodes; i++)
  {
    myParams[i] = CTabularCPD::Create(domains[i], nodeNumbers[i], pMD);
  }
  
  float data0[] = {0.200000f, 0.800000f};
  float data1[] = {0.500000f, 0.500000f, 0.500000f, 0.500000f};
  float data2[] = {0.600000f, 0.400000f};
  float data3[] = {0.500000f, 0.500000f, 0.500000f, 0.500000f};
  float data4[] = {0.500000f, 0.500000f, 0.100000f, 0.900000f, 0.800000f, 0.200000f, 0.020000f, 0.980000f};
  float data5[] = {10000.000000f, -2000.000000f};
  float data6[] = {-5000.000000f, 10000.000000f};
  
  float *data[] = { data0, data1, data2, data3, data4,
    data5, data6 };
  
  for (i = 0; i < nnodes; i++)
  {
    myParams[i]->AllocMatrix(data[i], matTable);
    pIDNet->AttachFactor(myParams[i]);
  }
  
  delete [] nodeTypes;
  delete [] nodeAssociation;
  
  return pIDNet;	
}
Beispiel #7
0
PNL_USING

CIDNet* CreatePigsLIMID()
{
  const int nnodes = 14;
  const int numberOfNodeTypes = 14;
  
  int i;
  
  CGraph *pGraph = CGraph::Create(0, NULL, NULL, NULL);
  pGraph->AddNodes(nnodes);
  pGraph->AddEdge(0,1,1);
  pGraph->AddEdge(0,3,1);
  pGraph->AddEdge(1,2,1);
  pGraph->AddEdge(2,3,1);
  pGraph->AddEdge(3,4,1);
  pGraph->AddEdge(3,6,1);
  pGraph->AddEdge(4,5,1);
  pGraph->AddEdge(5,6,1);
  pGraph->AddEdge(6,7,1);
  pGraph->AddEdge(6,9,1);
  pGraph->AddEdge(7,8,1);
  pGraph->AddEdge(8,9,1);
  pGraph->AddEdge(2,10,1);
  pGraph->AddEdge(5,11,1);
  pGraph->AddEdge(8,12,1);
  pGraph->AddEdge(9,13,1);
  
  CNodeType *nodeTypes = new CNodeType [numberOfNodeTypes];
  
  nodeTypes[0].SetType(1, 2, nsChance);
  nodeTypes[1].SetType(1, 2, nsChance);
  nodeTypes[2].SetType(1, 2, nsDecision);
  nodeTypes[3].SetType(1, 2, nsChance);
  nodeTypes[4].SetType(1, 2, nsChance);
  nodeTypes[5].SetType(1, 2, nsDecision);
  nodeTypes[6].SetType(1, 2, nsChance);
  nodeTypes[7].SetType(1, 2, nsChance);
  nodeTypes[8].SetType(1, 2, nsDecision);
  nodeTypes[9].SetType(1, 2, nsChance);
  nodeTypes[10].SetType(1, 1, nsValue);
  nodeTypes[11].SetType(1, 1, nsValue);
  nodeTypes[12].SetType(1, 1, nsValue);
  nodeTypes[13].SetType(1, 1, nsValue);
  
  int *nodeAssociation = new int[nnodes];
  for (i = 0; i < nnodes; i++)
  {
    nodeAssociation[i] = i;
  }
  
  CIDNet *pIDNet = CIDNet::Create(nnodes, numberOfNodeTypes, nodeTypes,
    nodeAssociation, pGraph);
  
  CModelDomain* pMD = pIDNet->GetModelDomain();
  
  CFactor **myParams = new CFactor*[nnodes];
  int *nodeNumbers = new int [nnodes];
  
  int domain0[] = { 0 };
  nodeNumbers[0] =  1;
  int domain1[] = { 0, 1 };
  nodeNumbers[1] =  2;
  int domain2[] = { 1, 2 };
  nodeNumbers[2] =  2;
  int domain3[] = { 2, 10 };
  nodeNumbers[3] =  2;
  int domain4[] = { 0, 2, 3 };
  nodeNumbers[4] =  3;
  int domain5[] = { 3, 4 };
  nodeNumbers[5] =  2;
  int domain6[] = { 4, 5 };
  nodeNumbers[6] =  2;
  int domain7[] = { 5, 11 };
  nodeNumbers[7] =  2;
  int domain8[] = { 3, 5, 6 };
  nodeNumbers[8] =  3;
  int domain9[] = { 6, 7 };
  nodeNumbers[9] =  2;
  int domain10[] = { 7, 8 };
  nodeNumbers[10] =  2;
  int domain11[] = { 8, 12 };
  nodeNumbers[11] =  2;
  int domain12[] = { 6, 8, 9 };
  nodeNumbers[12] =  3;
  int domain13[] = { 9, 13 };
  nodeNumbers[13] =  2;
  
  int *domains[] = { domain0, domain1, domain2, domain3, domain4,
    domain5, domain6, domain7, domain8, domain9, domain10, domain11, 
    domain12, domain13 };
  
  pIDNet->AllocFactors();
  
  for (i = 0; i < nnodes; i++)
  {
    myParams[i] = CTabularCPD::Create(domains[i], nodeNumbers[i], pMD);
  }
  
  float data0[] = {0.900000f, 0.100000f};
  float data1[] = {0.100000f, 0.900000f, 0.800000f, 0.200000f};
  float data2[] = {0.500000f, 0.500000f, 0.500000f, 0.500000f};
  float data3[] = {-100.000000f, 0.000000f};
  float data4[] = {0.900000f, 0.100000f, 0.800000f, 0.200000f, 0.500000f, 0.500000f, 0.100000f, 0.900000f};
  float data5[] = {0.100000f, 0.900000f, 0.800000f, 0.200000f};
  float data6[] = {0.500000f, 0.500000f, 0.500000f, 0.500000f};
  float data7[] = {-100.000000f, 0.000000f};
  float data8[] = {0.900000f, 0.100000f, 0.800000f, 0.200000f, 0.500000f, 0.500000f, 0.100000f, 0.900000f};
  float data9[] = {0.100000f, 0.900000f, 0.800000f, 0.200000f};
  float data10[] = {0.500000f, 0.500000f, 0.500000f, 0.500000f};
  float data11[] = {-100.000000f, 0.000000f};
  float data12[] = {0.900000f, 0.100000f, 0.800000f, 0.200000f, 0.500000f, 0.500000f, 0.100000f, 0.900000f};
  float data13[] = {1000.000000f, 300.000000f};
  
  float *data[] = { data0, data1, data2, data3, data4,
    data5, data6, data7, data8, data9,
    data10, data11, data12, data13 };
  
  for (i = 0; i < nnodes; i++)
  {
    myParams[i]->AllocMatrix(data[i], matTable);
    pIDNet->AttachFactor(myParams[i]);
  }
  
  delete [] nodeTypes;
  delete [] nodeAssociation;
  
  return pIDNet;
}
Beispiel #8
0
PNL_USING
CBNet* CreateAlarmBNet()
{
    const int nnodes = 37;
    const int numberOfNodeTypes = 37;
    
    int i;
    
    CGraph *pGraph = CGraph::Create(0, NULL, NULL, NULL);
    pGraph->AddNodes(37);
    pGraph->AddEdge(0,1,1);
    pGraph->AddEdge(0,3,1);
    pGraph->AddEdge(2,3,1);
    pGraph->AddEdge(3,4,1);
    pGraph->AddEdge(3,5,1);
    pGraph->AddEdge(0,6,1);
    pGraph->AddEdge(2,6,1);
    pGraph->AddEdge(11,12,1);
    pGraph->AddEdge(10,13,1);
    pGraph->AddEdge(12,13,1);
    pGraph->AddEdge(8,14,1);
    pGraph->AddEdge(9,14,1);
    pGraph->AddEdge(13,14,1);
    pGraph->AddEdge(8,15,1);
    pGraph->AddEdge(14,15,1);
    pGraph->AddEdge(15,16,1);
    pGraph->AddEdge(15,19,1);
    pGraph->AddEdge(18,19,1);
    pGraph->AddEdge(8,21,1);
    pGraph->AddEdge(20,21,1);
    pGraph->AddEdge(19,22,1);
    pGraph->AddEdge(21,22,1);
    pGraph->AddEdge(23,24,1);
    pGraph->AddEdge(16,25,1);
    pGraph->AddEdge(17,25,1);
    pGraph->AddEdge(22,25,1);
    pGraph->AddEdge(24,25,1);
    pGraph->AddEdge(25,26,1);
    pGraph->AddEdge(7,27,1);
    pGraph->AddEdge(26,27,1);
    pGraph->AddEdge(26,29,1);
    pGraph->AddEdge(28,29,1);
    pGraph->AddEdge(26,30,1);
    pGraph->AddEdge(28,30,1);
    pGraph->AddEdge(14,31,1);
    pGraph->AddEdge(16,31,1);
    pGraph->AddEdge(8,32,1);
    pGraph->AddEdge(14,32,1);
    pGraph->AddEdge(20,33,1);
    pGraph->AddEdge(8,34,1);
    pGraph->AddEdge(9,34,1);
    pGraph->AddEdge(13,34,1);
    pGraph->AddEdge(6,35,1);
    pGraph->AddEdge(26,35,1);
    pGraph->AddEdge(24,36,1);
    pGraph->AddEdge(35,36,1);
    
    CNodeType *nodeTypes = new CNodeType [37];
    
    nodeTypes[0].SetType(1, 2);
    nodeTypes[1].SetType(1, 2);
    nodeTypes[2].SetType(1, 2);
    nodeTypes[3].SetType(1, 3);
    nodeTypes[4].SetType(1, 3);
    nodeTypes[5].SetType(1, 3);
    nodeTypes[6].SetType(1, 3);
    nodeTypes[7].SetType(1, 2);
    nodeTypes[8].SetType(1, 3);
    nodeTypes[9].SetType(1, 2);
    nodeTypes[10].SetType(1, 2);
    nodeTypes[11].SetType(1, 3);
    nodeTypes[12].SetType(1, 4);
    nodeTypes[13].SetType(1, 4);
    nodeTypes[14].SetType(1, 4);
    nodeTypes[15].SetType(1, 4);
    nodeTypes[16].SetType(1, 3);
    nodeTypes[17].SetType(1, 2);
    nodeTypes[18].SetType(1, 2);
    nodeTypes[19].SetType(1, 3);
    nodeTypes[20].SetType(1, 2);
    nodeTypes[21].SetType(1, 2);
    nodeTypes[22].SetType(1, 3);
    nodeTypes[23].SetType(1, 2);
    nodeTypes[24].SetType(1, 3);
    nodeTypes[25].SetType(1, 2);
    nodeTypes[26].SetType(1, 3);
    nodeTypes[27].SetType(1, 3);
    nodeTypes[28].SetType(1, 2);
    nodeTypes[29].SetType(1, 3);
    nodeTypes[30].SetType(1, 3);
    nodeTypes[31].SetType(1, 4);
    nodeTypes[32].SetType(1, 4);
    nodeTypes[33].SetType(1, 3);
    nodeTypes[34].SetType(1, 4);
    nodeTypes[35].SetType(1, 3);
    nodeTypes[36].SetType(1, 3);
    
    int *nodeAssociation = new int[nnodes];
    
    for ( i = 0; i < nnodes; i++ )
    {
	nodeAssociation[i] = i;
    }
    CBNet *pBNet = CBNet::Create( nnodes, numberOfNodeTypes, nodeTypes,
	nodeAssociation, pGraph );
    
    CModelDomain* pMD = pBNet->GetModelDomain();
    
    //number of factors is the same as number of nodes - one CPD per node
    CFactor **myParams = new CFactor*[nnodes];
    int *nodeNumbers = new int [nnodes];
    
    int domain0[] = { 0 };
    nodeNumbers[0] =  1;
    int domain1[] = { 0, 1 };
    nodeNumbers[1] =  2;
    int domain2[] = { 2 };
    nodeNumbers[2] =  1;
    int domain3[] = { 0, 2, 3 };
    nodeNumbers[3] =  3;
    int domain4[] = { 3, 4 };
    nodeNumbers[4] =  2;
    int domain5[] = { 3, 5 };
    nodeNumbers[5] =  2;
    int domain6[] = { 0, 2, 6 };
    nodeNumbers[6] =  3;
    int domain7[] = { 7 };
    nodeNumbers[7] =  1;
    int domain8[] = { 8 };
    nodeNumbers[8] =  1;
    int domain9[] = { 9 };
    nodeNumbers[9] =  1;
    int domain10[] = { 10 };
    nodeNumbers[10] =  1;
    int domain11[] = { 11 };
    nodeNumbers[11] =  1;
    int domain12[] = { 11, 12 };
    nodeNumbers[12] =  2;
    int domain13[] = { 10, 12, 13 };
    nodeNumbers[13] =  3;
    int domain14[] = { 8, 9, 13, 14 };
    nodeNumbers[14] =  4;
    int domain15[] = { 8, 14, 15 };
    nodeNumbers[15] =  3;
    int domain16[] = { 15, 16 };
    nodeNumbers[16] =  2;
    int domain17[] = { 17 };
    nodeNumbers[17] =  1;
    int domain18[] = { 18 };
    nodeNumbers[18] =  1;
    int domain19[] = { 15, 18, 19 };
    nodeNumbers[19] =  3;
    int domain20[] = { 20 };
    nodeNumbers[20] =  1;
    int domain21[] = { 8, 20, 21 };
    nodeNumbers[21] =  3;
    int domain22[] = { 19, 21, 22 };
    nodeNumbers[22] =  3;
    int domain23[] = { 23 };
    nodeNumbers[23] =  1;
    int domain24[] = { 23, 24 };
    nodeNumbers[24] =  2;
    int domain25[] = { 16, 17, 22, 24, 25 };
    nodeNumbers[25] =  5;
    int domain26[] = { 25, 26 };
    nodeNumbers[26] =  2;
    int domain27[] = { 7, 26, 27 };
    nodeNumbers[27] =  3;
    int domain28[] = { 28 };
    nodeNumbers[28] =  1;
    int domain29[] = { 26, 28, 29 };
    nodeNumbers[29] =  3;
    int domain30[] = { 26, 28, 30 };
    nodeNumbers[30] =  3;
    int domain31[] = { 14, 16, 31 };
    nodeNumbers[31] =  3;
    int domain32[] = { 8, 14, 32 };
    nodeNumbers[32] =  3;
    int domain33[] = { 20, 33 };
    nodeNumbers[33] =  2;
    int domain34[] = { 8, 9, 13, 34 };
    nodeNumbers[34] =  4;
    int domain35[] = { 6, 26, 35 };
    nodeNumbers[35] =  3;
    int domain36[] = { 24, 35, 36 };
    nodeNumbers[36] =  3;
    
    int *domains[] = { domain0, domain1, domain2, domain3, domain4,
	domain5, domain6, domain7, domain8, domain9,
	domain10, domain11, domain12, domain13, domain14,
	domain15, domain16, domain17, domain18, domain19,
	domain20, domain21, domain22, domain23, domain24,
	domain25, domain26, domain27, domain28, domain29,
	domain30, domain31, domain32, domain33, domain34,
	domain35, domain36};
    
    pBNet->AllocFactors();
    
    for( i = 0; i < nnodes; i++ )
    {
	myParams[i] = CTabularCPD::Create( domains[i], nodeNumbers[i], pMD);
    }
    
    // data creation for all CPDs of the model
    float data0[] = {0.050000f, 0.950000f};
    float data1[] = {0.900000f, 0.100000f, 0.010000f, 0.990000f};
    float data2[] = {0.200000f, 0.800000f};
    float data3[] = {0.950000f, 0.040000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.010000f, 0.090000f, 0.900000f, 0.050000f, 0.900000f, 0.050000f};
    float data4[] = {0.950000f, 0.040000f, 0.010000f, 0.040000f, 0.950000f, 0.010000f, 0.010000f, 0.290000f, 0.700000f};
    float data5[] = {0.950000f, 0.040000f, 0.010000f, 0.040000f, 0.950000f, 0.010000f, 0.010000f, 0.040000f, 0.950000f};
    float data6[] = {0.980000f, 0.010000f, 0.010000f, 0.950000f, 0.040000f, 0.010000f, 0.500000f, 0.490000f, 0.010000f, 0.050000f, 0.900000f, 0.050000f};
    float data7[] = {0.050000f, 0.950000f};
    float data8[] = {0.920000f, 0.030000f, 0.050000f};
    float data9[] = {0.040000f, 0.960000f};
    float data10[] = {0.100000f, 0.900000f};
    float data11[] = {0.050000f, 0.900000f, 0.050000f};
    float data12[] = {0.050000f, 0.930000f, 0.010000f, 0.010000f, 0.050000f, 0.010000f, 0.930000f, 0.010000f, 0.050000f, 0.010000f, 0.010000f, 0.930000f};
    float data13[] = {0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f};
    float data14[] = {0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.300000f, 0.680000f, 0.010000f, 0.010000f, 0.950000f, 0.030000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.950000f, 0.030000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.500000f, 0.480000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.400000f, 0.580000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.300000f, 0.680000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f};
    float data15[] = {0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.030000f, 0.950000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.940000f, 0.040000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.880000f, 0.100000f, 0.010000f};
    float data16[] = {0.010000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.980000f, 0.040000f, 0.920000f, 0.040000f, 0.900000f, 0.090000f, 0.010000f};
    float data17[] = {0.100000f, 0.900000f};
    float data18[] = {0.050000f, 0.950000f};
    float data19[] = {1.000000f, 0.000000f, 0.000000f, 0.950000f, 0.040000f, 0.010000f, 1.000000f, 0.000000f, 0.000000f, 0.010000f, 0.950000f, 0.040000f, 0.990000f, 0.010000f, 0.000000f, 0.950000f, 0.040000f, 0.010000f, 0.950000f, 0.040000f, 0.010000f, 0.010000f, 0.010000f, 0.980000f};
    float data20[] = {0.010000f, 0.990000f};
    float data21[] = {0.100000f, 0.900000f, 0.950000f, 0.050000f, 0.100000f, 0.900000f, 0.950000f, 0.050000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f};
    float data22[] = {0.980000f, 0.010000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.010000f, 0.980000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.980000f, 0.690000f, 0.300000f, 0.010000f};
    float data23[] = {0.010000f, 0.990000f};
    float data24[] = {0.980000f, 0.010000f, 0.010000f, 0.300000f, 0.400000f, 0.300000f};
    float data25[] = {0.010000f, 0.990000f, 0.010000f, 0.990000f, 0.700000f, 0.300000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f, 0.700000f, 0.300000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f, 0.950000f, 0.050000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f, 0.700000f, 0.300000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f, 0.950000f, 0.050000f, 0.050000f, 0.950000f, 0.050000f, 0.950000f, 0.950000f, 0.050000f, 0.010000f, 0.990000f, 0.010000f, 0.990000f, 0.700000f, 0.300000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f, 0.700000f, 0.300000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f, 0.990000f, 0.010000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f, 0.700000f, 0.300000f, 0.010000f, 0.990000f, 0.050000f, 0.950000f, 0.990000f, 0.010000f, 0.050000f, 0.950000f, 0.050000f, 0.950000f, 0.990000f, 0.010000f, 0.010000f, 0.990000f, 0.010000f, 0.990000f, 0.100000f, 0.900000f, 0.010000f, 0.990000f, 0.010000f, 0.990000f, 0.100000f, 0.900000f, 0.010000f, 0.990000f, 0.010000f, 0.990000f, 0.300000f, 0.700000f, 0.010000f, 0.990000f, 0.010000f, 0.990000f, 0.100000f, 0.900000f, 0.010000f, 0.990000f, 0.010000f, 0.990000f, 0.300000f, 0.700000f, 0.010000f, 0.990000f, 0.010000f, 0.990000f, 0.300000f, 0.700000f};
    float data26[] = {0.050000f, 0.900000f, 0.050000f, 0.010000f, 0.090000f, 0.900000f};
    float data27[] = {0.980000f, 0.010000f, 0.010000f, 0.300000f, 0.400000f, 0.300000f, 0.010000f, 0.980000f, 0.010000f, 0.400000f, 0.590000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.980000f};
    float data28[] = {0.100000f, 0.900000f};
    float data29[] = {0.333333f, 0.333333f, 0.333333f, 0.010000f, 0.980000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.333333f, 0.333333f, 0.333333f, 0.333333f, 0.333333f, 0.333333f, 0.010000f, 0.010000f, 0.980000f};
    float data30[] = {0.333333f, 0.333333f, 0.333333f, 0.010000f, 0.980000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.333333f, 0.333333f, 0.333333f, 0.333333f, 0.333333f, 0.333333f, 0.010000f, 0.010000f, 0.980000f};
    float data31[] = {0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f};
    float data32[] = {0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.500000f, 0.480000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.500000f, 0.480000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.600000f, 0.380000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f};
    float data33[] = {0.010000f, 0.190000f, 0.800000f, 0.050000f, 0.900000f, 0.050000f};
    float data34[] = {0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.050000f, 0.250000f, 0.250000f, 0.450000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.200000f, 0.750000f, 0.040000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.290000f, 0.300000f, 0.400000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.900000f, 0.080000f, 0.010000f, 0.010000f, 0.300000f, 0.490000f, 0.200000f, 0.010000f, 0.150000f, 0.250000f, 0.590000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.200000f, 0.700000f, 0.090000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.080000f, 0.900000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.380000f, 0.600000f, 0.010000f, 0.010000f, 0.080000f, 0.900000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.010000f, 0.970000f, 0.010000f, 0.010000f, 0.010000f, 0.100000f, 0.840000f, 0.050000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f, 0.400000f, 0.580000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.010000f, 0.970000f};
    float data35[] = {0.980000f, 0.010000f, 0.010000f, 0.950000f, 0.040000f, 0.010000f, 0.800000f, 0.190000f, 0.010000f, 0.950000f, 0.040000f, 0.010000f, 0.040000f, 0.950000f, 0.010000f, 0.010000f, 0.040000f, 0.950000f, 0.300000f, 0.690000f, 0.010000f, 0.010000f, 0.300000f, 0.690000f, 0.010000f, 0.010000f, 0.980000f};
    float data36[] = {0.980000f, 0.010000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.900000f, 0.090000f, 0.010000f, 0.980000f, 0.010000f, 0.010000f, 0.100000f, 0.850000f, 0.050000f, 0.050000f, 0.200000f, 0.750000f, 0.300000f, 0.600000f, 0.100000f, 0.050000f, 0.400000f, 0.550000f, 0.010000f, 0.090000f, 0.900000f};
    float *data[] = { data0, data1, data2, data3, data4,
	data5, data6, data7, data8, data9,
	data10, data11, data12, data13, data14,
	data15, data16, data17, data18, data19,
	data20, data21, data22, data23, data24,
	data25, data26, data27, data28, data29,
	data30, data31, data32, data33, data34,
	data35, data36};
    
    for( i = 0; i < nnodes; i++ )
    {
	myParams[i]->AllocMatrix(data[i], matTable);
	pBNet->AttachFactor(myParams[i]);
    }
    
    delete [] nodeTypes;
    delete[] nodeAssociation;

    CContextPersistence xmlContext;
    xmlContext.Put(pBNet, "MyModel");
    if(!xmlContext.SaveAsXML("myFavoriteObjects.xml"))
    {
	fprintf(stderr, "Persistence: error!\n");
	// something goes wrong – can’t create
    }
    else
    {
	fprintf(stderr, "Persistence: good!\n");
    }
    
    return pBNet;
}