Diff for /capa/capa51/pProj/capaFunction.c between versions 1.7 and 1.11

version 1.7, 2000/06/30 21:36:16 version 1.11, 2000/09/14 20:25:12
Line 2 Line 2
    Copyright (C) 1992-2000 Michigan State University     Copyright (C) 1992-2000 Michigan State University
   
    The CAPA system is free software; you can redistribute it and/or     The CAPA system is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as     modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the     published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.     License, or (at your option) any later version.
   
    The CAPA system is distributed in the hope that it will be useful,     The CAPA system is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of     but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.     General Public License for more details.
   
    You should have received a copy of the GNU Library General Public     You should have received a copy of the GNU General Public
    License along with the CAPA system; see the file COPYING.  If not,     License along with the CAPA system; see the file COPYING.  If not,
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,     write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */     Boston, MA 02111-1307, USA.
   
      As a special exception, you have permission to link this program
      with the TtH/TtM library and distribute executables, as long as you
      follow the requirements of the GNU GPL in regard to all of the
      software in the executable aside from TtH/TtM.
   */
   
 /* =||>>================================================================<<||= */  /* =||>>================================================================<<||= */
 /* 45678901234567890123456789012345678901234567890123456789012345678901234567 */  /* 45678901234567890123456789012345678901234567890123456789012345678901234567 */
 /*  copyrighted by Isaac Tsai, 1996, 1997, 1998, 1999, 2000                   */  /*  by Isaac Tsai, 1996, 1997, 1998, 1999, 2000                               */
 /* =||>>================================================================<<||= */  /* =||>>================================================================<<||= */
   
 #include <stdlib.h>  #include <stdlib.h>
