Esempio n. 1
0
    std::string Number::str(unsigned precision) const
    {
        switch (type())
        {
        case Number::INTEGER:
            return get_i().str(precision);

        case Number::FLOATING:
            return get_f().str(precision);

        case Number::RATIONAL:
            return get_r().str();

#ifndef PMP_DISABLE_VECTOR
        case Number::VECTOR:
            {
                std::string s;
                if (!empty())
                {
                    s += get_v()[0].str(precision);
                    for (size_t i = 1; i < size(); ++i)
                    {
                        s += ", ";
                        s += get_v()[i].str(precision);
                    }
                }
                return s;
            }
#endif

        default:
            assert(0);
            return "";
        }
    }
Esempio n. 2
0
double Mask::involution(BYTE* image,int widthBytes,int type,int x,int y){
    //type indicates which color tube to use
    double sum=0;
    if (type==1)//r
    {
        for (int i = -1; i <= 1; ++i)
            for (int j = -1;j<=1;j++)
                sum+=get_r(image,widthBytes,x-i,y+j)*mask[(i+1)*3+j+1];
//        sum/=16;

    }
    if (type==2)//g
    {
        for (int i = -1; i <= 1; ++i)
            for (int j = -1;j<=1;j++)
                sum+=get_g(image,widthBytes,x-i,y+j)*mask[(i+1)*3+j+1];
//        sum/=16;

    }
    if (type==3)//b
    {
        for (int i = -1; i <= 1; ++i)
            for (int j = -1;j<=1;j++)
                sum+=get_b(image,widthBytes,x-i,y+j)*mask[(i+1)*3+j+1];
//        sum/=16;

    }
    return sum;
}
Esempio n. 3
0
    rational_type Number::to_r() const
    {
        switch (type())
        {
        case Number::INTEGER:
            return i_to_r();

        case Number::FLOATING:
            return f_to_r();

        case Number::RATIONAL:
            return get_r();

#ifndef PMP_DISABLE_VECTOR
        case Number::VECTOR:
            if (empty())
                return 0;
            else
                return get_v()[0].to_r();
#endif

        default:
            assert(0);
            return 0;
        }
    }
Esempio n. 4
0
    bool Number::is_zero() const
    {
        switch (type())
        {
        case Number::INTEGER:
            return get_i().is_zero();

        case Number::FLOATING:
            return get_f().is_zero();

        case Number::RATIONAL:
            return get_r().is_zero();

#ifndef PMP_DISABLE_VECTOR
        case Number::VECTOR:
            for (size_t i = 0; i < size(); ++i)
            {
                if (!get_v()[i].is_zero())
                    return false;
            }
            return true;
#endif

        default:
            assert(0);
            return false;
        }
    }
Esempio n. 5
0
void Analyze::writeGrid () {
  std::ofstream fout ("/Users/fred.christensen/Dropbox/school/Parallel/genetic/result.ppm");
  fout << "P3\n640 420\n255\n";
  for (int y = 0; y < height; ++y) {
    for (int x = 0; x < width; ++x) {
      double bias = (double)grid[x][y] / (double)max;
      fout << get_r(bias) << " " << get_g(bias) << " " << get_b(bias);
      if (x < width -1) {
        fout << "\t";
      } else {
        fout << std::endl;
      }
    }
  }
}
Esempio n. 6
0
static real dispacement(int n, real *x, real *y, real *rmin, real *thetamin, real *pmin, real *qmin){
  /* find the distance between two sets of cordinates by finding a suitable
     rotation and scaling to minimize the distance */
  real dist = 0, theta, normx = 0, r, d, p, q;
  int i;
  
  *thetamin = 0.;
  dist = get_r(n, x, y, 0., &r, &p, &q);
  *rmin = r; *pmin = p; *qmin = q;

  for (i = 0; i < 180; i++){
    theta = 3.1415626*i/180;
    d = get_r(n, x, y, theta, &r, &p, &q);
    if (d < dist){
      dist = d;
      *rmin = r; *pmin = p; *qmin = q;
      *thetamin = theta;
    }
  }


  for (i = 0; i < n; i++) normx += x[2*i]*x[2*i]+x[2*i+1]*x[2*i+1];
  return sqrt(dist/normx);
}
Esempio n. 7
0
    int Number::sign() const
    {
        switch (type())
        {
        case Number::INTEGER:
            return get_i().sign();

        case Number::FLOATING:
            return get_f().sign();;

        case Number::RATIONAL:
            return get_r().sign();

        default:
            assert(0);
            return 0;
        }
    }
