Exemple #1
0
        public virtual LayerConstruct Copy()
        {
            LayerConstruct copy = new LayerConstruct(Name, _layerClassType)
            {
                Parameters      = (IRegistry)Parameters.DeepCopy(),
                ExternalInputs  = (string[])ExternalInputs.Clone(),
                ExternalOutputs = (string[])ExternalOutputs.Clone(),
                UpdateBeforeInstantiationEvent = UpdateBeforeInstantiationEvent,
                ValidateEvent = ValidateEvent
            };

            return(copy);
        }
Exemple #2
0
        public void AddInput(LayerConstruct input, string alias = "default")
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }

            if (Inputs.ContainsKey(alias))
            {
                throw new ArgumentException($"Attempted to add duplicate output to construct {Name} with alias {alias}.");
            }

            Inputs.Add(alias, input);
        }
Exemple #3
0
        /// <inheritdoc />
        public void Initialise(IComputationHandler handler)
        {
            if (handler == null)
            {
                throw new ArgumentNullException(nameof(handler));
            }

            if (Architecture == null)
            {
                throw new InvalidOperationException("Cannot initialise network before assigning a network architecture.");
            }

            _logger.Debug($"Initialising network \"{Name}\" for handler {handler} containing {Architecture.LayerCount} layers...");

            _associatedHandler = handler;

            ITaskObserver prepareTask = SigmaEnvironment.TaskManager.BeginTask(TaskType.Prepare);

            Architecture.ResolveAllNames();

            _orderedLayerBuffers.Clear();
            _externalInputsLayerBuffers.Clear();
            _externalOutputsLayerBuffers.Clear();

            Dictionary <Tuple <LayerConstruct, LayerConstruct>, IRegistry> mappedRegistriesByInOutputs = new Dictionary <Tuple <LayerConstruct, LayerConstruct>, IRegistry>();

            foreach (LayerConstruct layerConstruct in Architecture.YieldLayerConstructsOrdered())
            {
                ILayer layer = layerConstruct.InstantiateLayer(handler);

                Dictionary <string, IRegistry> inputs = new Dictionary <string, IRegistry>();

                foreach (string externalInputAlias in layerConstruct.ExternalInputs)
                {
                    inputs[externalInputAlias] = new Registry(tags: "external_input");
                }

                foreach (string inputAlias in layerConstruct.Inputs.Keys)
                {
                    inputs[inputAlias] = mappedRegistriesByInOutputs[new Tuple <LayerConstruct, LayerConstruct>(layerConstruct.Inputs[inputAlias], layerConstruct)];
                }

                Dictionary <string, IRegistry> outputs = new Dictionary <string, IRegistry>();

                foreach (string externalOutputAlias in layerConstruct.ExternalOutputs)
                {
                    outputs[externalOutputAlias] = new Registry(tags: "external_output");
                }

                foreach (string outputAlias in layerConstruct.Outputs.Keys)
                {
                    LayerConstruct outputConstruct = layerConstruct.Outputs[outputAlias];

                    Tuple <LayerConstruct, LayerConstruct> inOuTuple = new Tuple <LayerConstruct, LayerConstruct>(layerConstruct, outputConstruct);

                    Registry outRegistry = new Registry(tags: "internal");

                    mappedRegistriesByInOutputs.Add(inOuTuple, outRegistry);

                    outputs[outputAlias] = outRegistry;
                }

                InternalLayerBuffer layerBuffer = new InternalLayerBuffer(layer, layerConstruct.Parameters, inputs, outputs,
                                                                          layerConstruct.ExternalInputs, layerConstruct.ExternalOutputs);

                _orderedLayerBuffers.Add(layerBuffer);

                if (layerConstruct.ExternalInputs.Length > 0)
                {
                    _externalInputsLayerBuffers.Add(layerBuffer);
                }

                if (layerConstruct.ExternalOutputs.Length > 0)
                {
                    _externalOutputsLayerBuffers.Add(layerBuffer);
                }
            }

            _orderedLayers = _orderedLayerBuffers.ConvertAll(buffer => buffer.Layer);

            UpdateRegistry();

            SigmaEnvironment.TaskManager.EndTask(prepareTask);

            _initialised = true;

            _logger.Debug($"Done initialising network \"{Name}\" for handler {handler} containing {Architecture.LayerCount} layers.");
        }
Exemple #4
0
 internal LayerConstructEventArgs(LayerConstruct self)
 {
     Self = self;
 }
Exemple #5
0
 /// <summary>
 /// Check if the type of two layer constructs is equal.
 /// </summary>
 /// <param name="other">The other layer construct.</param>
 /// <returns>A boolean indicating whether or not the two layer construct types are equal.</returns>
 public bool TypeEquals(LayerConstruct other)
 {
     return(other != null && other._layerClassType == _layerClassType);
 }