[BACK]Return to ox_eval.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_gsl

Diff for /OpenXM/src/ox_gsl/ox_eval.c between version 1.2 and 1.6

version 1.2, 2018/04/05 05:53:52 version 1.6, 2018/04/17 02:50:07
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/ox_gsl/ox_eval.c,v 1.1 2018/04/03 12:09:46 ohara Exp $ */  /* $OpenXM: OpenXM/src/ox_gsl/ox_eval.c,v 1.5 2018/04/13 16:51:42 ohara Exp $ */
   
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
   #include <stdarg.h>
 #include <string.h>  #include <string.h>
 #include <math.h>  #include <math.h>
 #include "ox_toolkit.h"  #include "ox_toolkit.h"
Line 10 
Line 11 
 Usage:  Usage:
   
 double d;  double d;
 init_dic();  replace(3,"x",1.25,"y",-2.0, "z", 2.1);
 register_entry("x",1.25);  
 register_entry("y",2.1);  
 if(eval_cmo(your_cmo_tree,&d)==0) goto_error();  if(eval_cmo(your_cmo_tree,&d)==0) goto_error();
 */  */
   
Line 22  if(eval_cmo(your_cmo_tree,&d)==0) goto_error();
Line 21  if(eval_cmo(your_cmo_tree,&d)==0) goto_error();
 #define FAILED  0  #define FAILED  0
 #define SUCCEED 1  #define SUCCEED 1
   
   void replace(int n, ...);
   void replace2(int n, char *s[], double v[]);
 int eval_cmo(cmo *c, double *retval);  int eval_cmo(cmo *c, double *retval);
   
 static double op_add(double x,double y)  static double op_add(double x,double y)