Esempio n. 8
0
    void Number::trim(unsigned precision/* = s_default_precision*/)
    {
        switch (type())
        {
        case Number::INTEGER:
            break;

        case Number::FLOATING:
            {
                assign(str(precision, std::ios_base::fixed));

                integer_type i = to_i();
                floating_type f = static_cast<floating_type>(i);
                if (f == get_f())
                    assign(i);
            }
            break;

        case Number::RATIONAL:
            {
                rational_type r = get_r();
                if (b_mp::denominator(r) == 1)
                    assign(b_mp::numerator(r));
            }
            break;

#ifndef PMP_DISABLE_VECTOR
        case Number::VECTOR:
            for (size_t i = 0; i < get_v().size(); ++i)
                get_v()[i].trim(precision);
            if (size() == 1)
                assign(get_v()[0]);
            break;
#endif

        default:
            assert(0);
            break;
        }
    }
Esempio n. 9
0
void initialize_potential( ) {

  int i, j;

  double ro[Dim], rc[Dim], dr[Dim], mdr2 , pref , mdr , k2, kv[Dim] ;
  pref = V / ( pow( 2.0 * sqrt(PI) *Range, Dim ) ) ; // Note: the factor of V comes from the FFT

  for ( j=0 ; j<Dim ; j++ )
    ro[j] = 0.0 ;

  for ( i=0 ; i<M ; i++ ) {

    get_r( i , rc ) ;

    mdr2 = pbc_mdr2( ro, rc, dr ) ;
    mdr = sqrt( mdr2 ) ;

    uG[i] = exp( -mdr2 / 4.0/Range2 ) * pref ;
    r_dudr[i] = -mdr2 * exp( -mdr2 / 4.0/Range2 ) ;

    tmp[i] = rho0 / 2.0 * ( 1.0 - erf( ( mdr - Rp ) / Xi ) ) * V;
    gammaP[i] = tmp[i] ;
    
  }

  // Set up the particle-particle potential //
  fftw_fwd( tmp , ktmp ) ;
  for ( i=0 ; i<M ; i++ ) 
    ktmp2[i] = ktmp[i] * ktmp[i] ;
  fftw_back( ktmp2 , uP ) ;

  // Set up particle-polymer potential //
 #pragma omp parallel for private(k2,kv)
  for ( i=0 ; i<M ; i++ ) {
    k2 = get_k( i , kv ) ;
    ktmp[i] *= exp( -Range2*k2 /2.0) ;
  }
  fftw_back( ktmp , uPG ) ;


  for ( j=0 ; j<Dim ; j++ ) {
    field_gradient( uG , grad_uG[j] , j ) ;
    field_gradient( uP , grad_uP[j] , j ) ;
    field_gradient( uPG , grad_uPG[j] , j ) ;
  }


  int j2; 
  for ( j=0 ; j<Dim ; j++ ) {

  #pragma omp parallel for private(j2, mdr2,rc, dr )
	for ( i=0 ; i<M ; i++ ) {
	get_r( i , rc ) ;
	mdr2 = pbc_mdr2( rc , ro , dr ) ;
	  for ( j2=0 ; j2<Dim ; j2++ ){
		vir_func[j][j2][i] = dr[j2] * -grad_uG[j][i] ;
		vir_funcpp[j][j2][i] = dr[j2] * -grad_uP[j][i] ;
		vir_funcpg[j][j2][i] = dr[j2] * -grad_uPG[j][i] ;
	  }
 
	}
   }

  for ( j=0 ; j<Dim ; j++ )
	for ( j2=0 ; j2<Dim ; j2++ ){
		fftw_fwd( vir_func[j][j2], vir_func_hat[j][j2] ) ;
		fftw_fwd( vir_funcpp[j][j2], vir_funcpp_hat[j][j2] ) ;
		fftw_fwd( vir_funcpg[j][j2], vir_funcpg_hat[j][j2] ) ;
	}

//  write_grid_data( "ug.dat" , uG ) ;
//  write_grid_data( "up.dat" , uP ) ;
//  write_grid_data( "upg.dat" , uPG ) ;


  for ( j=0 ; j<Dim ; j++ ) {
    char nm[20] ;
    fftw_fwd( grad_uG[j] , grad_uG_hat[j] ) ;
//    sprintf( nm , "grad_ug_%d.dat" , j ) ;
 //   write_grid_data( nm , grad_uG[j] ) ;

    fftw_fwd( grad_uP[j] , grad_uP_hat[j] ) ;
 //   sprintf( nm , "grad_up_%d.dat" , j ) ;
 //   write_grid_data( nm , grad_uP[j] ) ;

    fftw_fwd( grad_uPG[j] , grad_uPG_hat[j] ) ;
   // sprintf( nm , "grad_upg_%d.dat" , j ) ;
   // write_grid_data( nm , grad_uPG[j] ) ;
  }
}
Esempio n. 10
0
uint calc(int x, int y){
	
	// r,g,b color values around center 'c11'
	// 00 10 20
	// 01 11 21
	// 02 12 22
	
	uint c00=get(x-1,y-1);
	uint c01=get(x-1,y);
	uint c02=get(x-1,y+1);
	uint c10=get(x,y-1);
	uint c11=get(x,y);
	uint c12=get(x,y+1);
	uint c20=get(x+1,y-1);
	uint c21=get(x+1,y);
	uint c22=get(x+1,y+1);
	
	// red
	uint r00=get_r(x-1,y-1);
	uint r01=get_r(x-1,y)  ;
	uint r02=get_r(x-1,y+1);
	uint r10=get_r(x,y-1)  ;
	uint r11=get_r(x,y)	;
	uint r12=get_r(x,y+1)  ;
	uint r20=get_r(x+1,y-1);
	uint r21=get_r(x+1,y)  ;
	uint r22=get_r(x+1,y+1);
	
	// green
	uint g00=get_g(x-1,y-1);
	uint g01=get_g(x-1,y)  ;
	uint g02=get_g(x-1,y+1);
	uint g10=get_g(x,y-1)  ;
	uint g11=get_g(x,y)	;
	uint g12=get_g(x,y+1)  ;
	uint g20=get_g(x+1,y-1);
	uint g21=get_g(x+1,y)  ;
	uint g22=get_g(x+1,y+1);
	
	// blue
	uint b00=get_b(x-1,y-1);
	uint b01=get_b(x-1,y)  ;
	uint b02=get_b(x-1,y+1);
	uint b10=get_b(x,y-1)  ;
	uint b11=get_b(x,y)	;
	uint b12=get_b(x,y+1)  ;
	uint b20=get_b(x+1,y-1);
	uint b21=get_b(x+1,y)  ;
	uint b22=get_b(x+1,y+1);
	
	// center colors of THIS dot
	uint r=r11;
	uint g=g11;
	uint b=b11;
	
	// random colors
	uint zr=rand()%256;
	uint zg=rand()%256;
	uint zb=rand()%256;	
	
	// mean color value of surrounding
	uint r0=((r10+r01+r21+r12)/4);
	uint g0=((g10+g01+g21+g12)/4);
	uint b0=(b10+b01+b21+b12)/4;
	
	// Including this dot
	// uint r0=((r10+r01+r11+r21+r12)/5);
	// uint g0=((g10+g01+g11+g21+g12)/5);
	// uint b0=(b10+b01+b11+b21+b12)/5;
	
	float fr=r0/256.0;
	float fg=g0/256.0;
	float fb=b0/256.0;
	
	uint k=128;
	float h=100.0;

//////////
// done with initialization, 
// now updated the dot's color based on some crazy experimental whatever function
// feel free to wildly experiment with this algorithm!

// POPULATION UPDATE

	//  inspired by Conway's game of life:

	//  if there is a sufficient population, then grow in numbers:
	if(b0>=100)b=b0*1.01;
	//  if the population is small then shrink
	if(b0<100)b=b0*(0.99-fr/100);
	//  if the population is too big then collapse
	if(b0>240)b=0;
	//  repopulate collapsed populations
	if(b0<3)b=120;//zb*((1.5-f)+fr*f);
	
	if(r0>=100)r=r0*1.01;
	if(r0<100)r=r0*(0.99-fg/100);
	if(r11>240)r=0;
	if(r11<3)r=120*(1.2-fr*fg);//zb*((1.5-f)+fr*f);
	
	if(g0>=100)g=g0*1.01;
	if(g0<100)g=g0*(0.99-f*fb/100);
	if(g11>240){g=0;b=b/2;}
	if(g11<3)g=120*(1-fb*fr);//zb*((1.5-f)+fr*f);

// END OF POPULATION UPDATE 

	if(r>255)r=255;
	if(g>255)g=255;
	if(b>255)b=255;
	return (r<<16)+(g<<8)+b;
}
Esempio n. 11
0
///////////////////////////////////////////////////////////////////////
// Class				:	CWinDisplay
// Method				:	data
// Description			:	Draw the data onto the screen
// Return Value			:	-
// Comments				:
int	CWinDisplay::data(int x,int y,int w,int h,float *d) {
	int	i,j;

	clampData(w,h,d);

	for (i=0;i<h;i++) {
		const float		*src	=	&d[i*w*numSamples];
		unsigned int	*dest	=	&imageData[((height-(i+y)-1)*width+x)];

		switch(numSamples) {
		case 0:
			break;
		case 1:
			for (j=0;j<w;j++) {
				unsigned char	d	=	(unsigned char) (src[0]*255);

				*dest++				=	color(d,d,d,d);
				src++;
			}
			break;
		case 2:
			for (j=0;j<w;j++) {
				const float		r	=	src[0]*src[1]*255	+ (1-src[1])*get_r(dest[0]);
				const float		a	=	src[1]*255			+ (1-src[1])*get_a(dest[0]);
				unsigned char	dr	=	(unsigned char) r;
				unsigned char	da	=	(unsigned char) a;

				*dest++				=	color(dr,dr,dr,da);

				src					+=	2;
			}
			break;
		case 3:
			for (j=0;j<w;j++) {
				unsigned char	dr	=	(unsigned char) (src[0]*255);
				unsigned char	dg	=	(unsigned char) (src[1]*255);
				unsigned char	db	=	(unsigned char) (src[2]*255);

				*dest++				=	color(dr,dg,db,(unsigned char) 255);

				src					+=	3;
			}
			break;
		case 4:
			for (j=0;j<w;j++) {
				const float		r	=	src[0]*src[3]*255	+ (1-src[3])*get_r(dest[0]);
				const float		g	=	src[1]*src[3]*255	+ (1-src[3])*get_g(dest[0]);
				const float		b	=	src[2]*src[3]*255	+ (1-src[3])*get_b(dest[0]);
				const float		a	=	src[3]*255			+ (1-src[3])*get_a(dest[0]);
				unsigned char	dr	=	(unsigned char) r;
				unsigned char	dg	=	(unsigned char) g;
				unsigned char	db	=	(unsigned char) b;
				unsigned char	da	=	(unsigned char) a;

				*dest++				=	color(dr,dg,db,da);

				src					+=	4;
			}
			break;
		default:
			for (j=0;j<w;j++) {
				float			r	=	src[0]*src[3]*255	+ (1-src[3])*get_r(*dest);
				float			g	=	src[1]*src[3]*255	+ (1-src[3])*get_g(*dest);
				float			b	=	src[2]*src[3]*255	+ (1-src[3])*get_b(*dest);
				float			a	=	src[3]*255			+ (1-src[3])*get_a(*dest);
				unsigned char	dr	=	(unsigned char) r;
				unsigned char	dg	=	(unsigned char) g;
				unsigned char	db	=	(unsigned char) b;
				unsigned char	da	=	(unsigned char) a;

				*dest++				=	color(dr,dg,db,da);

				src					+=	numSamples;
			}
			break;
		}
	}

	if (active) {
		if (willRedraw == FALSE) {
			// Pump messages
			willRedraw	=	TRUE;
			PostMessage(hWnd,WM_PAINT,(WPARAM) this,0);
		}
	}

	return active;
}
Esempio n. 12
0
    Number& Number::operator+=(const Number& num)
    {
#ifndef PMP_DISABLE_VECTOR
        if (is_v() || num.is_v())
        {
            vector_type vec;
            for (size_t i = 0; i < size(); ++i)
            {
                for (size_t j = 0; j < num.size(); ++j)
                {
                    Number tmp((*this)[i]);
                    tmp += num[j];
                    vec.push_back(tmp);
                }
            }
            assign(vec);
            return *this;
        }
#endif  // ndef PMP_DISABLE_VECTOR
        integer_type    i;
        floating_type   f;
        rational_type   r;
        switch (type())
        {
        case Number::INTEGER:
            switch (num.type())
            {
            case Number::INTEGER:
                i = get_i();
                i += num.get_i();
                assign(i);
                break;

            case Number::FLOATING:
                f = to_f();
                f += num.get_f();
                assign(f);
                break;

            case Number::RATIONAL:
                r = to_r();
                r += num.get_r();
                assign(r);
                break;

            default:
                assert(0);
                break;
            }
            break;

        case Number::FLOATING:
            switch (num.type())
            {
            case Number::INTEGER:
                f = get_f();
                f += num.to_f();
                assign(f);
                break;

            case Number::FLOATING:
                f = get_f();
                f += num.get_f();
                assign(f);
                break;

            case Number::RATIONAL:
                f = get_f();
                f += num.to_f();
                assign(f);
                break;

            default:
                assert(0);
                break;
            }
            break;

        case Number::RATIONAL:
            switch (num.type())
            {
            case Number::INTEGER:
                r = get_r();
                r += num.to_r();
                assign(r);
                break;

            case Number::FLOATING:
                f = to_f();
                f += num.get_f();
                assign(f);
                break;

            case Number::RATIONAL:
                r = get_r();
                r += num.get_r();
                assign(r);
                break;

            default:
                assert(0);
                break;
            }
            break;

        default:
            assert(0);
            break;
        }
        return *this;
    }
