//Constructors /// <summary> /// Creates an itialized instance. /// </summary> /// <param name="fieldIdx">Index of the reservoir input field</param> /// <param name="poolID">ID of the target pool</param> /// <param name="density">Input field connection density</param> /// <param name="synapseCfg">Input neuron to pool's neuron synapse settings</param> public InputConnection(int fieldIdx, int poolID, double density, InputSynapseSettings synapseCfg) { FieldIdx = fieldIdx; PoolID = poolID; Density = density; SynapseCfg = synapseCfg.DeepClone(); return; }
/// <summary> /// The deep copy constructor. /// </summary> /// <param name="source">Source instance</param> public InputConnection(InputConnection source) { FieldIdx = source.FieldIdx; PoolID = source.PoolID; Density = source.Density; SynapseCfg = source.SynapseCfg.DeepClone(); return; }
/// <summary> /// Creates the instance and initializes it from given xml element. /// This is the preferred way to instantiate Neural Preprocessor settings. /// </summary> /// <param name="elem"> /// Xml data containing the settings. /// Content of xml element is always validated against the xml schema. /// </param> public NeuralPreprocessorSettings(XElement elem) { //Validation ElemValidator validator = new ElemValidator(); Assembly assemblyRCNet = Assembly.GetExecutingAssembly(); validator.AddXsdFromResources(assemblyRCNet, "RCNet.Neural.Network.SM.Preprocessing.NeuralPreprocessorSettings.xsd"); validator.AddXsdFromResources(assemblyRCNet, "RCNet.RCNetTypes.xsd"); XElement neuralPreprocessorSettingsElem = validator.Validate(elem, "rootElem"); //Parsing //Input InputConfig = new InputSettings(neuralPreprocessorSettingsElem.Descendants("input").First()); //Collect available reservoir settings List <ReservoirSettings> availableResSettings = new List <ReservoirSettings>(); XElement reservoirSettingsContainerElem = neuralPreprocessorSettingsElem.Descendants("reservoirCfgContainer").First(); foreach (XElement reservoirSettingsElem in reservoirSettingsContainerElem.Descendants("reservoirCfg")) { availableResSettings.Add(new ReservoirSettings(reservoirSettingsElem)); } //Mapping of input fields to reservoir settings (future reservoir instance) ReservoirInstanceDefinitionCollection = new List <ReservoirInstanceDefinition>(); XElement reservoirInstancesContainerElem = neuralPreprocessorSettingsElem.Descendants("reservoirInstanceContainer").First(); int reservoirInstanceID = 0; int numOfNeuronsInLargestReservoir = 0; foreach (XElement reservoirInstanceElem in reservoirInstancesContainerElem.Descendants("reservoirInstance")) { ReservoirInstanceDefinition reservoirInstanceDefinition = new ReservoirInstanceDefinition { InstanceID = reservoirInstanceID, InstanceName = reservoirInstanceElem.Attribute("name").Value, //Select reservoir settings Settings = (from settings in availableResSettings where settings.SettingsName == reservoirInstanceElem.Attribute("cfg").Value select settings).FirstOrDefault(), PredictorsCfg = new HiddenNeuronPredictorsSettings(reservoirInstanceElem.Descendants("predictors").First()) }; if (reservoirInstanceDefinition.Settings == null) { throw new Exception($"Reservoir settings '{reservoirInstanceElem.Attribute("cfg").Value}' was not found among available settings."); } //Update number of neurons in the largest reservoir int numOfReservoirNeurons = 0; foreach (PoolSettings ps in reservoirInstanceDefinition.Settings.PoolSettingsCollection) { numOfReservoirNeurons += ps.Dim.Size; } if (numOfNeuronsInLargestReservoir < numOfReservoirNeurons) { numOfNeuronsInLargestReservoir = numOfReservoirNeurons; } //Distinct input field names and corresponding indexes using by the reservoir instance List <string> resInpFieldNameCollection = new List <string>(); foreach (XElement inputFieldConnectionElem in reservoirInstanceElem.Descendants("inputConnections").First().Descendants("inputConnection")) { //Input field name string inputFieldName = inputFieldConnectionElem.Attribute("fieldName").Value; //Index in InputConfig int inputFieldIdx = InputConfig.IndexOf(inputFieldName); //Found? if (inputFieldIdx < 0) { //Not found throw new Exception($"Reservoir instance {reservoirInstanceDefinition.InstanceName}: field name {inputFieldName} is not defined among input fields."); } //Add distinct name to the collection if (resInpFieldNameCollection.IndexOf(inputFieldName) < 0) { reservoirInstanceDefinition.NPInputFieldIdxCollection.Add(inputFieldIdx); resInpFieldNameCollection.Add(inputFieldName); } } //Connections of the reservoir's input fields to the pools foreach (XElement inputConnectionElem in reservoirInstanceElem.Descendants("inputConnections").First().Descendants("inputConnection")) { //Input field string inputFieldName = inputConnectionElem.Attribute("fieldName").Value; //Index in resInpFieldNameCollection int resInputFieldIdx = resInpFieldNameCollection.IndexOf(inputFieldName); //Found? if (resInputFieldIdx < 0) { //Not found throw new Exception($"Reservoir instance {reservoirInstanceDefinition.InstanceName}: input field {inputFieldName} is not defined among Reservoir's input fields."); } //Target pool string targetPoolName = inputConnectionElem.Attribute("poolName").Value; int targetPoolID = -1; //Find target pool ID (index) for (int idx = 0; idx < reservoirInstanceDefinition.Settings.PoolSettingsCollection.Count; idx++) { if (reservoirInstanceDefinition.Settings.PoolSettingsCollection[idx].Name == targetPoolName) { targetPoolID = idx; break; } } //Found? if (targetPoolID < 0) { //Not found throw new Exception($"Reservoir instance {reservoirInstanceDefinition.InstanceName}: pool {targetPoolName} is not defined among Reservoir pools."); } //Density double density = double.Parse(inputConnectionElem.Attribute("density").Value, CultureInfo.InvariantCulture); //Input synapse settings InputSynapseSettings synapseCfg = new InputSynapseSettings(inputConnectionElem.Descendants("synapse").First()); //Add new assignment reservoirInstanceDefinition.InputConnectionCollection.Add(new ReservoirInstanceDefinition.InputConnection(resInputFieldIdx, targetPoolID, density, synapseCfg)); } ReservoirInstanceDefinitionCollection.Add(reservoirInstanceDefinition); ++reservoirInstanceID; } //Finalize boot cycles if necessary if (InputConfig.BootCycles == AutomaticBootCycles && InputConfig.FeedingType == NeuralPreprocessor.InputFeedingType.Continuous) { InputConfig.BootCycles = numOfNeuronsInLargestReservoir; } return; }