static void ComputeGradients_AddDivAddGradients(ManagedArrayPtr inputs, ManagedArray2Ptr gradients, ManagedArray2Ptr gradientSums, ManagedArrayPtr errors, int idx, float by)
 {
     for (int x = 0; x < inputs.Size; x++)
     {
         gradients[x, idx] += inputs[x] * errors[idx];
         gradients[x, idx] /= by;
         gradientSums[x, idx] += gradients[x, idx];
     }
 }
 static void ComputeGradients_SetAndAddGradients(ManagedArrayPtr inputs, ManagedArray2Ptr gradients, ManagedArray2Ptr gradientSums, ManagedArrayPtr errors, int idx)
 {
     for (int x = 0; x < inputs.Size; x++)
     {
         var v = inputs[x] * errors[idx];
         gradients[x, idx] = v;
         gradientSums[x, idx] += v;
     }
 }
 static float ComputeErrors_LowerErrorSum(ManagedArrayPtr lowerErrors, ManagedArray2Ptr lowerWeights, int idx) 
 {
     float sum = 0.0f;
     for (int x = 0; x < lowerErrors.Size; x++) sum += lowerErrors[x] * lowerWeights[idx, x];
     return sum;
 }
 static void ComputeGradients_AddGradients(ManagedArrayPtr inputs, ManagedArray2Ptr gradients, ManagedArrayPtr errors, int idx)
 {
     for (int x = 0; x < inputs.Size; x++) gradients[x, idx] += inputs[x] * errors[idx];
 }
 static float ComputeForward_Sum(ManagedArrayPtr inputs, ManagedArray2Ptr weights, int idx) 
 {
     float sum = 0.0f;
     for (int x = 0; x < inputs.Size; x++) sum += inputs[x] * weights[x, idx];
     return sum;
 }