00001
00025 #include "inanna/annetwork.h"
00026
00027 ANNTopology::~ANNTopology () {
00028 }
00029
00030
00031
00033
00034
00035
00036
00037
00038
00040
00041 ANNLayering::~ANNLayering () {
00042 }
00043
00054 void ANNLayering::make (const char* description) {
00055 if (!description)
00056 return;
00057 String desc = description;
00058
00059 Array<String> sizes_tmp;
00060 desc.split (sizes_tmp, '-');
00061 ASSERTWITH (sizes_tmp.size()>=1, "Layering description must have at least 1 layer");
00062
00063
00064 mLayers.make (sizes_tmp.size());
00065 for (int i=0; i<sizes_tmp.size(); i++)
00066 mLayers[i] = sizes_tmp[i].toInt();
00067 }
00068
00075 int ANNLayering::layerIndex (int layer) const {
00076 if (layer<0)
00077 layer = mLayers.size()+layer;
00078
00079 ASSERT (layer>=0 && layer<mLayers.size());
00080
00081 int index = 0;
00082 for (int k=0; k<layer; k++)
00083 index += mLayers[k];
00084
00085 return index;
00086 }
00087
00099 void ANNLayering::getPos (int i, int& layerno, int& layerpos) const {
00100 layerpos=i;
00101 for (layerno=0; layerno<mLayers.size() && layerpos>=mLayers[layerno];
00102 layerpos-=mLayers[layerno++]);
00103 ASSERTWITH (layerno<mLayers.size(), format ("Index %d doesn't map to layering", i));
00104 }
00105
00108 String ANNLayering::toString () const {
00109
00110 Array<String> layers_arr (layers());
00111 for (int i=0; i<layers(); i++)
00112 layers_arr[i] = String ((*this)[i]);
00113
00114
00115 String layers_str;
00116 layers_str.join (layers_arr, '-');
00117
00118 return layers_str;
00119 }
00120
00121
00122
00124
00125
00126
00127
00128
00129
00131
00132 LayeredTopology::~LayeredTopology () {
00133 }
00134
00135 void LayeredTopology::build (ANNetwork& network) const {
00136 const ANNLayering& mLayering = dynamic_cast<const ANNLayering&>(*this);
00137 int inputs=mLayering[0];
00138 int outputlimit=mLayering.layerIndex (-1);
00139
00140
00141
00142
00143 for (int i=0; i<mLayering.totalUnits(); i++)
00144
00145 if (network.getUnitPrototype())
00146 network.add (network.getUnitPrototype()->clone());
00147 else
00148 network.add (new Neuron());
00149
00150
00151 for (int i=0; i<network.size(); i++) {
00152
00153 if (i<inputs)
00154 network[i].setType (Neuron::INPUTUNIT);
00155 else
00156 if (i<outputlimit)
00157 network[i].setType (Neuron::HIDDENUNIT);
00158 else
00159 network[i].setType (Neuron::OUTPUTUNIT);
00160
00161
00162
00163
00164 int layerno, layerpos;
00165 mLayering.getPos (i, layerno, layerpos);
00166
00167
00168 network[i].moveTo (layerno*8, layerpos, 0);
00169 }
00170 }
00171