    // Copyright (C) 2018  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #undef DLIB_AUTO_LEARnING_ABSTRACT_Hh_
    #ifdef DLIB_AUTO_LEARnING_ABSTRACT_Hh_

    #include "kernel_abstract.h"
    #include "function_abstract.h"
    #include <chrono>
    #include <vector>

    namespace dlib
    {

        normalized_function<decision_function<radial_basis_kernel<matrix<double,0,1>>>> auto_train_rbf_classifier (
            std::vector<matrix<double,0,1>> x,
            std::vector<double> y,
            const std::chrono::nanoseconds max_runtime,
            bool be_verbose = true
        );
        /*!
            requires
                - is_binary_classification_problem(x,y) == true
                - y contains at least 6 examples of each class.
            ensures
                - This routine trains a radial basis function SVM on the given binary
                  classification training data.  It uses the svm_c_trainer to do this.  It also
                  uses find_max_global() and 6-fold cross-validation to automatically determine
                  the best settings of the SVM's hyperparameters.
                - The hyperparameter search will run for about max_runtime and will print
                  messages to the screen as it runs if be_verbose==true.
        !*/

    // ----------------------------------------------------------------------------------------

        normalized_function<multiclass_linear_decision_function<linear_kernel<matrix<double,0,1>>, unsigned long>>
        auto_train_multiclass_svm_linear_classifier (
            std::vector<matrix<double,0,1>> x,
            std::vector<unsigned long> y,
            const std::chrono::nanoseconds max_runtime,
            bool be_verbose = true
        );
        /*!
            requires
                - is_learning_problem(x,y) == true
                - y contains at least 3 examples of each class.
            ensures
                - This routine trains a linear multiclass SVM on the given classification training data.
                  It uses the svm_multiclass_linear_trainer to do this.  It also
                  uses find_max_global() and 3-fold cross-validation to automatically determine
                  the best setting of the SVM's hyperparameter C.
                - The hyperparameter search will run for about max_runtime and will print
                  messages to the screen as it runs if be_verbose==true.
        !*/

        normalized_function<multiclass_linear_decision_function<linear_kernel<matrix<float,0,1>>, unsigned long>>
        auto_train_multiclass_svm_linear_classifier (
            const std::vector<matrix<float,0,1>>& x,
            std::vector<unsigned long> y,
            const std::chrono::nanoseconds max_runtime,
            bool be_verbose = true
        );
        /*!
            requires
                - is_learning_problem(x,y) == true
                - y contains at least 3 examples of each class.
            ensures
                - This function is just an overload of the one defined immediately above.  It casts the
                  input data from float to double, calls the above function, and casts the results back
                  to float.
                - This routine trains a linear multiclass SVM on the given classification training data.
                  It uses the svm_multiclass_linear_trainer to do this.  It also
                  uses find_max_global() and 3-fold cross-validation to automatically determine
                  the best setting of the SVM's hyperparameter C.
                - The hyperparameter search will run for about max_runtime and will print
                  messages to the screen as it runs if be_verbose==true.
        !*/
    }

    #endif // DLIB_AUTO_LEARnING_ABSTRACT_Hh_