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

namespace OpenCVForUnity.MlModule
{

    // C++: class LogisticRegression
    //javadoc: LogisticRegression

    public class LogisticRegression : 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_LogisticRegression_delete (nativeObj);
                    nativeObj = IntPtr.Zero;
                }
            } finally {
                base.Dispose (disposing);
            }
#else
            return;
#endif
        }

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

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

        // C++: enum RegKinds
        public const int REG_DISABLE = -1;
        public const int REG_L1 = 0;
        public const int REG_L2 = 1;
        // C++: enum Methods
        public const int BATCH = 0;
        public const int MINI_BATCH = 1;
        //
        // C++:  Mat cv::ml::LogisticRegression::get_learnt_thetas()
        //

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


        //
        // C++: static Ptr_LogisticRegression cv::ml::LogisticRegression::create()
        //

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


        //
        // C++: static Ptr_LogisticRegression cv::ml::LogisticRegression::load(String filepath, String nodeName = String())
        //

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

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


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

        //javadoc: LogisticRegression::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_LogisticRegression_getTermCriteria_10 (nativeObj, tmpArray);
            TermCriteria retVal = new TermCriteria (tmpArray);
        
            return retVal;
#else
            return null;
#endif
        }


        //
        // C++:  double cv::ml::LogisticRegression::getLearningRate()
        //

        //javadoc: LogisticRegression::getLearningRate()
        public double getLearningRate ()
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            double retVal = ml_LogisticRegression_getLearningRate_10 (nativeObj);
        
            return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  float cv::ml::LogisticRegression::predict(Mat samples, Mat& results = Mat(), int flags = 0)
        //

        //javadoc: LogisticRegression::predict(samples, results, flags)
        public override float predict (Mat samples, Mat results, int flags)
        {
            ThrowIfDisposed ();
            if (samples != null)
                samples.ThrowIfDisposed ();
            if (results != null)
                results.ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            float retVal = ml_LogisticRegression_predict_10 (nativeObj, samples.nativeObj, results.nativeObj, flags);
        
            return retVal;
#else
            return -1;
#endif
        }

        //javadoc: LogisticRegression::predict(samples, results)
        public override float predict (Mat samples, Mat results)
        {
            ThrowIfDisposed ();
            if (samples != null)
                samples.ThrowIfDisposed ();
            if (results != null)
                results.ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            float retVal = ml_LogisticRegression_predict_11 (nativeObj, samples.nativeObj, results.nativeObj);
        
            return retVal;
#else
            return -1;
#endif
        }

        //javadoc: LogisticRegression::predict(samples)
        public override float predict (Mat samples)
        {
            ThrowIfDisposed ();
            if (samples != null)
                samples.ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            float retVal = ml_LogisticRegression_predict_12 (nativeObj, samples.nativeObj);
        
            return retVal;
#else
            return -1;
#endif
        }


        //
        // C++:  int cv::ml::LogisticRegression::getIterations()
        //

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


        //
        // C++:  int cv::ml::LogisticRegression::getMiniBatchSize()
        //

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


        //
        // C++:  int cv::ml::LogisticRegression::getRegularization()
        //

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


        //
        // C++:  int cv::ml::LogisticRegression::getTrainMethod()
        //

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


        //
        // C++:  void cv::ml::LogisticRegression::setIterations(int val)
        //

        //javadoc: LogisticRegression::setIterations(val)
        public void setIterations (int val)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            ml_LogisticRegression_setIterations_10 (nativeObj, val);
        
            return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::LogisticRegression::setLearningRate(double val)
        //

        //javadoc: LogisticRegression::setLearningRate(val)
        public void setLearningRate (double val)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            ml_LogisticRegression_setLearningRate_10 (nativeObj, val);
        
            return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::LogisticRegression::setMiniBatchSize(int val)
        //

        //javadoc: LogisticRegression::setMiniBatchSize(val)
        public void setMiniBatchSize (int val)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            ml_LogisticRegression_setMiniBatchSize_10 (nativeObj, val);
        
            return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::LogisticRegression::setRegularization(int val)
        //

        //javadoc: LogisticRegression::setRegularization(val)
        public void setRegularization (int val)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            ml_LogisticRegression_setRegularization_10 (nativeObj, val);
        
            return;
#else
            return;
