public unsafe TrainFlatNetworkProp(global::Org.Encog.Engine.Network.Flat.FlatNetwork p0, global::Org.Encog.Engine.Data.IEngineDataSet p1)
            : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
        {
            if (((global::Java.Lang.Object) this).Handle != IntPtr.Zero)
            {
                return;
            }

            try {
                JValue *__args = stackalloc JValue [2];
                __args [0] = new JValue(p0);
                __args [1] = new JValue(p1);
                if (GetType() != typeof(TrainFlatNetworkProp))
                {
                    SetHandle(
                        global::Android.Runtime.JNIEnv.StartCreateInstance(GetType(), "(Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/data/EngineDataSet;)V", __args),
                        JniHandleOwnership.TransferLocalRef);
                    global::Android.Runtime.JNIEnv.FinishCreateInstance(((global::Java.Lang.Object) this).Handle, "(Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/data/EngineDataSet;)V", __args);
                    return;
                }

                if (id_ctor_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_data_EngineDataSet_ == IntPtr.Zero)
                {
                    id_ctor_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_data_EngineDataSet_ = JNIEnv.GetMethodID(class_ref, "<init>", "(Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/data/EngineDataSet;)V");
                }
                SetHandle(
                    global::Android.Runtime.JNIEnv.StartCreateInstance(class_ref, id_ctor_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_data_EngineDataSet_, __args),
                    JniHandleOwnership.TransferLocalRef);
                JNIEnv.FinishCreateInstance(((global::Java.Lang.Object) this).Handle, class_ref, id_ctor_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_data_EngineDataSet_, __args);
            } finally {
            }
        }
        public unsafe GradientWorkerCPU(global::Org.Encog.Engine.Network.Flat.FlatNetwork p0, global::Org.Encog.Engine.Network.Train.Prop.TrainFlatNetworkProp p1, global::Org.Encog.Engine.Data.IEngineIndexableSet p2, int p3, int p4)
            : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
        {
            if (((global::Java.Lang.Object) this).Handle != IntPtr.Zero)
            {
                return;
            }

            try {
                JValue *__args = stackalloc JValue [5];
                __args [0] = new JValue(p0);
                __args [1] = new JValue(p1);
                __args [2] = new JValue(p2);
                __args [3] = new JValue(p3);
                __args [4] = new JValue(p4);
                if (GetType() != typeof(GradientWorkerCPU))
                {
                    SetHandle(
                        global::Android.Runtime.JNIEnv.StartCreateInstance(GetType(), "(Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/network/train/prop/TrainFlatNetworkProp;Lorg/encog/engine/data/EngineIndexableSet;II)V", __args),
                        JniHandleOwnership.TransferLocalRef);
                    global::Android.Runtime.JNIEnv.FinishCreateInstance(((global::Java.Lang.Object) this).Handle, "(Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/network/train/prop/TrainFlatNetworkProp;Lorg/encog/engine/data/EngineIndexableSet;II)V", __args);
                    return;
                }

                if (id_ctor_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_network_train_prop_TrainFlatNetworkProp_Lorg_encog_engine_data_EngineIndexableSet_II == IntPtr.Zero)
                {
                    id_ctor_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_network_train_prop_TrainFlatNetworkProp_Lorg_encog_engine_data_EngineIndexableSet_II = JNIEnv.GetMethodID(class_ref, "<init>", "(Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/network/train/prop/TrainFlatNetworkProp;Lorg/encog/engine/data/EngineIndexableSet;II)V");
                }
                SetHandle(
                    global::Android.Runtime.JNIEnv.StartCreateInstance(class_ref, id_ctor_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_network_train_prop_TrainFlatNetworkProp_Lorg_encog_engine_data_EngineIndexableSet_II, __args),
                    JniHandleOwnership.TransferLocalRef);
                JNIEnv.FinishCreateInstance(((global::Java.Lang.Object) this).Handle, class_ref, id_ctor_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_network_train_prop_TrainFlatNetworkProp_Lorg_encog_engine_data_EngineIndexableSet_II, __args);
            } finally {
            }
        }
        static void n_Compile_Ljava_util_Map_Lorg_encog_engine_network_train_prop_OpenCLTrainingProfile_Lorg_encog_engine_network_flat_FlatNetwork_(IntPtr jnienv, IntPtr native__this, IntPtr native_p0, IntPtr native_p1, IntPtr native_p2)
        {
            global::Org.Encog.Engine.Opencl.Kernels.KernelNetworkTrain __this = global::Java.Lang.Object.GetObject <global::Org.Encog.Engine.Opencl.Kernels.KernelNetworkTrain> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
            var p0 = global::Android.Runtime.JavaDictionary <string, string> .FromJniHandle(native_p0, JniHandleOwnership.DoNotTransfer);

            global::Org.Encog.Engine.Network.Train.Prop.OpenCLTrainingProfile p1 = global::Java.Lang.Object.GetObject <global::Org.Encog.Engine.Network.Train.Prop.OpenCLTrainingProfile> (native_p1, JniHandleOwnership.DoNotTransfer);
            global::Org.Encog.Engine.Network.Flat.FlatNetwork p2 = global::Java.Lang.Object.GetObject <global::Org.Encog.Engine.Network.Flat.FlatNetwork> (native_p2, JniHandleOwnership.DoNotTransfer);
            __this.Compile(p0, p1, p2);
        }
        public unsafe KernelNetworkTrain(global::Org.Encog.Engine.Opencl.EncogCLDevice p0, global::Org.Encog.Engine.Network.Flat.FlatNetwork p1, global::Org.Encog.Engine.Data.IEngineIndexableSet p2, int p3)
            : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
        {
            if (((global::Java.Lang.Object) this).Handle != IntPtr.Zero)
            {
                return;
            }

            try {
                JValue *__args = stackalloc JValue [4];
                __args [0] = new JValue(p0);
                __args [1] = new JValue(p1);
                __args [2] = new JValue(p2);
                __args [3] = new JValue(p3);
                if (GetType() != typeof(KernelNetworkTrain))
                {
                    SetHandle(
                        global::Android.Runtime.JNIEnv.StartCreateInstance(GetType(), "(Lorg/encog/engine/opencl/EncogCLDevice;Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/data/EngineIndexableSet;I)V", __args),
                        JniHandleOwnership.TransferLocalRef);
                    global::Android.Runtime.JNIEnv.FinishCreateInstance(((global::Java.Lang.Object) this).Handle, "(Lorg/encog/engine/opencl/EncogCLDevice;Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/data/EngineIndexableSet;I)V", __args);
                    return;
                }

                if (id_ctor_Lorg_encog_engine_opencl_EncogCLDevice_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_data_EngineIndexableSet_I == IntPtr.Zero)
                {
                    id_ctor_Lorg_encog_engine_opencl_EncogCLDevice_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_data_EngineIndexableSet_I = JNIEnv.GetMethodID(class_ref, "<init>", "(Lorg/encog/engine/opencl/EncogCLDevice;Lorg/encog/engine/network/flat/FlatNetwork;Lorg/encog/engine/data/EngineIndexableSet;I)V");
                }
                SetHandle(
                    global::Android.Runtime.JNIEnv.StartCreateInstance(class_ref, id_ctor_Lorg_encog_engine_opencl_EncogCLDevice_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_data_EngineIndexableSet_I, __args),
                    JniHandleOwnership.TransferLocalRef);
                JNIEnv.FinishCreateInstance(((global::Java.Lang.Object) this).Handle, class_ref, id_ctor_Lorg_encog_engine_opencl_EncogCLDevice_Lorg_encog_engine_network_flat_FlatNetwork_Lorg_encog_engine_data_EngineIndexableSet_I, __args);
            } finally {
            }
        }
        public virtual unsafe void Compile(global::System.Collections.Generic.IDictionary <string, string> p0, global::Org.Encog.Engine.Network.Train.Prop.OpenCLTrainingProfile p1, global::Org.Encog.Engine.Network.Flat.FlatNetwork p2)
        {
            if (id_compile_Ljava_util_Map_Lorg_encog_engine_network_train_prop_OpenCLTrainingProfile_Lorg_encog_engine_network_flat_FlatNetwork_ == IntPtr.Zero)
            {
                id_compile_Ljava_util_Map_Lorg_encog_engine_network_train_prop_OpenCLTrainingProfile_Lorg_encog_engine_network_flat_FlatNetwork_ = JNIEnv.GetMethodID(class_ref, "compile", "(Ljava/util/Map;Lorg/encog/engine/network/train/prop/OpenCLTrainingProfile;Lorg/encog/engine/network/flat/FlatNetwork;)V");
            }
            IntPtr native_p0 = global::Android.Runtime.JavaDictionary <string, string> .ToLocalJniHandle(p0);

            try {
                JValue *__args = stackalloc JValue [3];
                __args [0] = new JValue(native_p0);
                __args [1] = new JValue(p1);
                __args [2] = new JValue(p2);

                if (GetType() == ThresholdType)
                {
                    JNIEnv.CallVoidMethod(((global::Java.Lang.Object) this).Handle, id_compile_Ljava_util_Map_Lorg_encog_engine_network_train_prop_OpenCLTrainingProfile_Lorg_encog_engine_network_flat_FlatNetwork_, __args);
                }
                else
                {
                    JNIEnv.CallNonvirtualVoidMethod(((global::Java.Lang.Object) this).Handle, ThresholdClass, JNIEnv.GetMethodID(ThresholdClass, "compile", "(Ljava/util/Map;Lorg/encog/engine/network/train/prop/OpenCLTrainingProfile;Lorg/encog/engine/network/flat/FlatNetwork;)V"), __args);
                }
            } finally {
                JNIEnv.DeleteLocalRef(native_p0);
            }
        }