public static INetwork BuildFFN(NetworkSettings settings, HiddenLayerSettings hiddenSettings)
        {
            Network ffn = new Network(settings);

            ffn.BuildInputNeurons(settings);
            ffn.HiddenLayers = ffn.BuildHiddenLayers(ffn.InputNeurons, hiddenSettings);
            ffn.BuildOutputNeurons(ffn.HiddenLayers.Last(), settings.OutputNeuronsCount, settings.OutputLayerFunction);
            return(ffn);
        }
        public static INetwork BuildRNN(NetworkSettings settings, HiddenLayerSettings hiddenSettings)
        {
            Network rnn = new Network(settings);

            rnn.BuildInputNeurons(settings);
            rnn.HiddenLayers = rnn.BuildHiddenLayers(rnn.InputNeurons, hiddenSettings);
            var prevLayer             = rnn.BuildOutputNeurons(rnn.HiddenLayers.Last(), settings.OutputNeuronsCount, settings.OutputLayerFunction);
            var outputLayer           = rnn.BuildInputNeurons(settings, 1);
            var prevLayerEnumerator   = prevLayer.GetEnumerator();
            var outputLayerEnumerator = outputLayer.GetEnumerator();

            while (prevLayerEnumerator.MoveNext())
            {
                outputLayerEnumerator.MoveNext();
                rnn.ConnectAxon(prevLayerEnumerator.Current, outputLayerEnumerator.Current, settings.OutputNeuronsCount);
            }

            return(rnn);
        }
        public static INetwork BuildLSTM(NetworkSettings settings, CellLayerSettings lstmSettings, HiddenLayerSettings prevHiddenSettings, HiddenLayerSettings lastHiddenSettings)
        {
            Network lstm = new Network(settings);

            IEnumerable <INeuron> prevLayer = lstm.BuildInputNeurons(settings);

            if (prevHiddenSettings != null)
            {
                lstm.HiddenLayers = lstm.BuildHiddenLayers(prevLayer, prevHiddenSettings);
            }

            if (lstm.HiddenLayers != null)
            {
                prevLayer = lstm.HiddenLayers.Last();
            }
            else
            {
                lstm.HiddenLayers = new List <ICollection <IHiddenNeuron> >();
                prevLayer         = lstm.InputNeurons;
            }

            var lstmLayers = lstm.BuildLSTMCells(prevLayer, lstmSettings);

            foreach (ICollection <IHiddenNeuron> layer in lstmLayers)
            {
                lstm.HiddenLayers.Add(layer);
                prevLayer = layer;
            }

            if (lastHiddenSettings != null)
            {
                var hiddenLayers = lstm.BuildHiddenLayers(prevLayer, lastHiddenSettings);
                foreach (ICollection <IHiddenNeuron> layer in hiddenLayers)
                {
                    lstm.HiddenLayers.Add(layer);
                }
            }

            return(lstm);
        }