1 // (C) Copyright International Business Machines Corporation 2006
2 // All Rights Reserved.
3 // This code is published under the Eclipse Public License.
4 //
5 // $Id$
6 //
7 // Authors:  Andreas Waechter               IBM    2006-03-02
8 
9 #ifndef __IPOPTINTERIORWARMSTARTER_HPP__
10 #define __IPOPTINTERIORWARMSTARTER_HPP__
11 
12 #include "IpSmartPtr.hpp"
13 #include "IpNLP.hpp"
14 #include <vector>
15 
16 namespace Bonmin
17 {
18   class IpoptInteriorWarmStarter : public Ipopt::ReferencedObject
19   {
20   public:
21     /**@name Constructors/Destructors */
22     //@{
23     /** Constructor. We give it the values of the current bounds so that
24      *  it can figure out which variables are fixed for this NLP. */
25     IpoptInteriorWarmStarter(Ipopt::Index n, const Ipopt::Number* x_L, const Ipopt::Number* x_u,
26         Ipopt::Number nlp_lower_bound_inf,
27         Ipopt::Number nlp_upper_bound_inf,
28         bool store_several_iterates);
29 
30     /** Default destructor */
31     ~IpoptInteriorWarmStarter();
32     //@}
33 
34     /** Method for possibly storing another iterate during the current
35      *  optimizatin for possible use for a warm start for a new
36      *  problem */
37     bool UpdateStoredIterates(Ipopt::AlgorithmMode mode,
38         const Ipopt::IpoptData& ip_data,
39         Ipopt::IpoptCalculatedQuantities& ip_cq);
40 
41     /** Method for doing whatever needs to be done after the parent NLP
42      *  has been solved */
43     bool Finalize();
44 
45     /** Method for computing the initial point based on the stored
46      *  information */
47     bool WarmStartIterate(Ipopt::Index n, const Ipopt::Number* x_l_new, const Ipopt::Number* x_u_new,
48         Ipopt::IteratesVector& warm_start_iterate);
49 
50   private:
51     /**@name Default Compiler Generated Methods
52      * (Hidden to avoid implicit creation/calling).
53      * These methods are not implemented and
54      * we do not want the compiler to implement
55      * them for us, so we declare them private
56      * and do not define them. This ensures that
57      * they will not be implicitly created/called. */
58     //@{
59     /** Default constructor. */
60     IpoptInteriorWarmStarter();
61 
62     /** Copy Constructor */
63     IpoptInteriorWarmStarter(const IpoptInteriorWarmStarter&);
64 
65     /** Overloaded Equals Operator */
66     void operator=(const IpoptInteriorWarmStarter&);
67     //@}
68 
69     //@{
70     /** Value for a lower bound that denotes -infinity */
71     Ipopt::Number nlp_lower_bound_inf_;
72     /** Value for a upper bound that denotes infinity */
73     Ipopt::Number nlp_upper_bound_inf_;
74     /** Flag indicating whether more than one iterate is to be
75      *  stored. */
76     bool store_several_iterates_;
77     //@}
78 
79     /** @name Copy of the bounds for the previously solved NLP.  This is
80      *  required to find out the remapping for fixed variables, and it
81      *  might also help to see how large the perturbation of the new
82      *  problem is. */
83     //@{
84     Ipopt::Index n_;
85     Ipopt::Number* x_l_prev_;
86     Ipopt::Number* x_u_prev_;
87     //@}
88 
89     /** @name Selected Iterates and quantities from the previous
90      *  optimization */
91     //@{
92     Ipopt::Index n_stored_iterates_;
93     std::vector<Ipopt::Index> stored_iter_;
94     std::vector<Ipopt::SmartPtr<const Ipopt::IteratesVector> > stored_iterates_;
95     std::vector<Ipopt::Number> stored_mu_;
96     std::vector<Ipopt::Number> stored_nlp_error_;
97     std::vector<Ipopt::Number> stored_primal_inf_;
98     std::vector<Ipopt::Number> stored_dual_inf_;
99     std::vector<Ipopt::Number> stored_compl_;
100     //@}
101   };
102 }
103 #endif
104