示例#1
0
int testMultiplyMatrix()
{

    int ret = TRS_OK;
    int i;
#if 0
    int range_max=5;

    int seed1 = pnlTestRandSeed();
    /*create string to display the value*/
    char *value = new char[20];
    value = _itoa(seed1, value, 10);
    trsiRead(&seed1, value, "Seed for srand to define NodeTypes etc.");
    delete []value;
    trsWrite(TW_CON|TW_RUN|TW_DEBUG|TW_LST, "seed for rand = %d\n", seed1);

    srand ((unsigned int)seed1);

    int Nrow1 = 1+rand()%((int) range_max);
    int Ncol1 = 1+rand()%((int) range_max);
    int Nrow2=Ncol1;
    int Ncol2=1+rand()%((int) range_max);
#endif
    int Nrow1 = 4;
    int Ncol1 = 6;
    int Nrow2=Ncol1;
    int Ncol2=5;


    int* ranges1 = (int*)trsGuardcAlloc( 2, sizeof(int) );
    int* ranges2 = (int*)trsGuardcAlloc( 2, sizeof(int) );

    ranges1[0]=Nrow1; ranges1[1]=Ncol1;
    ranges2[0]=Nrow2; ranges2[1]=Ncol2;

    int data_length1=ranges1[0]*ranges1[1];
    int data_length2=ranges2[0]*ranges2[1];
    float* data1 = (float*)trsGuardcAlloc( data_length1, sizeof(float) );
    float* data2 = (float*)trsGuardcAlloc( data_length2, sizeof(float) );
    for (i = 0; i < data_length1; data1[i] = (div(i,Ncol1).quot+1)*1.0f, i++);
    for (i = 0; i < data_length2; data2[i] = (div(i,Ncol2).rem+1)*0.1f, i++);

    C2DNumericDenseMatrix<float>* m1 = C2DNumericDenseMatrix<float>::Create( ranges1, data1);
    C2DNumericDenseMatrix<float>* m2 = C2DNumericDenseMatrix<float>::Create( ranges2, data2);
    C2DNumericDenseMatrix<float>* m3 = pnlMultiply(m1,m2,0);
    int data_length3;
    const float *m3data;
    m3->GetRawData(&data_length3, &m3data);

    float *testdata0=new float[data_length3];
    int currow;int curcol;
    for (i = 0; i < data_length3; i++)
    {
	currow=div(i,Ncol2).quot+1;
	curcol=div(i,Ncol2).rem+1;
	testdata0[i] =currow*curcol*Ncol1*0.1f;
    }
    for(i = 0; i < data_length3; i++)
    {
	// Test the values...
	//printf("%3d  %4.2f  %4.2f\n",i, testdata0[i], m3data[i]);
	if(m3data[i] - testdata0[i]>eps)
	{
	    return trsResult(TRS_FAIL, "data doesn't agree at max=0, preorder");
	}
    }
    delete m3;
    m3 = pnlMultiply(m2,m1,0);
    m3->GetRawData(&data_length3, &m3data);

    for(i = 0; i < data_length3; i++)
    {
	// Test the values...
	//printf("%3d  %4.2f  %4.2f\n",i, testdata0[i], m3data[i]);
	if(m3data[i] - testdata0[i]>eps)
	{
	    return trsResult(TRS_FAIL, "data doesn't agree at max=0, postorder");
	}
    }

#if 0
    float *data4 = new float[data_length2];
    for (i=0;i<data_length2;i++)
    {
	currow=div(i,Ncol2).quot+1;
	curcol=div(i,Ncol2).rem+1;
	data4[i]=currow*(1e+curcol-3f);
    }
    CNumericDenseMatrix<float> * m4=CNumericDenseMatrix<float>::Create(2,ranges2, data4);
#endif
    delete m3;
    m3 = pnlMultiply(m1,m2,1);
    m3->GetRawData(&data_length3, &m3data);

    float *testdata1=new float[data_length3];
    for (i = 0; i < data_length3; i++)
    {
	int currow=div(i,Ncol2).quot+1;
	int curcol=div(i,Ncol2).rem+1;
	testdata1[i] =currow*curcol*0.1f;
    }
    for(i = 0; i < data_length3; i++)
    {
	// Test the values...
	//printf("%3d  %4.2f  %4.2f\n",i, testdata1[i], m3data[i]);
	if(m3data[i] - testdata1[i] > eps)
	{
	    return trsResult(TRS_FAIL, "data doesn't agree at max=1, preorder");
	}
    }
    delete m3;
    m3 = pnlMultiply(m2,m1,1);
    m3->GetRawData(&data_length3, &m3data);

    for(i = 0; i < data_length3; i++)
    {
	// Test the values...
	//printf("%3d  %4.2f  %4.2f\n",i, testdata1[i], m3data[i]);
	if(m3data[i] - testdata1[i]>eps)
	{
	    return trsResult(TRS_FAIL, "data doesn't agree at max=1, postorder");
	}
    }

    int ranges1_memory_flag = trsGuardCheck( ranges1 );
    int ranges2_memory_flag = trsGuardCheck( ranges2 );
    int data1_memory_flag = trsGuardCheck( data1 );
    int data2_memory_flag = trsGuardCheck( data2 );

    trsGuardFree( ranges1 );
    trsGuardFree( ranges2 );
    trsGuardFree( data1 );
    trsGuardFree( data2 );

    if(ranges1_memory_flag || ranges2_memory_flag || data1_memory_flag||
	data2_memory_flag)
    {
	return trsResult( TRS_FAIL, "Dirty memory");
    }

    delete m1; delete m2; delete m3;
    delete []testdata1;
    delete []testdata0;
    return trsResult( ret, ret == TRS_OK ? "No errors" : "Bad matrix data");
}
CPotential* CJtreeInfEngine::MergeCliques(int domSize, int* Domain)
{
    int numNodes = m_pJTree->GetNumberOfNodes();
    potsPVector	vPots(numNodes, (CPotential*)0);
    int i;
    const int*  clqDomain;
    int			clqSize;
    const int*  sepDomain;
    int			sepSize;

    const int    *nbr, *nbrs_end;
    int          numOfNbrs;
    const int    *nbrs;
    const ENeighborType *nbrsTypes;

    intVector::const_iterator    sourceIt, source_end;
    intVecVector::const_iterator layerIt     = m_collectSequence.begin(),
	collSeq_end = m_collectSequence.end();

    const CGraph *pGraph = m_pJTree->GetGraph();

    intVector  nodesSentMessages;
    intVector  tmpV;

    for( ; layerIt != collSeq_end; ++layerIt )
    {
	for( sourceIt = layerIt->begin(), source_end = layerIt->end();
	    sourceIt != source_end; ++sourceIt )
	{
	    if( !m_NodesAfterShrink[*sourceIt] ) continue;

	    pGraph->GetNeighbors( *sourceIt, &numOfNbrs, &nbrs, &nbrsTypes );
	    tmpV.assign(Domain, Domain+domSize);

	    for( nbr = nbrs, nbrs_end = nbrs + numOfNbrs; nbr != nbrs_end;
		++nbr )
	    {
		if( !m_NodesAfterShrink[*nbr] ) continue;
		m_pJTree->GetSeparatorDomain(*sourceIt, *nbr, &sepSize, &sepDomain);
		tmpV = pnlSetUnion(sepSize, const_cast<int*>(sepDomain), tmpV.size(), &tmpV.front());
	    }
	    m_pJTree->GetNodeContent(*sourceIt, &clqSize, &clqDomain);
	    tmpV = pnlIntersect(clqSize, const_cast<int*>(clqDomain), tmpV.size(), &tmpV.front());
	    if( !pnlIsIdentical(tmpV.size(), &tmpV.front(), clqSize, const_cast<int*>(clqDomain)) )
	    {
		vPots[*sourceIt] = m_pJTree->GetNodePotential(*sourceIt)->Marginalize(tmpV);
	    }
	    else
	    {
		vPots[*sourceIt] = static_cast<CPotential*>(m_pJTree->GetNodePotential(*sourceIt)->Clone());
	    }
	}
    }

    intVector bigDomain;
    layerIt = m_collectSequence.begin();
    nodesSentMessages.assign(numNodes, false);
    CPotential* tPot;
    for( ; layerIt != collSeq_end; ++layerIt )
    {
	for( sourceIt = layerIt->begin(), source_end = layerIt->end();
	    sourceIt != source_end; ++sourceIt )
	{
	    if( !m_NodesAfterShrink[*sourceIt] )continue;
	    pGraph->GetNeighbors( *sourceIt, &numOfNbrs, &nbrs, &nbrsTypes );
	    for( nbr = nbrs, nbrs_end = nbrs + numOfNbrs; nbr != nbrs_end; ++nbr )
	    {
		if( !nodesSentMessages[*nbr] && m_NodesAfterShrink[*nbr] )
		{
		    CPotential* pPot = vPots[*nbr];
		    CPotential* cPot = vPots[*sourceIt];
		    CPotential* bigPot = pnlMultiply(pPot, cPot, GetModel()->GetModelDomain());
		    *bigPot /=  *(m_pJTree->GetSeparatorPotential(*sourceIt, *nbr));
		    m_NodesAfterShrink[*sourceIt] = false;

		    int                 numOfNbrs1;
		    const int           *nbrs1, *nbr1, *nbrs1_end;
		    const ENeighborType *nbrsTypes1;

		    pGraph->GetNeighbors( *nbr, &numOfNbrs1, &nbrs1, &nbrsTypes1 );
		    tmpV.assign(Domain, Domain+domSize);
		    for(nbr1 = nbrs1, nbrs1_end = nbrs1 + numOfNbrs1; nbr1 != nbrs1_end; ++nbr1 )
		    {
			if( !m_NodesAfterShrink[*nbr1] ) continue;
			m_pJTree->GetSeparatorDomain(*nbr, *nbr1, &sepSize, &sepDomain);
			tmpV = pnlSetUnion(sepSize, const_cast<int*>(sepDomain), tmpV.size(), &tmpV.front());
		    }
		    bigPot->GetDomain(&bigDomain);
		    tmpV = pnlIntersect(tmpV.size(), &tmpV.front(), bigDomain.size(), &bigDomain.front());
		    if( tmpV.size() < bigDomain.size() )
		    {
			tPot = bigPot->Marginalize(&tmpV.front(), tmpV.size());
			delete bigPot;
			bigPot = tPot;
		    }
		    delete vPots[*nbr];
		    vPots[*nbr] = bigPot;
		    bigPot->GetDomain(&bigDomain);
		    if( pnlIsSubset(domSize, Domain, bigDomain.size(), &bigDomain.front()) )
		    {
			CPotential* retPot = static_cast<CPotential*>(bigPot->Clone());
			for(i=0; i<numNodes; i++)
			{
			    delete vPots[i];
			}
			vPots.clear();
			m_NodesAfterShrink.clear();
			return retPot;
		    }
		}
		nodesSentMessages[*sourceIt] = true;
	    }
	}
    }
    PNL_THROW(CInternalError, "internal error");
}