コード例 #1
0
ファイル: ConnectivityGraph.cpp プロジェクト: njuhugn/rdis
void ConnectivityGraph::setAsReplacement( EdgeIP e, ETForestLevel l ) {
	assert( e->level == l );
	assert( !e->isTree );

	Vertex & u( vertices[e->vxid1] );
	Vertex & v( vertices[e->vxid2] );

	// remove from non-tree list and update weights
	removeNontreeEdge( e.get(), l );

	e->isTree = true;

//	std::cout << "adding edge " << *e << " as replacement, giving " << std::endl;

	for ( int i = 0; i <= l; ++i ) {
	 	// get the previous roots on level l
		ETNode * ru = u.ETvertices[i].loopNode->findRoot();
		ETNode * rv = v.ETvertices[i].loopNode->findRoot();

		assert( ru != rv );

		// remove the previous roots
		removeRoot( ru, i );
		removeRoot( rv, i );

		// add the edge to this level (and the forest)
		ETNode * newroot = addTreeEdge( u, v, e, i );

		// remember the new root
		insertRoot( newroot, i );
	}

//	EulerTourTree::print( u.ETvertices[0].loopNode->findRoot() );
//	std::cout << std::endl;
}
コード例 #2
0
ファイル: ConnectivityGraph.cpp プロジェクト: njuhugn/rdis
//void ConnectivityGraph::insertEdge( VariableID vid, FactorID fid ) {
void ConnectivityGraph::insertEdge( VertexID vxid1, VertexID vxid2 ) {

	assert( vxid1 != vxid2 );

	Vertex & u( vertices[vxid1] );
	Vertex & v( vertices[vxid2] );

	ETNode * ru = u.ETvertices[0].loopNode->findRoot();
	ETNode * rv = v.ETvertices[0].loopNode->findRoot();

	EdgeIP e = edgepool.get();
	e->set( /*vid, fid,*/ vxid1, vxid2, /*0,*/ 0 );

//	std::cout << "inserting/incrementing edge: " << *e << std::endl;


//#ifdef DEBUG
//	assert( !existingEdges[vxid][fxid][fid] );
//	assert( !existingEdges[fxid][vxid][fid] );
//	existingEdges[vxid][fxid].set( fid );
//	existingEdges[fxid][vxid].set( fid );
//#endif // DEBUG

//	if ( e->count == 0 ) {
//		e->set( vid, fid, vxid, fxid, 1, 0 ); // ensure level is 0

//		std::cout << "adding edge to graph: " << *e << std::endl;

		// check if they're already connected
		if ( ru == rv ) {
			// add edge to non-tree adjacency lists and update weights, which
			// correspond to edge counts
			addNontreeEdge( u, v, e, 0 );

		} else {
			e->isTree = true;

			// find and remove the two previous roots from the level 0 forest
			removeRoot( ru, 0 );
			removeRoot( rv, 0 );

			ETNode * newroot = addTreeEdge( u, v, e, 0 );

			// put the new root into the level 0 forest -- note that we use the
			// root's vertex ID as the index
			insertRoot( newroot, 0 );
		}
//	} else {
//		++e->count;
//	}
}
コード例 #3
0
taoNodeRoot* taoGroup::unlinkFixed(taoNodeRoot* root, taoNode* node)
{
#ifdef TAO_CONTROL
	if (root->getController())
		root->getController()->deleteParamTree(node);
#endif

	taoNodeRoot* r = new taoNodeRoot(*node->frameGlobal());

	node->unlink();

	if (!root->getDChild())
		delete removeRoot(root->getID());

	deFrame home;
	home.identity();

	node->link(r, &home);

	node->addABNode();

	taoDynamics::initialize(r);

	addRoot(r, -999);

	return r;
}
コード例 #4
0
ファイル: ConnectivityGraph.cpp プロジェクト: njuhugn/rdis
void ConnectivityGraph::raiseTreeEdges( ETNode * n, ETForestLevel l ) {
	assert( n->isLoop() );
	Vertex & u( vertices[n->vx1->vxid] );

	auto & list = u.adjTreeEdges[l];

	while ( !list.empty() ) {
		// get and remove the last edge (efficient in a vector)
		EdgeIP e = list.back();

		assert( e->isTree );
		assert( e->level == l );

//		removeTreeEdge( e.get(), l );

		list.pop_back();

		Vertex & v( e->vxid1 == n->vx1->vxid ? vertices[e->vxid2] :
				vertices[e->vxid1] );

		assert( EulerTourTree::connected( &u.ETvertices[l], &v.ETvertices[l] ) );

		// remove e from v's adjacency lists
		EdgeIP ev = getFromList( e->vxid1, e->vxid2, v.adjTreeEdges[l], l );
		assert( ev == e );

		u.ETvertices[l].loopNode->addWeight( -1, ETWeight::Tree );
		v.ETvertices[l].loopNode->addWeight( -1, ETWeight::Tree );

		// get the previous roots on level l+1
		ETNode * ru = u.ETvertices[l+1].loopNode->findRoot();
		ETNode * rv = v.ETvertices[l+1].loopNode->findRoot();

		assert( ru != rv );

		// remove the previous roots
		removeRoot( ru, l+1 );
		removeRoot( rv, l+1 );

		// move the edge up a level, add it to this new level (and the forest)
		e->level = l + 1;
		ETNode * newroot = addTreeEdge( u, v, e, l+1 );

		// remember the new root
		insertRoot( newroot, l+1 );
	}
}
コード例 #5
0
ファイル: tbst.cpp プロジェクト: jamesus95/Cpp
/**
 * @brief removes an entry from the TBST
 * @details removes the specified entry from the TBST if
 * it exists, and restructures the tree. Running time O(logn).
 * 
 * @param token entry value to remove
 * @return true if the entry is found and removed
 * otherwise false.
 */