Line 49  static double op_negative(double x) 
Line 50  static double op_negative(double x) 
     return -x;      return -x;
 }  }
   
   static double op_parentheses(double x)
   {
       return x;
   }
   
 /* 定数は引数なしの関数として実現する。*/  /* 定数は引数なしの関数として実現する。*/
 typedef struct {  typedef struct {
     char *name;      char *name;
Line 66  typedef struct {
Line 72  typedef struct {
 entry global_dic[512] = {  entry global_dic[512] = {
     {"sin",0,sin,1},      {"sin",0,sin,1},
     {"cos",0,cos,1},      {"cos",0,cos,1},
       {"tan",0,tan,1},
       {"sinh",0,sinh,1},
       {"cosh",0,cosh,1},
       {"tanh",0,tanh,1},
       {"asin",0,asin,1},
       {"acos",0,acos,1},
       {"asinh",0,asinh,1},
       {"acosh",0,acosh,1},
       {"erf",0,erf,1},
     {"exp",0,exp,1},      {"exp",0,exp,1},
       {"exp2",0,exp2,1},
     {"log",0,log,1},      {"log",0,log,1},
     {"negative",0,op_negative,1},      {"log2",0,log2,1},
       {"log10",0,log10,1},
       {"gamma",0,gamma,1},
       {"lgamma",0,lgamma,1},
       {"sqrt",0,sqrt,1},
       {"cbrt",0,cbrt,1},
       {"fabs",0,fabs,1},
       {"j0",0,j0,1},
       {"j1",0,j1,1},
       {"y0",0,y0,1},
       {"y1",0,y1,1},
       {"()", 0,op_parentheses,1},
       {"-",  0,op_negative,1},
     {"+",  0,op_add,2},      {"+",  0,op_add,2},
     {"-",  0,op_sub,2},      {"-",  0,op_sub,2},
     {"*",  0,op_mul,2},      {"*",  0,op_mul,2},
     {"/",  0,op_div,2},      {"/",  0,op_div,2},
     {"^",  0,pow,2},      {"^",  0,pow,2},
     {"e",  M_E, NULL,0},      {"pow",  0,pow,2},
     {"pi", M_PI,NULL,0},      {"@e",  M_E, NULL,0},
       {"@pi", M_PI,NULL,0},
     {NULL,0,NULL,0}      {NULL,0,NULL,0}
 };  };
   
Line 108  void init_dic()
Line 137  void init_dic()
     memset(local_dic, 0, sizeof(entry)*LOCAL_DIC_SIZE);      memset(local_dic, 0, sizeof(entry)*LOCAL_DIC_SIZE);
 }  }
   
 static entry *find_entry(cmo *node, entry *dic)  void replace(int n, ...)
 {  {
     char *s;      char *s;
       double d;
       va_list ap;
       va_start(ap,n);
       for(init_dic(); n>0; n--) {
           s = va_arg(ap, char *);
           d = va_arg(ap, double);
           register_entry(s,d);
       }
       va_end(ap);
   }
   
   void replace2(int n, char *s[], double v[])
   {
       int i;
       init_dic();
       for(i=0; i<n; i++) {
           register_entry(s[i],v[i]);
       }
   }
   
   static entry *find_entry(cmo *node, int len, entry *dic)
   {
       char *s;
     entry *e;      entry *e;
     if(node->tag == CMO_STRING) {      if(node->tag == CMO_STRING) {
         s = ((cmo_string *)node)->s;          s = ((cmo_string *)node)->s;
Line 120  static entry *find_entry(cmo *node, entry *dic)
Line 172  static entry *find_entry(cmo *node, entry *dic)
         return NULL;          return NULL;
     }      }
     for(e=dic; e->name != NULL; e++) {      for(e=dic; e->name != NULL; e++) {
         if(strcmp(e->name,s)==0) {          if(strcmp(e->name,s)==0 && (len<0 || len==e->n_args)) {
             return e;              return e;
         }          }
     }      }
Line 183  int entry_value(entry *e, double *retval)
Line 235  int entry_value(entry *e, double *retval)
 */  */
 static int eval_cmo_tree(cmo_tree* t, double *retval)  static int eval_cmo_tree(cmo_tree* t, double *retval)
 {  {
     entry *e = find_entry((cmo *)t->name,global_dic);      entry *e = find_entry((cmo *)t->name,list_length(t->leaves),global_dic);
         if (FUNCTION_P(e)) {      if (FUNCTION_P(e)) {
                 return entry_function(e,t->leaves,retval);          return entry_function(e,t->leaves,retval);
         }else if (VALUE_P(e)) {      }else if (VALUE_P(e)) {
                 return entry_value(e, retval);          return entry_value(e, retval);
         }      }
     return 0;      return 0;
 }  }
   
 static int eval_cmo_indeterminate(cmo_indeterminate *c, double *retval)  static int eval_cmo_indeterminate(cmo_indeterminate *c, double *retval)
 {  {
     entry *e = find_entry((cmo *)c,local_dic);      entry *e = find_entry((cmo *)c,-1,local_dic);
     if (VALUE_P(e)) {      if (VALUE_P(e)) {
         return entry_value(e,retval);          return entry_value(e,retval);
     }      }
Line 263  static int eval_cmo_recursive_polynomial(cmo_recursive
Line 315  static int eval_cmo_recursive_polynomial(cmo_recursive
                 }                  }
                 vars=(double *)calloc(n,sizeof(double));                  vars=(double *)calloc(n,sizeof(double));
                 for(i=0; i<n; i++) {                  for(i=0; i<n; i++) {
                         e = find_entry(list_nth(c->ringdef,i),local_dic);                          e = find_entry(list_nth(c->ringdef,i),-1,local_dic);
                         if(e == NULL) {                          if(e == NULL) {
                                 free(vars);                                  free(vars);
                                 return 0; /* failed */                                  return 0; /* failed */
Line 282  int eval_cmo(cmo *c, double *retval)
Line 334  int eval_cmo(cmo *c, double *retval)
 {  {
     int tag = c->tag;      int tag = c->tag;
     switch(c->tag) {      switch(c->tag) {
       case CMO_NULL:
     case CMO_ZERO:      case CMO_ZERO:
         *retval = 0;          *retval = 0;
         break;          break;

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.6

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>