Пример #1
0
void CDynamicGraphicalModel::FindInterfaceNodes()
{
    int i, j;

    CGraph *graph = m_pGrModel->GetGraph();

    int nnodes = graph->GetNumberOfNodes();

    int                    numberOfNeighbors;
    const int              *neighbors;
    const ENeighborType *orientation;

    for( i = 0; i < nnodes/2; i++ )
    {
	graph->GetNeighbors(i, &numberOfNeighbors, &neighbors, &orientation);

	for( j = 0; j < numberOfNeighbors; j++ )
	{
	    if( neighbors[j] >= nnodes/2 )
	    {
		m_InterfaceNodes.push_back(i);
                break;
	    }
	}
    }
}
Пример #2
0
void
CGraphPersistence::Save(CPNLBase *pObj, CContextSave *pContext)
{
    CGraph *pG = dynamic_cast<CGraph*>(pObj);
    std::stringstream buf;

    PNL_CHECK_IS_NULL_POINTER(pG);
    int nNode = pG->GetNumberOfNodes();
    intVector neig;
    neighborTypeVector neigType;

    pContext->AddAttribute("SavingType", "ByEdges");

    {
        char buf2[12];

        sprintf(buf2, "%i", nNode);
        pContext->AddAttribute("NumberOfNodes", buf2);
    }

    for(int i = 0; i < nNode; ++i)
    {
        pG->GetNeighbors(i, &neig, &neigType);
        buf << i << ":";
        for(int j = neig.size(); --j >= 0;)
        {
            buf << neig[j] << "_(" << neighTypeSymbols[neigType[j]] << ") ";
        }
        buf << '\n';
    }

    pContext->AddText(buf.str().c_str());
}
CGraph *C1_5SliceInfEngine::Create1_5SliceGraph()
{

    int node, i, j;

    CGraph *graph = GrModel()->GetGraph();

    int nnodesInDBN = graph->GetNumberOfNodes();

    int numberOfInterfaceNodes;
    const int *interfaceNodes;
    GrModel()->GetInterfaceNodes(&numberOfInterfaceNodes, &interfaceNodes);

    int nnodes = nnodesInDBN/2 + numberOfInterfaceNodes;
    CGraph *pFinalGraph = CGraph::Create( nnodes, NULL, NULL, NULL );
    PNL_CHECK_IF_MEMORY_ALLOCATED( pFinalGraph );

    int            numberOfNeighbors;
    const int             *neighbors;
    const ENeighborType *orientation;
    int newNumber;
    intVector                    FinalNeighbors;
    pnlVector<ENeighborType> FinalOrientation;

    intVector newIntNodes( numberOfInterfaceNodes );
    int numberOfNonIntNodes = nnodesInDBN/2 - numberOfInterfaceNodes;

    for ( node = 0; node < numberOfInterfaceNodes; node++ )
    {
	newIntNodes[node] = interfaceNodes[node] - numberOfNonIntNodes;
    }

    for( i = nnodesInDBN/2; i < nnodesInDBN; i++ )
    {
	graph->GetNeighbors(i, &numberOfNeighbors, &neighbors, &orientation);

	FinalNeighbors.resize(numberOfNeighbors);

	for ( j = 0; j < numberOfNeighbors; j++ )
	{
	    newNumber = neighbors[j] - numberOfNonIntNodes;
	    FinalNeighbors[j] = ( newNumber < numberOfInterfaceNodes ) ?
		( std::find( newIntNodes.begin(), newIntNodes.end(),
		newNumber) - newIntNodes.begin() ) : newNumber;
	}

	pFinalGraph->SetNeighbors( i - numberOfNonIntNodes, numberOfNeighbors,
	    &(FinalNeighbors.front()), orientation );
    }

    return pFinalGraph;
}
Пример #4
0
CIDNet* CreateRandomIDNet(int num_nodes, int num_indep_nodes,
  int max_size_family, int num_decision_nodes, int max_num_states_chance_nodes,
  int max_num_states_decision_nodes, int min_utility, int max_utility,
  bool is_uniform_start_policy)
{
  PNL_CHECK_RANGES(num_decision_nodes, 1, num_nodes-1);
  PNL_CHECK_LEFT_BORDER(max_num_states_chance_nodes, 1);
  PNL_CHECK_LEFT_BORDER(max_num_states_decision_nodes, 1);
  PNL_CHECK_LEFT_BORDER(max_utility, min_utility);
  
  CGraph* pGraph = 
    CreateRandomAndSpecificForIDNetGraph(num_nodes, num_indep_nodes,
    max_size_family);
  
  if (!pGraph->IsDAG())
  {
    PNL_THROW(CInconsistentType, " the graph should be a DAG ");
  }
  
  if (!pGraph->IsTopologicallySorted())
  {
    PNL_THROW(CInconsistentType, 
      " the graph should be sorted topologically ");
  }
  if (pGraph->NumberOfConnectivityComponents() > 1)
  {
    PNL_THROW(CInconsistentType, " the graph should be linked ");
  }
  
  int i, j, k;
  
  CNodeType *nodeTypes = new CNodeType [num_nodes];
  
  intVector nonValueNodes(0);
  intVector posibleDecisionNodes(0);
  nonValueNodes.resize(0);
  posibleDecisionNodes.resize(0);
  for (i = 0; i < num_nodes; i++)
  {
    if (pGraph->GetNumberOfChildren(i) == 0)
    {
      nodeTypes[i].SetType(1, 1, nsValue);
    }
    else
    {
      nonValueNodes.push_back(i);
      posibleDecisionNodes.push_back(i);
    }
  }
  int ind_decision_node;
  int num_states;
  int index;
  int node;
  intVector neighbors(0);
  neighborTypeVector neigh_types(0);

  num_decision_nodes = (num_decision_nodes > posibleDecisionNodes.size()) ? 
    posibleDecisionNodes.size() : num_decision_nodes;
  for (i = 0; (i < num_decision_nodes) && (posibleDecisionNodes.size()>0); i++)
  {
    ind_decision_node = rand() % posibleDecisionNodes.size();
    node = posibleDecisionNodes[ind_decision_node];
    num_states = GetRandomNumberOfStates(max_num_states_decision_nodes);
    nodeTypes[node].SetType(1, num_states, nsDecision);
    
    index = -1;
    for (j = 0; j < nonValueNodes.size(); j++)
    {
      if (nonValueNodes[j] == node)
      {
        index = j;
        break;
      }
    }
    if (index != -1)
      nonValueNodes.erase(nonValueNodes.begin() + index);
      
    posibleDecisionNodes.erase(posibleDecisionNodes.begin() + 
      ind_decision_node);
    pGraph->GetNeighbors(node, &neighbors, &neigh_types);
    for (j = 0; j < neighbors.size(); j++)
    {
      index = -1;
      for (k = 0; k < posibleDecisionNodes.size(); k++)
      {
        if (neighbors[j] == posibleDecisionNodes[k])
        {
          index = k;
          break;
        }
      }
      if (index != -1)
        posibleDecisionNodes.erase(posibleDecisionNodes.begin() + index);
    }
  }
  for (i = 0; i < nonValueNodes.size(); i++)
  {
    num_states = GetRandomNumberOfStates(max_num_states_chance_nodes);
    nodeTypes[nonValueNodes[i]].SetType(1, num_states, nsChance);
  }
  
  int *nodeAssociation = new int[num_nodes];
  for (i = 0; i < num_nodes; i++)
  {
    nodeAssociation[i] = i;
  }
  
  CIDNet *pIDNet = CIDNet::Create(num_nodes, num_nodes, nodeTypes,
    nodeAssociation, pGraph);
  pGraph = pIDNet->GetGraph();
  CModelDomain* pMD = pIDNet->GetModelDomain();
  
  CFactor **myParams = new CFactor*[num_nodes];
  int *nodeNumbers = new int[num_nodes];
  int **domains = new int*[num_nodes];
  
  intVector parents(0);
  for (i = 0; i < num_nodes; i++)
  {
    nodeNumbers[i] = pGraph->GetNumberOfParents(i) + 1;
    domains[i] = new int[nodeNumbers[i]];
    pGraph->GetParents(i, &parents);
    
    for (j = 0; j < parents.size(); j++)
    {
      domains[i][j] = parents[j];
    }
    domains[i][nodeNumbers[i]-1] = i;
  }
  
  pIDNet->AllocFactors();
  
  for (i = 0; i < num_nodes; i++)
  {
    myParams[i] = CTabularCPD::Create(domains[i], nodeNumbers[i], pMD);
  }
  
  float **data = new float*[num_nodes];
  int size_data;
  int num_states_node;
  int num_blocks;
  intVector size_nodes(0);
  float belief, sum_beliefs;
  
  for (i = 0; i < num_nodes; i++)
  {
    size_data = 1;
    size_nodes.resize(0);
    for (j = 0; j < nodeNumbers[i]; j++)
    {
      size_nodes.push_back(pIDNet->GetNodeType(domains[i][j])->GetNodeSize());
      size_data *= size_nodes[j];
    }
    num_states_node = size_nodes[size_nodes.size() - 1];
    num_blocks = size_data / num_states_node;
    
    data[i] = new float[size_data];
    switch (pIDNet->GetNodeType(i)->GetNodeState())
    {
      case nsChance:
      {
        for (j = 0; j < num_blocks; j++)
        {
          sum_beliefs = 0.0;
          for (k = 0; k < num_states_node - 1; k++)
          {
            belief = GetBelief(1.0f - sum_beliefs);
            data[i][j * num_states_node + k] = belief;
            sum_beliefs += belief;
          }
          belief = 1.0f - sum_beliefs;
          data[i][j * num_states_node + num_states_node - 1] = belief;
        }
        break;
      }
      case nsDecision:
      {
        if (is_uniform_start_policy)
        {
          belief = 1.0f / float(num_states_node);
          for (j = 0; j < num_blocks; j++)
          {
            sum_beliefs = 0.0;
            for (k = 0; k < num_states_node - 1; k++)
            {
              data[i][j * num_states_node + k] = belief;
              sum_beliefs += belief;
            }
            data[i][j * num_states_node + num_states_node - 1] = 
              1.0f - sum_beliefs;
          }
        }
        else
        {
          for (j = 0; j < num_blocks; j++)
          {
            sum_beliefs = 0.0;
            for (k = 0; k < num_states_node - 1; k++)
            {
              belief = GetBelief(1.0f - sum_beliefs);
              data[i][j * num_states_node + k] = belief;
              sum_beliefs += belief;
            }
            belief = 1.0f - sum_beliefs;
            data[i][j * num_states_node + num_states_node - 1] = belief;
          }
        }
        break;
      }
      case nsValue:
      {
        for (j = 0; j < num_blocks; j++)
        {
          data[i][j] = float(GetUtility(min_utility, max_utility));
        }
        break;
      }
    }
  }

  for (i = 0; i < num_nodes; i++)
  {
    myParams[i]->AllocMatrix(data[i], matTable);
    pIDNet->AttachFactor(myParams[i]);
  }

  delete [] nodeTypes;
  delete [] nodeAssociation;

  return pIDNet;
}
void CSpecPearlInfEngine::ComputeProductLambda( int nodeNumber, fgMessage lambda,
                                               fgMessage& resMes,
                                               int except ) const
{
    int i;
    CGraph *theGraph = m_pGraphicalModel->GetGraph();
    
    int                    numNeighb;
    const int              *neighbors;
    const ENeighborType *orientations;
    
    theGraph->GetNeighbors( nodeNumber, &numNeighb, &neighbors, &orientations );
    
    if( orientations[0] == ntNeighbor )
    {
        return;// InitMessage( nodeNumber, ( m_pGraphicalModel->GetNodeType(nodeNumber) ) );
    }
    //getting parameter from the model
    
    int nodes = nodeNumber;
    int numOfParams;
    CFactor ** param;
    m_pGraphicalModel->GetFactors(1, &nodes, &numOfParams, &param );
    
    if( !numOfParams )
    {
        PNL_THROW( CInvalidOperation, "no parameter" )
    }
    
    //we want to find parameter in which nodeNumber is a child - last in domain
    const CFactor *parameter = param[0];
    
    //to check last node in domain
    const int *BigDomain; int bigDomSize;
    
    //flag to check - if there isn't such domain
    int bSuchDom = 0;
    
    for ( i = 0; i < numOfParams; i++ )
    {
        param[i]->GetDomain( &bigDomSize, &BigDomain );
        if( BigDomain[bigDomSize-1] == nodeNumber )
        {
            parameter = param[i];
            bSuchDom = 1;
            break;
        }
    }
    
    if( !bSuchDom )
    {
        //we need to produce message without any interesting information - only ones
        //fgMessage allData = InitMessage( nodeNumber, m_pGraphicalModel->GetNodeType( nodeNumber ) );
        return;// allData;
    }
    //getting data from parameter
    /*fgMessage paramData = static_cast<CPotential*>(parameter->Clone());//->_GetDistribFun();
    
    //getting domain for marginalize and multiply
    
    parameter->GetDomain( &bigDomSize, &BigDomain );
    
    //we need to use serial numbers
    intVector domNumbers( bigDomSize );
    for ( i = 0; i < bigDomSize; i++ )
    {
        domNumbers[i] = i;
    }
    //we need to find all parents, collect their messages
    // put the pointers to them into array, call CPD_to_pi()
    int location;
    intVector parentIndices;
    //we create vector of messages in the same order as in domain - they are first in domain
    std::vector<fgMessage> parentMessages = std::vector<fgMessage>(bigDomSize - 1);
    int keepNode = -1;
    for( i = 0; i < numNeighb; i++ )
    {
        location = std::find( BigDomain, BigDomain + bigDomSize,
            neighbors[i] ) - BigDomain;
        if( ( orientations[i] == ntParent ) && ( location < bigDomSize ) )
        {
            parentMessages[location] = m_curMessages[m_curState][nodeNumber][i];
            if(  neighbors[i] != except  )
            {
                parentIndices.push_back(location);
            }
            if (neighbors[i] == except)
            {
                keepNode =  location;
            }
        }
    }
    //fgMessage resMes1 = paramData->_GetDistribFun()->_CPD_to_lambda(lambda, parentMessages.begin(), 
    //    parentIndices.begin(), parentIndices.size(), keepNode, m_bMaximize);
    //return resMes1;*/
}
Пример #6
0
void DefineQueryArHMM( CDBN *pDBN, int nTimeSlice,
		      intVector * queryForDBNPrior,
		      intVector * queryForDBN,
		      intVecVector *queryForUnrollBnet )
{
    ///////////////////////////////////////////////////////////////////////////
    //Define query for unrolled DBN and DBN (it is parents of some random node)
    /////////////////////////////////////////////////////////////////////////////
    int numOfNodesInDBN=pDBN->GetNumberOfNodes();
    int numOfInterfaceNodes;
    const int * interfaceNodes;
    pDBN->GetInterfaceNodes( &numOfInterfaceNodes, &interfaceNodes );
    /////////////////////////////////////////////////////////////////////////////
    int node = ( int )( rand()%( numOfNodesInDBN - 1 ) ) ;
    /////////////////////////////////////////////////////////////////////////////
    (*queryForUnrollBnet).resize( nTimeSlice );

    /////////////////////////////////////////////////////////////////////////////
    int numOfNeighbors;
    const int * neighbors;
    const ENeighborType * types;
    /////////////////////////////////////////////////////////////////////////////

    CGraph *pPriorGraph = pDBN->CreatePriorSliceGraph();
    pPriorGraph->GetNeighbors( node, &numOfNeighbors, &neighbors, &types );
    int i;
    for( i = 0; i < numOfNeighbors; i++ )
    {
	if( types[i] == ntParent )
	{
	    (*queryForDBNPrior).push_back( neighbors[i] );
	    (*queryForUnrollBnet)[0].push_back( neighbors[i] );
	}

    }
    (*queryForDBNPrior).push_back( node );
    (*queryForUnrollBnet)[0].push_back( node );
    delete pPriorGraph;

    //////////////////////////////////////////////////////////////////////////////
    node +=  numOfNodesInDBN;
    pDBN->GetGraph()->GetNeighbors( node, &numOfNeighbors, &neighbors, &types );


    int slice;

    for( i = 0; i < numOfNeighbors; i++ )
    {
	if( types[i] == ntParent )
	{
	    (*queryForDBN).push_back( neighbors[i] );
	    for( slice = 0; slice < nTimeSlice - 1; slice++ )
	    {
		(*queryForUnrollBnet)[slice+1].push_back( neighbors[i] +
		    slice*numOfNodesInDBN );
	    }
	}

    }
    (*queryForDBN).push_back( node );


    for( slice = 0; slice < nTimeSlice - 1; slice++ )
    {
	(*queryForUnrollBnet)[slice+1].push_back( node + slice*numOfNodesInDBN );
    }

}