Index: trunk/Ohana/src/opihi/lib.data/nnet.c
===================================================================
--- trunk/Ohana/src/opihi/lib.data/nnet.c	(revision 40317)
+++ trunk/Ohana/src/opihi/lib.data/nnet.c	(revision 40319)
@@ -1,22 +1,3 @@
 # include "data.h"
-
-typedef struct {
-  char *name;
-  int Nlayers; // Nlayers = input layer + output layer + hidden layers
-  int *Nnodes; // number of nodes per layer
-  float **weights; // a matrix between each layer
-  float **biases; // a vector for each layer
-
-  float **zvalue; // a vector of z values for each layer (= w*input + b)
-  float **svalue; // a vector of s values for each layer (= sigmoid(z))
-  float **sprime; // 
-  float **delta;  // 
-
-  float ** Nabla_b; // a vector of Nabla_b values for each layer
-  float **dNabla_b; // a vector of Nabla_b values for each layer
-
-  float ** Nabla_w; // a matrix of Nabla_w values for each layer
-  float **dNabla_w; // a matrix of Nabla_w values for each layer
-} NNet;
 
 static Nnet **nnets  = NULL; /* nnet to store the list of all nnets */
@@ -34,6 +15,9 @@
   int i;
 
-  for (i = 0; i < Nnnets; i++) {
-    FreeNnet (nnets[i]);
+  if (!nnets) InitNnets();
+
+  for (i = 0; i < Nnnets; i++) {
+    FreeNnetData (nnets[i]);
+    free (nnets[i]);
   }
   free (nnets);
@@ -46,10 +30,12 @@
   nnet[0].name = strcreate (name);
 
-  nnet[0].Nlayers = 0;
+  nnet[0].Nlayer  = 0;
   nnet[0].Nnodes  = NULL;
-  nnet[0].weights = NULL;
+  nnet[0].weight  = NULL;
   nnet[0].biases  = NULL;
-  nnet[0].avalue  = NULL;
+  nnet[0].svalue  = NULL;
   nnet[0].zvalue  = NULL;
+  nnet[0].sprime  = NULL;
+  nnet[0].delta   = NULL;
 
   nnet[0]. Nabla_b  = NULL;
@@ -64,6 +50,6 @@
 
     free (nnet[0].name);
-    for (i = 0; i < nnet[0].Nlayers; i++) {
-      free (nnet[0].weights[i]);
+    for (i = 0; i < nnet[0].Nlayer; i++) {
+      free (nnet[0].weight[i]);
       free (nnet[0].biases[i]);
       free (nnet[0].svalue[i]);
@@ -78,5 +64,5 @@
     }
     free (nnet[0].Nnodes);
-    free (nnet[0].weights);
+    free (nnet[0].weight);
     free (nnet[0].biases);
     free (nnet[0].svalue);
@@ -94,4 +80,6 @@
 Nnet *GetNnet (int where) {
 
+  if (!nnets) InitNnets();
+
   if (where < 0) where += Nnnets;
   if (where < 0) return NULL;
@@ -105,4 +93,6 @@
   int i;
 
+  if (!nnets) InitNnets();
+
   for (i = 0; i < Nnnets; i++) {
     if (!strcmp (nnets[i][0].name, name)) {
@@ -113,14 +103,16 @@
 }
 
-/* make a new named nnet with Nlayers */
+/* make a new named nnet with Nlayer */
 Nnet *CreateNnet (char *name, int Nlayer) {
 
   int N;
   Nnet *nnet;
+
+  if (!nnets) InitNnets();
 
   nnet = FindNnet (name);
   if (nnet != NULL) {
     FreeNnetData (nnet);
-    InitNnetData (nnet);
+    InitNnetData (nnet, name);
     return (nnet);
   }
@@ -134,5 +126,5 @@
   nnet[0].Nlayer = Nlayer;
   ALLOCATE (nnet[0].Nnodes, int, Nlayer);
-  ALLOCATE (nnet[0].weights, float *, Nlayer);
+  ALLOCATE (nnet[0].weight, float *, Nlayer);
   ALLOCATE (nnet[0].biases, float *, Nlayer);
   ALLOCATE (nnet[0].svalue, float *, Nlayer);
@@ -155,5 +147,20 @@
   ohana_gaussdev_init ();
 
-  for (int i = 1; i < Nlayer; i++) {
+  // NOTE : none of these elements are used for the first layer (the input layer)
+  // EXCEPT svalue[0]
+  
+  nnet[0].weight[0] = NULL;
+  nnet[0].biases[0] = NULL;
+  nnet[0].zvalue[0] = NULL;
+  nnet[0].sprime[0] = NULL;
+  nnet[0].delta [0] = NULL;
+  nnet[0]. Nabla_b[0] = NULL;
+  nnet[0].dNabla_b[0] = NULL;
+  nnet[0]. Nabla_w[0] = NULL;
+  nnet[0].dNabla_w[0] = NULL;
+
+  ALLOCATE (nnet[0].svalue[0], float, nnet[0].Nnodes[0]);
+
+  for (int i = 1; i < nnet[0].Nlayer; i++) {
     ALLOCATE (nnet[0].biases[i], float, nnet[0].Nnodes[i]);  // biases for each node in the hidden and output layers only
     for (int j = 0; j < nnet[0].Nnodes[i]; j++) {
@@ -161,7 +168,7 @@
     }
 
-    ALLOCATE (nnet[0].weights[i], float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]);  // weights connected each node in the previous layer to the current layer (excludes input layer)
+    ALLOCATE (nnet[0].weight[i], float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]);  // weight connected each node in the previous layer to the current layer (excludes input layer)
     for (int j = 0; j < nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]; j++) {
-      nnet[0].weights[i][j] = ohana_gaussdev_rnd (0.0, 1.0);
+      nnet[0].weight[i][j] = ohana_gaussdev_rnd (0.0, 1.0);
     }
 
@@ -171,9 +178,8 @@
     ALLOCATE (nnet[0].delta [i], float, nnet[0].Nnodes[i]);  // vectors for holding results / values for each node in the input, hidden, output layers
 
-    ALLOCATE (nnet[0]. Nabla_b, float, nnet[0].Nnodes[i]);
-    ALLOCATE (nnet[0].dNabla_b, float, nnet[0].Nnodes[i]);
-
-    ALLOCATE (nnet[0]. Nabla_w, float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]);
-    ALLOCATE (nnet[0].dNabla_w, float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]);
+    ALLOCATE (nnet[0]. Nabla_b[i], float, nnet[0].Nnodes[i]);
+    ALLOCATE (nnet[0].dNabla_b[i], float, nnet[0].Nnodes[i]);
+    ALLOCATE (nnet[0]. Nabla_w[i], float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]);
+    ALLOCATE (nnet[0].dNabla_w[i], float, nnet[0].Nnodes[i-1]*nnet[0].Nnodes[i]);
   }
 }
@@ -183,4 +189,6 @@
 
   int i, N, NNNETS_2;
+
+  if (!nnets) InitNnets();
 
   /* find nnet in nnet list */
@@ -204,5 +212,6 @@
   }
 
-  FreeNnet (nnet);
+  FreeNnetData (nnet);
+  free (nnet);
   return (TRUE);
 }
@@ -213,7 +222,9 @@
   int i, j;
 
+  if (!nnets) InitNnets();
+
   for (i = 0; i < Nnnets; i++) {
     gprint (GP_ERR, "%-15s :", nnets[i][0].name);
-    for (j = 0; j < nnets[i][0].Nlayers; i++) {
+    for (j = 0; j < nnets[i][0].Nlayer; j++) {
       gprint (GP_ERR, " %3d", nnets[i][0].Nnodes[j]);
     }
