Ejemplo n.º 1
0
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 );
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
/** 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);
}