コード例 #1
0
ファイル: ta_distance_map.c プロジェクト: rcortini/dna_ode
int calculate_distance_map (trajectory_frame *frame, void *p) {
  unsigned int i, j;
  unsigned int *nbodies = (unsigned int *) p;
  distance_map *map = distance_map_alloc (*nbodies);

  /* assign distance map to frame data */
  frame->data = map;

  /* calculate the distance map */
  for (i=0; i<*nbodies; i++) {
    for (j=i+1; j<*nbodies; j++) {
      /* calculate the distance vector */
      t_vector diff;
      vector_diff (diff,
	  frame->body_i_state [i].r,
	  frame->body_i_state [j].r);

      /* set the distance map */
      set_distance_ij (i, j, vector_norm (diff), map);
    }
  }
  
  /* print distance map for each frame */
  print_distance_map (map);

  return LOAD_TRAJ_FRAME_SUCCESS;
}
コード例 #2
0
ファイル: integrators.c プロジェクト: mcmaniac/compopraktikum
void verlet(const data* dat, output_function output)
{
  int i;
  const double dt = dat->eta * delta_t_factor; // konstant

  vector *a    = (vector*) malloc((dat->N)*sizeof(vector)),
         *a_1 = (vector*) malloc((dat->N)*sizeof(vector)),
         *r_p  = (vector*) malloc((dat->N)*sizeof(vector)), // r_(n-1), not initialized
         *r    = init_r(dat),                               // r_(n)
         *r_n  = (vector*) malloc((dat->N)*sizeof(vector)), // r_(n+1), not initialized
         *v    = init_v(dat);                               // v_(n)

  double time = 0;
  output(time, dt, dat, r, v);

  // set initial data
  accelerations(dat, r, a); // a_0
  adots(dat, r, v, a_1);
  for (i = 0; i < dat->N; i++)
  {
    // set r_(-1)
    r_p[i] = vector_add(r[i],
             vector_add(scalar_mult(dt, v[i]),
                        scalar_mult(0.5 * dt * dt, a[i])));
    // set r_1
    r_n[i] = vector_add(scalar_mult(2, r[i]),
             vector_add(scalar_mult(-1, r_p[i]),
                        scalar_mult(dt * dt, a[i])));
  }
  //time += dt;

  // regular timesteps
  while (time < dat->t_max)
  {
    accelerations(dat, r_n, a); // a_n+1 (gets shifted to a_n)
    for (i = 0; i < dat->N; i++)
    {
      // shift indexes n+1 -> n
      r_p[i] = r[i];
      r[i]   = r_n[i];
      r_n[i] = vector_add(scalar_mult(2, r[i]),
               vector_add(scalar_mult(-1, r_p[i]),
                          scalar_mult(dt * dt, a[i])));
      v[i] = scalar_mult(0.5 / dt, vector_diff(r_n[i], r_p[i]));
    }
    adots(dat, r, v, a_1);
    time += dt;
    output(time, dt, dat, r, v);
  }
  free(a); free(r_p); free(r); free(r_n); free(v);
}
コード例 #3
0
ファイル: graph-analysis.c プロジェクト: lccanon/ggen
igraph_vector_t * ggen_analyze_longest_antichain(igraph_t *g)
{
	/* The following steps are implemented :
	 *  - Convert our DAG to a specific bipartite graph B
	 *  - solve maximum matching on B
	 *  - conver maximum matching to min vectex cover
	 *  - convert min vertex cover to antichain on G
	 */
	int err;
	unsigned long i,vg,found,added;
	igraph_t b,gstar;
	igraph_vector_t edges,*res = NULL;
	igraph_vector_t c,s,t,todo,n,next,l,r;
	igraph_eit_t eit;
	igraph_es_t es;
	igraph_integer_t from,to;
	igraph_vit_t vit;
	igraph_vs_t vs;
	igraph_real_t value;

	if(g == NULL)
		return NULL;

	/* before creating the bipartite graph, we need all relations
	 * between any two vertices : the transitive closure of g */
	err = igraph_copy(&gstar,g);
	if(err) return NULL;

	err = ggen_transform_transitive_closure(&gstar);
	if(err) goto error;

	/* Bipartite convertion : let G = (S,C),
	 * we build B = (U,V,E) with
	 *	- U = V = S (each vertex is present twice)
	 *	- (u,v) \in E iff :
	 *		- u \in U
	 *		- v \in V
	 *		- u < v in C (warning, this means that we take
	 *		transitive closure into account, not just the
	 *		original edges)
	 * We will also need two additional nodes further in the code.
	 */
	vg = igraph_vcount(g);
	err = igraph_empty(&b,vg*2,1);
	if(err) goto error;

	/* id and id+vg will be a vertex in U and its copy in V,
	 * iterate over gstar edges to create edges in b
	 */
	err = igraph_vector_init(&edges,igraph_ecount(&gstar));
	if(err) goto d_b;
	igraph_vector_clear(&edges);

	err = igraph_eit_create(&gstar,igraph_ess_all(IGRAPH_EDGEORDER_ID),&eit);
	if(err) goto d_edges;

	for(IGRAPH_EIT_RESET(eit); !IGRAPH_EIT_END(eit); IGRAPH_EIT_NEXT(eit))
	{
		err = igraph_edge(&gstar,IGRAPH_EIT_GET(eit),&from,&to);
		if(err)
		{
			igraph_eit_destroy(&eit);
			goto d_edges;
		}
		to += vg;
		igraph_vector_push_back(&edges,(igraph_real_t)from);
		igraph_vector_push_back(&edges,(igraph_real_t)to);
	}
	igraph_eit_destroy(&eit);
	err = igraph_add_edges(&b,&edges,NULL);
	if(err) goto d_edges;

	/* maximum matching on b */
	igraph_vector_clear(&edges);
	err = bipartite_maximum_matching(&b,&edges);
	if(err) goto d_edges;

	/* Let M be the max matching, and N be E - M
	 * Define T as all unmatched vectices from U as well as all vertices
	 * reachable from those by going left-to-right along N and right-to-left along
	 * M.
	 * Define L = U - T, R = V \inter T
	 * C:= L + R
	 * C is a minimum vertex cover
	 */
	err = igraph_vector_init_seq(&n,0,igraph_ecount(&b)-1);
	if(err) goto d_edges;

	err = vector_diff(&n,&edges);
	if(err) goto d_n;

	err = igraph_vector_init(&c,vg);
	if(err) goto d_n;
	igraph_vector_clear(&c);

	/* matched vertices : S */
	err = igraph_vector_init(&s,vg);
	if(err) goto d_c;
	igraph_vector_clear(&s);

	for(i = 0; i < igraph_vector_size(&edges); i++)
	{
		err = igraph_edge(&b,VECTOR(edges)[i],&from,&to);
		if(err) goto d_s;

		igraph_vector_push_back(&s,from);
	}
	/* we may have inserted the same vertex multiple times */
	err = vector_uniq(&s);
	if(err) goto d_s;

	/* unmatched */
	err = igraph_vector_init_seq(&t,0,vg-1);
	if(err) goto d_s;

	err = vector_diff(&t,&s);
	if(err) goto d_t;

	/* alternating paths
	 */
	err = igraph_vector_copy(&todo,&t);
	if(err) goto d_t;

	err = igraph_vector_init(&next,vg);
	if(err) goto d_todo;
	igraph_vector_clear(&next);
	do {
		vector_uniq(&todo);
		added = 0;
		for(i = 0; i < igraph_vector_size(&todo); i++)
		{
			if(VECTOR(todo)[i] < vg)
			{
				/* scan edges */
				err = igraph_es_adj(&es,VECTOR(todo)[i],IGRAPH_OUT);
				if(err) goto d_next;
				err = igraph_eit_create(&b,es,&eit);
				if(err)
				{
					igraph_es_destroy(&es);
					goto d_next;
				}
				for(IGRAPH_EIT_RESET(eit); !IGRAPH_EIT_END(eit); IGRAPH_EIT_NEXT(eit))
				{
					if(igraph_vector_binsearch(&n,IGRAPH_EIT_GET(eit),NULL))
					{
						err = igraph_edge(&b,IGRAPH_EIT_GET(eit),&from,&to);
						if(err)
						{
							igraph_eit_destroy(&eit);
							igraph_es_destroy(&es);
							goto d_next;
						}
						if(!igraph_vector_binsearch(&t,to,NULL))
						{
							igraph_vector_push_back(&next,to);
							added = 1;
						}
					}
				}
			}
			else
			{
				/* scan edges */
				err = igraph_es_adj(&es,VECTOR(todo)[i],IGRAPH_IN);
				if(err) goto d_next;
				err = igraph_eit_create(&b,es,&eit);
				if(err)
				{
					igraph_es_destroy(&es);
					goto d_next;
				}
				for(IGRAPH_EIT_RESET(eit); !IGRAPH_EIT_END(eit); IGRAPH_EIT_NEXT(eit))
				{
					if(igraph_vector_binsearch(&edges,IGRAPH_EIT_GET(eit),NULL))
					{
						err = igraph_edge(&b,IGRAPH_EIT_GET(eit),&from,&to);
						if(err)
						{
							igraph_eit_destroy(&eit);
							igraph_es_destroy(&es);
							goto d_next;
						}
						if(!igraph_vector_binsearch(&t,to,NULL))
						{
							igraph_vector_push_back(&next,from);
							added = 1;
						}
					}
				}
			}
			igraph_es_destroy(&es);
			igraph_eit_destroy(&eit);
		}
		igraph_vector_append(&t,&todo);
		igraph_vector_clear(&todo);
		igraph_vector_append(&todo,&next);
		igraph_vector_clear(&next);
	} while(added);

	err = igraph_vector_init_seq(&l,0,vg-1);
	if(err) goto d_t;

	err = vector_diff(&l,&t);
	if(err) goto d_l;

	err = igraph_vector_update(&c,&l);
	if(err) goto d_l;

	err = igraph_vector_init(&r,vg);
	if(err) goto d_l;
	igraph_vector_clear(&r);

	/* compute V \inter T */
	for(i = 0; i < igraph_vector_size(&t); i++)
	{
		if(VECTOR(t)[i] >= vg)
			igraph_vector_push_back(&r,VECTOR(t)[i]);
	}

	igraph_vector_add_constant(&r,(igraph_real_t)-vg);
	err = vector_union(&c,&r);
	if(err) goto d_r;

	/* our antichain is U - C */
	res = malloc(sizeof(igraph_vector_t));
	if(res == NULL) goto d_r;

	err = igraph_vector_init_seq(res,0,vg-1);
	if(err) goto f_res;

	err = vector_diff(res,&c);
	if(err) goto d_res;

	goto ret;
d_res:
	igraph_vector_destroy(res);
f_res:
	free(res);
	res = NULL;
ret:
d_r:
	igraph_vector_destroy(&r);
d_l:
	igraph_vector_destroy(&l);
d_next:
	igraph_vector_destroy(&next);
d_todo:
	igraph_vector_destroy(&todo);
d_t:
	igraph_vector_destroy(&t);
d_s:
	igraph_vector_destroy(&s);
d_c:
	igraph_vector_destroy(&c);
d_n:
	igraph_vector_destroy(&n);
d_edges:
	igraph_vector_destroy(&edges);
d_b:
	igraph_destroy(&b);
error:
	igraph_destroy(&gstar);
	return res;
}
コード例 #4
0
ファイル: integrators.c プロジェクト: mcmaniac/compopraktikum
void hermite_iterated(const data* dat, output_function output, int iterations)
{
  int i,j;
  double dt = dat->eta * delta_t_factor;

  vector *a      = (vector*) malloc((dat->N)*sizeof(vector)), // a_n,          not initialized
         *a_p    = (vector*) malloc((dat->N)*sizeof(vector)), // a_(n+1)^p,    not initialized
         *a_1   = (vector*) malloc((dat->N)*sizeof(vector)), // a_1_n,       not initialized
         *a_1_p = (vector*) malloc((dat->N)*sizeof(vector)), // a_1_(n+1)^p, not initialized
         *r      = init_r(dat),                               // r_n
         *r_p    = (vector*) malloc((dat->N)*sizeof(vector)), // r_(n+1)^p,    not initialized
         *v      = init_v(dat),                               // v_n
         *v_p    = (vector*) malloc((dat->N)*sizeof(vector)); // v_(n+1)^p,    not initialized

  double time = 0;

  accelerations(dat, r, a);
  adots(dat, r, v, a_1);
  dt = delta_t(dat, a, a_1);

  output(time, dt, dat, r, v);

  while (time < dat->t_max)
  {
    // prediction step
    for (i = 0; i < dat->N; i++)
    {
      v_p[i] = vector_add(v[i],
               vector_add(scalar_mult(dt, a[i]),
                          scalar_mult(0.5 * dt * dt, a_1[i])));
      r_p[i] = vector_add(r[i],
               vector_add(scalar_mult(dt, v[i]),
               vector_add(scalar_mult(0.5 * dt * dt, a[i]),
                          scalar_mult(dt * dt * dt / 6.0, a_1[i]))));
    }
    // iteration of correction step
    for (j = 0; j < iterations; j++)
    {
      // predict a, a_1
      accelerations(dat, r_p, a_p);
      adots(dat, r_p, v_p, a_1_p);
      for (i = 0; i < dat->N; i++)
      {
        // correction steps -> overwrite "prediction" variables for convenience,
        // will get written in r,v after iteration is done
        v_p[i] = vector_add(v[i],
               vector_add(scalar_mult(dt / 2.0, vector_add(a_p[i], a[i])),
                          scalar_mult(dt * dt / 12.0, vector_diff(a_1_p[i], a_1[i]))));
        r_p[i] = vector_add(r[i],
                 vector_add(scalar_mult(dt / 2.0, vector_add(v_p[i], v[i])),
                            scalar_mult(dt * dt / 12.0, vector_diff(a_p[i], a[i]))));
      }
    }
    // apply iterated correction steps
    for (i = 0; i < dat->N; i++)
    {
      r[i] = r_p[i];
      v[i] = v_p[i];
    }
    time += dt;
    // a/a_1 values for next step
    accelerations(dat, r, a);
    adots(dat, r, v, a_1);
    // new dt
    dt = delta_t(dat, a, a_1);
    output(time, dt, dat, r, v);
  }

  free(a);   free(a_p);
  free(a_1); free(a_1_p);
  free(r);   free(r_p);
  free(v);   free(v_p);
}
コード例 #5
0
ファイル: integrators.c プロジェクト: mcmaniac/compopraktikum
void hermite(const data* dat, output_function output)
{
  int i;
  double dt = dat->eta * delta_t_factor;

  vector *a      = (vector*) malloc((dat->N)*sizeof(vector)), // a_n,          not initialized
         *a_p    = (vector*) malloc((dat->N)*sizeof(vector)), // a_(n+1)^p,    not initialized
         *a_1   = (vector*) malloc((dat->N)*sizeof(vector)), // a_1_n,       not initialized
         *a_1_p = (vector*) malloc((dat->N)*sizeof(vector)), // a_1_(n+1)^p, not initialized
         *a_2    = (vector*) malloc((dat->N)*sizeof(vector)), // a_(n+1)^(2),  not initialized
         *a_3    = (vector*) malloc((dat->N)*sizeof(vector)), // a_(n+1)^(3),  not initialized
         *r      = init_r(dat),                               // r_n
         *r_p    = (vector*) malloc((dat->N)*sizeof(vector)), // r_(n+1)^p,    not initialized
         *v      = init_v(dat),                               // v_n
         *v_p    = (vector*) malloc((dat->N)*sizeof(vector)); // v_(n+1)^p,    not initialized

  double time = 0;

  accelerations(dat, r, a);
  adots(dat, r, v, a_1);
  dt = delta_t(dat, a, a_1);

  output(time, dt, dat, r, v);

  while (time < dat->t_max)
  {
    // prediction step
    for (i = 0; i < dat->N; i++)
    {
      v_p[i] = vector_add(v[i],
               vector_add(scalar_mult(dt, a[i]),
                          scalar_mult(0.5 * dt * dt, a_1[i])));
      r_p[i] = vector_add(r[i],
               vector_add(scalar_mult(dt, v[i]),
               vector_add(scalar_mult(0.5 * dt * dt, a[i]),
                          scalar_mult(dt * dt * dt / 6.0, a_1[i]))));
    }
    // predict a^p, a_1^p
    accelerations(dat, r_p, a_p);
    adots(dat, r_p, v_p, a_1_p);
    for (i = 0; i < dat->N; i++)
    {
      // predict 2nd and 3rd derivations
      a_2[i] = vector_add(scalar_mult(2 * (-3) / dt / dt, vector_diff(a[i], a_p[i])),
                          scalar_mult(2 * (-1) / dt, vector_add(scalar_mult(2, a_1[i]), a_1_p[i])));
      a_3[i] = vector_add(scalar_mult(6 * 2 / dt / dt / dt, vector_diff(a[i], a_p[i])),
                          scalar_mult(6 / dt / dt, vector_add(a_1[i], a_1_p[i])));
      // correction steps
      v[i] = vector_add(v_p[i],
             vector_add(scalar_mult(dt * dt * dt / 6.0, a_2[i]),
                        scalar_mult(dt * dt * dt / 24.0, a_3[i])));
      r[i] = vector_add(r_p[i],
             vector_add(scalar_mult(dt * dt * dt * dt / 24.0, a_2[i]),
                        scalar_mult(dt * dt * dt * dt * dt / 120.0, a_3[i])));
    }
    time += dt;
    // a/a_1 values for next step
    accelerations(dat, r, a);
    adots(dat, r, v, a_1);
    // new dt
    dt = delta_t_(dat, a, a_1, a_2, a_3);
    output(time, dt, dat, r, v);
  }

  free(a);    free(a_p);
  free(a_1); free(a_1_p);
  free(r);    free(r_p);
  free(v);    free(v_p);
}
コード例 #6
0
void lin_alg::gauss_seidel_solve(double **a, double *x, double *b, int n, int max_iter, bool &solved, double tol, double &error)
{
	// Solve the system Ax=b by Gauss-Seidel iteration method
	// R. Sheehan 3 - 8 - 2011
	
	bool cgt=false;

	double *oldx = vector(n); 
	double *diffx = vector(n); 
		
	int n_iter = 1;
	double bi, mi, err;
		
	while(n_iter<max_iter){

		// store the initial approximation to the solution
		for(int i=1; i<=n; i++){
			oldx[i] = x[i]; 
		}

		// iteratively compute the solution vector x
		for(int i=1; i<=n; i++){

			bi=b[i]; 
			mi=a[i][i];

			for(int j=1; j<i; j++){

				bi -= a[i][j]*x[j];

			}

			for(int j=i+1; j<=n; j++){

				bi -= a[i][j]*oldx[j];

			}

			x[i] = bi/mi;
		}
			
		// test for convergence
		// compute x - x_{old} difference between the two is the error
		diffx = vector_diff(x, oldx, n, n); 

		// error is measured as the length of the difference vector ||x - x_{old}||_{\infty}
		err = inf_norm(diffx, n); 

		if( n_iter%4 == 0){
			cout<<"iteration "<<n_iter<<" , error = "<<err<<endl;
		}
			
		if(abs(err)<tol){ // solution has converged, stop iterating

			cout<<"\nGauss-Seidel Iteration Complete\nSolution converged in "<<n_iter<<" iterations\n";

			cout<<"Error = "<<abs(err)<<endl<<endl;

			error=abs(err);

			cgt=solved=true;

			break;
		}
			
		n_iter++; // solution has not converged, keep iterating
	}
		
	if(!cgt){ // solution did not converge

		cout<<"\nError: Gauss-Seidel Iteration\n";

		cout<<"Error: Solution did not converge in "<<max_iter<<" iterations\n";

		cout<<"Error = "<<abs(err)<<endl;

		error=abs(err);

		solved=false;
	}

	delete[] oldx; 
	delete[] diffx; 
}
コード例 #7
0
void lin_alg::jacobi_solve(double **a, double *x, double *b, int n, int max_iter, bool &solved, double tol, double &error)
{
	// Solve the system Ax=b by Jacobi's iteration method
	// This has the slowest convergence rate of the iterative techniques
	// In practice you never use this algorithm
	// Always use GS or SOR for iterative solution
	// R. Sheehan 3 - 8 - 2011
	
	bool cgt = false;
	
	double *oldx = vector(n); 
	double *diffx = vector(n); 
		
	int n_iter = 1;
	double bi, mi, err;
		
	while(n_iter < max_iter){

		// store the initial approximation to the solution
		for(int i=1; i<=n; i++){
			oldx[i] = x[i]; 
		}
		
		for(int i=1;i<=n;i++){

			bi=b[i]; mi=a[i][i];

			for(int j=1;j<=n;j++){

				if(j!=i){
					bi-=a[i][j]*oldx[j];
				}

			}

			x[i]=bi/mi;
		}
			
		diffx = vector_diff(x, oldx, n, n); 
		
		err = inf_norm(diffx, n);

		if( n_iter%4 == 0){
			cout<<"iteration "<<n_iter<<" , error = "<<err<<endl;
		}
			
		if(abs(err)<tol){

			cout<<"\nJacobi Iteration Complete\nSolution converged in "<<n_iter<<" iterations\n";
			cout<<"Error = "<<abs(err)<<endl<<endl;
			
			error = abs(err);

			cgt = solved = true;
			
			break;
		}
			
		n_iter++;
	}
		
	if(!cgt){
		cout<<"\nError: Jacobi Iteration\n";
		cout<<"Error: Solution did not converge in "<<max_iter<<" iterations\n\n";
	}

	delete[] oldx; 
	delete[] diffx; 
}