Program Listing for File optimizationApplication.h

Return to documentation for file (include/parpeamici/optimizationApplication.h)

#ifndef OPTIMIZATIONAPPLICATION_H
#define OPTIMIZATIONAPPLICATION_H

#include <parpecommon/parpeConfig.h>
#include <parpeamici/multiConditionProblem.h>
#include <parpeamici/hierarchicalOptimization.h>

#ifdef PARPE_ENABLE_MPI
#include <parpeloadbalancer/loadBalancerMaster.h>
#include <parpeloadbalancer/loadBalancerWorker.h>
#endif

#include <getopt.h>
#include <string>

namespace parpe {

#ifndef PARPE_ENABLE_MPI
// Workaround to allow building without MPI. Should be cleaned up.
using LoadBalancerMaster = int;
using LoadBalancerWorker = int;
#endif

// TODO: DistributedOptimizationApplication
class OptimizationApplication {
  public:
    OptimizationApplication() = default;

    virtual ~OptimizationApplication();

    virtual void initProblem(std::string const& inFileArgument,
                             std::string const& outFileArgument) = 0;

    int run(int argc, char **argv);

    virtual void runMaster();

#ifdef PARPE_ENABLE_MPI
    virtual void runWorker();
#endif

    virtual void runSingleProcess();

  protected:

    virtual void finalizeTiming(double wallTimeSeconds, double cpuTimeSeconds);

    std::string
    processResultFilenameCommandLineArgument(const char *commandLineArg);

    bool isMaster();

    bool isWorker();

    static void initMPI(int *argc, char ***argv);

    virtual int parseCliOptionsPreMpiInit(int argc, char **argv);

    virtual int parseCliOptionsPostMpiInit(int argc, char **argv);

    virtual void printUsage(char* const argZero);

    virtual void logParPEVersion(const H5::H5File &file) const;

private:
    int init(int argc, char **argv);

    void runMultiStarts() const;

protected:
    // command line option parsing
    const char *shortOptions = "dhvmt:o:s:";
    struct option const longOptions[9] = {
        {"debug", no_argument, nullptr, 'd'},
        {"print-worklist", no_argument, nullptr, 'p'},
        {"help", no_argument, nullptr, 'h'},
        {"version", no_argument, nullptr, 'v'},
        {"mpi", no_argument, nullptr, 'm'},
        {"task", required_argument, nullptr, 't'},
        {"outfile-prefix", required_argument, nullptr, 'o'},
        {"first-start-idx", required_argument, nullptr, 's'},
        {nullptr, 0, nullptr, 0}};

    enum class OperationType {
        parameterEstimation,
        gradientCheck
    };

    std::string dataFileName;
    std::string resultFileName;

    int first_start_idx {0};

    // the need to be filled in by sub
    std::unique_ptr<MultiStartOptimizationProblem> multiStartOptimizationProblem;
    std::unique_ptr<OptimizationProblem> problem;
    H5::H5File h5File = 0;
    OperationType operationType = OperationType::parameterEstimation;
    LoadBalancerMaster loadBalancer;
    bool withMPI = false;
};


void saveTotalCpuTime(const H5::H5File &file, const double timeInSeconds);


} // namespace parpe

#endif // OPTIMIZATIONAPPLICATION_H