conic_impl.hpp
1 /*
2  * This file is part of CasADi.
3  *
4  * CasADi -- A symbolic framework for dynamic optimization.
5  * Copyright (C) 2010-2023 Joel Andersson, Joris Gillis, Moritz Diehl,
6  * KU Leuven. All rights reserved.
7  * Copyright (C) 2011-2014 Greg Horn
8  *
9  * CasADi is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 3 of the License, or (at your option) any later version.
13  *
14  * CasADi is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with CasADi; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  */
24 
25 
26 #ifndef CASADI_CONIC_IMPL_HPP
27 #define CASADI_CONIC_IMPL_HPP
28 
29 #include "conic.hpp"
30 #include "function_internal.hpp"
31 #include "plugin_interface.hpp"
32 #include "im.hpp"
33 
35 namespace casadi {
36 
37  struct CASADI_EXPORT ConicMemory : public FunctionMemory {
38  // Problem data structure
40 
41  };
42 
44  class CASADI_EXPORT Conic : public FunctionInternal, public PluginInterface<Conic> {
45  public:
46  // Memory structure
48 
49  // Constructor
50  Conic(const std::string& name, const std::map<std::string, Sparsity> &st);
51 
52  // Destructor
53  ~Conic() override = 0;
54 
56 
59  size_t get_n_in() override { return CONIC_NUM_IN;}
60  size_t get_n_out() override { return CONIC_NUM_OUT;}
62 
64 
67  Sparsity get_sparsity_in(casadi_int i) override;
68  Sparsity get_sparsity_out(casadi_int i) override;
70 
72 
75  std::string get_name_in(casadi_int i) override { return conic_in(i);}
76  std::string get_name_out(casadi_int i) override { return conic_out(i);}
78 
80 
83  static const Options options_;
84  const Options& get_options() const override { return options_;}
86 
88  int eval(const double** arg, double** res, casadi_int* iw, double* w, void* mem) const final;
89 
91  virtual int solve(const double** arg, double** res,
92  casadi_int* iw, double* w, void* mem) const = 0;
93 
94  // Initialize
95  void init(const Dict& opts) override;
96 
97  // Finalize the object creation
98  void finalize() override;
99 
103  int init_mem(void* mem) const override;
104 
108  void set_work(void* mem, const double**& arg, double**& res,
109  casadi_int*& iw, double*& w) const override;
110 
112  virtual void check_inputs(const double* lbx, const double* ubx,
113  const double* lba, const double* uba) const;
114 
116  virtual void generateNativeCode(std::ostream& file) const;
117 
118  // Creator function for internal class
119  typedef Conic* (*Creator)(const std::string& name,
120  const std::map<std::string, Sparsity>& st);
121 
122  // No static functions exposed
123  struct Exposed{ };
124 
126  static std::map<std::string, Plugin> solvers_;
127 
128 #ifdef CASADI_WITH_THREADSAFE_SYMBOLICS
129  static std::mutex mutex_solvers_;
130 #endif // CASADI_WITH_THREADSAFE_SYMBOLICS
131 
133  static const std::string infix_;
134 
136  static std::string shortname() { return "conic";}
137 
141  bool is_a(const std::string& type, bool recursive) const override;
142 
146  double get_default_in(casadi_int ind) const override;
147 
149  virtual bool integer_support() const { return false;}
150 
152  virtual bool psd_support() const { return false;}
153 
155  Dict get_stats(void* mem) const override;
156 
160  void qp_codegen_body(CodeGenerator& g) const;
161 
162  protected:
164  std::vector<bool> discrete_;
165  std::vector<bool> equality_;
168 
170  Sparsity H_, A_, Q_, P_;
171 
173  casadi_int nx_;
174 
176  casadi_int na_;
177 
179  casadi_int np_;
180 
182  struct SDPToSOCPMem {
183  // Block partition vector for SOCP (block i runs from r[i] to r[i+1])
184  std::vector<casadi_int> r;
185 
186  // Tranpose of A, and corresponding mapping
188  std::vector<casadi_int> A_mapping;
189 
190  // Aggregate SOCP helper constraints (lhs)
192 
193  // Aggregate SOCP helper constraints (rhs)
194  std::vector<casadi_int> map_P;
195 
196  // Maximum size of ind/val vectors
197  casadi_int indval_size;
198  };
199 
201  void sdp_to_socp_init(SDPToSOCPMem& mem) const;
202 
203  void serialize(SerializingStream &s, const SDPToSOCPMem& m) const;
204  void deserialize(DeserializingStream &s, SDPToSOCPMem& m);
205 
206  public:
210  void serialize_body(SerializingStream &s) const override;
214  void serialize_type(SerializingStream &s) const override;
215 
219  std::string serialize_base_function() const override { return "Conic"; }
223  static ProtoFunction* deserialize(DeserializingStream& s);
224 
225  protected:
226 
230  explicit Conic(DeserializingStream& s);
231  private:
232  void set_qp_prob();
233  };
234 
235 
236 } // namespace casadi
238 #endif // CASADI_CONIC_IMPL_HPP
Helper class for C code generation.
Internal class.
Definition: conic_impl.hpp:44
static const Options options_
Options.
Definition: conic_impl.hpp:83
casadi_int nx_
Number of decision variables.
Definition: conic_impl.hpp:173
virtual int solve(const double **arg, double **res, casadi_int *iw, double *w, void *mem) const =0
Solve the QP.
casadi_int np_
The shape of psd constraint matrix.
Definition: conic_impl.hpp:179
size_t get_n_in() override
Number of function inputs and outputs.
Definition: conic_impl.hpp:59
casadi_int na_
The number of constraints (counting both equality and inequality) == A.size1()
Definition: conic_impl.hpp:176
static std::map< std::string, Plugin > solvers_
Collection of solvers.
Definition: conic_impl.hpp:126
size_t get_n_out() override
Number of function inputs and outputs.
Definition: conic_impl.hpp:60
std::string serialize_base_function() const override
String used to identify the immediate FunctionInternal subclass.
Definition: conic_impl.hpp:219
std::vector< bool > discrete_
Options.
Definition: conic_impl.hpp:164
const Options & get_options() const override
Options.
Definition: conic_impl.hpp:84
std::vector< bool > equality_
Definition: conic_impl.hpp:165
virtual bool psd_support() const
Can psd constraints be treated.
Definition: conic_impl.hpp:152
bool solver_version_check_
Definition: conic_impl.hpp:167
static std::string shortname()
Short name.
Definition: conic_impl.hpp:136
static const std::string infix_
Infix.
Definition: conic_impl.hpp:133
casadi_qp_prob< double > p_qp_
Definition: conic_impl.hpp:47
std::string get_name_out(casadi_int i) override
Names of function input and outputs.
Definition: conic_impl.hpp:76
std::string get_name_in(casadi_int i) override
Names of function input and outputs.
Definition: conic_impl.hpp:75
virtual bool integer_support() const
Can discrete variables be treated.
Definition: conic_impl.hpp:149
Helper class for Serialization.
Internal class for Function.
Interface for accessing input and output data structures.
Base class for FunctionInternal and LinsolInternal.
Helper class for Serialization.
General sparsity class.
Definition: sparsity.hpp:106
std::vector< std::string > conic_out()
Get QP solver output scheme of QP solvers.
Definition: conic.cpp:66
std::vector< std::string > conic_in()
Get input scheme of QP solvers.
Definition: conic.cpp:60
The casadi namespace.
Definition: archiver.cpp:28
@ CONIC_NUM_IN
Definition: conic.hpp:196
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
@ CONIC_NUM_OUT
Definition: conic.hpp:208
casadi_qp_data< double > d_qp
Definition: conic_impl.hpp:39
SDP to SOCP conversion memory.
Definition: conic_impl.hpp:182
std::vector< casadi_int > r
Definition: conic_impl.hpp:184
std::vector< casadi_int > A_mapping
Definition: conic_impl.hpp:188
std::vector< casadi_int > map_P
Definition: conic_impl.hpp:194
Function memory with temporary work vectors.
Options metadata for a class.
Definition: options.hpp:40