This class provides methods for creating new optimization studies.


 domain = {};
 domain(1).name = 'x1';
 domain(1).type = 'continuous';
 domain(1).domain = [-1.5, 1.5];
 domain(2).name = 'x2';
 domain(2).type = 'continuous';
 domain(2).domain = [-1.5, 1.5];

 study = client.create_study('domain', domain, 'name', 'basic example');



        Purpose: Checks whether there is a running optimization server.
        Usage: client.check_server(warn)
          warn: If true, shows warning messages.


        Purpose: Shuts down the optimization server
        Usage: client.shutdown_server()
          port: The port where the optimization server is running. If not port is
               provided, the server started by calling jcmwave_optimizer_startup()
               is closed.
          force: If True the optimization server is closed even if a study
               is not yet finished.


        Purpose: Creates a new optimization study object.
        Usage: client.create_study('domain', domain, 'name', 'basic example');
        Input: key-value list to configure the optimization study
           domain: Cell array of domain definitions for each parameter. A domain
               definition consists of a struct with the entries:

               name: Name of the parameter. E.g. 'x1'. The name should contain
                    no spaces and must not be equal to function names like
                    'sin', 'cos', 'exp' etc.
               type: Type of the parameter. Either 'continuous', 'discrete',
                     'categorial' or 'fixed'. Fixed parameters are not optimized,
                     but can be used in the constraint functions.
               domain: The domain of the parameter. For continuous parameters this
                    is a tuple [min, max]. For discrete parameters this is a list
                    of values, e.g. [1.0,2.5,3.0]. For categorial inputs it is a list
                    of strings, e.g. {% raw %}{{'cat1','cat2','cat3'}}{% endraw %}. Note, that categorial
                    values are internally mapped to integer representations, which
                    are allowed to have a correlation. The categorial values should
                    therefore be ordered according to their similarity.
                    For fixed parameters the domain is a single parameter value.

                    domain = {};
                    domain(1).name = 'x1';
                    domain(1).type = 'continuous';
                    domain(1).domain = [-1.5, 1.5];
                    domain(2).name = 'x2';
                    domain(2).type = 'continuous';
                    domain(2).domain = [-1.5, 1.5];
                    domain(3).name = 'x3';
                    domain(3).type = 'discrete';
                    domain(3).domain = [-1,0,1];
                    domain(4).name = 'x4';
                    domain(4).type = 'categorial';
                    domain(4).domain = {'a','b','c'};
                    domain(5).name = 'radius';
                    domain(5).type = 'fixed';
                    domain(5).domain = 2;

           constraints: List of constraints on the domain. Each list element is a
               dictionary with the entries

               name: Name of the constraint.
               constraint: A string defining a function that is smaller zero if and
                     only if the constraint is met. The following operations and
                     functions may be used: +,-,*,/,^,sqrt,sin,cos,tan,abs,round,
                     sgn, tunc. E.g. 'x1^2 + x2^2 + sin(x1+x2)'

                     constraints = {};
                     constraints(1).name = 'circle';
                     constraints(1).constraint = 'x1^2 + x2^2 - 4';
                     constraints(2).name = 'triangle';
                     constraints(2).constraint = 'x1 - x2';

           study_id: A unique identifier of the study. All relevant information on
                 the study are saved in a file named study_id+'.mpk'
                 If the study already exists, the domain and constraints
                 do not need to be provided. If not set, the study_id is set to
                 a random unique string.

           name: The name of the study that will be shown in the dashboard.

           save_dir: The path to a directory, where the study
               file (jcmo-file) is saved. If false, no study file is saved.

           output_precision: Precision level for ouput of parameters. (Default: 1e-10)

               Note: Rounding the output can potentially lead to a slight
                     breaking of constraints.

           driver: Driver used for the study (default:  'BayesOptimization').
                 For a list of drivers, see the
                 Analysis and Optimization Toolkit/Driver Reference

          dashboard: If true, a dashboard server will
                 be started for the study. (Default: true)

          open_browser: If true, a browser window with the dashboard is started.
                (Default: true)


        Purpose: Creates a new benchmark object for benchmarking different optimization
                 studies against each other.
        Usage: client.create_benchmark('num_average', 6);
        Input: key-value list to configure the benchmark
           benchmark_id: A unique identifier of the benchmark
           num_average: Number of study runs to determine average study performance