home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 February / PCWK0297.iso / technika / nnmodel / primfunc.c < prev    next >
C/C++ Source or Header  |  1996-04-18  |  5KB  |  266 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include <stdarg.h>
  6. #include <stdlib.h>
  7. #include "nndefs.h"
  8.  
  9. #define VERBOSE
  10.  
  11.     static char msg1[] = "Bad dimensions in alloc_2d_floats()\n";
  12.     static char msg2[] = "Can't alloc storage for dimension 1 in alloc_2d_floats()\n";
  13.     static char msg3[] = "Can't alloc storage for dimension 2 in alloc_2d_floats()\n";
  14.     static char msg4[] = "Bad dimensions in free_2d_float()\n";
  15.     void Logit(const char* fmt, ...);
  16.  
  17.     union {
  18.         float f;
  19.         long l;
  20.         } MissingUnion;
  21. #define MISSING (MissingUnion.f)
  22.  
  23. float  **alloc_2d_floats(int hi1d, int hi2d )
  24. {
  25.     int     i;
  26.     float **m;
  27.     int len;
  28.     /* check dimensions first */
  29.     if( hi1d<1 || hi2d<1 ) {
  30.         return NULL;
  31.     }
  32.     
  33.     m = (float**) malloc (sizeof(float*) * hi1d);
  34.     if( m == NULL ) {
  35.         return NULL;
  36.     }                  
  37.     len = hi2d*sizeof(float);
  38.     for( i=0; i<hi1d; ++i ) {
  39.         m[i] = (float *) malloc (sizeof(float)*hi2d) ;
  40.         if( m[i] == NULL ) {
  41.             for( i--; i> 0; --i ) free (m[i]);
  42.             free (m);
  43.             return NULL;
  44.         }
  45.         memset (m[i],0,len);
  46.     }
  47. //    return NULL;                    
  48.     // return pointer to array of pointers to rows 
  49. //    Logit ("alloc_2d returning %lx\n",m);
  50.     return m;
  51.  
  52. } // end alloc_2d_floats 
  53.  
  54. void free_2d_floats( float **matrix, int hi1d)
  55. {
  56.     int i;
  57.  
  58.     // check dimensions first 
  59.     if( hi1d<1 ) {
  60.         return;
  61.     }
  62.     if( matrix == NULL ) return;
  63.     for( i=0; i<hi1d; i++ ) free (matrix[i]);
  64.     free (matrix);
  65.  
  66. } // end free_2d_floats 
  67.  
  68. void ToUpper (char *s) {
  69.     strupr(s);
  70. }
  71.  
  72. // isstring - checks to see if the field is a string to a number 
  73. // a number is '0123456789+-eE' but not '.'                      
  74.  
  75. int isstring (const char *s) {
  76.     while (*s!=0) {
  77.         if ((*s>='A') && ((*s != 'e') || (*s != 'E'))) return 1;
  78.         s++;
  79.     }
  80.     return 0;
  81. }
  82.  
  83. // Checks for see if the value should be clipped
  84.             
  85. int ChkClip (float f, float hi, float lo)
  86. {
  87.     if (f==MISSING) return 1;
  88.     if ((hi!=MISSING) && (f > hi)) return 1;
  89.     if ((lo!=MISSING) && (f < lo)) return 1;
  90.     return 0;
  91. }
  92.  
  93. void dump (const char *buf,int count)
  94. {
  95.     int i;
  96.     char obuf[128];
  97.     char tbuf[12];
  98.     if (count==0) count=strlen(buf);
  99.  
  100.     obuf[0]=0;
  101.     for (i=0; i < count; i++) {
  102.         if ((i % 16) == 0) {
  103.             strcat (obuf,"\n");
  104.             Logit (obuf);
  105.             sprintf (obuf,"%04x - ",i);
  106.         } 
  107.         sprintf (tbuf,"%02x ",(buf[i]&0xff));
  108.         strcat (obuf,tbuf);
  109.     }
  110.     strcat (obuf,"\n");
  111.     Logit (obuf);
  112. }
  113.  
  114. void removeleadingblanks (char *s) {
  115.     char *p = s;
  116.     while (*p==32) p++;
  117.     strcpy (s,p);
  118. }
  119.  
  120. void fixfieldsize(char *s)
  121. {
  122.     int i;
  123.     int l = strlen(s);
  124.     if (l >= MAXSTRING) {
  125.         s[MAXSTRING]=0;
  126.         s[MAXSTRING-1]=32;
  127.         return;
  128.     }
  129.     for (i=l; i < MAXSTRING; i++) s[i] = 32;
  130.     s[MAXSTRING]=0;
  131. }
  132.  
  133. void Logit(const char* fmt, ...)
  134. {
  135.     static FILE *fd;
  136.     static char buf[512];
  137.     extern int SessionLog;
  138.     int ret;
  139.     
  140.     va_list args;
  141.     va_start(args,fmt);
  142. //    if (SessionLog) {
  143.         ret = vsprintf(buf,fmt,args);
  144.         fd = fopen("nnlib.log","a+");
  145.         fputs (buf,fd);
  146.         fclose(fd);
  147. //    }
  148.     va_end(args);
  149. }
  150.  
  151. /* GASDEV  routine returns a gaussian dist number range approx -5 to +5 */
  152. // example float gasdev(-13,dzdiv);
  153.  
  154.  
  155. #define M1 259200
  156. #define IA1 7141
  157. #define IC1 54773
  158. #define RM1 (1.0/M1)
  159. #define M2 134456
  160. #define IA2 8121
  161. #define IC2 28411
  162. #define RM2 (1.0/M2)
  163. #define M3 243000
  164. #define IA3 4561
  165. #define IC3 51349
  166.  
  167. float ran1(int *idum)
  168. {
  169.     static long ix1,ix2,ix3;
  170.     static float r[98];
  171.     float temp;
  172.     static int iff=0;
  173.     int j;
  174.  
  175.     if (*idum < 0 || iff == 0) {
  176.         iff=1;
  177.         ix1=(IC1-(*idum)) % M1;
  178.         ix1=(IA1*ix1+IC1) % M1;
  179.         ix2=ix1 % M2;
  180.         ix1=(IA1*ix1+IC1) % M1;
  181.         ix3=ix1 % M3;
  182.         for (j=1;j<=97;j++) {
  183.             ix1=(IA1*ix1+IC1) % M1;
  184.             ix2=(IA2*ix2+IC2) % M2;
  185.             r[j]=(float) ((ix1+ix2*RM2)*RM1);
  186.         }
  187.         *idum=1;
  188.     }
  189.     ix1=(IA1*ix1+IC1) % M1;
  190.     ix2=(IA2*ix2+IC2) % M2;
  191.     ix3=(IA3*ix3+IC3) % M3;
  192.     j=(int) (1 + ((97*ix3)/M3));
  193.     if (j > 97 || j < 1) {
  194.         Logit("RAN1: This cannot happen.");
  195.     }
  196.     temp=r[j];
  197.     r[j]=(float) ((ix1+ix2*RM2)*RM1);
  198.     return temp;
  199. }
  200.  
  201. #undef M1
  202. #undef IA1
  203. #undef IC1
  204. #undef RM1
  205. #undef M2
  206. #undef IA2
  207. #undef IC2
  208. #undef RM2
  209. #undef M3
  210. #undef IA3
  211. #undef IC3
  212.  
  213. float gasdev(int *idum, float dzdiv)
  214. {
  215.     static int iset=0;
  216.     static float gset;
  217.     float fac,r,v1,v2;
  218.  
  219.     if  (iset == 0) {
  220.         do {
  221.             v1=2.0f*ran1(idum)-1.0f;
  222.             v2=2.0f*ran1(idum)-1.0f;
  223.             r=v1*v1+v2*v2;
  224.         } while (r >= 1.0 || r == 0.0);
  225.         fac=(float)sqrt(-2.0*log(r)/r);
  226.         gset=v1*fac;
  227.         iset=1;
  228.         return v2*fac/dzdiv;
  229.     } else {
  230.         iset=0;
  231.         return gset/dzdiv;
  232.     }
  233. }
  234.  
  235. int sign (float x, float y)
  236. {
  237.     if ((x>0) && (y>0)) return 1;
  238.     if ((x<0) && (y<0)) return 1;
  239.     return 0;
  240. }
  241.  
  242. float sign_of_arg (float x)
  243. {
  244.     return (x < 0) ? -1 : 1;
  245.  
  246. } // end sign_of_arg 
  247.  
  248. float Max (float a, float b)
  249. {
  250.     if (a > b) return a;
  251.     else return b;
  252. }
  253.  
  254. // returns a number between -randz and +randz 
  255.  
  256. float Random(float randz) {
  257.     float f;
  258.  
  259.     f = (float) rand() / 32767.0f;
  260.     f = (.5f - f ) * randz * 2.f;
  261.  
  262. //      printf ("%10f",f);
  263.     return f;
  264. }
  265.  
  266.