1+
2+ # ------------------------------------------------------------------------------
3+ # ------------------------------------------------------------------------------
4+ # Solvers on CPU: NLPModelsIpopt, MadNLP, MadNCL
5+
6+ # NLPModelsIpopt
7+ function solve_with_ipopt (
8+ nlp:: NLPModels.AbstractNLPModel ;
9+ kwargs... ,
10+ ):: SolverCore.GenericExecutionStats
11+ solver = NLPModelsIpopt. IpoptSolver (nlp)
12+ return NLPModelsIpopt. solve! (solver, nlp; kwargs... )
13+ end
14+
15+ # MadNLP
16+ function solve_with_madnlp (
17+ nlp:: NLPModels.AbstractNLPModel ;
18+ kwargs... ,
19+ ):: MadNLP.MadNLPExecutionStats
20+ solver = MadNLP. MadNLPSolver (nlp; kwargs... )
21+ return MadNLP. solve! (solver)
22+ end
23+
24+ # ------------------------------------------------------------------------------
25+ # ------------------------------------------------------------------------------
26+ # Generic solvers
27+ abstract type AbstractNLPSolverBackend end
28+
29+ # ------------------------------------------------------------------------------
30+ # NLPModelsIpopt
31+ struct NLPModelsIpoptBackend <: AbstractNLPSolverBackend
32+ # attributes
33+ max_iter:: Int
34+ tol:: Float64
35+ print_level:: Int
36+ mu_strategy:: String
37+ linear_solver:: String
38+ sb:: String
39+ kwargs
40+
41+ # constructor
42+ function NLPModelsIpoptBackend (;
43+ max_iter:: Int = 100 ,
44+ tol:: Float64 = 1e-6 ,
45+ print_level:: Int = 5 ,
46+ mu_strategy:: String = " adaptive" ,
47+ linear_solver:: String = " Mumps" ,
48+ sb:: String = " yes" ,
49+ kwargs... ,
50+ )
51+ return new (max_iter, tol, print_level, mu_strategy, linear_solver, sb, kwargs)
52+ end
53+ end
54+
55+ function CommonSolve. solve (
56+ prob:: AbstractOptimizationProblem ,
57+ initial_guess,
58+ modeler:: AbstractNLPModelBackend ,
59+ solver:: NLPModelsIpoptBackend ;
60+ ):: SolverCore.GenericExecutionStats
61+
62+ # build the model
63+ nlp = build_model (prob, initial_guess, modeler)
64+
65+ # solve the problem
66+ return solve_with_ipopt (nlp;
67+ max_iter= solver. max_iter,
68+ tol= solver. tol,
69+ print_level= solver. print_level,
70+ mu_strategy= solver. mu_strategy,
71+ linear_solver= solver. linear_solver,
72+ sb= solver. sb,
73+ solver. kwargs...
74+ )
75+ end
76+
77+ # ------------------------------------------------------------------------------
78+ # MadNLP
79+ struct MadNLPBackend <: AbstractNLPSolverBackend
80+ # attributes
81+ max_iter:: Int
82+ tol:: Float64
83+ print_level:: MadNLP.LogLevels
84+ linear_solver:: Type{<:MadNLP.AbstractLinearSolver}
85+ kwargs
86+
87+ # constructor
88+ function MadNLPBackend (;
89+ max_iter:: Int = 100 ,
90+ tol:: Float64 = 1e-6 ,
91+ print_level:: MadNLP.LogLevels = MadNLP. INFO,
92+ linear_solver:: Type{<:MadNLP.AbstractLinearSolver} = MadNLPMumps. MumpsSolver,
93+ kwargs... ,
94+ )
95+ return new (max_iter, tol, print_level, linear_solver, kwargs)
96+ end
97+ end
98+
99+ function CommonSolve. solve (
100+ prob:: AbstractOptimizationProblem ,
101+ initial_guess,
102+ modeler:: AbstractNLPModelBackend ,
103+ solver:: MadNLPBackend ;
104+ ):: MadNLP.MadNLPExecutionStats
105+
106+ # build the model
107+ nlp = build_model (prob, initial_guess, modeler)
108+
109+ # solve the problem
110+ return solve_with_madnlp (nlp;
111+ max_iter= solver. max_iter,
112+ tol= solver. tol,
113+ print_level= solver. print_level,
114+ linear_solver= solver. linear_solver,
115+ solver. kwargs...
116+ )
117+ end
0 commit comments