-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmain_multicondition.cpp
125 lines (99 loc) · 4.18 KB
/
main_multicondition.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "steadyStateMultiConditionDataprovider.h"
#include "wrapfunctions.h"
#ifdef PARPE_ENABLE_MPI
#include <parpeloadbalancer/loadBalancerWorker.h>
#endif
#include <parpecommon/parpeConfig.h>
#include <parpeoptimization/optimizationOptions.h>
#include <parpecommon/hdf5Misc.h>
#include <parpecommon/logging.h>
#include <parpeamici/optimizationApplication.h>
#include <parpecommon/misc.h>
#include <iostream>
#include <unistd.h>
/** @file
*
* This example demonstrates the use of the loadbalancer / queue for
* parallel ODE simulation.
* The example is based on the `steadystate` example included in AMICI.
*
* This model has 5 parameters, 3 states, 4 condition specific fixed parameters.
*
* To run, e.g.: mpiexec -np 4
* ../parPE-build/amici/examples/steadystate/example_steadystate_multi -o
* steadystate_`date +%F` amici/examples/steadystate/data.h5
*/
/**
* @brief The SteadystateApplication class subclasses parpe::OptimizationApplication
* which provides a frame for a standalone program to solve a multi-start local optimization
* problem.
*/
class SteadystateApplication : public parpe::OptimizationApplication {
public:
using OptimizationApplication::OptimizationApplication;
~SteadystateApplication() override = default;
void initProblem(std::string const& inFileArgument,
std::string const& outFileArgument) override
{
// The same file should only be opened/created once, an then only be reopened
h5File = parpe::hdf5CreateFile(outFileArgument, true);
logParPEVersion(h5File);
dataProvider = std::make_unique<SteadyStateMultiConditionDataProvider>(
amici::generic_model::getModel(), inFileArgument);
// read options from file
auto optimizationOptions = parpe::OptimizationOptions::fromHDF5(
dataProvider->getHdf5File());
// Create one instance for the problem, one for the application for clear ownership
auto multiCondProb = new parpe::MultiConditionProblem(
dataProvider.get(),
&loadBalancer,
std::make_unique<parpe::Logger>(),
// TODO remove this resultwriter
std::make_unique<parpe::OptimizationResultWriter>(
h5File,
std::string("/multistarts/"))
);
// If hierarchical optimization was requested, wrap the original problem
if(optimizationOptions->hierarchicalOptimization) {
problem.reset(new parpe::HierarchicalOptimizationProblemWrapper(
std::unique_ptr<parpe::MultiConditionProblem>(multiCondProb),
dataProvider.get())
);
} else {
problem.reset(multiCondProb);
}
problem->setOptimizationOptions(*optimizationOptions);
// On master, copy input data to result file
if(parpe::getMpiRank() < 1)
dataProvider->copyInputData(h5File);
// TODO: we can set the correct start?
auto ms = new parpe::MultiConditionProblemMultiStartOptimizationProblem(
dataProvider.get(),
problem->getOptimizationOptions(),
multiCondProb->getResultWriter(),
&loadBalancer,
std::make_unique<parpe::Logger>()
);
multiStartOptimizationProblem.reset(ms);
}
std::unique_ptr<SteadyStateMultiConditionDataProvider> dataProvider;
};
/**
* @brief The SteadystateLocalOptimizationApplication class overrides the multi-start optimization
* in the base class and performs only a single optimization run. This is mostly for debugging.
*/
class SteadystateLocalOptimizationApplication : public SteadystateApplication {
public:
using SteadystateApplication::SteadystateApplication;
void runMaster() override {
// Single optimization
getLocalOptimum(problem.get());
}
};
int main(int argc, char **argv) {
int status = EXIT_SUCCESS;
// SteadystateLocalOptimizationApplication app(argc, argv);
SteadystateApplication app;
status = app.run(argc, argv);
return status;
}