1 /* 2 * This file is part of CasADi. 3 * 4 * CasADi -- A symbolic framework for dynamic optimization. 5 * Copyright (C) 2010-2014 Joel Andersson, Joris Gillis, Moritz Diehl, 6 * K.U. 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_LINSOL_LDL_HPP 27 #define CASADI_LINSOL_LDL_HPP 28 29 /** \defgroup plugin_Linsol_ldl 30 * Linear solver using sparse direct LDL factorization 31 */ 32 33 /** \pluginsection{Linsol,ldl} */ 34 35 /// \cond INTERNAL 36 #include "casadi/core/linsol_internal.hpp" 37 #include <casadi/solvers/casadi_linsol_ldl_export.h> 38 39 namespace casadi { 40 struct CASADI_LINSOL_LDL_EXPORT LinsolLdlMemory : public LinsolMemory { 41 std::vector<double> l, d, w; 42 }; 43 44 /** \brief \pluginbrief{LinsolInternal,ldl} 45 * @copydoc LinsolInternal_doc 46 * @copydoc plugin_LinsolInternal_ldl 47 */ 48 class CASADI_LINSOL_LDL_EXPORT LinsolLdl : public LinsolInternal { 49 public: 50 51 // Create a linear solver given a sparsity pattern and a number of right hand sides 52 LinsolLdl(const std::string& name, const Sparsity& sp); 53 54 /** \brief Create a new LinsolInternal */ creator(const std::string & name,const Sparsity & sp)55 static LinsolInternal* creator(const std::string& name, const Sparsity& sp) { 56 return new LinsolLdl(name, sp); 57 } 58 59 // Destructor 60 ~LinsolLdl() override; 61 62 ///@{ 63 /** \brief Options */ 64 static const Options options_; get_options() const65 const Options& get_options() const override { return options_;} 66 ///@} 67 68 // Initialize the solver 69 void init(const Dict& opts) override; 70 71 /** \brief Create memory block */ alloc_mem() const72 void* alloc_mem() const override { return new LinsolLdlMemory();} 73 74 /** \brief Initalize memory block */ 75 int init_mem(void* mem) const override; 76 77 /** \brief Free memory block */ free_mem(void * mem) const78 void free_mem(void *mem) const override { delete static_cast<LinsolLdlMemory*>(mem);} 79 80 // Symbolic factorization 81 int sfact(void* mem, const double* A) const override; 82 83 // Factorize the linear system 84 int nfact(void* mem, const double* A) const override; 85 86 // Solve the linear system 87 int solve(void* mem, const double* A, double* x, casadi_int nrhs, bool tr) const override; 88 89 /// Generate C code 90 void generate(CodeGenerator& g, const std::string& A, const std::string& x, 91 casadi_int nrhs, bool tr) const override; 92 93 /// Number of negative eigenvalues 94 casadi_int neig(void* mem, const double* A) const override; 95 96 /// Matrix rank 97 casadi_int rank(void* mem, const double* A) const override; 98 99 /// A documentation string 100 static const std::string meta_doc; 101 102 // Get name of the plugin plugin_name() const103 const char* plugin_name() const override { return "ldl";} 104 105 // Get name of the class class_name() const106 std::string class_name() const override { return "LinsolLdl";} 107 108 // Symbolic factorization 109 std::vector<casadi_int> p_; 110 Sparsity sp_Lt_; 111 112 ///@{ 113 // Options 114 bool incomplete_, amd_; 115 ///@} 116 117 /** \brief Serialize an object without type information */ 118 void serialize_body(SerializingStream &s) const override; 119 120 /** \brief Deserialize with type disambiguation */ deserialize(DeserializingStream & s)121 static ProtoFunction* deserialize(DeserializingStream& s) { return new LinsolLdl(s); } 122 123 protected: 124 /** \brief Deserializing constructor */ 125 explicit LinsolLdl(DeserializingStream& s); 126 }; 127 128 } // namespace casadi 129 130 /// \endcond 131 132 #endif // CASADI_LINSOL_LDL_HPP 133