Esempio n. 1
0
void libDHStandard<T, B, S>::GetAncestors(std::set<typename S::MPNode*>& Ancestors, typename S::MPNode* r) {
	for(typename std::vector<typename S::MsgContainer>::iterator c=r->Parents.begin(),c_e=r->Parents.end();c!=c_e;++c) {
		typename S::MPNode* ptr = c->node;
		Ancestors.insert(ptr);
		GetAncestors(Ancestors, ptr);
	}
}
Esempio n. 2
0
int main()
{
	#if 1
	AddNode(&pRoot,4);
	AddNode(&pRoot,6);
	AddNode(&pRoot,2);
	AddNode(&pRoot,3);
	AddNode(&pRoot,5);
	AddNode(&pRoot,7);
	AddNode(&pRoot,1);
	
	//SubTree

	pRootSub = getbtNode(2);
	pRootSub->left = getbtNode(1);
	pRootSub->right = getbtNode(3);//true subtree case
	//pRootSub->right = getbtNode(4);//fasle subtree case
	#else//for Sum Tree 
	pRoot = getbtNode(30);
	pRoot->left = getbtNode(10);
	pRoot->right = getbtNode(5);
	pRoot->left->left = getbtNode(6);
	pRoot->left->right = getbtNode(4);
	pRoot->right->right = getbtNode(3);
	pRoot->right->left = getbtNode(2);
		
	#endif
	
	cout<<endl<<"##########################################################################################################"<<endl;
	
	cout<<"Inorder Traversal ::"<<endl;
	Inorder(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	
	cout<<"Preorder Traversal ::"<<endl;
	
	Preorder(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	
	cout<<"Postorder Traversal ::"<<endl;
	Postorder(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	cout<<"Level Order Traversal ::"<<endl;
	LOrder(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	cout<<"Size of the Tree ::"<<endl;
	cout<<GetTreeSize(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	cout<<"Height of the Tree ::"<<endl;
	cout<<GetTreeHeight(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	#if 0
	DeleteTree(&pRoot);
	
	AddNode(&pRoot,1);
	
	cout<<"Inorder Traversal after Deletion::"<<endl;
	Inorder(pRoot);
	cout<<endl;
	#endif
		
	MirrorTree(pRoot);	
	cout<<"Inorder Traversal after MirrorTree operation::"<<endl;
	Inorder(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	
	MirrorTree(pRoot);
	cout<<"Inorder Traversal after MirrorTree operation for second time::"<<endl;
	Inorder(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	cout<<"Max Element of the Tree ::"<<endl;
	cout<<MaxTreeElement(pRoot);
	cout<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	
	int path[7];
	cout<<"Root To Leaf Paths ::"<<endl;
	RootToLeafPath(pRoot,path,0);
	cout<<endl<<"##########################################################################################################"<<endl;
	cout<<"Number of Leaf Nodes::"<<NumberOfLeafNodes(pRoot)<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	
	cout<<"Ancestors of 7 are ::"<<endl;
	GetAncestors(pRoot,7);
	cout<<endl;

	cout<<endl<<"##########################################################################################################"<<endl;
	
	cout<<"CheckSumTree ::"<<IsSumTree(pRoot)<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	
	cout<<endl<<"Lowest Common Ancestor of 1 and 3 ::"<<LCA(pRoot,1,3)->data<<endl;
	cout<<endl<<"Lowest Common Ancestor of 1 and 7 ::"<<LCA(pRoot,1,7)->data<<endl;
	cout<<endl<<"Lowest Common Ancestor of 4 and 6 ::"<<LCA(pRoot,4,6)->data<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	cout<<endl<<"Tree has Path Sum 9 ::"<<hasPathSum(pRoot,9)<<endl;
	cout<<endl<<"Tree has Path Sum 100 ::"<<hasPathSum(pRoot,100)<<endl;
	cout<<endl<<"Tree has Path Sum 15 ::"<<hasPathSum(pRoot,15)<<endl;
	cout<<endl<<"##########################################################################################################"<<endl;
	
	cout<<endl<<"Subtree ::"<<IsSubTree(pRoot,pRootSub)<<endl;
	
	cout<<endl<<"##########################################################################################################"<<endl;
	return 0;
}
Esempio n. 3
0
int libDHStandard<T, B, S>::Marginalize(std::vector<GRAPH_TYPE>* graph) {
	ObservedEmpiricalMean.assign(NumFeatures, T(0.0));

	phi->x->assign(graph->size(), GRAPH_TYPE());
	for(size_t x=0,x_e=graph->size();x!=x_e;++x) {
		std::vector<size_t>* y_x = &y->at(x);

		std::map<typename S::MPNode*,typename S::MPNode*> OriginalRegion2NewRegion;
		std::vector<std::pair<std::set<size_t>,typename S::MPNode*> > VariableIXs2Node;

		GRAPH_TYPE* ptr = &graph->at(x);
		GRAPH_TYPE* ptrH = &phi->x->at(x);
		for(typename GRAPH_TYPE::iterator rit=ptr->begin(),rit_e=ptr->end();rit!=rit_e;++rit) {
			typename S::MPNode* r = *rit;

			size_t pos = 0;
			size_t numLatent = 0;
			for(size_t v=0,v_e=r->num_variables;v!=v_e;++v) {
				size_t x_v = (*y_x)[r->var_ix[v]];
				if(x_v==size_t(-1)) {
					++numLatent;
				} else {
					pos += x_v*r->cum_num_states[v];
				}
			}

			if(numLatent==0) {
				for(size_t k=0,k_e=r->featureIDs.size();k!=k_e;++k) {
					ObservedEmpiricalMean[r->featureIDs[k]] += (*r->potOrig[k])[pos];
				}
			} else {
				std::set<size_t> varIXset;
				for(size_t v=0,v_e=r->num_variables;v!=v_e;++v) {
					size_t x_v = (*y_x)[r->var_ix[v]];
					if(x_v==size_t(-1)) {
						varIXset.insert(r->var_ix[v]);
					}
				}
				typename S::MPNode* ExistingNode = NULL;
				for(typename std::vector<std::pair<std::set<size_t>,typename S::MPNode*> >::iterator xs=VariableIXs2Node.begin(),xs_e=VariableIXs2Node.end();xs!=xs_e;++xs) {
					if(xs->first.size()==varIXset.size()) {
						std::set<size_t> res;
						std::set_difference(xs->first.begin(),xs->first.end(),varIXset.begin(),varIXset.end(),std::inserter(res,res.end()));
						if(res.size()==0) {
							ExistingNode = xs->second;
							break;
						}
					}
				}

				if(ExistingNode==NULL) {
					typename S::MPNode* tmp = new typename S::MPNode;
					OriginalRegion2NewRegion[r] = tmp;
					VariableIXs2Node.push_back(std::make_pair<std::set<size_t>,typename S::MPNode*>(varIXset,tmp));

					tmp->num_variables = numLatent;
					tmp->flag = r->flag;
					tmp->c_r = -std::numeric_limits<T>::max();
					tmp->SR = NULL;

					tmp->num_states = new size_t[numLatent];
					tmp->cum_num_states = new size_t[numLatent+1];tmp->cum_num_states[0] = 1;
					tmp->var_ix = new size_t[numLatent];
					size_t* multiplier = new size_t[numLatent];

					size_t cnt = 0;
					for(size_t v=0,v_e=r->num_variables;v!=v_e;++v) {
						size_t x_v = (*y_x)[r->var_ix[v]];
						if(x_v==size_t(-1)) {
							multiplier[cnt] = r->cum_num_states[v];
							tmp->num_states[cnt] = r->num_states[v];
							tmp->var_ix[cnt] = r->var_ix[v];
							tmp->cum_num_states[cnt+1] = tmp->cum_num_states[cnt]*r->num_states[v];
							++cnt;
						}
					}

					size_t potSize = tmp->cum_num_states[tmp->num_variables];
					tmp->pot = new typename S::Data;
					tmp->loss = NULL;

					size_t numFeatures = r->featureIDs.size();
					tmp->featureIDs = r->featureIDs;
					tmp->potOrig.assign(numFeatures, NULL);
					for(size_t r_=0;r_<numFeatures;++r_) {
						tmp->potOrig[r_] = new typename S::Data;
						T* buf = new T[potSize];
						typename S::Data* oldbuf = r->potOrig[r_];
						for(size_t x_v=0;x_v!=potSize;++x_v) {
							size_t oldPos = pos;
							for(size_t v=0,v_e=tmp->num_variables;v!=v_e;++v) {
								oldPos += ((x_v/tmp->cum_num_states[v])%tmp->num_states[v]) * multiplier[v];
							}

							buf[x_v] = (*oldbuf)[oldPos];
						}
						tmp->potOrig[r_]->ResetDataNew(buf,potSize,true,true);
					}

					delete [] multiplier;

					ptrH->push_back(tmp);
				} else {
					OriginalRegion2NewRegion[r] = ExistingNode;

					size_t* num_states = new size_t[numLatent];
					size_t* cum_num_states = new size_t[numLatent+1];cum_num_states[0] = 1;
					size_t* var_ix = new size_t[numLatent];
					size_t* multiplier = new size_t[numLatent];

					size_t cnt = 0;
					for(size_t v=0,v_e=r->num_variables;v!=v_e;++v) {
						size_t x_v = (*y_x)[r->var_ix[v]];
						if(x_v==size_t(-1)) {
							multiplier[cnt] = r->cum_num_states[v];
							num_states[cnt] = r->num_states[v];
							var_ix[cnt] = r->var_ix[v];
							cum_num_states[cnt+1] = cum_num_states[cnt]*r->num_states[v];
							++cnt;
						}
					}

					size_t potSize = cum_num_states[numLatent];
					size_t numFeatures = r->featureIDs.size();
					for(size_t r_=0;r_<numFeatures;++r_) {
						std::vector<size_t>::iterator rFound = std::find(ExistingNode->featureIDs.begin(), ExistingNode->featureIDs.end(), r->featureIDs[r_]);

						size_t r_tmp;
						if(rFound==ExistingNode->featureIDs.end()) {
							r_tmp = ExistingNode->featureIDs.size();
							ExistingNode->featureIDs.push_back(r->featureIDs[r_]);
							typename S::Data* buf = new typename S::Data;
							//T* bufbuf = new T[potSize];
							//std::fill(bufbuf,bufbuf+potSize, T(0.0));
							//buf->ResetDataNew(bufbuf,potSize,true,true);
							buf->ResetDataNew((T*)NULL,(size_t*)NULL,0,true);
							ExistingNode->potOrig.push_back(buf);
						} else {
							r_tmp = rFound-ExistingNode->featureIDs.begin();
						}

						T* NewDataVec = new T[potSize];
						typename S::Data* buf = ExistingNode->potOrig[r_tmp];
						typename S::Data* oldbuf = r->potOrig[r_];

						for(size_t x_v=0;x_v!=potSize;++x_v) {
							size_t oldPos = pos;
							std::map<size_t,size_t> VarStates;
							for(size_t v=0;v!=numLatent;++v) {
								size_t buf = (x_v/cum_num_states[v])%num_states[v];
								VarStates[var_ix[v]] = buf;
								oldPos += buf * multiplier[v];
							}

							size_t newPos = 0;
							for(size_t v=0;v!=numLatent;++v) {
								newPos += VarStates[ExistingNode->var_ix[v]]*ExistingNode->cum_num_states[v];
							}

							NewDataVec[newPos] = (*buf)[newPos] + (*oldbuf)[oldPos];
						}
						buf->ResetDataNew(NewDataVec, potSize, true, true);
					}

					delete [] num_states;
					delete [] cum_num_states;
					delete [] var_ix;
					delete [] multiplier;
				}
			}
		}

		for(typename GRAPH_TYPE::iterator rit=ptr->begin(),rit_e=ptr->end();rit!=rit_e;++rit) {
			typename S::MPNode* r = *rit;
			typename std::map<typename S::MPNode*,typename S::MPNode*>::iterator res = OriginalRegion2NewRegion.find(r);
			if(res!=OriginalRegion2NewRegion.end()) {
				size_t potSize = res->second->cum_num_states[res->second->num_variables];
				for(typename std::vector<typename S::MsgContainer>::iterator p=r->Parents.begin(),p_e=r->Parents.end();p!=p_e;++p) {
					typename std::map<typename S::MPNode*,typename S::MPNode*>::iterator res_p = OriginalRegion2NewRegion.find(p->node);
					assert(res_p!=OriginalRegion2NewRegion.end());

					if(res_p->second!=res->second) {
						typename S::MsgContainer ptmp;
						ptmp.node = res_p->second;
						ptmp.lambda = new T[potSize];
						memset(ptmp.lambda, 0, sizeof(T)*potSize);
						res->second->Parents.push_back(ptmp);

						typename S::MsgContainer ctmp;
						ctmp.node = res->second;
						ctmp.lambda = ptmp.lambda;
						res_p->second->Childs.push_back(ctmp);
					}
				}
			}
		}

		if(DHParams->BetheCountingNumbers>0) {
			bool AllRegionsAssigned = false;
			while(!AllRegionsAssigned) {
				AllRegionsAssigned = true;
				for(typename GRAPH_TYPE::iterator rit=ptrH->begin(),rit_e=ptrH->end();rit!=rit_e;++rit) {
					typename S::MPNode* r = *rit;

					if(r->c_r!=-std::numeric_limits<T>::max()) {
						continue;
					}

					std::set<typename S::MPNode*> Ancestors;
					GetAncestors(Ancestors, r);

					bool allAncestorsAssigned = true;
					T ancestorSum = T(0.0);
					for(typename std::set<typename S::MPNode*>::iterator ac=Ancestors.begin(),ac_e=Ancestors.end();ac!=ac_e;++ac) {
						typename S::MPNode* ptr = *ac;
						if(ptr->c_r==-std::numeric_limits<T>::max()) {
							allAncestorsAssigned = false;
							break;
						}
						ancestorSum += ptr->c_r;
					}

					if(allAncestorsAssigned) {
						r->c_r = T(1.0) - ancestorSum;
					} else {
						AllRegionsAssigned = false;
					}
				}
			}
		} else {
			for(typename GRAPH_TYPE::iterator rit=ptrH->begin(),rit_e=ptrH->end();rit!=rit_e;++rit) {
				typename S::MPNode* r = *rit;
				r->c_r = T(1.0);
			}
		}
	}
	return 0;
}