Esempio n. 13
0
    Number& Number::operator/=(const Number& num)
    {
#ifndef PMP_DISABLE_VECTOR
        if (is_v() || num.is_v())
        {
            vector_type vec;
            for (size_t i = 0; i < size(); ++i)
            {
                for (size_t j = 0; j < num.size(); ++j)
                {
                    Number tmp((*this)[i]);
                    tmp /= num[j];
                    vec.push_back(tmp);
                }
            }
            assign(vec);
            return *this;
        }
#endif
        integer_type    i;
        floating_type   f;
        rational_type   r;
        switch (type())
        {
        case Number::INTEGER:
            switch (num.type())
            {
            case Number::INTEGER:
                if (s_intdiv_type == Number::INTEGER)
                {
                    i = get_i();
                    i /= num.get_i();
                    assign(i);
                }
                else if (s_intdiv_type == Number::FLOATING)
                {
                    if (b_mp::fmod(to_f(), num.to_f()) != 0)
                    {
                        f = to_f();
                        f /= num.to_f();
                        assign(f);
                    }
                    else
                    {
                        i = get_i();
                        i /= num.get_i();
                        assign(i);
                    }
                }
                else if (s_intdiv_type == Number::RATIONAL)
                {
                    r = rational_type(get_i(), num.get_i());
                    assign(r);
                }
                else
                {
                    assert(0);
                }
                break;

            case Number::FLOATING:
                f = to_f();
                f /= num.get_f();
                assign(f);
                break;

            case Number::RATIONAL:
                r = to_r();
                r /= num.get_r();
                assign(r);
                break;

            default:
                assert(0);
                break;
            }
            break;

        case Number::FLOATING:
            switch (num.type())
            {
            case Number::INTEGER:
                f = get_f();
                f /= num.to_f();
                assign(f);
                break;

            case Number::FLOATING:
                f = get_f();
                f /= num.get_f();
                assign(f);
                break;

            case Number::RATIONAL:
                f = get_f();
                f /= num.to_f();
                assign(f);
                break;

            default:
                assert(0);
                break;
            }
            break;

        case Number::RATIONAL:
            switch (num.type())
            {
            case Number::INTEGER:
                r = get_r();
                r /= num.to_r();
                assign(r);
                break;

            case Number::FLOATING:
                f = to_f();
                f /= num.get_f();
                assign(f);
                break;

            case Number::RATIONAL:
                r = get_r();
                r /= num.get_r();
                assign(r);
                break;

            default:
                assert(0);
                break;
            }
            break;

        default:
            assert(0);
            break;
        }
        return *this;
    }