Exemple #1
0
static void fh_dump(struct fibheap *a, Edge **res)
{
    int i;
    int n = a->fh_n;
    for (i=n-1; i>=0; i--)
        res[i] = (Edge *) fh_extractmin(a);
}
Exemple #2
0
int main(void)
{
  
    struct fibheap *a;
    void *arr[10];
    int i;

    a = fh_makekeyheap();
	
    for (i=1 ; i < 8 ; i++)
     {
      arr[i]= fh_insertkey(a,0,(void *)i);
      printf("adding: 0 %d \n",i);
     }
     
     printf(" \n");

     fh_replacekey(a, arr[1],-2);
     fh_replacekey(a, arr[4],-3);
     fh_replacekey(a, arr[7],-5);
	  
     printf("Wert(minkey) %d\n",fh_minkey(a));
     printf("Knoten: %d\n\n", (int)fh_extractmin(a)); 
        
     fh_replacekey(a, arr[3],-2);
     fh_replacekey(a, arr[6],-1);
	
     printf("Wert(minkey) %d\n",fh_minkey(a));
     printf("Knoten: %d\n\n", (int)fh_extractmin(a));
	
     fh_replacekey(a, arr[1],-9);
     fh_replacekey(a, arr[5],-3);

     printf("Wert(minkey) %d\n",fh_minkey(a));
     printf("Knoten: %d\n\n", (int)fh_extractmin(a));

     fh_replacekey(a, arr[2],-4);
     fh_replacekey(a, arr[5],-5);
     fh_replacekey(a, arr[6],-3);
        	
     printf("Wert(minkey) %d\n",fh_minkey(a));
     printf("Knoten: %d\n\n", (int)fh_extractmin(a));

     fh_replacekey(a, arr[2],-6);
     fh_replacekey(a, arr[6],-6);

     printf("Wert(minkey) %d\n",fh_minkey(a));
     printf("Knoten: %d\n\n", (int)fh_extractmin(a));

     printf("Wert(minkey) %d\n",fh_minkey(a));
     printf("Knoten: %d\n\n", (int)fh_extractmin(a));

     printf("Wert(minkey) %d\n",fh_minkey(a));
     printf("Knoten: %d\n\n", (int)fh_extractmin(a));
       	
     fh_deleteheap(a);

	return 0;
}
Exemple #3
0
static void admitNewWiggleIteratorsIntoPlay(Multiplexer * multi) {
	while (fh_notempty(multi->starts) && fh_min(multi->starts) == multi->start) {
		int index = fh_extractmin(multi->starts);
		WiggleIterator * wi = multi->iters[index];
		fh_insert(multi->finishes, wi->finish, index);
		multi->inplay[index] = true;
		multi->values[index] = wi->value;
		multi->inplay_count++;
	}
}
Exemple #4
0
static void popClosingWiggleIterators(Multiplexer * multi) {
	while (fh_notempty(multi->finishes) && fh_min(multi->finishes) == multi->finish) {
		int index = fh_extractmin(multi->finishes);
		WiggleIterator * wi = multi->iters[index];
		pop(wi);
		multi->inplay[index] = false;
		multi->inplay_count--;
		multi->values[index] = wi->default_value;
		if (!wi->done && !strcmp(wi->chrom, multi->chrom))
			fh_insert(multi->starts, wi->start, index);
	}
}
Exemple #5
0
/* Maintain a fixed size heap */
static void fh_insert_fixed(struct fibheap *a, Edge *i, Edge **cur_min)
{
     if (a->fh_n < HEAP_SIZE) 
     {
         fh_insert(a, (void *)i);
     }
     else
     {
         if (edge_cmpr(cur_min, i) < 0)
         {
            /* Remove least value and renew */
            fh_extractmin(a);
            fh_insert(a, (void *)i);
            /* Keep a memory of the current min */
            *cur_min = (Edge *)fh_min(a);
         }
     }
}
Exemple #6
0
// Removes the node with the shortest key, then returns it.
struct node_st *removeNextNodeFromHeap(FibHeap * heap)
{
	return (struct node_st *) fh_extractmin(heap);
}
Exemple #7
0
// Removes the node with the shortest key, then returns it.
unsigned int removeNextNodeFromHeap ( FibHeap * heap )
{
	return ( unsigned int ) fh_extractmin ( heap );
}
void perform_front_propagation_2d(T_callback_intert_node callback_insert_node)
{
	// create the Fibonacci heap
	struct fibheap* open_heap = fh_makeheap();
	fh_setcmp(open_heap, compare_points);

	double h = 1.0/n;
	
	// initialize points
	for( int i=0; i<n; ++i )
	for( int j=0; j<p; ++j )
	{
		D_(i,j) = GW_INFINITE;
		S_(i,j) = kFar;
		Q_(i,j) = -1;
	}

	// record all the points
	heap_pool = new fibheap_el*[n*p]; 
	memset( heap_pool, NULL, n*p*sizeof(fibheap_el*) );

	// inialize open list
	point_list existing_points;
	for( int k=0; k<nb_start_points; ++k )
	{
		int i = (int) start_points_(0,k);
		int j = (int) start_points_(1,k);

		if( D_( i,j )==0 )
			ERROR_MSG("start_points should not contain duplicates.");

		point* pt = new point( i,j );
		existing_points.push_back( pt );			// for deleting at the end
		heap_pool_(i,j) = fh_insert( open_heap, pt );			// add to heap
		if( values==NULL ) 
			D_( i,j ) = 0;
		else
			D_( i,j ) = values[k];
		S_( i,j ) = kOpen;
		Q_(i,j) = k;
	}

	// perform the front propagation
	int num_iter = 0;
	bool stop_iteration = GW_False;
	while( !fh_isempty(open_heap) && num_iter<nb_iter_max && !stop_iteration )
	{
		num_iter++;

		// current point
		point& cur_point = * ((point*) fh_extractmin( open_heap ));
		int i = cur_point.i;
		int j = cur_point.j;
		heap_pool_(i,j) = NULL;
		S_(i,j) = kDead;
		stop_iteration = end_points_reached(i,j);
		
		/*
		char msg[200];
		sprintf(msg, "Cool %f", Q_(i,j) );
		WARN_MSG( msg ); 
		*/
		
		CHECK_HEAP;

		// recurse on each neighbor
		int nei_i[4] = {i+1,i,i-1,i};
		int nei_j[4] = {j,j+1,j,j-1};
		for( int k=0; k<4; ++k )
		{
			int ii = nei_i[k];
			int jj = nei_j[k];
			bool bInsert = true;
			if( callback_insert_node!=NULL )
				bInsert = callback_insert_node(i,j,ii,jj);
			// check that the contraint distance map is ok
			if( ii>=0 && jj>=0 && ii<n && jj<p && bInsert )
			{
				double P = h/W_(ii,jj);
				// compute its neighboring values
				double a1 = GW_INFINITE;
				int k1 = -1;
				if( ii<n-1 )
				{
					bool bParticipate = true;
					if( callback_insert_node!=NULL )
						bParticipate = callback_insert_node(ii,jj,ii+1,jj);
					if( bParticipate )
					{
						a1 = D_(ii+1,jj);
						k1 = Q_(ii+1,jj);
					}
				}
				if( ii>0 )
				{
					bool bParticipate = true;
					if( callback_insert_node!=NULL )
						bParticipate = callback_insert_node(ii,jj,ii-1,jj);
					if( bParticipate )
					{
						if( D_(ii-1,jj)<a1 )
							k1 = Q_(ii-1,jj);
						a1 = GW_MIN( a1, D_(ii-1,jj) );
					}
				}
				double a2 = GW_INFINITE;
				int k2 = -1;
				if( jj<p-1 )
				{

					bool bParticipate = true;
					if( callback_insert_node!=NULL )
						bParticipate = callback_insert_node(ii,jj,ii,jj+1);
					if( bParticipate )
					{
						a2 = D_(ii,jj+1);
						k2 = Q_(ii,jj+1);
					}
				}
				if( jj>0 )
				{
					bool bParticipate = true;
					if( callback_insert_node!=NULL )
						bParticipate = callback_insert_node(ii,jj,ii,jj-1);
					if( bParticipate )
					{
						if( D_(ii,jj-1)<a2 )
							k2 = Q_(ii,jj-1);
						a2 = GW_MIN( a2, D_(ii,jj-1) );
					}
				}
				if( a1>a2 )	// swap so that a1<a2
				{
					double tmp = a1; a1 = a2; a2 = tmp;
					int tmpi = k1; k1 = k2; k2 = tmpi;
				}
				// update its distance
				// now the equation is   (a-a1)^2+(a-a2)^2 = P, with a >= a2 >= a1.
				double A1 = 0;
				if( P*P > (a2-a1)*(a2-a1) )
				{
					double delta = 2*P*P-(a2-a1)*(a2-a1);
					A1 = (a1+a2+sqrt(delta))/2.0;
				}
				else
					A1 = a1 + P;
				if( ((int) S_(ii,jj)) == kDead )
				{
					// check if action has change. Should not happen for FM
					// if( A1<D_(ii,jj) )
					//	WARN_MSG("The update is not monotone");
#if 1
					if( A1<D_(ii,jj) )	// should not happen for FM
					{
						D_(ii,jj) = A1;
						// update the value of the closest starting point
						//if( GW_ABS(a1-A1)<GW_ABS(a2-A1) && k1>=0  )
							Q_(ii,jj) = k1;
						//else
						//	Q_(ii,jj) = k2;
						//Q_(ii,jj) = Q_(i,j);
					}
#endif
				}
				else if( ((int) S_(ii,jj)) == kOpen )
				{
					// check if action has change.
					if( A1<D_(ii,jj) )
					{
						D_(ii,jj) = A1;
						// update the value of the closest starting point
						//if( GW_ABS(a1-A1)<GW_ABS(a2-A1) && k1>=0  )
							Q_(ii,jj) = k1;
						//else
						//	Q_(ii,jj) = k2;
						//Q_(ii,jj) = Q_(i,j);
						// Modify the value in the heap
						fibheap_el* cur_el = heap_pool_(ii,jj);
						if( cur_el!=NULL )
							fh_replacedata( open_heap, cur_el, cur_el->fhe_data );	// use same data for update
						else
							ERROR_MSG("Error in heap pool allocation."); 
					}
				}
				else if( ((int) S_(ii,jj)) == kFar )
				{
					if( D_(ii,jj)!=GW_INFINITE )
						ERROR_MSG("Distance must be initialized to Inf");
					if( L==NULL || A1<=L_(ii,jj) )
					{
						S_(ii,jj) = kOpen;
						// distance must have change.
						D_(ii,jj) = A1;
						// update the value of the closest starting point
						//if( GW_ABS(a1-A1)<GW_ABS(a2-A1) && k1>=0 )
							Q_(ii,jj) = k1;
						//else
						//	Q_(ii,jj) = k2;
						//Q_(ii,jj) = Q_(i,j);
						// add to open list
						point* pt = new point(ii,jj);
						existing_points.push_back( pt );
						heap_pool_(ii,jj) = fh_insert( open_heap, pt );			// add to heap	
					}
				}
				else 
					ERROR_MSG("Unkwnown state."); 
					
			}	// end switch
		}		// end for
	}			// end while

//				char msg[200];
//				sprintf(msg, "Cool %f", Q_(100,100) );
//				 WARN_MSG( msg ); 

	// free heap
	fh_deleteheap(open_heap);
	// free point pool
	for( point_list::iterator it = existing_points.begin(); it!=existing_points.end(); ++it )
		GW_DELETE( *it );
	// free fibheap pool
	GW_DELETEARRAY(heap_pool);
}
Exemple #9
0
int
main(void)
{
#if !TESTCASE
	struct fibheap_el *w;
#else
	int e, j, k;
#endif
	struct fibheap *a;
	int i, x;

	a = fh_makeheap();
	fh_setcmp(a, cmp);

	srandom(time(NULL));
#if TESTCASE
#if VERBOSE
	printf("inserting: ");
#endif
	e = 0;
	for (i = 0; i < COUNT; i++) {
#if VERBOSE
		if (i)
			printf(", ");
#endif
		fh_insert(a, (void *)(x = random()/10));
#if VERBOSE
		printf("%d", x);
#endif
		if (i - e > DIF) {
			k = random() % MAXEXT;
			for (j = 0; j < k; j++, e++)
				printf("throwing: %d\n", (int)fh_extractmin(a));
		}
	}

#if VERBOSE
	printf("\nremaining: %d\n", COUNT - e);
	printf("extracting: ");
#endif
	for (i = 0; i < COUNT - e; i++) {
#if VERBOSE
		if (i)
			printf(", ");
		printf("%d", (int)fh_extractmin(a));
#else
		fh_extractmin(a);
#endif
	}
#if VERBOSE
	printf("\n");
#endif
	if ((int)fh_extractmin(a) == 0)
		printf("heap empty!\n");
	else {
		printf("heap not empty! ERROR!\n");
		exit(1);
	}
#else
	w = fh_insert(a, (void *)6);
	printf("adding: %d\n", 6);
	fh_insert(a, (void *)9);
	printf("adding: %d\n", 9);
	fh_insert(a, (void *)1);
	printf("adding: %d\n", 1);
	for(i = 0; i < 5; i++) {
		x = random()/10000;
		printf("adding: %d\n", x);
		fh_insert(a, (void *)x);
	}
	fh_insert(a, (void *)4);
	printf("adding: %d\n", 4);
	fh_insert(a, (void *)8);
	printf("adding: %d\n", 8);
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("deleting: %d\n", (int)fh_delete(a, w));
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("first: %d\n", (int)fh_extractmin(a));
	for(i = 0; i < 5; i++) {
		x = random()/10000;
		printf("adding: %d\n", x);
		fh_insert(a, (void *)x);
	}
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("first: %d\n", (int)fh_extractmin(a));
	printf("first: %d\n", (int)fh_extractmin(a));
#endif

	fh_deleteheap(a);

	return 0;
}
Exemple #10
0
int
main(void) {
	struct fibheap *a;
	void *arr[10];
	int i;
	a = fh_makekeyheap();
	
	for (i=1 ; i < 10 ; i++)
	  {
              arr[i]= fh_insertkey(a,0,int_to_pointer(i));
	      printf("adding: 0 %d \n",i);
	  }
     
	printf(" \n");
	 fh_replacekey(a, arr[1],-38);
         fh_replacekey(a, arr[7],-34);
  
        printf("wert(minkey) %d\n",fh_minkey(a));
	printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
	 fh_replacekey(a, arr[2],-55);
         fh_replacekey(a, arr[5],-56);
        printf("Wert(minkey) %d\n",fh_minkey(a));
        printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
	
	 fh_replacekey(a, arr[4],-1);
         fh_replacekey(a, arr[2],-102);
	 fh_replacekey(a, arr[6],-1);
         fh_replacekey(a, arr[9],-1);
	 fh_replacekey(a, arr[8],-4);
        printf("Wert(minkey) %d\n",fh_minkey(a));
        printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
	 fh_replacekey(a, arr[3],-74);
         fh_replacekey(a, arr[8],-55);
	 fh_replacekey(a, arr[4],-2);
        	
        printf("Wert(minkey) %d\n",fh_minkey(a));
	printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
	 fh_replacekey(a, arr[4],-3);
         fh_replacekey(a, arr[6],-2);
         fh_replacekey(a, arr[7],-99);
        printf("Wert(minkey) %d\n",fh_minkey(a));
	printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
	 fh_replacekey(a, arr[6],-3);
         fh_replacekey(a, arr[4],-4);
	 fh_replacekey(a, arr[8],-94);
         fh_replacekey(a, arr[9],-2);
        printf("Wert(minkey) %d\n",fh_minkey(a));
	printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
        fh_replacekey(a, arr[6],-4);
	
        printf("Wert(minkey) %d\n",fh_minkey(a));
	printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
	
        printf("Wert(minkey) %d\n",fh_minkey(a));
        printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
	/*fh_replacekey(a, arr[9],-3);*/
        printf("Wert(minkey) %d\n",fh_minkey(a));
	printf("Knoten: %lld\n\n", pointer_to_ll(fh_extractmin(a)));
     
        /*fh_replacekey(a, arr[9],-49);*/
 
	fh_deleteheap(a);

	return 0;
}
Exemple #11
0
int main(void)
{
	struct fibheap *a;
	void *arr[10];
	int i;

	a = fh_makekeyheap();
	
	for (i=1 ; i < 10 ; i++)
	  {
              arr[i]= fh_insertkey(a,0,(void *)i);
	      printf("adding: 0 %d \n",i);
	  }
     
	printf(" \n");
	 fh_replacekey(a, arr[1],-1);
         fh_replacekey(a, arr[6],-1);
	 fh_replacekey(a, arr[4],-1);
         fh_replacekey(a, arr[2],-1); 
         fh_replacekey(a, arr[8],-1); 
	  
        printf("value(minkey) %d\n",fh_minkey(a));
	printf("id: %d\n\n", (int)fh_extractmin(a));          
     
	 fh_replacekey(a, arr[7],-33);
/* -> node 7 becomes root node, but is still pointed to by node 6 */
         fh_replacekey(a, arr[4],-36);
	 fh_replacekey(a, arr[3],-1);
         fh_replacekey(a, arr[9],-81); 	
	
        printf("value(minkey) %d\n",fh_minkey(a));
        printf("id: %d\n\n", (int)fh_extractmin(a));
	
	 fh_replacekey(a, arr[6],-68);
         fh_replacekey(a, arr[2],-69);

        printf("value(minkey) %d\n",fh_minkey(a));
        printf("id: %d\n\n", (int)fh_extractmin(a));

	 fh_replacekey(a, arr[1],-52);
         fh_replacekey(a, arr[3],-2);
	 fh_replacekey(a, arr[4],-120);
         fh_replacekey(a, arr[5],-48); 	

        printf("value(minkey) %d\n",fh_minkey(a));
	printf("id: %d\n\n", (int)fh_extractmin(a));

	 fh_replacekey(a, arr[3],-3);
         fh_replacekey(a, arr[5],-63);

        printf("value(minkey) %d\n",fh_minkey(a));
	printf("id: %d\n\n", (int)fh_extractmin(a));

	 fh_replacekey(a, arr[5],-110);
         fh_replacekey(a, arr[7],-115);

        printf("value(minkey) %d\n",fh_minkey(a));
	printf("id: %d\n\n", (int)fh_extractmin(a));

         fh_replacekey(a, arr[5],-188);

        printf("value(minkey) %d\n",fh_minkey(a));
	printf("id: %d\n\n", (int)fh_extractmin(a));

         fh_replacekey(a, arr[3],-4);

        printf("value(minkey) %d\n",fh_minkey(a));
	printf("id: %d\n\n", (int)fh_extractmin(a));
	
        printf("value(minkey) %d\n",fh_minkey(a));
        printf("id: %d\n\n", (int)fh_extractmin(a));

	fh_deleteheap(a);

	return 0;
}
void perform_dijkstra_propagation(T_callback_insert_node callback_insert_node = NULL)
{
	// create the Fibonacci heap
	struct fibheap* open_heap = fh_makeheap();
	fh_setcmp(open_heap, compare_points);

	// initialize points
	for( int i=0; i<n; ++i )
	{
		D[i] = GW_INFINITE;
		S[i] = kFar;
	}

	// record all the points
	heap_pool = new fibheap_el*[n]; 
	memset( heap_pool, NULL, n*sizeof(fibheap_el*) );

	// inialize open list
	for( int k=0; k<nb_start_points; ++k )
	{
		int i = (int) start_points[k];

		if( D[i]==0 )
			mexErrMsgTxt("start_points should not contain duplicates.");

		heap_pool[i] = fh_insert( open_heap, (void*) i );			// add to heap
		D[i] = 0;
		S[i] = kOpen;
	}

	// perform the front propagation
	int num_iter = 0;
	bool stop_iteration = GW_False;
	while( !fh_isempty(open_heap) && num_iter<nb_iter_max && !stop_iteration )
	{
		num_iter++;

		// current point
		int i = (int) fh_extractmin( open_heap );
		heap_pool[i] = NULL;
		S[i] = kDead;
		stop_iteration = end_points_reached(i);

		CHECK_HEAP;

        // index in   irs[jcs[k]]...irs[jcs[k+1]-1] are the node connected to node k
        // values are W[jcs[k]]...W[jcs[k]-1]
		// recurse on each neighbor of i
		for( int k=jcs[i]; k<jcs[i+1]; ++k )
		{
			int ii = irs[k];
            double P = W[k]; // graph weight

			bool bInsert = true;
			if( callback_insert_node!=NULL )
				bInsert = callback_insert_node(ii,ii);
			if( ii>=0 && ii<n && bInsert )
			{
				// compute its neighboring values
				double a1 = D[i] + P;

				if( ((int) S[ii]) == kDead )
				{
					// check if action has change. Should not happen for Dijkstra
					if( a1<D[ii] )
					    mexWarnMsgTxt("The update is not monotone");
#if 1
					if( a1<D[ii] )	// should not happen for FM
						D[ii] = a1;
#endif
				}
				else if( ((int) S[ii]) == kOpen )
				{
					// check if action has change.
					if( a1<D[ii] )
					{
						D[ii] = a1;
						// Modify the value in the heap
						fibheap_el* cur_el = heap_pool[ii];
						if( cur_el!=NULL )
							fh_replacedata( open_heap, cur_el, cur_el->fhe_data );	// use same data for update
						else
							mexErrMsgTxt("Error in heap pool allocation."); 
					}
				}
				else if( ((int) S[ii]) == kFar )
				{
					if( D[ii]!=GW_INFINITE )
						mexErrMsgTxt("Distance must be initialized to Inf");  
					S[ii] = kOpen;
					// distance must have change.
					D[ii] = a1;
					// add to open list
					heap_pool[ii] = fh_insert( open_heap, (void*) ii );			// add to heap	
				}
				else 
					mexErrMsgTxt("Unkwnown state."); 
			}	// end switch
		}		// end for
	}			// end while


	// free heap
	fh_deleteheap(open_heap);
	// free fibheap pool
	GW_DELETEARRAY(heap_pool);
}