diff --git a/src/ZMPRefTrajectoryGeneration/qp-problem.hh b/src/ZMPRefTrajectoryGeneration/qp-problem.hh index 53bad913039413092547de957e5009ea664555e3..d028a65151d332e5382d892abcb7a35bb0c9ec08 100644 --- a/src/ZMPRefTrajectoryGeneration/qp-problem.hh +++ b/src/ZMPRefTrajectoryGeneration/qp-problem.hh @@ -29,6 +29,7 @@ #include <jrl/mal/matrixabstractlayer.hh> #include <Mathematics/qld.h> +#include <privatepgtypes.h> namespace PatternGeneratorJRL { @@ -118,20 +119,20 @@ namespace PatternGeneratorJRL /// \brief Set the number of optimization parameters. /// /// \param nb_variables - inline void setNbVariables( int nb_variables ) - { m_NbVariables = n = nb_variables;}; + void setNbVariables( int nb_variables ) + { m_NbVariables = nb_variables;}; /// \brief Set the number of optimization parameters. /// - /// \param nb_variables + /// \param nb_eq_constraints inline void setNbEqConstraints( int nb_eq_constraints ) - { m_NbEqConstraints = me = nb_eq_constraints;}; + { m_NbEqConstraints = nb_eq_constraints;}; /// \brief Set the number of optimization parameters. /// - /// \param nb_variables + /// \param nb_constraints inline void setNbConstraints( int nb_constraints ) - { m_NbVariables = n = nb_constraints;}; + { m_NbConstraints = nb_constraints;}; /// \brief Set the dimensions of the problem. /// This method has an internal logic to @@ -158,7 +159,7 @@ namespace PatternGeneratorJRL initialize(NewArray, new_size, (type)0); for(int i = 0; i < old_size; i++) { - NewArray[i] = array[i]; + NewArray[i] = array[i]; } if (array!=0) delete [] array; @@ -172,18 +173,18 @@ namespace PatternGeneratorJRL /// \brief Add a matrix to the final optimization problem in array form /// /// \param Mat Added matrix - /// \param target Target matrix + /// \param type Target matrix type /// \param row First row inside the target /// \param col First column inside the target void addTerm(const MAL_MATRIX (&Mat, double), int type, - unsigned int row, unsigned int col); + int row, int col); /// \brief Add a vector to the final optimization problem in array form /// /// \param Mat Added vector - /// \param target Target vector type + /// \param ype Target vector type /// \param row First row inside the target void addTerm(const MAL_VECTOR (&Vec, double), int type, - unsigned int row); + int row); /// \name Dumping functions /// \{ @@ -199,7 +200,7 @@ namespace PatternGeneratorJRL /// \param type /// \param filename void dump( int type, const char *filename); - void dump( int type, std::ostream &); + void dump( int type, std::ostream & aos); /// \} /// \brief Initialize array @@ -209,6 +210,9 @@ namespace PatternGeneratorJRL template <class type> void initialize(type * array, int size, type value) { std::fill_n(array,size,value); } + /// \brief Initialize arrays + void clear( ); + /// \brief Initialize whole array /// /// \param[in] type @@ -242,9 +246,92 @@ namespace PatternGeneratorJRL /// \brief Allocate memory. /// Called when setting the dimensions of the problem. /// - /// \param nb_variables - /// \param nb_constraints - void resizeAll( int nb_variables, int nb_constraints); + /// \param[in] nb_variables + /// \param[in] nb_constraints + void resizeAll(); + + // + //Private types + // + private: + + /// \brief Handle matrices/vectors in array form + template<class type> + struct array_s + { + type * array_; + + int id_; + int nrows_, ncols_; + + void fill( type value) + { std::fill_n(array_, nrows_*ncols_, value); } + + void fill( type * array, int size, type value) + { std::fill_n(array, size, value); } + + + /// \brief Make a contiguous array + /// + /// \param[in] nrows Size of the new array + /// \param[in] ncols Size of the new array + /// \param[in] preserve Preserve old values + /// \return 0 + int stick_together(type *& final_array, int nrows, int ncols) + { + try { + type * NewArray = new type[nrows*ncols]; + fill(NewArray, nrows*ncols, (type)0); + for(int i = 0; i < nrows; i++) + for(int j = 0; j < ncols; j++) + NewArray[i+nrows*j] = array_[i+nrows_*j]; + if (final_array!=0) + delete [] final_array; + + final_array = NewArray; + nrows_ = nrows; + ncols_ = ncols; + } + catch (std::bad_alloc& ba) + {std::cerr << "bad_alloc caught: " << ba.what() << std::endl; } + + return 0; + } + + /// \brief Resize array + /// + /// \param[in] nrows Size of the new array + /// \param[in] ncols Size of the new array + /// \param[in] preserve Preserve old values + /// \return 0 + int resize(int nrows, int ncols, bool preserve) + { + try { + type * NewArray = new type[nrows*ncols]; + fill(NewArray, nrows*ncols, (type)0); + if(preserve) { + for(int i = 0; i < nrows_; i++) + for(int j = 0; j < ncols_; j++) + NewArray[i+nrows*j] = array_[i+nrows_*j]; } + if (array_!=0) + delete [] array_; + + array_ = NewArray; + nrows_ = nrows; + ncols_ = ncols; + } + catch (std::bad_alloc& ba) + {std::cerr << "bad_alloc caught: " << ba.what() << std::endl; } + + return 0; + } + + array_s(): + array_(0),id_(0),nrows_(0),ncols_(0){ + }; + ~array_s() + { if (array_!=0) delete [] array_;}; + }; // //Private members @@ -254,8 +341,8 @@ namespace PatternGeneratorJRL /// \name ql-parameters /// \{ int m, me, mmax, n, nmax, mnn; - double *Q, *D, *DU, *DS, *XL, *XU, *X, *U, *war; - int *iwar; + array_s<double> Q_, Q_dense_, D_, DU_, DU_dense_, DS_, XL_, XU_, X_, U_, war_; + array_s<int> iwar_; int iout, ifail, iprint, lwar, liwar; double Eps; /// \} @@ -275,6 +362,12 @@ namespace PatternGeneratorJRL // /// \brief Primal Least square Distance Problem solver // Optimization::Solver::PLDPSolverHerdt * m_PLDPSolverHerdt; + int scale_factor_; + + /// \brief Maximal number of variables + int max_var_; + /// \brief Maximal number of constraints + int max_constr_; }; typedef struct QPProblem_s QPProblem; }