// NNfile class: parses neural network input files // storing network parameters and optional training // data in memory. // Modified 9/11/97: removed packing all data in a // single array (now use multiple arrays so the code // is simpler). package mwa.ai.neural; import java.io.*; import java.net.URL; import java.util.*; //import java.lang.*; class FileFormatException extends Exception { public FileFormatException(String str) { super(str); } } public class NNfile { public int NumLayers; public int NumInput, NumHidden, NumOutput, NumTraining; public int WeightFlag; public int SpecialFlag; private float W1[]; private float W2[]; private float Special[]; // private float Training[]; private Vector TrainingIn = new Vector(); private Vector TrainingOut = new Vector(); public NNfile() { NumLayers=NumInput=NumHidden=NumOutput=0; } public NNfile(String input_file) { FileInputStream is = null; try { is = new FileInputStream(input_file); } catch (Exception E) { System.out.println("can not open file " + input_file); } try { if (is != null) ReadFile(is); is.close(); } catch (Exception E) { System.out.println("can not process file"); } OutputStream f = null; } // To get weights: public float GetW1(int input, int hidden) { return W1[input * NumHidden + hidden]; } public float GetW2(int hidden, int output) { return W2[hidden * NumOutput + output]; } // To set weights: public void SetW1(int input, int hidden, float x) { WeightFlag=1; // set this so save() will save weights W1[input * NumHidden + hidden] = x; } public void SetW2(int hidden, int output, float x) { WeightFlag=1; // set this so save() will save weights W2[hidden * NumOutput + output] = x; } // To get any application specific data: public float GetSpecial(int i) { if (SpecialFlag==0) return 0.0f; return Special[i]; } // To add application specific data: public void AddSpecial(float x) { Special[SpecialFlag++] = x; } // To get training cases: public float GetInput(int training_case, int neuron_index) { return ((float [])TrainingIn.elementAt(training_case))[neuron_index]; } public float GetOutput(int training_case, int neuron_index) { return ((float [])TrainingOut.elementAt(training_case))[neuron_index]; } public void RemoveTraining(int num) { if (num < 0 || num >= NumTraining) { System.out.println("Error in RemoveTraining(" + num + ")"); return; } TrainingIn.removeElementAt(num); TrainingOut.removeElementAt(num); NumTraining--; } public void AddTraining(float inputs[], float outputs[]) { TrainingIn.addElement(inputs); TrainingOut.addElement(outputs); NumTraining++; } void ReadFile(InputStream inp) throws IOException, FileFormatException { System.out.println("Entered ReadFile"); float data[] = new float[32000]; // temporary storage StreamTokenizer st = new StreamTokenizer(inp); st.commentChar('#'); st.eolIsSignificant(false); st.parseNumbers(); System.out.println("Before while" ); int count = 0; process: while (true) { switch(st.nextToken()) { case StreamTokenizer.TT_EOL: System.out.println("EOF found"); break process; case StreamTokenizer.TT_NUMBER: float x = (float)st.nval; data[count++] = x; break; case StreamTokenizer.TT_WORD: String s = st.sval.substring(0, 2).toLowerCase(); if (s.equals("e-")) { data[count-1] = 0.0f; } else { System.out.println("Token (default):" + st.sval); break process; } break; default: System.out.println("Token (default):" + st.sval); break process; } } inp.close(); int k = 0; NumLayers = (int)data[k++]; NumInput = (int)data[k++]; NumHidden = (int)data[k++]; NumOutput = (int)data[k++]; WeightFlag = (int)data[k++]; SpecialFlag = (int)data[k++]; int TempNumTraining = (int)data[k++]; // allocate storage: W1 = new float[NumInput * NumHidden]; W2 = new float[NumHidden * NumOutput]; Special = new float[SpecialFlag + 10]; // room to grow.. // Training = new float[NumTraining * (NumInput + NumOutput)]; if (WeightFlag!=0) { for (int i=0; i