home *** CD-ROM | disk | FTP | other *** search
/ Collection of Education / collectionofeducationcarat1997.iso / COMPUSCI / NASANETS.ZIP / COMPILE.C < prev    next >
C/C++ Source or Header  |  1990-06-07  |  18KB  |  434 lines

  1. /*=============================*/
  2. /*           NETS              */
  3. /*                             */
  4. /* a product of the AI Section */
  5. /* NASA, Johnson Space Center  */
  6. /*                             */
  7. /* principal author:           */
  8. /*       Paul Baffes           */
  9. /*                             */
  10. /* contributing authors:       */
  11. /*      Bryan Dulock           */
  12. /*      Chris Ortiz            */
  13. /*=============================*/
  14.  
  15.  
  16. /*
  17. ----------------------------------------------------------------------
  18.   Code For Production of Delivery Code (Prefix = CC_)
  19. ----------------------------------------------------------------------
  20.   This code is divided into 3 major sections:
  21.  
  22.   (1) include files
  23.   (2) externed functions
  24.   (3) subroutines
  25.  
  26.   Each section is further explained below.
  27. ----------------------------------------------------------------------
  28. */
  29.  
  30.  
  31. /*
  32. ----------------------------------------------------------------------
  33.   INCLUDE FILES
  34. ----------------------------------------------------------------------
  35. */
  36. #include  "common.h"
  37. #include  "weights.h"
  38. #include  "layer.h"
  39. #include  "net.h"
  40. #include  "netio.h"
  41.  
  42.  
  43. /*
  44. ----------------------------------------------------------------------
  45.   EXTERNED FUNCTIONS AND GLOBALS
  46. ----------------------------------------------------------------------
  47.   Below are the functions defined in other files which are used by the
  48.   code here. They are organized by section.
  49. ----------------------------------------------------------------------
  50. */
  51. extern int    N_reset_wts();
  52. extern int    N_save_wts();
  53. extern void   IO_my_get_string();
  54. extern void   IO_print();
  55. extern void   sys_delete_file();
  56. extern int    PA_check_signature();
  57.  
  58. extern char   IO_str[MAX_LINE_SIZE];
  59.  
  60.  
  61. /*
  62. ======================================================================
  63.   ROUTINES IN DELIVER.C                                                   
  64. ======================================================================
  65.   The routines in this file are grouped below by function. Each routine
  66.   is prefixed by the string "CC_" indicating that it is defined in the 
  67.   "deliver.c" file.  The types returned by the routines are also shown 
  68.   so that cross checking is more easily done between these functions
  69.   and the other files which intern them.
  70.  
  71.  
  72.   Type Returned                 Routine                                 
  73.   -------------                 -------                                 
  74.                                                                      
  75.   CREATION ROUTINES                                                    
  76.     void                        CC_create_delivery
  77.     void                        CC_setup_header
  78.     void                        CC_create_initialize
  79.     void                        CC_create_prop
  80.     void                        CC_create_cleanup
  81.     void                        CC_create_main
  82. ======================================================================
  83. */
  84.  
  85.  
  86. void  CC_create_delivery(ptr_net, net_file, wts_file)
  87. Net   *ptr_net;
  88. char  *net_file, *wts_file;
  89. /*
  90. ----------------------------------------------------------------------
  91.   Using the network as a guide, this routine creates a deliverable
  92.   file which is used simply to execute the network.
  93. ----------------------------------------------------------------------
  94. */
  95. BEGIN
  96.    FILE  *fp;
  97.    void  CC_setup_header(), CC_create_initialize(), CC_create_prop(),
  98.          CC_create_cleanup(), CC_create_main(), CC_set_name();
  99.    char  cc_file[MAX_WORD_SIZE], net_name[MAX_WORD_SIZE];
  100.  
  101.    /*-----------------------------------------------------*/
  102.    /* if the weights file is not in portable format, quit */
  103.    /*-----------------------------------------------------*/
  104.    if (PA_check_signature(wts_file, PORTABLE_FORMAT) == ERROR)
  105.       return;
  106.    
  107.    /*-------------------------------------*/
  108.    /* first, prompt for delivery file and */
  109.    /* check that the file can be opened   */
  110.    /*-------------------------------------*/
  111.    sprintf(IO_str, "\n   Enter name of delivery file: ");
  112.    IO_print(0);
  113.    IO_my_get_string(cc_file);
  114.    while (cc_file[0] == ENDSTRING) BEGIN
  115.       sprintf(IO_str, "\n   try again: ");
  116.       IO_print(0);
  117.       IO_my_get_string(cc_file);
  118.    ENDWHILE   
  119.    if( (fp = fopen(cc_file, "wt")) == NULL) BEGIN
  120.       sprintf(IO_str, "\n*** can't open %s file ***\n", cc_file);
  121.       IO_print(0);
  122.       return;
  123.    ENDIF
  124.  
  125.    /*------------------------------------*/
  126.    /* once the prompting is done, we can */
  127.    /* begin. First,though, save off the  */
  128.    /* current network weights since they */
  129.    /* will be trashed in the process of  */
  130.    /* making the delivery file.          */
  131.    /*------------------------------------*/
  132.    N_save_wts(ptr_net, "temp.wts", FAST_FORMAT);
  133.  
  134.    /*---------------------------------------------*/
  135.    /* Next, check the weights to see that they    */
  136.    /* are compatible with the net's configuration */
  137.    /* and if not, print out message and abort.    */
  138.    /*---------------------------------------------*/
  139.    if (N_reset_wts(ptr_net, wts_file, PORTABLE_FORMAT) == ERROR) BEGIN
  140.       sprintf(IO_str, "\n*** weights not compatible with network");
  141.       IO_print(0);
  142.    ENDIF
  143.    
  144.    else BEGIN   
  145.       /*-------------------------------------------*/
  146.       /* setup the net_name variable using the net */
  147.       /* ID so that this code will be unique.      */
  148.       /*-------------------------------------------*/
  149.       CC_set_name(net_name, net_file);
  150.    
  151.       /*------------------------------------------------*/
  152.       /* Create the headers and routines which are used */
  153.       /* to initialize, propagate, and free a network.  */
  154.       /*------------------------------------------------*/
  155.       CC_setup_header(fp, ptr_net, net_name);
  156.       CC_create_main(fp, net_name);
  157.       CC_create_initialize(fp, ptr_net, net_file, wts_file, net_name);
  158.       CC_create_prop(fp, net_name);
  159.       CC_create_cleanup(fp, net_name);
  160.    ENDELSE
  161.    
  162.    /*-------------------------------------------*/
  163.    /* reset the weights of the network to their */
  164.    /* former values, throw away the temporary   */
  165.    /* file, and close the delivery file.        */
  166.    /*-------------------------------------------*/
  167.    N_reset_wts(ptr_net, "temp.wts", FAST_FORMAT);
  168.    sys_delete_file("temp.wts");
  169.    fclose(fp);
  170.  
  171. END /* CC_create_delivery */
  172.  
  173.  
  174. void  CC_set_name(net_name, net_file)
  175. char  *net_name, *net_file;
  176. /*
  177. ----------------------------------------------------------------------
  178.    Using the name of the network specification file (stored in the
  179.    "net_file" parameter) this routine sets up the string which will be
  180.    used as a precursor to all variable and routine names in the delivery
  181.    file. The idea is to read until a "." or the end of the string is
  182.    encountered.
  183. ----------------------------------------------------------------------
  184. */
  185. BEGIN
  186.    int  i = 0;
  187.    
  188.    while ((net_file[i] != '.') && (net_file[i] != ENDSTRING)) BEGIN
  189.       net_name[i] = net_file[i];      
  190.       /*-------------------------------------------------*/
  191.       /* I know this is stupid, but the stupid masscomp  */
  192.       /* C compiler choked on an autoincrement of "i"    */
  193.       /* within the array reference. So I had to come    */
  194.       /* down a peg to the brute force approach.         */
  195.       /*-------------------------------------------------*/
  196.       i++;
  197.    ENDWHILE
  198.    net_name[i++] = '_';
  199.    net_name[i] = ENDSTRING;
  200.  
  201. END /* CC_set_name */
  202.  
  203.  
  204. void  CC_setup_header(fp, ptr_net, name)
  205. FILE  *fp;
  206. Net   *ptr_net;
  207. char  *name;
  208. /*
  209. ----------------------------------------------------------------------
  210.   This routine prints out the initial includes and defines for the 
  211.   delivery file. Also, two arrays of floating point numbers are 
  212.   declared as global variables; these will be the arrays which are
  213.   used to put inputs into the network.
  214. ----------------------------------------------------------------------
  215. */
  216. BEGIN   
  217.    fprintf(fp, "\n/*=============================*/");
  218.    fprintf(fp, "\n/* NETS Netwo