public double[] Compute(Options options, double[] inputs)
            {
                var inputLayer = Layers[0];

                if (inputs.Length != inputLayer.Neurons.Count)
                {
                    throw new ArgumentException($"Invalid number of inputs. Expected: {inputLayer.Neurons.Count}");
                }

                for (int i = 0; i < inputs.Length; i++)
                {
                    inputLayer.Neurons[i].Value = inputs[i];
                }

                var prevLayer = inputLayer; // Previous layer is input layer.

                for (var i = 1; i < Layers.Count; i++)
                {
                    for (var j = 0; j < Layers[i].Neurons.Count; j++)
                    {
                        // For each Neuron in each layer.
                        var sum = 0.0;
                        for (var k = 0; k < prevLayer.Neurons.Count; k++)
                        {
                            // Every Neuron in the previous layer is an input to each Neuron in
                            // the next layer.
                            sum += prevLayer.Neurons[k].Value *
                                   Layers[i].Neurons[j].Weights[k];
                        }

                        // Compute the activation of the Neuron.
                        Layers[i].Neurons[j].Value = options.Activation(sum);
                    }
                    prevLayer = Layers[i];
                }

                // All outputs of the Network.
                var lastLayer = Layers.Last();

                return(lastLayer.Neurons.Select(n => n.Value).ToArray());
            }