1:
16: package ;
17:
18: import ;
19: import ;
20: import ;
21: import ;
22: import ;
23: import ;
24: import ;
25:
26:
34: public class NNMLToBiNet extends NNMLToNet {
35:
36:
39:
47: public Neuron[][] convertToNet(String s) throws NNMLException, NeuronTypeMismatchException {
48: return this.convertToBiNet(s);
49: }
50:
51: private BiNeuron parseNeuron(String neuron) {
52: return new BiNeuron(CharToFloat.convert(
53: neuron.substring(neuron.indexOf("=")+2,
54: neuron.indexOf(".")+2)));
55: }
56:
57: private BiNeuron[] parseLayer(String layerStr) {
58: String[] s = new String[0];
59: String[] buffer;
60: while(layerStr.indexOf("<neuron") != -1) {
61: buffer = new String[s.length+1];
62: for(int i=0;i<s.length;++i) {
63: buffer[i] = s[i];
64: }
65: buffer[s.length] = layerStr.substring(layerStr.indexOf("<neuron"), layerStr.indexOf("/>"));
66: layerStr = layerStr.substring(layerStr.indexOf("/>")+1);
67: s = buffer;
68: }
69:
70: BiNeuron[] layer = new BiNeuron[s.length];
71:
72: for(int i=0;i<layer.length;++i) {
73: layer[i] = parseNeuron(s[i]);
74: }
75: return layer;
76: }
77:
78: private BiNeuron[][] parseLayers(String layersStr) {
79: String[] s = new String[0];
80: String[] buffer;
81:
82:
83: while(layersStr.indexOf("<layer>") != -1) {
84: buffer = new String[s.length+1];
85: for(int i=0;i<s.length;++i) {
86: buffer[i] = s[i];
87: }
88: buffer[s.length] = layersStr.substring(layersStr.indexOf("<layer>"), layersStr.indexOf("</layer>"));
89: layersStr = layersStr.substring(layersStr.indexOf("</layer>")+1);
90: s = buffer;
91: }
92:
93: BiNeuron[][] layers = new BiNeuron[s.length][];
94:
95: for(int i=0;i<layers.length;++i) {
96: layers[i] = parseLayer(s[i]);
97: }
98: return layers;
99: }
100:
101: private void parseSynapses(String synapses, BiNeuron[][] schichten) throws NNMLException {
102: try {
103: while(synapses.indexOf("<synapse") != -1) {
104: synapses = synapses.substring(synapses.indexOf("<synapse"));
105: String weightStr = synapses.substring(synapses.indexOf("=")+2, synapses.indexOf(".")+2);
106: float weight = CharToFloat.convert(weightStr);
107: synapses = synapses.substring(synapses.indexOf("<source"));
108: int sourceLayerID = CharToInt.convert(synapses.charAt(synapses.indexOf("=")+2));
109: synapses = synapses.substring(synapses.indexOf("neuronID"));
110: int sourceNeuronID = CharToInt.convert(synapses.charAt(synapses.indexOf("=")+2));
111: synapses = synapses.substring(synapses.indexOf("<target"));
112: int targetLayerID = CharToInt.convert(synapses.charAt(synapses.indexOf("=")+2));
113: synapses = synapses.substring(synapses.indexOf("neuronID"));
114: int targetNeuronID = CharToInt.convert(synapses.charAt(synapses.indexOf("=")+2));
115:
116: schichten[sourceLayerID][sourceNeuronID].addConnection(schichten[targetLayerID][targetNeuronID], weight);
117: }
118: } catch (NumberFormatException e) {
119: throw new NNMLException("Error in parsing a neuron ID or layer ID", e.getCause());
120: }
121: }
122:
123:
130: public BiNeuron[][] convertToBiNet(String s) throws NNMLException, NeuronTypeMismatchException {
131: String layersStr;
132: String synapses;
133: String typeStr;
134: int beginType = s.indexOf("<neural_net type=");
135: int beginLayers = s.indexOf("<layer>");
136: typeStr = s.substring(beginType, beginLayers-1);
137: if(!StringSearch.stringContains(typeStr, "type=\"bineuron\"")){
138: throw new NeuronTypeMismatchException("Unsupported neuron type!");
139: }
140: int beginSynapsen = s.indexOf("<synapse");
141: if(beginLayers < 0 || beginSynapsen <0) {
142: throw new NNMLException("This is not valid NNML!");
143: } else {
144: layersStr = s.substring(beginLayers, beginSynapsen-1);
145: synapses = s.substring(beginSynapsen);
146: BiNeuron[][] schichten = parseLayers(layersStr);
147: parseSynapses(synapses, schichten);
148: return schichten;
149: }
150: }
151:
152: }