     }
     
     /// Trains the network using the given set of inputs and corresponding outputs.
-    /// - parameter inputs: A 2D array of `Float`s.
-    /// Inner array: A single set of inputs for the network. Outer array: The full set of training data to be used for training.
-    /// - parameter answers: A 2D array of `Float`s.
-    /// Inner array: A single set of outputs expected from the network. Outer array: The full set of output data to be used for training.
-    /// - parameter testInputs: A set of validation data to be used for testing the network.
-    /// - This data will not used in the network's training, but will be used to determine when an acceptable solution has been found.
-    /// - parameter testAnswers: The set of expected outputs corresponding to `testInputs`.
-    /// - parameter errorThreshold: A `Float` indicating the maximum error allowed per epoch of validation data, before the network is considered 'trained' and ceases its training process.
-    /// - This value must be determined by the user, because it varies based on the type of data used and the desired accuracy.
-    /// - returns: The final calculated weights of the network after training has completed.
+    /// - Parameters: 
+    ///     - inputs: A 2D array of `Float`s.
+    ///             Inner array: A single set of inputs for the network. Outer array: The full set of training data to be used for training.
+    ///     - answers: A 2D array of `Float`s.
+    ///             Inner array: A single set of outputs expected from the network. Outer array: The full set of output data to be used for training.
+    ///     - testInputs: A set of validation data to be used for testing the network.
+    ///             This data will not used in the network's training, but will be used to determine when an acceptable solution has been found.
+    ///     - testAnswers: The set of expected outputs corresponding to `testInputs`.
+    ///     - errorThreshold: A `Float` indicating the maximum error allowed per epoch of validation data, before the network is considered 'trained'.
+    ///             This value must be determined by the user, because it varies based on the type of data used and the desired accuracy.
+    /// - Returns: The final calculated weights of the network after training has completed.
     public func train(inputs inputs: [[Float]], answers: [[Float]], testInputs: [[Float]], testAnswers: [[Float]], errorThreshold: Float) throws -> [Float] {
         guard errorThreshold > 0 else {
             throw FFNNError.InvalidInputsError("Error threshold must be greater than zero!")
         }
+        
+        // TODO: Allow trainer to exit early or regenerate new weights if it gets stuck in local minima
+        
         // Train forever until the desired error threshold is met
         while true {
             for (index, input) in inputs.enumerate() {

    }
    
    /// Trains the network by comparing its most recent output to the given 'answers', adjusting the network's weights as needed.
    /// - parameter answer: The 'correct' desired output for the most recent update to the network, as an array of `Float`s.
    /// - returns: The total calculated error from the most recent update.
    public func backpropagate(answer answer: [Float]) throws -> Float {
        // Verify valid answer
        guard answer.count == self.numOutputs else {

            self.mfLR = (1 - newMomentum) * self.learningRate
        }
    }
    
    /// The activation function to use during update cycles.
    private var activationFunction : ActivationFunction = .Sigmoid
    
    
    /**
     The following private properties are allocated once during initializtion, in order to prevent frequent
