internal static void UpdateBiasNodeWeight(Weight weightForPrevLayer, double delta, double momentumMagnitude)
    {
        var change = -delta;

        weightForPrevLayer.Adjust(change);

        if (weightForPrevLayer is IWeightWithMomentum weightForPrevLayerAsWeightWithMomentum)
        {
            var changeFromMomentum = momentumMagnitude * weightForPrevLayerAsWeightWithMomentum.Momentum;
            weightForPrevLayer.Adjust(changeFromMomentum);
            weightForPrevLayerAsWeightWithMomentum.Momentum = change + changeFromMomentum;
        }
    }
    internal static void UpdateNodeWeight(Node prevNode, Weight weightForPrevNode, double delta, double momentumMagnitude)
    {
        var change = -(delta * prevNode.Output);

        weightForPrevNode.Adjust(change);

        if (weightForPrevNode is IWeightWithMomentum weightForPrevNodeAsWeightWithMomentum)
        {
            var changeFromMomentum = momentumMagnitude * weightForPrevNodeAsWeightWithMomentum.Momentum;
            weightForPrevNode.Adjust(changeFromMomentum);
            weightForPrevNodeAsWeightWithMomentum.Momentum = change + changeFromMomentum;
        }
    }