home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / misc / b186_1 / Source / c / patterns < prev    next >
Text File  |  1988-01-14  |  6KB  |  229 lines

  1. /*
  2.  
  3.        This file is part of the PDP software package.
  4.          
  5.        Copyright 1987 by James L. McClelland and David E. Rumelhart.
  6.        
  7.        Please refer to licensing information in the file license.txt,
  8.        which is in the same directory with this source file and is
  9.        included here by reference.
  10. */
  11.  
  12.  
  13. /* file: patterns.c
  14.  
  15.     This file contains functions for reading patterns.
  16.     
  17.     First version implemented by Elliot Jaffe.
  18.     
  19.     Date of last revision:  8-12-87/JLM.
  20. */
  21.  
  22. /*LINTLIBRARY*/
  23.  
  24. #include "general.h"
  25. #include "command.h"
  26. #include "variable.h"
  27. #include "patterns.h"
  28.  
  29. int     npatterns;
  30. int    maxpatterns = MAXPATTERNS;
  31. float  **ipattern;
  32. float  **tpattern;
  33. char   **pname;
  34. int    *used;
  35. char   cpname[BUFSIZ];
  36.  
  37. extern int ninputs; 
  38. extern int noutputs;
  39.  
  40. init_pattern_pairs() {
  41.     init_pats(PAIRS);
  42. }
  43.  
  44. init_patterns() {
  45.     init_pats(!PAIRS);
  46. }
  47.  
  48. init_pats(pairs) int pairs; {
  49.  
  50.     (void) install_var("npatterns", Int,(int *) & npatterns, 0, 0,SETENVMENU);
  51.     (void) install_var("maxpatterns",Int,(int *) &maxpatterns,0,0,SETENVMENU);
  52.     (void) install_var("ipattern", PVfloat,(int *) ipattern, 0, 0,SETENVMENU);
  53.     if (pairs) 
  54.       (void) install_var("tpattern", PVfloat,(int *) tpattern,0,0,SETENVMENU);
  55.     (void) install_var("pname",Vstring,(int *) pname, 0, 0, SETENVMENU);
  56.     (void) install_var("cpname", String,(int *) cpname, 0, 0, SETSVMENU);
  57.     
  58. }
  59.  
  60. reset_patterns(pairs) int pairs; {
  61.     int i;
  62.     struct Variable *vp;
  63.     
  64.     if (pname) {
  65.       for (i = 0; i < npatterns; i++) {
  66.     if(pname[i] != NULL)
  67.       free(pname[i]);
  68.       }
  69.       free(pname);
  70.     }
  71.     pname = ( (char **) emalloc( (unsigned)(sizeof (char *) * maxpatterns)));
  72.     vp = lookup_var("pname");
  73.     vp->varptr = (int *) pname;
  74.     if (ipattern) {
  75.       for(i = 0; i < npatterns; i++) {
  76.     if(ipattern[i] != NULL)
  77.       free(ipattern[i]);
  78.       }
  79.       free(ipattern);
  80.     }
  81.     ipattern = 
  82.         ((float **) emalloc( (unsigned) (sizeof (float *) * maxpatterns)));
  83.     vp = lookup_var("ipattern");
  84.     vp->varptr = (int *) ipattern;
  85.     if (pairs) {
  86.       if (tpattern) {
  87.         for (i = 0; i < npatterns; i++) {
  88.          if(tpattern[i] != NULL)
  89.       free(tpattern[i]);
  90.     }
  91.     free(tpattern);
  92.       }
  93.       tpattern = 
  94.       ((float **) emalloc( (unsigned) (sizeof (float *) * maxpatterns)));
  95.       vp = lookup_var("tpattern");
  96.       vp->varptr = (int *) tpattern;
  97.     }
  98.     if (used) free(used);
  99.     used = ( (int *) emalloc( (unsigned) (sizeof (int) * maxpatterns)));
  100. }
  101.  
  102. enlarge_patterns(pairs) int pairs; {
  103.     struct Variable *vp;
  104.     int oldmaxpatterns;
  105.     
  106.     oldmaxpatterns = maxpatterns;
  107.     
  108.     maxpatterns += 100;
  109.     pname = ( (char **) 
  110.       erealloc( (char *) pname,
  111.           (unsigned)(oldmaxpatterns * sizeof(char *)),
  112.       (unsigned)(maxpatterns * sizeof(char *))));
  113.     vp = lookup_var("pname");
  114.     vp->varptr = (int *) pname;
  115.     ipattern = ( (float **) 
  116.       erealloc( (char *)ipattern,
  117.           (unsigned)(oldmaxpatterns * sizeof(float *)),
  118.       (unsigned)(maxpatterns * sizeof(float *))));
  119.     vp = lookup_var("ipattern");
  120.     vp->varptr = (int *) ipattern;
  121.     if (pairs) {
  122.     tpattern = ( (float **) 
  123.          erealloc( (char *)tpattern,
  124.          (unsigned)(oldmaxpatterns * sizeof(float *)),
  125.          (unsigned)(maxpatterns * sizeof(float *))));
  126.     vp = lookup_var("tpattern");
  127.     vp->varptr = (int *) tpattern;
  128.     }
  129.     used = ( (int *) erealloc( (char *)used,
  130.             (unsigned)(oldmaxpatterns * sizeof(int)),
  131.         (unsigned)(maxpatterns * sizeof(int))));
  132. }
  133.  
  134. get_patterns() {
  135.     return(get_pats(!PAIRS));
  136. }
  137.  
  138. get_pattern_pairs() {
  139.     return(get_pats(PAIRS));
  140. }
  141.  
  142. get_pats(pairs) int pairs; {
  143.     char   *sp;
  144.     int     i,j,rval;
  145.     FILE   *iop;
  146.     char    temp[LINE_SIZE];
  147.  
  148.     if (!System_Defined)
  149.       if (!define_system())
  150.     return(put_error("Define network before getting patterns"));
  151.  
  152.     sp = get_command("filename for patterns: ");
  153.     if( sp == NULL) return(CONTINUE);
  154.     if ((iop = fopen(sp, "r")) == NULL) {
  155.     return(put_error("Can't open file for patterns."));
  156.     }
  157.     reset_patterns(pairs);
  158.     for (i = 0; 1; i++) {
  159.     if (fscanf(iop,"%s",temp) == EOF) {
  160.         break;
  161.     }
  162.     if (i == maxpatterns) {
  163.         enlarge_patterns(pairs);
  164.     }
  165.     pname[i] = ((char *) emalloc((unsigned)(strlen(temp) + 1)));
  166.     (void) strcpy(pname[i], temp);
  167.     ipattern[i] = ((float *) emalloc((unsigned) (ninputs*sizeof(float))));
  168.     for (j = 0; j < ninputs; j++) {
  169.       if (fscanf(iop,"%s",temp) == EOF) {
  170.         rval = put_error("Pattern file structure does not match specs!");
  171.         goto pattern_end;
  172.       }
  173.       if (strcmp(temp,"+") == 0) ipattern[i][j] = (float) 1.0;
  174.       else if (strcmp(temp,"-") == 0) ipattern[i][j] = (float) -1.0;
  175.       else if (strcmp(temp,".") == 0) ipattern[i][j] = (float) 0.0;
  176.       else if (sscanf(temp,"%f",&ipattern[i][j]) != 1) {
  177.         rval = put_error("Pattern file structure does not match specs!");
  178.         goto pattern_end;
  179.       }
  180.     }
  181.     if (pairs) {
  182.      tpattern[i] = ((float *)emalloc((unsigned)(noutputs*sizeof(float))));
  183.      for (j = 0; j < noutputs; j++) {
  184.       if (fscanf(iop,"%s",temp) == EOF) {
  185.         rval = put_error("Pattern file structure does not match specs!");
  186.         goto pattern_end;
  187.       }
  188.       if (strcmp(temp,"+") == 0) tpattern[i][j] = (float) 1.0;
  189.       else if (strcmp(temp,".") == 0) tpattern[i][j] = (float) 0.0;
  190.       else if (strcmp(temp,"-") == 0) tpattern[i][j] = (float) -1.0;
  191.       else if (sscanf(temp,"%f",&tpattern[i][j]) != 1) {
  192.         rval = put_error("Pattern file structure does not match specs!");
  193.         goto pattern_end;
  194.       }
  195.      }
  196.     }
  197.     }
  198.     rval = CONTINUE;
  199. pattern_end:
  200.     npatterns = i;
  201.     change_variable_length("ipattern",npatterns,ninputs);
  202.     if (pairs) 
  203.         change_variable_length("tpattern",npatterns,noutputs);
  204.     change_variable_length("pname",npatterns,0);
  205.     clear_display();
  206.     update_display();
  207.     (void) fclose(iop);
  208.     return(rval);
  209. }
  210.  
  211. get_pattern_number(str)  char *str; {
  212.  
  213.     int index;
  214.  
  215.     if(sscanf(str,"%d",&index) == 1) 
  216.     if(index < 0 || index >= npatterns)
  217.         return(-1);
  218.     else
  219.         return(index);
  220.     for(index = 0; index < npatterns; index++)
  221.     if(startsame(str,pname[index]))
  222.        break;
  223.  
  224.     if(index < npatterns)
  225.     return(index);
  226.     else
  227.     return(-1);
  228. }
  229.