using OpenCVForUnity.CoreModule;
using OpenCVForUnity.UtilsModule;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace OpenCVForUnity.MlModule
{

    // C++: class SVMSGD
    //javadoc: SVMSGD

    public class SVMSGD : StatModel
    {

        protected override void Dispose (bool disposing)
        {
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
try {
if (disposing) {
}
if (IsEnabledDispose) {
if (nativeObj != IntPtr.Zero)
ml_SVMSGD_delete(nativeObj);
nativeObj = IntPtr.Zero;
}
} finally {
base.Dispose (disposing);
}
#else
            return;
#endif
        }

        protected internal SVMSGD (IntPtr addr) : base (addr) { }

        // internal usage only
        public static new SVMSGD __fromPtr__ (IntPtr addr) { return new SVMSGD (addr); }

        // C++: enum SvmsgdType
        public const int SGD = 0;
        public const int ASGD = 1;
        // C++: enum MarginType
        public const int SOFT_MARGIN = 0;
        public const int HARD_MARGIN = 1;
        //
        // C++:  Mat cv::ml::SVMSGD::getWeights()
        //

        //javadoc: SVMSGD::getWeights()
        public Mat getWeights ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        Mat retVal = new Mat(ml_SVMSGD_getWeights_10(nativeObj));
        
        return retVal;
#else
            return null;
#endif
        }


        //
        // C++: static Ptr_SVMSGD cv::ml::SVMSGD::create()
        //

        //javadoc: SVMSGD::create()
        public static SVMSGD create ()
        {
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        SVMSGD retVal = SVMSGD.__fromPtr__(ml_SVMSGD_create_10());
        
        return retVal;
#else
            return null;
#endif
        }


        //
        // C++: static Ptr_SVMSGD cv::ml::SVMSGD::load(String filepath, String nodeName = String())
        //

        //javadoc: SVMSGD::load(filepath, nodeName)
        public static SVMSGD load (string filepath, string nodeName)
        {
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        SVMSGD retVal = SVMSGD.__fromPtr__(ml_SVMSGD_load_10(filepath, nodeName));
        
        return retVal;
#else
            return null;
#endif
        }

        //javadoc: SVMSGD::load(filepath)
        public static SVMSGD load (string filepath)
        {
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        SVMSGD retVal = SVMSGD.__fromPtr__(ml_SVMSGD_load_11(filepath));
        
        return retVal;
#else
            return null;
#endif
        }


        //
        // C++:  TermCriteria cv::ml::SVMSGD::getTermCriteria()
        //

        //javadoc: SVMSGD::getTermCriteria()
        public TermCriteria getTermCriteria ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        double[] tmpArray = new double[3];
ml_SVMSGD_getTermCriteria_10(nativeObj, tmpArray);
TermCriteria retVal = new TermCriteria (tmpArray);
        
        return retVal;
#else
            return null;
#endif
        }


        //
        // C++:  float cv::ml::SVMSGD::getInitialStepSize()
        //

        //javadoc: SVMSGD::getInitialStepSize()
        public float getInitialStepSize ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        float retVal = ml_SVMSGD_getInitialStepSize_10(nativeObj);
        
        return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  float cv::ml::SVMSGD::getMarginRegularization()
        //

        //javadoc: SVMSGD::getMarginRegularization()
        public float getMarginRegularization ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        float retVal = ml_SVMSGD_getMarginRegularization_10(nativeObj);
        
        return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  float cv::ml::SVMSGD::getShift()
        //

        //javadoc: SVMSGD::getShift()
        public float getShift ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        float retVal = ml_SVMSGD_getShift_10(nativeObj);
        
        return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  float cv::ml::SVMSGD::getStepDecreasingPower()
        //

        //javadoc: SVMSGD::getStepDecreasingPower()
        public float getStepDecreasingPower ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        float retVal = ml_SVMSGD_getStepDecreasingPower_10(nativeObj);
        
        return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  int cv::ml::SVMSGD::getMarginType()
        //

        //javadoc: SVMSGD::getMarginType()
        public int getMarginType ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        int retVal = ml_SVMSGD_getMarginType_10(nativeObj);
        
        return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  int cv::ml::SVMSGD::getSvmsgdType()
        //

        //javadoc: SVMSGD::getSvmsgdType()
        public int getSvmsgdType ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        int retVal = ml_SVMSGD_getSvmsgdType_10(nativeObj);
        
        return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  void cv::ml::SVMSGD::setInitialStepSize(float InitialStepSize)
        //

        //javadoc: SVMSGD::setInitialStepSize(InitialStepSize)
        public void setInitialStepSize (float InitialStepSize)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setInitialStepSize_10(nativeObj, InitialStepSize);
        
        return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::SVMSGD::setMarginRegularization(float marginRegularization)
        //

        //javadoc: SVMSGD::setMarginRegularization(marginRegularization)
        public void setMarginRegularization (float marginRegularization)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setMarginRegularization_10(nativeObj, marginRegularization);
        
        return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::SVMSGD::setMarginType(int marginType)
        //

        //javadoc: SVMSGD::setMarginType(marginType)
        public void setMarginType (int marginType)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setMarginType_10(nativeObj, marginType);
        
        return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::SVMSGD::setOptimalParameters(int svmsgdType = SVMSGD::ASGD, int marginType = SVMSGD::SOFT_MARGIN)
        //

        //javadoc: SVMSGD::setOptimalParameters(svmsgdType, marginType)
        public void setOptimalParameters (int svmsgdType, int marginType)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setOptimalParameters_10(nativeObj, svmsgdType, marginType);
        
        return;
