unsafe private static void SetGradientsRTLR(RTLRComputationData2 data, int ijValueIndex, float gradient)
        {
            var gradients = data.Gradients != null ? data.Gradients.ToManaged2() : null;
            var gradientSums = data.GradientSums != null ? data.GradientSums.ToManaged2() : null;
            var biasGradients = data.BiasGradients != null ? data.BiasGradients.ToManaged() : null;
            var biasGradientSums = data.BiasGradientSums != null ? data.BiasGradientSums.ToManaged() : null;

            fixed (float* pGradients = gradients != null ? gradients.InternalArray : null,
                pGradientSums = gradientSums != null ? gradientSums.InternalArray : null,
                pBiasGradients = biasGradients != null ? biasGradients.InternalArray : null,
                pBiasGradientSums = biasGradientSums != null ? biasGradientSums.InternalArray : null)
            {
                if (pGradients != null)
                {
                    Debug.Assert(data.JLayerIndex > 0);
                    var gradientsPtr = gradients.ToPtr(pGradients);
                    gradientsPtr[ijValueIndex] = gradient;
                }

                if (pGradientSums != null)
                {
                    Debug.Assert(data.JLayerIndex > 0);
                    var gradientSumsPtr = gradientSums.ToPtr(pGradientSums);
                    gradientSumsPtr[ijValueIndex] += gradient;
                }

                if (pBiasGradients != null)
                {
                    Debug.Assert(data.JLayerIndex == 0);
                    var biasGradientsPtr = biasGradients.ToPtr(pBiasGradients);
                    biasGradientsPtr[ijValueIndex] = gradient;
                }

                if (pBiasGradientSums != null)
                {
                    Debug.Assert(data.JLayerIndex == 0);
                    var biasGradientSumsPtr = biasGradientSums.ToPtr(pBiasGradientSums);
                    biasGradientSumsPtr[ijValueIndex] += gradient;
                }
            }
        }
 unsafe private static ManagedArrayPtr GetPValuesPtr(ManagedArray2 pValuesOfWeights, float* pPValuesOfWeights, int ijValueIndex, RTLRComputationData2 data, int kLayerIndex)
 {
     return new ManagedArrayPtr(pValuesOfWeights, pPValuesOfWeights, ijValueIndex * (data.ULayersCount * data.MaxULayerSize) + kLayerIndex * data.MaxULayerSize);
 }