1 | # ----------------------------------------------------------------------- |
---|
2 | # Diana process modelling, simulation and analysis software |
---|
3 | # Copyright (c) 2009, Sergiy Gogolenko |
---|
4 | # e-mail: gogolenk@mpi-magdeburg.mpg.de |
---|
5 | # All rights reserved. |
---|
6 | # ----------------------------------------------------------------------- |
---|
7 | # Description: |
---|
8 | # Simple example of using DIANA for solving parameter fitting problems |
---|
9 | # with deterministic optimizer (in this case LBFGS-solver). |
---|
10 | |
---|
11 | import diana, sys, os |
---|
12 | #from math import * |
---|
13 | |
---|
14 | modelPath = "Substrateuptake.so" |
---|
15 | observedParams = ["c_x", "c_s"] |
---|
16 | fileMesData = "./data/observations.dat" |
---|
17 | integratorName = "odessa" #"ida" |
---|
18 | optimizerPEName = "nmsimplex" |
---|
19 | methodOEDName = "oedsigmapoint" |
---|
20 | optimizerOEDName = "direct" #"genetic" #"nmsimplex" |
---|
21 | |
---|
22 | # initialize Diana main class |
---|
23 | dmain=diana.GetDianaMain(sys.argv) |
---|
24 | |
---|
25 | ########################################################################## |
---|
26 | # PI Definition Section # |
---|
27 | ########################################################################## |
---|
28 | |
---|
29 | # create optimizer for PI |
---|
30 | sfactory = dmain.GetSolverFactory() |
---|
31 | optimizerPE = sfactory.CreateSolver(diana.CAPE_NLP, None, optimizerPEName) |
---|
32 | |
---|
33 | # set optimizer's parameters |
---|
34 | pars_PEsolver = optimizerPE.GetParameters() |
---|
35 | pars_PEsolver["StopCondition"].SetValue(1+8) |
---|
36 | pars_PEsolver["MaxTimeOfWork"].SetValue(10) |
---|
37 | pars_PEsolver["MaxCountOfEvals"].SetValue(1) |
---|
38 | pars_PEsolver["VerboseLevel"].SetValue(0) |
---|
39 | |
---|
40 | pars_PEsolver["Step"].SetValue(0.01) |
---|
41 | pars_PEsolver["MaxFn"].SetValue(40) |
---|
42 | pars_PEsolver["StopCr"].SetValue(1e-2) |
---|
43 | pars_PEsolver["NLoop"].SetValue(20) |
---|
44 | pars_PEsolver["IQuad"].SetValue(True) |
---|
45 | pars_PEsolver["Simp"].SetValue(1e-6) |
---|
46 | |
---|
47 | # create model |
---|
48 | mmanager = dmain.GetModelManager() |
---|
49 | model = mmanager.CreateModel(diana.CAPE_CONTINUOUS, modelPath) |
---|
50 | model.Initialize() |
---|
51 | #print model.GetActiveESO().GetParameters() |
---|
52 | |
---|
53 | # load measured data (state values and time points) from specified file |
---|
54 | md = diana.DianaMeasuredData(model, observedParams) |
---|
55 | md.load(fileMesData) |
---|
56 | |
---|
57 | # describe estimated parameters |
---|
58 | sps = [ |
---|
59 | diana.DianaNLPRealParameterSpec("k_s", "", 1.0, 1.0, 3.0, 0.0001), |
---|
60 | diana.DianaNLPRealParameterSpec("mu_max", "", 4.0, 4.0, 6.0, 0.0001) |
---|
61 | ] |
---|
62 | |
---|
63 | # create paramerter fitting task |
---|
64 | taskPE = diana.ParameterFittingTask(dmain, integratorName, model, md, sps) |
---|
65 | taskPE.Initialize() |
---|
66 | print "Parameter fitting task "\ |
---|
67 | "for %s is initialized" % model.GetComponentName() |
---|
68 | |
---|
69 | # set prepeared PI task to PI optimizer |
---|
70 | optimizerPE.SetNLPTask(taskPE) |
---|
71 | optimizerPE.Initialize() |
---|
72 | print "PI optimizer %s initialized" % optimizerPE.GetComponentName() |
---|
73 | |
---|
74 | ######################################################################### |
---|
75 | # OED Definition Section # |
---|
76 | ######################################################################### |
---|
77 | # describe design variables |
---|
78 | colDesignVars = [ |
---|
79 | diana.DianaNLPRealParameterSpec("q_0", "", 0.09, 0.07, 0.08, 0.0001) |
---|
80 | ] |
---|
81 | |
---|
82 | # create OED problem |
---|
83 | nlptaskfactory = dmain.GetNLPTaskFactory() |
---|
84 | taskOED = nlptaskfactory.CreateOEDTask(taskPE, optimizerPE, |
---|
85 | colDesignVars, methodOEDName) |
---|
86 | pars_OEDtask = taskOED.GetParameters() |
---|
87 | pars_OEDtask["OptimalityCriterion"].SetValue(diana.DIANA_OED_EStar) |
---|
88 | pars_OEDtask["ExecException"].SetValue(True) |
---|
89 | pars_OEDtask["Alpha"].SetValue(0.5) |
---|
90 | taskOED.Initialize() |
---|
91 | print "OED task initialized..." |
---|
92 | |
---|
93 | ######################################################################## |
---|
94 | # Create OED task reporting # |
---|
95 | ######################################################################## |
---|
96 | |
---|
97 | # create reportOEDTask |
---|
98 | reportOEDTask = dmain.CreateReportingInterface(methodOEDName) |
---|
99 | # set parameters for reportOEDTask class |
---|
100 | pars_taskOEDrep = reportOEDTask.GetParameters() |
---|
101 | pars_taskOEDrep["OutputFolder"].SetValue("./oedtask") |
---|
102 | pars_taskOEDrep["ConsoleOutput"].SetValue(True) |
---|
103 | pars_taskOEDrep["SamplingPoints"].SetValue(True) |
---|
104 | |
---|
105 | reportOEDTask.Initialize() |
---|
106 | |
---|
107 | taskOED.SetReportingInterface(reportOEDTask) |
---|
108 | print "OED task report initialized" |
---|
109 | |
---|
110 | ######################################################################## |
---|
111 | # OED Solving Section # |
---|
112 | ######################################################################## |
---|
113 | |
---|
114 | # create optimizer for OED problem |
---|
115 | optimizerOED = sfactory.CreateSolver(diana.CAPE_NLP, |
---|
116 | None, optimizerOEDName) |
---|
117 | |
---|
118 | # settings for OED optimizer |
---|
119 | pars_OEDsolver = optimizerOED.GetParameters() |
---|
120 | pars_OEDsolver["Eps"].SetValue(1.0000000000e-4) |
---|
121 | pars_OEDsolver["Maxf"].SetValue(5000) |
---|
122 | pars_OEDsolver["MaxT"].SetValue(1000) |
---|
123 | pars_OEDsolver["Algmethod"].SetValue(False) |
---|
124 | pars_OEDsolver["FGlPer"].SetValue(1.0000000000e-02) |
---|
125 | pars_OEDsolver["VolPer"].SetValue(-1.0000000000e+00) |
---|
126 | pars_OEDsolver["SigmaPer"].SetValue(-1.0000000000e+00) |
---|
127 | pars_OEDsolver["FGlobal"].SetValue(-10.15320) |
---|
128 | pars_OEDsolver["VerboseLevel"].SetValue(2) |
---|
129 | |
---|
130 | # create report |
---|
131 | report = dmain.CreateReportingInterface(optimizerOEDName) |
---|
132 | # set parameters for report class |
---|
133 | pars_solverOEDrep = report.GetParameters() |
---|
134 | pars_solverOEDrep["Author"].SetValue("SG") |
---|
135 | pars_solverOEDrep["OutputFolder"].SetValue("./oed") |
---|
136 | pars_solverOEDrep["ConsoleOutput"].SetValue(True) |
---|
137 | pars_solverOEDrep["Samples"].SetValue(True) |
---|
138 | |
---|
139 | report.Initialize() |
---|
140 | print "Report initialized" |
---|
141 | |
---|
142 | # set prepeared task and report to OED optimizer |
---|
143 | optimizerOED.SetReportingInterface(report) |
---|
144 | optimizerOED.SetNLPTask(taskOED) |
---|
145 | optimizerOED.Initialize() |
---|
146 | print "OED optimizer %s initialized" % optimizerOED.GetComponentName() |
---|
147 | |
---|
148 | # start optimization |
---|
149 | print "OED by %s for %s..." % (taskOED.GetComponentName(), |
---|
150 | model.GetComponentName()) |
---|
151 | try: |
---|
152 | optimizerOED.Solve() |
---|
153 | except: |
---|
154 | print "Best solution: ", optimizerOED.GetSolution() |
---|
155 | raise |
---|
156 | print "Solution: ", optimizerOED.GetSolution() |
---|
157 | print "Parameter values:" |
---|
158 | print task.GetSoughtParameters() |
---|