1 | # ------------------------------------------------------------------ |
---|
2 | # Diana process modelling, simulation and analysis software |
---|
3 | # Copyright (c) 2006, Sergiy Gogolenko |
---|
4 | # e-mail: gogolenk@mpi-magdeburg.mpg.de |
---|
5 | # All rights reserved. |
---|
6 | # ------------------------------------------------------------------ |
---|
7 | # $Id: rosenbrock.py Fri Aug 11 13:38:55 2006 gogolenk $ |
---|
8 | # ------------------------------------------------------------------ |
---|
9 | # Written under: i586-suse-linux |
---|
10 | # ------------------------------------------------------------------ |
---|
11 | # Last update: Fri Aug 11 13:38:55 2006 |
---|
12 | # ------------------------------------------------------------------ |
---|
13 | # Description: |
---|
14 | # Simple example of using DIANA in order to find minimum of |
---|
15 | # Rosenbrocks' function (10 unknowns) with deterministic |
---|
16 | # optimizer (in this case LBFGS-solver). |
---|
17 | |
---|
18 | __author__ = "Sergiy Gogolenko (gogolenk@mpi-magdeburg.mpg.de)" |
---|
19 | __version__ = "@PACKAGE_VERSION@" |
---|
20 | __date__ = "$Date: Fri Aug 11 13:38:55 2006 $" |
---|
21 | __copyright__ = "Copyright (c) 2006 Sergiy Gogolenko" |
---|
22 | __license__ = "" |
---|
23 | |
---|
24 | import diana, sys |
---|
25 | from math import * |
---|
26 | |
---|
27 | optimizerName = "lbfgsb" # "direct" |
---|
28 | |
---|
29 | # initialize Diana main class |
---|
30 | dmain = diana.GetDianaMain(sys.argv) |
---|
31 | |
---|
32 | # create LBFGSB-optimizer |
---|
33 | sfactory = dmain.GetSolverFactory() |
---|
34 | solver = sfactory.CreateSolver(diana.CAPE_NLP, None, optimizerName) |
---|
35 | |
---|
36 | # specify list of sought parameters |
---|
37 | sp = [] |
---|
38 | for i in range(10): |
---|
39 | sp.append(diana.DianaNLPRealParameterSpec |
---|
40 | ("x"+str(i+1), "x"+str(i+1), 2, -512, 512, 0.001)) |
---|
41 | |
---|
42 | # create task |
---|
43 | task=diana.BasicNLPTask(sp) |
---|
44 | |
---|
45 | # define objective |
---|
46 | def objfunc_Rosenbrock(task): |
---|
47 | pars = task.GetNLPParameters() |
---|
48 | par = pars.GetParameterValue(0) |
---|
49 | objfunc = 0. |
---|
50 | for i in xrange(pars.GetParametersCount()-1): |
---|
51 | par_next = pars.GetParameterValue(i+1) |
---|
52 | objfunc += 100*((par_next - par**2)**2) + ((par-1)**2) |
---|
53 | par = par_next |
---|
54 | return objfunc |
---|
55 | |
---|
56 | # assign objective with task |
---|
57 | task.SetObjFunction(objfunc_Rosenbrock) |
---|
58 | task.Initialize() |
---|
59 | print "Rosenbrock task initialized" |
---|
60 | |
---|
61 | # create report |
---|
62 | report = dmain.CreateReportingInterface(optimizerName) |
---|
63 | |
---|
64 | # set parameters for reporting |
---|
65 | pars_rep = report.GetParameters() |
---|
66 | pars_rep["Author"].SetValue("MG") |
---|
67 | pars_rep["OutputFolder"].SetValue("./report") |
---|
68 | pars_rep["ConsoleOutput"].SetValue(True) |
---|
69 | |
---|
70 | report.Initialize() |
---|
71 | print "Report initialized" |
---|
72 | |
---|
73 | # assign prepared task and report to solver |
---|
74 | solver.SetReportingInterface(report) |
---|
75 | solver.SetNLPTask(task) |
---|
76 | solver.Initialize() |
---|
77 | print "LBFGSB optimizer initialized" |
---|
78 | |
---|
79 | # start optimization |
---|
80 | print "Rosenbrock function (%i parameters) optimization..." \ |
---|
81 | % (task.GetSoughtParameters().Count()) |
---|
82 | try: |
---|
83 | solver.Solve() |
---|
84 | except: |
---|
85 | print "Solving error" |
---|
86 | pars_opt = solver.GetParameters() |
---|
87 | print '#'*80 |
---|
88 | print "Found minimum: ", \ |
---|
89 | pars_opt["MinObjFunc"].GetValue() |
---|
90 | print "Total amount of objective calls: ", \ |
---|
91 | pars_opt["TotalEvalsCount"].GetValue() |
---|
92 | print "Total amount of iterations: ", \ |
---|
93 | pars_opt["CurrIteration"].GetValue() |
---|
94 | print "Total execution time: %s sec" % \ |
---|
95 | pars_opt["TotalTimeOfWork"].GetValue() |
---|
96 | print '#'*80 |
---|
97 | print "Solution: ", solver.GetSolution() |
---|
98 | print '#'*80 |
---|
99 | |
---|