Line 60  match_function(func, argc) char *func; i Line 66  match_function(func, argc) char *func; i
 {  {
   if( !strcmp(func,"random") )         return (((argc==2 || argc==3)? RANDOM_F : MIS_ARG_COUNT));    if( !strcmp(func,"random") )         return (((argc==2 || argc==3)? RANDOM_F : MIS_ARG_COUNT));
   if( !strcmp(func,"random_normal") )         return ((argc==5)? RANDOM_NORMAL_F : MIS_ARG_COUNT);    if( !strcmp(func,"random_normal") )         return ((argc==5)? RANDOM_NORMAL_F : MIS_ARG_COUNT);
     if( !strcmp(func,"random_multivariate_normal") )  return ((argc==6)? RANDOM_MULTIVARIATE_NORMAL_F : MIS_ARG_COUNT);
   if( !strcmp(func,"random_beta") )           return ((argc==5)? RANDOM_BETA_F : MIS_ARG_COUNT);    if( !strcmp(func,"random_beta") )           return ((argc==5)? RANDOM_BETA_F : MIS_ARG_COUNT);
   if( !strcmp(func,"random_gamma") )          return ((argc==5)? RANDOM_GAMMA_F : MIS_ARG_COUNT);    if( !strcmp(func,"random_gamma") )          return ((argc==5)? RANDOM_GAMMA_F : MIS_ARG_COUNT);
   if( !strcmp(func,"random_poisson") )        return ((argc==4)? RANDOM_POISSON_F : MIS_ARG_COUNT);    if( !strcmp(func,"random_poisson") )        return ((argc==4)? RANDOM_POISSON_F : MIS_ARG_COUNT);
Line 777  ArgNode_t  *argp; Line 784  ArgNode_t  *argp;
               resultp->s_int  = 0;                resultp->s_int  = 0;
             } break;              } break;
    /* generate random numbers according to a pre-defined distributions and a seed */     /* generate random numbers according to a pre-defined distributions and a seed */
      case RANDOM_MULTIVARIATE_NORMAL_F:
          /* random_multivariate_normal(return_array,item_cnt,seed,dimen,mean_vector,covariance_vector) */
          /* the dimension of both mean_vector and covariance_vector should be the same as item_cnt */
          /* It will return item_cnt numbers in standard normal deviate in return_array */
          /* item_cnt, seed, dimen, mean_vec, cov_vec 
             are all destroyed after this function !!!*/
           {  char     *mean_vec_str, *cov_vec_str, *seed_str, *out_vec_str;
              int      dimen, item_cnt, tmp_int;
              long     tmp_long;
              Symbol   *r_p;
              
              errCode = 0;
              switch( FIRST_ARGTYPE(argp) ) { /* parameter one covariance_matrix of size dimen*dimen */
                     case I_VAR: case I_CONSTANT:   
                     case R_VAR: case R_CONSTANT: 
                           resultp->s_type = S_CONSTANT;
                           resultp->s_str  = strsave("<<LAST ARG. OF THIS FUNCTION MUST BE AN ARRAY NAME>>");
                           sprintf(tmpS,"%s()'s last arg. must be an array name.\n",FuncStack[Func_idx].s_name);
                           capa_msg(MESSAGE_ERROR,tmpS);
                           errCode = 1;
                          break;
                     case S_VAR: case S_CONSTANT:
                           cov_vec_str = strsave( FIRST_ARGSTR(argp) );
                          break;
                     case IDENTIFIER:
                           cov_vec_str = strsave( FIRST_ARGNAME(argp) );
                           /*
                           resultp->s_type = S_CONSTANT;
                           resultp->s_str  = strsave("<<LAST ARG. OF THIS FUNCTION MUST BE AN ARRAY WITH DATA>>");
                           sprintf(tmpS,"%s()'s last arg. must be an array with data (covariance array).\n",FuncStack[Func_idx].s_name);
                           capa_msg(MESSAGE_ERROR,tmpS);
                           errCode = 1;
                           */
                          break;
              }
              if(errCode == 0) {
                 switch( SECOND_ARGTYPE(argp) ) { /* parameter two mean_vector */
                       case I_VAR: case I_CONSTANT:   
                       case R_VAR: case R_CONSTANT: 
                           resultp->s_type = S_CONSTANT;
                           resultp->s_str  = strsave("<<THE FIFTH ARG. OF THIS FUNCTION MUST BE AN ARRAY NAME>>");
                           sprintf(tmpS,"%s()'s fifth arg. must be an array name.\n",FuncStack[Func_idx].s_name);
                           capa_msg(MESSAGE_ERROR,tmpS);
                           errCode = 1;
                           break;
                       case S_VAR: case S_CONSTANT:
                           mean_vec_str = SECOND_ARGSTR(argp);
                           break;
                       case IDENTIFIER:
                           mean_vec_str = SECOND_ARGNAME(argp);
                           /*
                           resultp->s_type = S_CONSTANT;
                           resultp->s_str  = strsave("<<THE FIFTH ARG. OF THIS FUNCTION MUST BE AN ARRAY WITH DATA>>");
                           sprintf(tmpS,"%s()'s fifth arg. must be an array with data (mean array).\n",FuncStack[Func_idx].s_name);
                           capa_msg(MESSAGE_ERROR,tmpS);
                           errCode = 1;
                           */
                           break;
                 }
                 if(errCode == 0 ) {
                    switch( THIRD_ARGTYPE(argp) ) { /* parameter three dimen */
                       case I_VAR: case I_CONSTANT:
                              dimen = THIRD_ARGINT(argp);
                              break;
                       case R_VAR: case R_CONSTANT: 
                              dimen = (int)THIRD_ARGREAL(argp);
                              break;
                       case S_VAR: case S_CONSTANT: 
                       case IDENTIFIER:
                              resultp->s_type = S_CONSTANT;
                              resultp->s_str  = strsave("<<THE FOURTH ARG. OF THIS FUNCTION MUST BE A NUMBER>>");
                              sprintf(tmpS,"%s()'s fourth arg. must be a number.\n",FuncStack[Func_idx].s_name);
                              capa_msg(MESSAGE_ERROR,tmpS);
                              errCode = 1;
                              break;
                     }
                     if(errCode == 0 ) {  /* parameter four seed */
                       switch( FOURTH_ARGTYPE(argp) ) { /* seed */
                           case I_VAR: case I_CONSTANT:
                                     seed_str = (char *)capa_malloc(32,1);
                                     sprintf(seed_str,"%ld",FOURTH_ARGINT(argp) );
                                   break;
                            case R_VAR: case R_CONSTANT: 
                                     tmp_long = (long)FOURTH_ARGREAL(argp);
                                     seed_str = (char *)capa_malloc(32,1);
                                     sprintf(seed_str,"%ld",tmp_long);
                                   break;
                            case S_VAR: case S_CONSTANT: 
                                     seed_str = strsave(FOURTH_ARGSTR(argp));
                                   break;
                            case IDENTIFIER:
                                     resultp->s_type = S_CONSTANT;
                                     resultp->s_str  = strsave("<<THIRD ARG. OF THIS FUNCTION MUST BE A NUMBER OR STRING>>");
                                  sprintf(tmpS,"%s()'s third arg. must be a number or a string.\n",FuncStack[Func_idx].s_name);
                                     capa_msg(MESSAGE_ERROR,tmpS);
                                     errCode = 1;
                                   break;
                       }
                       if(errCode == 0 ) {
                          switch( FIFTH_ARGTYPE(argp) ) { /* parameter five item_cnt */
                             case I_VAR: case I_CONSTANT:
                                     item_cnt = FIFTH_ARGINT(argp);
                                    break;
                             case R_VAR: case R_CONSTANT: 
                                     item_cnt = (int)FIFTH_ARGREAL(argp);
                                    break;
                             case S_VAR: case S_CONSTANT: 
                             case IDENTIFIER:
                                    resultp->s_type = S_CONSTANT;
                                    resultp->s_str  = strsave("<<SECOND ARG. OF THIS FUNCTION MUST BE A NUMBER>>");
                                    sprintf(tmpS,"%s()'s second arg. must be a number.\n",FuncStack[Func_idx].s_name);
                                    capa_msg(MESSAGE_ERROR,tmpS);
                                    errCode = 1;
                                    break;
                           }
                           if(errCode == 0 ) { /* array_name, clear the content of this array first */
                              switch( SIXTH_ARGTYPE(argp) ) { 
                                 case I_VAR: case I_CONSTANT: 
                                 case R_VAR: case R_CONSTANT: 
                                      resultp->s_type = S_CONSTANT;
                                      resultp->s_str  = strsave("<<FIRST ARG. OF THIS FUNCTION MUST BE AN ARRAY NAME>>");
                                    sprintf(tmpS,"%s()'s first arg. must be a name of an array.\n",FuncStack[Func_idx].s_name);
                                      capa_msg(MESSAGE_ERROR,tmpS);
                                      errCode = 1;
                                   break;
                                  case S_VAR: case S_CONSTANT:
                                      tmp_int = free_array(SIXTH_ARGSTR(argp));
                                      
                                      out_vec_str= strsave(SIXTH_ARGSTR(argp));
                                   break;
                                  case IDENTIFIER:
                                      tmp_int = free_array(SIXTH_ARGNAME(argp));
                                      
                                      out_vec_str= strsave(SIXTH_ARGNAME(argp));
                                      
                                   break;
                               } /* send switch */
                             } /* end if array_name check */
                           } /* end if (item_cnt) check */
                         } /* end if (seed) check */
                       } /* end if (dimen) check */
                     } /* end if (mean_vector) check */
                     if(errCode == 0 ) { /* all the parameter checks OK */
                       r_p = gen_multivariate_normal(out_vec_str,seed_str,item_cnt,dimen,mean_vec_str,cov_vec_str);
                       capa_mfree((char *)resultp);
                       resultp = r_p;
                       
                     }
                     if( out_vec_str != NULL )   capa_mfree((char *)out_vec_str);
                     if( seed_str != NULL )      capa_mfree((char *)seed_str);
                     if( mean_vec_str != NULL )  capa_mfree((char *)mean_vec_str);
                     if( cov_vec_str != NULL )   capa_mfree((char *)cov_vec_str);
                     
           } break;
    case RANDOM_NORMAL_F: /* random_normal(return_array,item_cnt,seed,av,std_dev) */     case RANDOM_NORMAL_F: /* random_normal(return_array,item_cnt,seed,av,std_dev) */
    case RANDOM_BETA_F: /* random_beta(return_array,item_cnt,seed,aa,bb) */     case RANDOM_BETA_F: /* random_beta(return_array,item_cnt,seed,aa,bb) */
    case RANDOM_GAMMA_F: /* random_gamma(return_array,item_cnt,seed,a,r) */     case RANDOM_GAMMA_F: /* random_gamma(return_array,item_cnt,seed,a,r) */

Removed from v.1.7  
changed lines
  Added in v.1.11


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