#endif
        }


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

        //javadoc: LogisticRegression::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_LogisticRegression_setTermCriteria_10 (nativeObj, val.type, val.maxCount, val.epsilon);
        
            return;
#else
            return;
#endif
        }


        //
        // C++:  void cv::ml::LogisticRegression::setTrainMethod(int val)
        //

        //javadoc: LogisticRegression::setTrainMethod(val)
        public void setTrainMethod (int val)
        {
            ThrowIfDisposed ();
#if ((UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR) || UNITY_5 || UNITY_5_3_OR_NEWER
        
            ml_LogisticRegression_setTrainMethod_10 (nativeObj, val);
        
            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::LogisticRegression::get_learnt_thetas()
        [DllImport (LIBNAME)]
        private static extern IntPtr ml_LogisticRegression_get_1learnt_1thetas_10 (IntPtr nativeObj);

        // C++: static Ptr_LogisticRegression cv::ml::LogisticRegression::create()
        [DllImport (LIBNAME)]
        private static extern IntPtr ml_LogisticRegression_create_10 ();

        // C++: static Ptr_LogisticRegression cv::ml::LogisticRegression::load(String filepath, String nodeName = String())
        [DllImport (LIBNAME)]
        private static extern IntPtr ml_LogisticRegression_load_10 (string filepath, string nodeName);

        [DllImport (LIBNAME)]
        private static extern IntPtr ml_LogisticRegression_load_11 (string filepath);

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

        // C++:  double cv::ml::LogisticRegression::getLearningRate()
        [DllImport (LIBNAME)]
        private static extern double ml_LogisticRegression_getLearningRate_10 (IntPtr nativeObj);

        // C++:  float cv::ml::LogisticRegression::predict(Mat samples, Mat& results = Mat(), int flags = 0)
        [DllImport (LIBNAME)]
        private static extern float ml_LogisticRegression_predict_10 (IntPtr nativeObj, IntPtr samples_nativeObj, IntPtr results_nativeObj, int flags);

        [DllImport (LIBNAME)]
        private static extern float ml_LogisticRegression_predict_11 (IntPtr nativeObj, IntPtr samples_nativeObj, IntPtr results_nativeObj);

        [DllImport (LIBNAME)]
        private static extern float ml_LogisticRegression_predict_12 (IntPtr nativeObj, IntPtr samples_nativeObj);

        // C++:  int cv::ml::LogisticRegression::getIterations()
        [DllImport (LIBNAME)]
        private static extern int ml_LogisticRegression_getIterations_10 (IntPtr nativeObj);

        // C++:  int cv::ml::LogisticRegression::getMiniBatchSize()
        [DllImport (LIBNAME)]
        private static extern int ml_LogisticRegression_getMiniBatchSize_10 (IntPtr nativeObj);

        // C++:  int cv::ml::LogisticRegression::getRegularization()
        [DllImport (LIBNAME)]
        private static extern int ml_LogisticRegression_getRegularization_10 (IntPtr nativeObj);

        // C++:  int cv::ml::LogisticRegression::getTrainMethod()
        [DllImport (LIBNAME)]
        private static extern int ml_LogisticRegression_getTrainMethod_10 (IntPtr nativeObj);

        // C++:  void cv::ml::LogisticRegression::setIterations(int val)
        [DllImport (LIBNAME)]
        private static extern void ml_LogisticRegression_setIterations_10 (IntPtr nativeObj, int val);

        // C++:  void cv::ml::LogisticRegression::setLearningRate(double val)
        [DllImport (LIBNAME)]
        private static extern void ml_LogisticRegression_setLearningRate_10 (IntPtr nativeObj, double val);

        // C++:  void cv::ml::LogisticRegression::setMiniBatchSize(int val)
        [DllImport (LIBNAME)]
        private static extern void ml_LogisticRegression_setMiniBatchSize_10 (IntPtr nativeObj, int val);

        // C++:  void cv::ml::LogisticRegression::setRegularization(int val)
        [DllImport (LIBNAME)]
        private static extern void ml_LogisticRegression_setRegularization_10 (IntPtr nativeObj, int val);

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

        // C++:  void cv::ml::LogisticRegression::setTrainMethod(int val)
        [DllImport (LIBNAME)]
        private static extern void ml_LogisticRegression_setTrainMethod_10 (IntPtr nativeObj, int val);

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

    }
}