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"); }