Exemple #1
0
func_t *func_expand_mul1_add1(func_t *f)
{
  int i,j,k;
  func_t *h=NULL,*g=NULL;
  if(func_is_mul(f) && func_power(f)==1 && func_a_has_op_pow1(f,func_is_add)){
    // get terms without (add)^1
    g=func_clone(FR(f));
    func_args_rm_add_pow1(g);
    func_a_rm_null(g);
    g=func_mul_eval(g);
    // loop
    for(i=0; i<func_asize(f); i++){
      if(func_is_add(f->a[i]) && func_power(f->a[i])==1){
	if(func_is_add(g) && func_power(g)==1){
	  h=func_zero();
	  for(k=0; k<func_asize(g); k++){
	    for(j=0; j<func_asize(f->a[i]); j++){
	      h=func_add(h,func_expand(func_mul(FR(g->a[k]),FR(f->a[i]->a[j]))));
	    }
	  }
	}else{	  
	  h=func_zero();
	  for(j=0; j<func_asize(f->a[i]); j++){
	    h=func_add(h,func_expand(func_mul(FR(g),FR(f->a[i]->a[j]))));
	  }
	}
	g=func_del(g); g=h; h=NULL;
      }
    }
  }else{ FUNC_ERROR_ARG1("func_expand_mul1_add1",f); }
  f=func_del(f);
  return g;
}
int main()
{
  float *a,*b;
  int j;
  int i;

  for ( j=10; j<1000000; j*=2){
    a =( float *) malloc(sizeof(float)*j);
    b =( float *) malloc(sizeof(float)*j);

    for (i=0; i<j; i++){
      a[i] = 2;
      b[i] = 3;
    }

    if(!func_add(a,b,j)){ printf("Failed\n"); return 1; }

    if(!func_mul(a,b,j)){ printf("Failed\n"); return 1; }

    free(a);
    free(b);
  }

  printf("Success\n");

  return 0;
}
Exemple #3
0
	float eval_branch(struct node *node, float x, float y, float z, float a)
	{
		switch (node->token) {
			case token_x:
				return x;
			case token_y:
				return y;
			case token_z:
				return z;
			case token_a:
				return a;
			case token_num:
				return node->value;
			case token_pow:
				return func_pow(eval_branch(node->left, x, y, z, a), node->value);
			case token_mul:
				return func_mul(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a));
			case token_div:
				return func_div(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a));
			case token_add:
				return func_add(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a));
			case token_sub:
				return func_sub(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a));
			case token_neg:
				return func_neg(0, eval_branch(node->right, x, y, z, a));
			case token_sqrt:
				return func_sqrt(0, eval_branch(node->right, x, y, z, a));
			case token_sin:
				return func_sin(0, eval_branch(node->right, x, y, z, a));
			case token_cos:
				return func_cos(0, eval_branch(node->right, x, y, z, a));
			default:
				return 0;
		}
	}