#else
            return;
#endif
        }

        //javadoc: SVMSGD::setOptimalParameters(svmsgdType)
        public void setOptimalParameters (int svmsgdType)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setOptimalParameters_11(nativeObj, svmsgdType);
        
        return;
#else
            return;
#endif
        }

        //javadoc: SVMSGD::setOptimalParameters()
        public void setOptimalParameters ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setOptimalParameters_12(nativeObj);
        
        return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::SVMSGD::setStepDecreasingPower(float stepDecreasingPower)
        //

        //javadoc: SVMSGD::setStepDecreasingPower(stepDecreasingPower)
        public void setStepDecreasingPower (float stepDecreasingPower)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setStepDecreasingPower_10(nativeObj, stepDecreasingPower);
        
        return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::SVMSGD::setSvmsgdType(int svmsgdType)
        //

        //javadoc: SVMSGD::setSvmsgdType(svmsgdType)
        public void setSvmsgdType (int svmsgdType)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setSvmsgdType_10(nativeObj, svmsgdType);
        
        return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::SVMSGD::setTermCriteria(TermCriteria val)
        //

        //javadoc: SVMSGD::setTermCriteria(val)
        public void setTermCriteria (TermCriteria val)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
        ml_SVMSGD_setTermCriteria_10(nativeObj, val.type, val.maxCount, val.epsilon);
        
        return;
#else
            return;
#endif
        }


#if (UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR
        const string LIBNAME = "__Internal";
#else
        const string LIBNAME = "opencvforunity";
#endif



        // C++:  Mat cv::ml::SVMSGD::getWeights()
        [DllImport (LIBNAME)]
        private static extern IntPtr ml_SVMSGD_getWeights_10 (IntPtr nativeObj);

        // C++: static Ptr_SVMSGD cv::ml::SVMSGD::create()
        [DllImport (LIBNAME)]
        private static extern IntPtr ml_SVMSGD_create_10 ();

        // C++: static Ptr_SVMSGD cv::ml::SVMSGD::load(String filepath, String nodeName = String())
        [DllImport (LIBNAME)]
        private static extern IntPtr ml_SVMSGD_load_10 (string filepath, string nodeName);
        [DllImport (LIBNAME)]
        private static extern IntPtr ml_SVMSGD_load_11 (string filepath);

        // C++:  TermCriteria cv::ml::SVMSGD::getTermCriteria()
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_getTermCriteria_10 (IntPtr nativeObj, double[] retVal);

        // C++:  float cv::ml::SVMSGD::getInitialStepSize()
        [DllImport (LIBNAME)]
        private static extern float ml_SVMSGD_getInitialStepSize_10 (IntPtr nativeObj);

        // C++:  float cv::ml::SVMSGD::getMarginRegularization()
        [DllImport (LIBNAME)]
        private static extern float ml_SVMSGD_getMarginRegularization_10 (IntPtr nativeObj);

        // C++:  float cv::ml::SVMSGD::getShift()
        [DllImport (LIBNAME)]
        private static extern float ml_SVMSGD_getShift_10 (IntPtr nativeObj);

        // C++:  float cv::ml::SVMSGD::getStepDecreasingPower()
        [DllImport (LIBNAME)]
        private static extern float ml_SVMSGD_getStepDecreasingPower_10 (IntPtr nativeObj);

        // C++:  int cv::ml::SVMSGD::getMarginType()
        [DllImport (LIBNAME)]
        private static extern int ml_SVMSGD_getMarginType_10 (IntPtr nativeObj);

        // C++:  int cv::ml::SVMSGD::getSvmsgdType()
        [DllImport (LIBNAME)]
        private static extern int ml_SVMSGD_getSvmsgdType_10 (IntPtr nativeObj);

        // C++:  void cv::ml::SVMSGD::setInitialStepSize(float InitialStepSize)
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setInitialStepSize_10 (IntPtr nativeObj, float InitialStepSize);

        // C++:  void cv::ml::SVMSGD::setMarginRegularization(float marginRegularization)
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setMarginRegularization_10 (IntPtr nativeObj, float marginRegularization);

        // C++:  void cv::ml::SVMSGD::setMarginType(int marginType)
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setMarginType_10 (IntPtr nativeObj, int marginType);

        // C++:  void cv::ml::SVMSGD::setOptimalParameters(int svmsgdType = SVMSGD::ASGD, int marginType = SVMSGD::SOFT_MARGIN)
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setOptimalParameters_10 (IntPtr nativeObj, int svmsgdType, int marginType);
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setOptimalParameters_11 (IntPtr nativeObj, int svmsgdType);
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setOptimalParameters_12 (IntPtr nativeObj);

        // C++:  void cv::ml::SVMSGD::setStepDecreasingPower(float stepDecreasingPower)
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setStepDecreasingPower_10 (IntPtr nativeObj, float stepDecreasingPower);

        // C++:  void cv::ml::SVMSGD::setSvmsgdType(int svmsgdType)
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setSvmsgdType_10 (IntPtr nativeObj, int svmsgdType);

        // C++:  void cv::ml::SVMSGD::setTermCriteria(TermCriteria val)
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_setTermCriteria_10 (IntPtr nativeObj, int val_type, int val_maxCount, double val_epsilon);

        // native support for java finalize()
        [DllImport (LIBNAME)]
        private static extern void ml_SVMSGD_delete (IntPtr nativeObj);

    }
}