bool TBST::remove(string token) {
    if (root != NULL && root->getData()->getToken() == token) {
        if(removeRoot()) {
            nodeCount--;
            return true;
        } else return false;
    } else if (root != NULL) {
        if(remove(root, token)) {
            nodeCount--;
            return true;
        } else return false;
    } else {
        return false;
    }
}
コード例 #6
0
ファイル: heapApp.c プロジェクト: pravs-naksh/CS-snippets
heap* getData(char *file){
	FILE* input_file = fopen(file,"r");
	if(input_file == NULL){
		printf("Error opening input file %s\n",file);
		exit(1);
	}
	float inputx = 0.0;
	float inputy = 0.0;	
	heap *newheap = createHeap();
	int i = 0;
	while(fscanf(input_file, "%f", &inputx) != EOF){
		fscanf(input_file, "%f", &inputy);
		data *d= createData(inputx,inputy);
		d->distance = calculateDistance(d->valx,d->valy);
		if(i>9){
			if(d->distance < newheap->root->d->distance){
				leaf *removeleaf = removeRoot(newheap);
#if DEBUG
				printf("deleted : %f and inserted : %f -- \n",removeleaf->d->distance,d->distance);
#endif
				popBack(newheap->q->ll);
				free(removeleaf->d);
				free(removeleaf);
				addLeaf(newheap,d);
			} else {
#if DEBUG			
				printf("Skipped : %f => ",d->distance);
				printf("deleting ...... \n");
#endif
				free(d);
			}
		}
		else { 	
#if DEBUG		
			printf("inserted : %f -- \n",d->distance);
#endif
			addLeaf(newheap,d);
		}
		i++;
	}
	
	fclose(input_file);
	return newheap;
}
コード例 #7
0
ファイル: ConnectivityGraph.cpp プロジェクト: njuhugn/rdis
void ConnectivityGraph::deleteEdge( EdgeIP e ) {
//	std::cout << "deleting edge " << *e <<
//			( e->isTree ? " (tree)" : " (nontree)" ) << std::endl;

//	assert( e->count == 0 );

	Vertex & u( vertices[e->vxid1] );
	Vertex & v( vertices[e->vxid2] );
	assert( EulerTourTree::connected( &u.ETvertices[0], &v.ETvertices[0] ) );

	if ( e->isTree ) {
		// cut all forests F_i, for 0 <= i <= level(e)
		for ( ETForestLevel i = e->level; i >= 0; --i ) {
			ETNode * oldroot = e->arcs[i].first->findRoot();
			assert( oldroot == e->arcs[i].second->findRoot() );

			// remove the old root from the forest
			removeRoot( oldroot, i );

			ETNode * r1 = NULL, * r2 = NULL;
			EulerTourTree::cut( e->arcs[i].first, e->arcs[i].second, &r1, &r2 );

#ifdef DEBUG
			ETNode * ru = u.ETvertices[i].loopNode->findRoot();
			ETNode * rv = v.ETvertices[i].loopNode->findRoot();
			assert( ru != rv );
			assert( ru == r1 || ru == r2 );
			assert( rv == r1 || rv == r2 );
#endif

			// put the new roots in the forest
			insertRoot( r1, i );
			insertRoot( r2, i );
		}

		// attempt to find a replacement edge
		for ( ETForestLevel i = e->level; i >= 0; --i ) {
			if ( replaceEdge( *e, i ) ) break;
		}
	}

//	delete e;
}
コード例 #8
0
ファイル: heapApp.c プロジェクト: pravs-naksh/CS-snippets
void printHeap(heap *h){
	data **listCor = (data**)malloc(sizeof(data*)*10);
	int i = 0;
	while(h->root){
		if(i>9){
			popBack(h->q->ll);
			break;
		}
		leaf *rootleaf = removeRoot(h);
		
#if DEBUG		
		printf("removing data %f at %d \n",rootleaf->d->distance,i);
#endif
		
		listCor[i] = createData(rootleaf->d->valx,rootleaf->d->valy);
		listCor[i]->distance = calculateDistance(listCor[i]->valx,listCor[i]->valy);
		
		if(h->root == rootleaf){
			free(h->root->d);
			free(h->root);
			h->root = NULL;
		} else {
			free(rootleaf->d);
			free(rootleaf);
		}

		popBack(h->q->ll);
		i++;	
	}
	
	for(i = 9;i>=0;i--){
		printf(" %.2f %.2f %.2f \n",listCor[i]->distance,listCor[i]->valx,listCor[i]->valy);
		data *d = createData(listCor[i]->valx,listCor[i]->valy);
		d->distance = calculateDistance(d->valx,d->valy);
		addLeaf(h,d);
		free(listCor[i]);
	}
	
	free(listCor);
}
コード例 #9
0
taoNodeRoot* taoGroup::unlinkFree(taoNodeRoot* root, taoNode* node, deFloat inertia, deFloat damping)
{
#ifdef TAO_CONTROL
	if (root->getController())
		root->getController()->deleteParamTree(node);
#endif

	deVector6 v = *node->velocity();
	taoNodeRoot* r = new taoNodeRoot(*node->frameGlobal());

	node->unlink();

	if (!root->getDChild())
		delete removeRoot(root->getID());

	deFrame home;
	home.identity();

	node->link(r, &home);

	taoJointDOF1* joint;

	joint = new taoJointPrismatic(TAO_AXIS_X);
	joint->setDamping(damping);
	joint->setInertia(inertia);
	joint->setDVar(new taoVarDOF1);
	joint->reset();
	joint->getVarDOF1()->_dQ = v[0][TAO_AXIS_X];
	node->addJoint(joint);

	joint = new taoJointPrismatic(TAO_AXIS_Y);
	joint->setDamping(damping);
	joint->setInertia(inertia);
	joint->setDVar(new taoVarDOF1);
	joint->reset();
	joint->getVarDOF1()->_dQ = v[0][TAO_AXIS_Y];
	node->addJoint(joint);

	joint = new taoJointPrismatic(TAO_AXIS_Z);
	joint->setDamping(damping);
	joint->setInertia(inertia);
	joint->setDVar(new taoVarDOF1);
	joint->reset();
	joint->getVarDOF1()->_dQ = v[0][TAO_AXIS_Z];
	node->addJoint(joint);

	taoJointSpherical* joint2 = new taoJointSpherical;
	joint2->setDamping(damping);
	joint2->setInertia(inertia);
	joint2->setDVar(new taoVarSpherical);
	joint2->reset();
	joint2->getVarSpherical()->_dQ = v[1];
	node->addJoint(joint2);

	node->addABNode();
	taoDynamics::initialize(r);

	addRoot(r, -999);

	return r;
}