plComputableObjectList createClusterJointDist( const Variables& variables, const Cluster& cluster ) { plComputableObjectList cndProbTab; const Variable& var = variables[*cluster.begin()]; const DistValues probs = createNBUniVarProbTab( var.cardinality() ) ; const plProbTable probTab( var, probs, true ); cndProbTab *= probTab; DistValueMat clusterProbTables = createClusterProbTables( variables, cluster ); //./bVariables clustVars; // clustVars ^= var; Cluster::const_iterator curr, next; curr = cluster.begin(); next = curr + 1; DistValueMat::const_iterator ptIt = clusterProbTables.begin(); while ( next != cluster.end() ) { plDistributionTable distTab_Xi_Z( variables[*next], variables[*curr] ); for (size_t h = 0; h < variables[*curr].cardinality(); ++h) { distTab_Xi_Z.push( plProbTable( variables[*next], ptIt->at(h)), (int)h ); } cndProbTab *= distTab_Xi_Z; ++curr; ++next; ++ptIt; } return cndProbTab; //plJointDistribution( clustVars, cndProbTab ); }
plComputableObjectList createNBCndTable(Variables& variables, Variable& latentVar) { plComputableObjectList dataCndTable; DistValueMat probTableXZ = createNBProbTables(variables, latentVar); for (size_t x = 0; x < variables.size(); ++x) { plDistributionTable distTab_Xi_Z(variables[x], latentVar); for (size_t h = 0; h < latentVar.cardinality(); ++h) { distTab_Xi_Z.push( plProbTable(variables[x], probTableXZ[x][h]), (int)h ); } dataCndTable *= distTab_Xi_Z; // adds the conditional table to result } return dataCndTable; }
/** BN vertex file: see SINGLE format. * BN distribution file: see above. */ void BayesGraphLoad::operator()( std::shared_ptr<Graph> graph, const std::string labPosFileName, const std::string vertexFileName, const std::string distributionFileName, const std::string cndDataFileName, const std::string dataFileName ) const { BOOST_LOG_TRIVIAL(trace) << "begin loading label..." << std::endl; LabPosMap labPosMap = readLabPos(labPosFileName); BOOST_LOG_TRIVIAL(trace) << "end loading label..." << std::endl; std::ifstream vertexFile(vertexFileName.c_str()), distributionFile(distributionFileName.c_str()), dataFile(dataFileName.c_str()); CSVIterator<std::string> vertexLine(vertexFile); ++vertexLine; // skips header. BOOST_LOG_TRIVIAL(trace) << "begin loading vertices\n"; for( ; vertexLine != CSVIterator<std::string>(); ++vertexLine ) { size_t id = boost::lexical_cast<size_t>( (*vertexLine)[0] ); int level = boost::lexical_cast<int>( (*vertexLine)[2] ); int cardinality = boost::lexical_cast<int>( (*vertexLine)[3] ); // printf("id: %lu, level: %d, card: %d, label: %s, pos: %d", id, level, cardinality, label.c_str(), position); std::string label = labPosMap[id].first; int position = labPosMap[id].second; create_graph_node( graph, cardinality, label, position, level ); } Graph& graphRef = *graph; BOOST_LOG_TRIVIAL(trace) << "end loading vertices: " << boost::num_vertices(graphRef) << "\n\n"; BOOST_LOG_TRIVIAL(trace) << "begin loading dist\n"; CSVIterator<std::string> distributionLine(distributionFile); while ( distributionLine != CSVIterator<std::string>() ) { plVariablesConjunction variables; // holds child variables plComputableObjectList jointDistri; size_t latentId = boost::lexical_cast<size_t>( (*distributionLine)[BN_LATENT_ID] ); size_t nbrChildren = boost::lexical_cast<size_t>( (*distributionLine)[NBR_CHILDREN] ); Node& latentNode = graphRef[ latentId ]; ++distributionLine; // reads next line. std::vector< plProbValue > probValuesZ; for ( size_t latentVal = 0; latentVal < latentNode.variable.cardinality(); ++latentVal) { // loads probability table for the latent var probValuesZ.push_back( boost::lexical_cast<plProbValue>( (*distributionLine)[latentVal] ) ); } const plProbTable probTabZ(latentNode.variable, probValuesZ); ++distributionLine; for ( size_t child = 0; child < nbrChildren; ++child ) { size_t childId = boost::lexical_cast<size_t>( (*distributionLine)[BN_LATENT_ID] ); ++distributionLine; Node& childNode = graphRef[ childId ]; variables ^= childNode.variable; plDistributionTable distTab_Xi_Z ( childNode.variable, latentNode.variable ); for ( size_t latentVal = 0; latentVal < latentNode.variable.cardinality(); ++latentVal ) { std::vector< plProbValue > probValuesXiZ_vals; for ( size_t childVal = 0; childVal < childNode.variable.cardinality(); ++childVal ) { probValuesXiZ_vals.push_back( boost::lexical_cast<plProbValue>( (*distributionLine)[childVal] ) ); } distTab_Xi_Z.push( plProbTable( childNode.variable, probValuesXiZ_vals), (int)latentVal ); ++distributionLine; } jointDistri *= distTab_Xi_Z; // adds the conditional table to result boost::add_edge( latentId, childId, graphRef ); } auto jd = ( probTabZ * jointDistri ); ++distributionLine; latentNode.set_joint_distribution( plJointDistribution(latentNode.variable ^ variables, probTabZ * jointDistri) ); } distributionFile.close(); vertexFile.close(); set_data(*graph, cndDataFileName, dataFileName); }