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; }
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; }
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; }
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; }
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; }
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; }
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; }
void CBICLearningEngine::Learn() { CEMLearningEngine *pLearn = NULL; float resultBIC = -FLT_MAX; CBNet *pResultBNet = NULL; intVector resultOrder; pEvidencesVector pEv(m_Vector_pEvidences.size(), NULL ); CModelDomain *pMD = m_pGrModel->GetModelDomain(); int nnodes = m_pGrModel->GetNumberOfNodes(); nodeTypeVector varTypes; pMD->GetVariableTypes(&varTypes); intVector varAss( pMD->GetVariableAssociations(), pMD->GetVariableAssociations() + nnodes ); intVector currentAssociation(nnodes); intVector currentObsNodes(nnodes); int i; for( i = 0; i < nnodes; i++ ) { currentObsNodes[i] = i; } CGraph *pGraph = CGraph::Create(nnodes, NULL, NULL, NULL); CBNet *pBNet; int lineSz = int( nnodes * ( nnodes - 1 ) / 2 ); intVecVector connect; intVector indexes(lineSz, 0); int startNode, endNode; int ind; for( ind = 0; ind < lineSz ; ) { if( indexes[ind] == 1 ) { FindNodesByNumber(&startNode, &endNode, nnodes, ind); pGraph->RemoveEdge(startNode, endNode ); indexes[ind] = 0; ind++; } else { FindNodesByNumber(&startNode, &endNode, nnodes, ind); pGraph->AddEdge(startNode, endNode, 1 ); indexes[ind] = 1; ind = 0; connect.clear(); pGraph->GetConnectivityComponents(&connect); if( connect.size() == 1 ) { do { CGraph *pCopyGraph = CGraph::Copy(pGraph); int j; for( j = 0; j < nnodes; j++ ) { currentAssociation[j] = varAss[currentObsNodes[j]]; } pBNet = CBNet::Create(nnodes, varTypes, currentAssociation, pCopyGraph); pBNet->AllocFactors(); for( j = 0; j < nnodes; j++ ) { pBNet->AllocFactor( j ); pBNet->GetFactor(j)->CreateAllNecessaryMatrices(); } int dimOfModel = DimOfModel(pBNet); int k; for( k = 0; k < pEv.size(); k++ ) { valueVector vls; m_Vector_pEvidences[k]->GetRawData(&vls); pEv[k] = CEvidence::Create( pBNet->GetModelDomain(),currentObsNodes, vls ); } pLearn = CEMLearningEngine::Create(pBNet); pLearn->SetData(pEv.size(), &pEv.front()); pLearn->Learn(); int nsteps; const float *score; pLearn->GetCriterionValue(&nsteps, &score); float log_lik = score[nsteps-1]; float BIC = log_lik - 0.5f*float( dimOfModel*log(float(pEv.size())) ); if( BIC >= resultBIC ) { delete pResultBNet; resultBIC = BIC; m_critValue.push_back(BIC); pResultBNet = pBNet; resultOrder.assign( currentObsNodes.begin(), currentObsNodes.end() ); } else { delete pBNet; } for( k = 0; k < pEv.size(); k++ ) { delete pEv[k]; } delete pLearn; }while(std::next_permutation(currentObsNodes.begin(), currentObsNodes.end())); } } } delete pGraph; m_pResultGrModel = pResultBNet; m_resultRenaming.assign(resultOrder.begin(), resultOrder.end()); }
PNL_USING int main() { int nnodes = 16; int nodeslice = 8; CBNet* pKjaerulf = pnlExCreateKjaerulfsBNet(); CDBN* pKj = CDBN::Create(pKjaerulf); int nSeries = 50; int nslices = 101; int i; intVector nS(nSeries); for(i = 0; i < nSeries; i++) { nS[i] = nslices; } valueVector vValues; vValues.resize(nodeslice); intVector obsNodes(nodeslice); for( i=0; i<nodeslice; i++)obsNodes[i] = i; CEvidence ***pEv; pEv = new CEvidence **[nSeries]; int series, slice, node, val; FILE * fp; fp = fopen("../Data/kjaerulff.dat", "r"); if( !fp ) { std::cout<<"can't open cases file"<<std::endl; exit(1); } for( series = 0; series < nSeries; series++ ) { pEv[series] = new CEvidence*[ nslices ]; for( slice = 0; slice < nslices; slice++ ) { for( node = 0; node < nodeslice; node++) { fscanf(fp, "%d,", &val); vValues[node].SetFlt(val); } (pEv[series])[slice] = CEvidence::Create(pKj->GetModelDomain(), obsNodes, vValues ); } } fclose(fp); CGraph *pGraph = CGraph::Create(nnodes, NULL, NULL, NULL); for(i=0; i<nnodes-1; i++) { pGraph->AddEdge(i, i+1,1); } CNodeType *nodeTypes = new CNodeType[1]; nodeTypes[0].SetType(1, 2); int *nodeAssociation = new int[nnodes]; for ( i = 0; i < nnodes; i++ ) { nodeAssociation[i] = 0; } CBNet *pBnet = CBNet::Create( nnodes, 1, nodeTypes, nodeAssociation, pGraph ); pBnet -> AllocFactors(); floatVector data; data.assign(64, 0.0f); for ( node = 0; node < nnodes; node++ ) { pBnet->AllocFactor( node ); (pBnet->GetFactor( node )) ->AllocMatrix( &data.front(), matTable ); } CDBN* pDBN = CDBN::Create(pBnet); CMlDynamicStructLearn *pLearn = CMlDynamicStructLearn::Create(pDBN, itDBNStructLearnML, StructLearnHC, BIC, 4, 1, 30); pLearn -> SetData(nSeries, &nS.front(), pEv); // pLearn->SetLearnPriorSlice(true); // pLearn->SetMinProgress((float)1e-4); pLearn ->Learn(); const CDAG* pDAG = pLearn->GetResultDag(); pDAG->Dump(); //////////////////////////////////////////////////////////////////////////// delete pLearn; delete pDBN; delete pKj; for(series = 0; series < nSeries; series++ ) { for( slice = 0; slice < nslices; slice++ ) { delete (pEv[series])[slice]; } delete[] pEv[series]; } delete[] pEv; return 0; }
int main() { int i, j; CBNet* pAlarm = CreateAlarmBNet(); const int nnodes = pAlarm->GetNumberOfNodes(); pAlarm->GetGraph()->Dump(); CGraph *graph = CGraph::Create( nnodes, NULL, NULL, NULL ); for(i=0; i<nnodes-1; i++) { graph->AddEdge(i, i+1, 1); } CBNet *bnet = CBNet::CreateWithRandomMatrices( graph, pAlarm->GetModelDomain() ); int nEv = 50; CEvidence **pEvidences = new CEvidence *[nEv]; int dataSize = nnodes;//summ all sizes int* obs_nodes = new int[nnodes]; for(i=0; i<nnodes; i++)obs_nodes[i] = i; //read data from file alarm.dat to evidences FILE * fp = fopen("../../examples/Data/alarm.dat", "r"); if( !fp && !(fp = fopen("../../c_pgmtk/examples/Data/alarm.dat", "r")) ) { std::cout<<"can't open cases file"<<std::endl; exit(1); } valueVector input_data; input_data.resize(dataSize); for(i = 0 ; i < nEv; i++) { for (j = 0; j < dataSize ; j++) { int val; fscanf(fp, "%d,", &val); input_data[j].SetInt(val); } pEvidences[i] = CEvidence::Create(pAlarm, nnodes, obs_nodes, input_data); } fclose(fp); intVector vA; intVector vD; CMlStaticStructLearn *pLearn = CMlStaticStructLearnHC::Create(bnet, itStructLearnML, StructLearnHC, BIC, 5, vA, vD, 1); pLearn->SetData(nEv, pEvidences); pLearn->Learn(); // pLearn->CreateResultBNet(const_cast<CDAG*>(pLearn->GetResultDAG())); // const CBNet* pBNet = pLearn->GetResultBNet(); /////////////////////////////////////////////////////////////////////////////// const CDAG* pDAG = pLearn->GetResultDAG(); CDAG* iDAG = CDAG::Create(*(pAlarm->GetGraph())); int diff = iDAG->SymmetricDifference(pDAG); pDAG->Dump(); delete pLearn; delete iDAG; delete[] obs_nodes; delete pAlarm; delete bnet; for( i = 0; i < nEv; i++) { delete pEvidences[i]; } return 1; }
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; }