Exemple #4
0
void func_add_args_collect(func_t *f, func_is_t *fis)
{
  int i,j;
  func_t *g=NULL;
  if(!func_is_add(f)){ FUNC_ERROR_ARG1("func_add_args_collect",f); }
  // convert args to split list
  for(i=0; i<func_asize(f); i++){
    g=func_mul_split_list(FR(func_aget(f,i)),fis);
    func_aset(f,i,FR(g));
    g=func_del(g);
  }
  // add a arg to same arg
  for(i=0; i<func_asize(f); i++){
    for(j=i+1; func_aget(f,i)!=NULL && !func_is_one(func_aget(func_aget(f,i),1)) && j<func_asize(f); j++){
      if(func_aget(f,j)!=NULL && func_cmp(func_aget(func_aget(f,i),1),func_aget(func_aget(f,j),1))==0){
	g=func_list(2);
	func_aset(g,0,func_add(FR(func_aget(func_aget(f,i),0)),FR(func_aget(func_aget(f,j),0))));
	func_aset(g,1,FR(func_aget(func_aget(f,i),1)));
	func_aset(f,i,FR(g));
	func_adel(f,j);
	g=func_del(g);
      }
    }
  }
  // convert list to mul
  for(i=0; i<func_asize(f); i++){
    if(func_aget(f,i)!=NULL){
      g=func_mul(FR(func_aget(func_aget(f,i),0)),FR(func_aget(func_aget(f,i),1)));
      func_aset(f,i,FR(g));
      g=func_del(g);
    }
  }
  func_a_rm_null(f);
}
Exemple #5
0
func_t *func_add(func_t *f1, func_t *f2)
{
  if     (f1==NULL || f2==NULL)                      { FUNC_ERROR_ARG2("func_add",f1,f2); }
  else if(func_is_zero(f1))                          { f1=func_del(f1); return f2; }
  else if(func_is_zero(f2))                          { f2=func_del(f2); return f1; }
  else if(func_in_bigint(f1)  && func_in_bigint(f2)) { return func_bigint_add(f1,f2); }
  else if(func_in_real(f1)    && func_in_real(f2))   { return func_real_add(f1,f2); }
  else if(func_in_complex(f1) && func_in_complex(f2)){ return func_complex_add(f1,f2); }
  else if(func_is_real(f1)    && func_is_number(f2)) { return func_add(f1,func_evalf(f2)); }
  else if(func_is_complex(f1) && func_is_number(f2)) { return func_add(f1,func_evalf(f2)); }
  else if(func_is_number(f1)  && func_is_real(f2))   { return func_add(func_evalf(f1),f2); }
  else if(func_is_number(f1)  && func_is_complex(f2)){ return func_add(func_evalf(f1),f2); }
  else if(func_in_vec(f1)     && func_in_vec(f2))    { return func_vec_add(f1,f2); }
  else if(func_in_mat(f1)     && func_in_mat(f2))    { return func_mat_add(f1,f2); }
  else                                               { return func_add_eval(func_arg2_new(__func_add,f1,f2)); }
}
Exemple #6
0
func_t *func_diff_add_pow1(func_t *f, int var)
{
  int i;
  func_t *fx=NULL;
  if(!func_is_add(f) || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_add",f); }
  fx=func_zero();
  for(i=0; i<func_asize(f); i++){
    fx=func_add(fx,func_diff(FR(f->a[i]),func_var1(var,1)));
  }
  f=func_del(f);
  return fx;
}
Exemple #7
0
func_t *func_diff_atan_pow1(func_t *f, int var)
{
  func_t *fx=NULL,*g=NULL,*gx=NULL,*h=NULL;
  if(!func_is(f,"atan") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_atan",f); }
  g=f->a[0];
  gx=func_diff(FR(g),func_var1(var,1));
  h=func_pow_n(FR(g),2);
  h=func_add(h,func_one());
  fx=func_div(gx,h);
  f=func_del(f);
  return fx;
}
Exemple #8
0
func_t *func_diff_acosh_pow1(func_t *f, int var)
{
  func_t *fx=NULL,*g=NULL,*gx=NULL,*h=NULL;
  if(!func_is(f,"acosh") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_acosh",f); }
  g=f->a[0];
  gx=func_diff(FR(g),func_var1(var,1));
  h=func_pow_n(FR(g),2);
  h=func_add(h,func_bigint_int(-1,1));
  h=func_sqrt(h);
  fx=func_div(gx,h);
  f=func_del(f);
  return fx;
}
Exemple #9
0
func_t *func_expand_add_pow1(func_t *f)
{
  int i;
  func_t *g=NULL;
  if(func_is_add(f) && func_power(f)==1){
    g=func_zero();
    for(i=0; i<func_asize(f); i++){
      g=func_add(g,func_expand(FR(f->a[i])));
    }
  }else{ FUNC_ERROR_ARG1("func_expand_add_pow1",f); }
  f=func_del(f);
  return g;
}
Exemple #10
0
// q=f/g, where f=g*q+r
func_t *func_poly_div_q(func_t *f, func_t *g)
{
  func_t *r=NULL,*neg=NULL,*q=NULL,*a;
  if(func_is_poly(f) && func_is_poly(g)){
    neg=func_bigint_int(-1,1);
    r=FR(f);                                    // r=f
    q=func_zero();
    while(func_is_poly(r) && func_poly_can_div(r,g)) {
      a=func_div(FR(func_poly_get_lt(r)),
		 FR(func_poly_get_lt(g))); // a=LT(r)/LT(g)
      q=func_add(q,FR(a));                      // q+=LT(r)/LT(g)
      a=func_mul(FR(neg),a);                    // a=(-1)*LT(r)/LT(g)
      a=func_expand(func_mul(a,FR(g)));         // a=((-1)*LT(r)/LT(g))*g
      r=func_add(r,a);                          // r-=(LT(r)/LT(g))*g
    }
  }
  f=func_del(f);
  g=func_del(g);
  neg=func_del(neg);
  r=func_del(r);
  return q;
}
Exemple #11
0
void func_add_args(func_t *f, func_is_t *fis, func_is_t *fin)
{
  int i,j;
  if(!func_is_add(f)){ FUNC_ERROR_ARG1("func_add_args",f); }
  for(i=0; i<func_asize(f); i++){
    for(j=0; fis(func_aget(f,i)) && j<func_asize(f); j++){
      if(i!=j && fin(func_aget(f,j))){
        func_aset(f,i,func_add(FR(func_aget(f,i)),FR(func_aget(f,j))));
	func_adel(f,j);
      }
    }
  }
  func_a_rm_null(f);
}
Exemple #12
0
void main()
{
	int a,b,add,sub;
	clock_t start,stop,over_time;
	
	a = 200;
	b = 100;
	start = clock();
	add = func_add(a,b);
	sub = func_sub(a,b);
	stop = clock();
	
	printf("\na+b = %d, a-b = %d, time=%d\n",add,sub,stop-start);
	
}
Exemple #13
0
func_t *func_poly_list_div_r(func_t *f, func_t *g)
{
  int i,flag;
  func_t *p=NULL,*r=NULL,*neg=NULL,*a=NULL;
  if(!(func_is_poly(f) && func_is_poly_list(g))){ FUNC_ERROR_ARG2("func_poly_list_div_r",f,g); }
  neg=func_bigint_int(-1,1);
  p=func_clone(FR(f));
  r=func_zero();
  while(!func_is_zero(p)){
    i=0;
    flag=0;
    while(i<func_asize(g) && flag==0){
      if(func_poly_can_div(p,g->a[i])){
	a=func_div(FR(func_poly_get_lt(p)),FR(func_poly_get_lt(g->a[i])));  // a:=LT(p)/LT(g[i])
	a=func_mul(FR(neg),a);                                                    // a:=-LT(p)/LT(g[i])
	a=func_expand(func_mul(a,func_poly_rm_lt(FR(g->a[i]))));            // a:=expand((-LT(p)/LT(g[i]))*(g[i]-LT(g[i])))
	p=func_poly_rm_lt(p);                                                     // p:=p-LT(p)
	p=func_add(p,FR(a));                                                      // p:=(p-LT(p))-(LT(p)/LT(g[i]))*(g[i]-LT(g[i])))=p-(LT(p)/LT(g[i]))*g[i]
	a=func_del(a);
	flag=1;
      }else{
	i=i+1;
      }
    }
    if(flag==0){
      r=func_add(r,FR(func_poly_get_lt(p)));
      p=func_poly_rm_lt(p);
    }
  }
  p=func_del(p);
  f=func_del(f);
  g=func_del(g);
  neg=func_del(neg);
  a=func_del(a);
  return r;
}
Exemple #14
0
func_t *func_diff_mul_pow1(func_t *f, int var)
{
  int i;
  func_t *fx=NULL,*g=NULL;
  if(!func_is_mul(f) || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_mul",f); }
  fx=func_zero();
  for(i=0; i<func_asize(f); i++){
    g=func_clone(FR(f));
    g->a[i]=func_del(g->a[i]);
    g=func_mul_eval(g);
    fx=func_add(fx,func_mul(g,func_diff(FR(f->a[i]),func_var1(var,1))));
  }
  f=func_del(f);
  return fx;
}
Exemple #15
0
func_t *func_diff_pow(func_t *f, int var)
{
  func_t *fx=NULL,*g=NULL,*h=NULL,*gx=NULL,*hx=NULL;
  if(!func_is(f,"pow")){ FUNC_ERROR_ARG1("func_diff_pow",f); }
  g=f->a[0];
  h=f->a[1];
  gx=func_diff(FR(g),func_var1(var,1));
  hx=func_diff(FR(h),func_var1(var,1));
  hx=func_mul(hx,func_log(FR(g)));
  gx=func_mul(gx,FR(h));
  gx=func_div(gx,FR(g));
  gx=func_add(gx,hx);
  fx=func_mul(FR(f),gx);
  f=func_del(f);
  return fx;
}
Exemple #16
0
func_t *func_expand_add_pow_n(func_t *f)
{
  int i,j,k;
  func_t *g=NULL,*h=NULL;
  if(func_is_add(f) && func_power(f)>=2){
    g=func_clone(FR(f)); func_set_power(g,1);
    for(k=1; k<func_power(f); k++){
      h=func_zero();
      for(i=0; i<func_asize(g); i++){	
	for(j=0; j<func_asize(f); j++){
	  h=func_add(h,func_expand(func_mul(FR(g->a[i]),FR(f->a[j]))));
	}
      }
      g=func_del(g); g=h; h=NULL;
    }
  }else{ FUNC_ERROR_ARG1("func_expand_add_pow_n",f); }
  f=func_del(f);
  return g;
}
Exemple #17
0
 void
show_funcs_ASL(ASL *asl)
{
	func_info *fi;
	int nargs;
	const char *atleast;

	func_add(asl);
	fprintf(Stderr, "Available nonstandard functions:%s\n",
		(fi = funcsfirst) ? "" : " none");
	for(; fi; fi = fi->fnext) {
		if ((nargs = fi->nargs) >= 0)
			atleast = "";
		else {
			nargs = -(1 + nargs);
			atleast = "at least ";
			}
		fprintf(Stderr, "\t%s(%s%d %sarg%s)\n", fi->name,
			atleast, nargs, fi->ftype ? "" : "real ",
			nargs == 1 ? "" : "s");
		}
	fflush(Stderr);
	}
Exemple #18
0
 char *
getstub_ASL(ASL *asl, char ***pargv, Option_Info *oi)
{
	char *s, *s1;
	keyword *kw, *okw;
	int i, options;
	char **argv = *pargv;

	progname = *argv;
	if (!Stderr)
		Stderr_init_ASL();	/* set Stderr if necessary */
	if (!asl)
		badasl_ASL(asl,0,"getstub");
	amplflag = 0;
	options = 1;
	okw = 0;
	if (oi) {
		oi->nnl = 0;
		oi->asl = asl;
		okw = oi->options;
		if ((s = getenv("solver_msg"))) {
			i = (int)strtol(s, &s1, 10);
			if (s1 > s && !*s1 && i >= 0 && !(i & 1))
				oi->option_echo = ASL_OI_never_echo;
			}
		oi->option_echo = (oi->option_echo & ASL_OI_never_echo)
			? ASL_OI_never_echo : ASL_OI_clopt | ASL_OI_echo;
		oi->n_badopts = 0;
		}

	while((s = *++argv)) {
		if (*s == '-' && options) {
			s1 = s + 1;
			if (okw
			 && (kw = (keyword*)b_search_ASL(okw,
					(int)sizeof(keyword), oi->n_options,
					&s1, &oi->eqsign))) {
				if (!*s1 && argv[1]) {
					s = (*kw->kf)(oi, kw, argv[1]);
					if (s != argv[1])
						argv++;
					continue;
					}
				(*kw->kf)(oi, kw, s1);
				continue;
				}
			if (!s1[1])
			    switch(*s1) {
				case '=':
					shownames(oi);
				case '?':
					usage_ASL(oi,0);
				case '-':
					options = 0;
					continue;
#ifdef SYMANTEC
				case 'E':
					_8087 = 0;
					continue;
#endif
				case 'e':
					if (oi)
						oi->option_echo &= ~ASL_OI_echo;
					continue;
				case 's':
					if (oi)
						oi->wantsol = 1;
					continue;
				case 'u':
					if (!oi || !(oi->flags && ASL_OI_want_funcadd))
						break;
					func_add(asl);
					show_funcs();
					exit(0);
				case 'v':
					if (oi)
						Ver_val_ASL(oi,0,0);
					continue;
				case 'i':
					if (ix_details_ASL[0]) {
						if ((s = argv[1])) {
							argv++;
							if (*s == '?' && !s[1])
								ix_usage();
							i_option_ASL = s;
							}
						continue;
						}
				}
			if (*s1 == 'i' && ix_details_ASL[0]) {
				if (s1[1] == '?' && !s1[2])
					ix_usage();
				i_option_ASL = s1 + 1;
				continue;
				}
			if (*s1 == '-') {
				if (!strcmp(++s1, "help")) {
					if (oi)
						usage_ASL(oi,0);
					}
				else if (!strcmp(s1, "version")) {
					if (oi) {
						Ver_val_ASL(oi,0,0);
						continue;
						}
					}
				}
			fprintf(Stderr, "%s: bad option %s\n", progname, s);
			usage_ASL(oi,1);
			}
		if (strchr(s,'='))
			break;
		if ((s1 = *++argv) && !strncmp(s1,"-AMPL",5)) {
			amplflag = 1;
			argv++;
			if (oi && oi->bsname
			 && !(oi->option_echo & ASL_OI_never_echo))
				need_nl = oi->nnl = printf("%s: ", oi->bsname);
			}
		i = strlen(s) - 3;
		if (i > 0 && !strcmp(s+i,".nl"))
			s[i] = 0;
		break;
		}
	if (oi && oi->n_badopts)	/* possiby set by kw->kf */
		exit(1);
	*pargv = argv;
	return s;
	}