From 6360e7741642766e81316387190529c50acd6eb0 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Fri, 17 Jul 2020 21:27:47 +0200 Subject: [PATCH 01/21] initial CMake files --- CMakeLists.txt | 5 +++++ PSOPT/CMakeLists-adolc.txt.in | 15 +++++++++++++++ PSOPT/CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++++ dmatrix/CMakeLists.txt | 10 ++++++++++ 4 files changed, 65 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 PSOPT/CMakeLists-adolc.txt.in create mode 100644 PSOPT/CMakeLists.txt create mode 100644 dmatrix/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..dcf4f032 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(PSOPT_ROOT) + +add_subdirectory(dmatrix/) +add_subdirectory(PSOPT/) \ No newline at end of file diff --git a/PSOPT/CMakeLists-adolc.txt.in b/PSOPT/CMakeLists-adolc.txt.in new file mode 100644 index 00000000..df389664 --- /dev/null +++ b/PSOPT/CMakeLists-adolc.txt.in @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8.2) + +project(adolc-download NONE) + +include(ExternalProject) +ExternalProject_Add(adolc + GIT_REPOSITORY https://github.com/coin-or/ADOL-C.git + GIT_TAG master + BUILD_IN_SOURCE ON + SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/adolc-src" + CONFIGURE_COMMAND autoreconf -fi + BUILD_COMMAND ls && make -j3 + INSTALL_COMMAND "" + TEST_COMMAND "" +) \ No newline at end of file diff --git a/PSOPT/CMakeLists.txt b/PSOPT/CMakeLists.txt new file mode 100644 index 00000000..ed08b498 --- /dev/null +++ b/PSOPT/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required (VERSION 3.10) +project(PSOPT VERSION 4.0.1 LANGUAGES CXX) + +find_package(PkgConfig REQUIRED) +pkg_check_modules(adolc adolc) + +if(NOT TARGET ${adolc}) + message(STATUS "ADOL-C will be downloaded and added to the project...") + # Download and unpack adolc at configure time + configure_file(CMakeLists-adolc.txt.in adolc-download/CMakeLists.txt) + execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/adolc-download ) + if(result) + message(FATAL_ERROR "CMake step for adolc failed: ${result}") + endif() + execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/adolc-download ) + if(result) + message(FATAL_ERROR "Build step for adolc failed: ${result}") + endif() + + # Add adolc directly to our build + add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/adolc-src + EXCLUDE_FROM_ALL) +endif() + +file(GLOB SRC src/*.cxx) +file(GLOB HEADER "src/*.h") + +add_library(${PROJECT_NAME} ${SRC} ${HEADER}) +add_dependencies(${PROJECT_NAME} dmatrix) +target_include_directories(${PROJECT_NAME} PUBLIC src/) +target_link_libraries(${PROJECT_NAME} PUBLIC adolc PRIVATE dmatrix) \ No newline at end of file diff --git a/dmatrix/CMakeLists.txt b/dmatrix/CMakeLists.txt new file mode 100644 index 00000000..05e5ecf6 --- /dev/null +++ b/dmatrix/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required (VERSION 3.10) +project(dmatrix LANGUAGES CXX) + +file(GLOB SRC src/*.cxx) +file(GLOB HEADER include/*.h) + +add_library(${PROJECT_NAME} ${SRC} ${HEADER}) +target_include_directories(${PROJECT_NAME} PUBLIC include/) + +set(${PROJECT_NAME} ${PROJECT_NAME} CACHE INTERNAL "${PROJECT_NAME} library target.") \ No newline at end of file From 7298dad16188e1e1b32ec21908668dc7b974bd5e Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Sat, 18 Jul 2020 06:56:36 +0200 Subject: [PATCH 02/21] adolc is automatically added to this project in case it is not installed on the disk --- PSOPT/CMakeLists-adolc.txt.in | 6 +++--- PSOPT/CMakeLists.txt | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/PSOPT/CMakeLists-adolc.txt.in b/PSOPT/CMakeLists-adolc.txt.in index df389664..75b0fa24 100644 --- a/PSOPT/CMakeLists-adolc.txt.in +++ b/PSOPT/CMakeLists-adolc.txt.in @@ -8,8 +8,8 @@ ExternalProject_Add(adolc GIT_TAG master BUILD_IN_SOURCE ON SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/adolc-src" - CONFIGURE_COMMAND autoreconf -fi - BUILD_COMMAND ls && make -j3 - INSTALL_COMMAND "" + CONFIGURE_COMMAND autoreconf -fi && ./configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/adolc-build + BUILD_COMMAND make -j3 + INSTALL_COMMAND make install TEST_COMMAND "" ) \ No newline at end of file diff --git a/PSOPT/CMakeLists.txt b/PSOPT/CMakeLists.txt index ed08b498..2de86cce 100644 --- a/PSOPT/CMakeLists.txt +++ b/PSOPT/CMakeLists.txt @@ -21,9 +21,8 @@ if(NOT TARGET ${adolc}) message(FATAL_ERROR "Build step for adolc failed: ${result}") endif() - # Add adolc directly to our build - add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/adolc-src - EXCLUDE_FROM_ALL) + add_library(adolc SHARED IMPORTED) + set_target_properties(adolc PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/adolc-build/lib64) endif() file(GLOB SRC src/*.cxx) From 05bf9cc0c25289044d5e4853d71bc229e6429078 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 14:17:49 +0200 Subject: [PATCH 03/21] do not include when using MacOS X because header is unknown to that environment --- dmatrix/include/dmatrixv.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dmatrix/include/dmatrixv.h b/dmatrix/include/dmatrixv.h index c3d56b5c..ba8214d8 100644 --- a/dmatrix/include/dmatrixv.h +++ b/dmatrix/include/dmatrixv.h @@ -107,7 +107,9 @@ extern "C" { #endif #ifndef WIN32 -#include static long start_clock; + #ifndef __APPLE__ + #include static long start_clock; + #endif #endif #endif From 8b3ed5be2cf7366ee90fff8f8bdb82a0b6d79765 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 17:02:03 +0200 Subject: [PATCH 04/21] added f2c header from dmatrix library so that fortran types are recognized --- PSOPT/src/psopt.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PSOPT/src/psopt.h b/PSOPT/src/psopt.h index 60a83976..808cd257 100644 --- a/PSOPT/src/psopt.h +++ b/PSOPT/src/psopt.h @@ -28,8 +28,8 @@ Address: University of Portsmouth e-mail: v.m.becerra@ieee.org **********************************************************************************************/ - -#include "../../RELEASE_NUMBER" + +#include "../../RELEASE_NUMBER" /* Define to the C type corresponding to Fortran INTEGER */ @@ -121,6 +121,7 @@ using namespace std; #endif +#include "f2c.h" #include using std::string; From 0e62c86164d2e76958ff6791c690dcc2ffb81754 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 17:02:50 +0200 Subject: [PATCH 05/21] min() was not defined, changed to std::min --- dmatrix/src/dmatrixv.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmatrix/src/dmatrixv.cxx b/dmatrix/src/dmatrixv.cxx index f18148f3..bde595ff 100644 --- a/dmatrix/src/dmatrixv.cxx +++ b/dmatrix/src/dmatrixv.cxx @@ -631,7 +631,7 @@ void DMatrix::Resize( long nnrow, long nncol ) DMatrix::Allocate(asize); - memcpy( a, atemp, min( n*m, asize )*sizeof(double) ); + memcpy( a, atemp, std::min( n*m, asize )*sizeof(double) ); n = nnrow; From 226448b8a15a064076fd65ff29982d3122f4e613 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 17:04:02 +0200 Subject: [PATCH 06/21] added include directories for adolc. adolc header does not compile when c++11 flag has not been set, so flag was explicitly added --- PSOPT/CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PSOPT/CMakeLists.txt b/PSOPT/CMakeLists.txt index 2de86cce..daadbdda 100644 --- a/PSOPT/CMakeLists.txt +++ b/PSOPT/CMakeLists.txt @@ -22,13 +22,16 @@ if(NOT TARGET ${adolc}) endif() add_library(adolc SHARED IMPORTED) + target_include_directories(adolc INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/adolc-build/include/) set_target_properties(adolc PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/adolc-build/lib64) + + set(CMAKE_CXX_FLAGS "-std=c++11") endif() -file(GLOB SRC src/*.cxx) +file(GLOB SRC src/*.cxx) file(GLOB HEADER "src/*.h") add_library(${PROJECT_NAME} ${SRC} ${HEADER}) add_dependencies(${PROJECT_NAME} dmatrix) target_include_directories(${PROJECT_NAME} PUBLIC src/) -target_link_libraries(${PROJECT_NAME} PUBLIC adolc PRIVATE dmatrix) \ No newline at end of file +target_link_libraries(${PROJECT_NAME} PUBLIC adolc PRIVATE dmatrix) From 872841bdf0299159a8cd82a8824f6b7213ea5633 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 19:28:07 +0200 Subject: [PATCH 07/21] added IPOPT header so that Ipopt::ApplicationReturnStatus::Solve_Succeeded is defined --- PSOPT/src/print.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PSOPT/src/print.cxx b/PSOPT/src/print.cxx index dc09d4b7..24d62ae7 100644 --- a/PSOPT/src/print.cxx +++ b/PSOPT/src/print.cxx @@ -29,6 +29,7 @@ e-mail: v.m.becerra@ieee.org **********************************************************************************************/ #include "psopt.h" +#include void psopt_print(Workspace* workspace, const char* msg) { @@ -259,7 +260,7 @@ void print_psopt_summary(Prob& problem, Alg& algorithm, Sol& solution, Workspace fprintf(outfile,"\nDate and time of this run: \t\t\t%s", solution.end_date_and_time.c_str() ); if ( algorithm.nlp_method == "IPOPT") { - if (solution.nlp_return_code == (int) Solve_Succeeded) { + if (solution.nlp_return_code == (int) Ipopt::ApplicationReturnStatus::Solve_Succeeded) { fprintf(outfile,"\nOptimal (unscaled) cost function value: \t%e", solution.cost); for (i=0;i < problem.nphases; i++) { mv = mean(tra(solution.relative_errors[i])); @@ -431,7 +432,7 @@ void print_solution_summary(Prob& problem, Alg& algorithm, Sol& solution, Worksp fprintf(outfile,"\nTotal CPU time (seconds):\t\t\t%e", solution.cpu_time); if ( algorithm.nlp_method == "IPOPT") { - if (solution.nlp_return_code == (int) Solve_Succeeded) { + if (solution.nlp_return_code == (int) Ipopt::ApplicationReturnStatus::Solve_Succeeded) { fprintf(outfile,"\nOptimal (unscaled) cost function value: \t%e", solution.cost); for (i=0;i < problem.nphases; i++) { fprintf(outfile,"\nPhase %i endpoint cost function value:\t\t%e",i+1, solution.endpoint_cost[i]); From 4d76badecd3653898f03a98d084e4a9508cae86d Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 19:28:39 +0200 Subject: [PATCH 08/21] ipopt is now correctly added to the project --- PSOPT/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PSOPT/CMakeLists.txt b/PSOPT/CMakeLists.txt index daadbdda..3f4d4821 100644 --- a/PSOPT/CMakeLists.txt +++ b/PSOPT/CMakeLists.txt @@ -3,6 +3,7 @@ project(PSOPT VERSION 4.0.1 LANGUAGES CXX) find_package(PkgConfig REQUIRED) pkg_check_modules(adolc adolc) +pkg_check_modules(ipopt REQUIRED ipopt) if(NOT TARGET ${adolc}) message(STATUS "ADOL-C will be downloaded and added to the project...") @@ -33,5 +34,5 @@ file(GLOB HEADER "src/*.h") add_library(${PROJECT_NAME} ${SRC} ${HEADER}) add_dependencies(${PROJECT_NAME} dmatrix) -target_include_directories(${PROJECT_NAME} PUBLIC src/) -target_link_libraries(${PROJECT_NAME} PUBLIC adolc PRIVATE dmatrix) +target_include_directories(${PROJECT_NAME} PUBLIC src/ PRIVATE ${ipopt_INCLUDE_DIRS}) +target_link_libraries(${PROJECT_NAME} PUBLIC adolc ${ipopt_LIBRARIES} PRIVATE dmatrix) From 1ce42b47dfebc13b8b333a152533926a54b879a4 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 19:29:16 +0200 Subject: [PATCH 09/21] removed empty class declarations for DMatrix and its sparse equivalent --- dmatrix/include/dmatrixv.h | 61 +++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/dmatrix/include/dmatrixv.h b/dmatrix/include/dmatrixv.h index ba8214d8..085c6b67 100644 --- a/dmatrix/include/dmatrixv.h +++ b/dmatrix/include/dmatrixv.h @@ -151,10 +151,6 @@ using std::string; #define RAND_A256 22925 /* jump multiplier, DO NOT CHANGE THIS VALUE */ #define RAND_DEFAULT 123456789 /* initial seed, use 0 < RAND_DEFAULT < RAND_MODULUS */ - -class DMatrix; -class SparseMatrix; - //! DMatrix class /** @@ -376,9 +372,7 @@ class DMatrix { // define DMatrix class public: -#ifdef SPARSE_MATRIX friend class SparseMatrix; -#endif // Public methods //! Allocates the array of auxiliary (temporary) objects used by the class @@ -1371,7 +1365,8 @@ class DMatrix { // define DMatrix class \param V is a pointer to a DMatrix object, which is modified on output to contain the V factor of the decomposition. \return Reference to a temporary DMatrix object with a vector that contains the singular values of matrix A. */ - friend DMatrix& SVD( const DMatrix& A, DMatrix* U=NULL, DMatrix* V=NULL ); + friend DMatrix& SVD( const DMatrix& A); + friend DMatrix& SVD( const DMatrix& A, DMatrix* U, DMatrix* V ); //! This function returns Q, the orthonormal basis for the range of a matrix A, such that \f$ Q Q' = I \f$. The number of columns of Q is the rank of A. /** \param A is a DMatrix object @@ -1398,14 +1393,16 @@ class DMatrix { // define DMatrix class \param U is a pointer to a DMatrix object. \return Reference to a temporary DMatrix object with the unitary matrix Q. */ - friend DMatrix& schur(const DMatrix& A, DMatrix* U= NULL ); + friend DMatrix& schur(const DMatrix& A); + friend DMatrix& schur(const DMatrix& A, DMatrix* U ); //! This function computes the eigenvalues and (optionally) the eigenvectors of a matrix A. This function uses the LAPACK routines dsyev_() and dgeev_. /** \param A is a DMatrix object. \param V is a pointer to a DMatrix object. \return Reference to a temporary DMatrix object with the real part of the eigenvalues in the first column and the complex part of the eigenvalues in the second column. */ - friend DMatrix& eig(const DMatrix& A, DMatrix* V= NULL ); + friend DMatrix& eig(const DMatrix& A); + friend DMatrix& eig(const DMatrix& A, DMatrix* V ); //! This function computes and return the Euclidean norm of a matrix A, which is the square root of the sum of its squared elements. /** \param A is a DMatrix object. @@ -1443,7 +1440,9 @@ class DMatrix { // define DMatrix class \param cindx is an optional pointer to an integer which is modified with the column index. \return the value of the element with maximum value. */ - friend double Max(const DMatrix& A,int* rindx=NULL, int* cindx=NULL); + friend double Max(const DMatrix& A); + friend double Max(const DMatrix& A,int* rindx); + friend double Max(const DMatrix& A,int* rindx, int* cindx); //! This function finds and returns the element of matrix A with maximum absolute value. It also returns the indices of such element. If more than one element has the same maximum absolute value, the indices of the first element found when searching column by column is returned. /** \param A is a DMatrix object. @@ -1451,7 +1450,8 @@ class DMatrix { // define DMatrix class \param cindx is a pointer to an integer which is modified with the column index. \return the absolute value of the element with maximum absolute value. */ - friend double MaxAbs(const DMatrix& A, int* rindx=NULL, int* cindx=NULL); + friend double MaxAbs(const DMatrix& A); + friend double MaxAbs(const DMatrix& A, int* rindx, int* cindx); //! This function finds and returns the element of matrix A with minimum value. It also returns the indices of such element. If more than one element has the same minimum value, the indices of the first element found when searching column by column is returned. /** \param A is a DMatrix object. @@ -1459,7 +1459,8 @@ class DMatrix { // define DMatrix class \param cindx is a pointer to an integer which is modified with the column index. \return the absolute value of the element with minimum absolute value. */ - friend double Min(const DMatrix& A, int* rindx=NULL, int* cindx=NULL ); + friend double Min(const DMatrix& A); + friend double Min(const DMatrix& A, int* rindx, int* cindx ); //! This function finds and returns the element of matrix A with minimum absolute value. It also returns the indices of such element. If more than one element has the same minimum absolute value, the indices of the first element found when searching column by column is returned. /** \param A is a DMatrix object. @@ -1467,14 +1468,16 @@ class DMatrix { // define DMatrix class \param cindx is a pointer to an integer which is modified with the column index. \return the absolute value of the element with minimum absolute value. */ - friend double MinAbs(const DMatrix& A, int* rindx=NULL, int* cindx=NULL); + friend double MinAbs(const DMatrix& A); + friend double MinAbs(const DMatrix& A, int* rindx, int* cindx); //! This function sorts the input vector x in ascending order. Optionally, it also returns an integer array of sorted indices. If the input object is not a vector, then an error is thrown. /** \param x is a DMatrix object which upon input contains the unsorted vector and upon output contains the sorted vector. \param indx is a pointer to the first element of the array of sorted indices. \return void */ - friend void sort( DMatrix& x, int indx[] = NULL); + friend void sort( DMatrix& x); + friend void sort( DMatrix& x, int indx[]); //! This function sorts the input vector x in ascending order. It also returns a DMatrix object with the sorted indices. If the input object is not a vector, then an error is thrown. /** \param x is a DMatrix object which upon input contains the unsorted vector and upon output contains the sorted vector. @@ -1558,14 +1561,16 @@ class DMatrix { // define DMatrix class \param ntype is the type of normalization, 0 (default) or 1. \return a temporary DMatrix object with the result of the operation */ - friend DMatrix& Std( const DMatrix& A, int ntype=0 ); + friend DMatrix& Std( const DMatrix& A); + friend DMatrix& Std( const DMatrix& A, int ntype); //! Computes the covariance matrix of a data matrix where the N rows correspond to samples and the M columns are variables. The result is returned as an M x M matrix. If ntype=0 (default) then the result is normalised with N-1. Otherwise, if ntype=1, the result is normalised with N. /** \param A is a DMatrix object. \param ntype is the type of normalization, 0 (default) or 1. \return a temporary DMatrix object with the result of the operation */ - friend DMatrix& cov( const DMatrix& A, int ntype=0 ); + friend DMatrix& cov( const DMatrix& A); + friend DMatrix& cov( const DMatrix& A, int ntype); //! Computes the covariance matrix of two vectors X and Y of dimension N. The result is returned as an 1 x 1 DMatrix object. If ntype=0 (default) then the result is normalised with N-1. Otherwise, if ntype=1, the result is normalised with N. /** \param X is a DMatrix object. @@ -1573,14 +1578,16 @@ class DMatrix { // define DMatrix class \param ntype is the type of normalization, 0 (default) or 1. \return a temporary DMatrix object with the result of the operation */ - friend DMatrix& cov(DMatrix& X, DMatrix& Y, int ntype=0 ); + friend DMatrix& cov(DMatrix& X, DMatrix& Y); + friend DMatrix& cov(DMatrix& X, DMatrix& Y, int ntype ); //! This function returns a row vector with the variance of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-1), where n is the number of rows of A. Otherwise, the result is normalised with n. /** \param A is a DMatrix object. \param ntype is the type of normalization, 0 (default) or 1. \return a temporary DMatrix object with the result of the operation */ - friend DMatrix& var(DMatrix& A, int ntype=0 ); + friend DMatrix& var(DMatrix& A); + friend DMatrix& var(DMatrix& A, int ntype); //! This function returns a row vector with the sum of the elements of each column of matrix A. /** \param A is a DMatrix object. @@ -1902,11 +1909,6 @@ int dgelqf_(integer *m, integer *n, doublereal *a, integer * #endif /* LAPACK */ -// #define SPARSE - -#ifdef SPARSE_MATRIX - - //! SparseMatrix class /** A C++ class for sparse numerical linear algebra with interfaces to @@ -2170,7 +2172,8 @@ class SparseMatrix { \param V is a pointer to a DMatrix object, which is modified on output to contain the V factor of the decomposition. \return Reference to a temporary DMatrix object with a vector that contains the singular values of matrix A. */ - friend DMatrix& SVD(const SparseMatrix& A, DMatrix* U=NULL, DMatrix* V=NULL ); + friend DMatrix& SVD(const SparseMatrix& A); + friend DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V ); //! Returns the QR factorisation of a sparse matrix A. The number of rows of matrix A must be greater or equal than the number of columns. /** \param A is a SparseMatrix object· @@ -2196,14 +2199,16 @@ class SparseMatrix { \param U is a pointer to a DMatrix object. \return Reference to a temporary DMatrix object with the unitary matrix Q. */ - friend DMatrix& schur(const SparseMatrix& A, DMatrix* U= NULL ); + friend DMatrix& schur(const SparseMatrix& A); + friend DMatrix& schur(const SparseMatrix& A, DMatrix* U ); //! This function computes the eigenvalues and (optionally) the eigenvectors of a sparse matrix A. This function uses the LAPACK routines dsyev_() and dgeev_. /** \param A is a SparseMatrix object. \param V is a pointer to a DMatrix object. \return Reference to a temporary DMatrix object with the real part of the eigenvalues in the first column and the complex part of the eigenvalues in the second column. */ - friend DMatrix& eig(const SparseMatrix& A, DMatrix* V= NULL ); + friend DMatrix& eig(const SparseMatrix& A); + friend DMatrix& eig(const SparseMatrix& A, DMatrix* V ); //! This function computes and return the Euclidean norm of a sparse matrix A, which is the square root of the sum of its (nonzero) squared elements. /** \param A is a SparseMatrix object. @@ -2490,10 +2495,6 @@ SparseMatrix& operator *(double Arg, const SparseMatrix& A); - -#endif /* SPARSE_MATRIX */ - - //! ErrorHandler class /** This is a C++ class intended to handle error conditions. From ec7fbc57faef3b7d9952b4f8659a5d9b2596178a Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 19:30:04 +0200 Subject: [PATCH 10/21] now sparse option is enabled for adolc --- PSOPT/CMakeLists-adolc.txt.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PSOPT/CMakeLists-adolc.txt.in b/PSOPT/CMakeLists-adolc.txt.in index 75b0fa24..8ff38735 100644 --- a/PSOPT/CMakeLists-adolc.txt.in +++ b/PSOPT/CMakeLists-adolc.txt.in @@ -8,7 +8,7 @@ ExternalProject_Add(adolc GIT_TAG master BUILD_IN_SOURCE ON SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/adolc-src" - CONFIGURE_COMMAND autoreconf -fi && ./configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/adolc-build + CONFIGURE_COMMAND autoreconf -fi && ./configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/adolc-build --enable-sparse BUILD_COMMAND make -j3 INSTALL_COMMAND make install TEST_COMMAND "" From 7229c1af0df91c9f21599a7a07e814a19b848180 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 23:12:44 +0200 Subject: [PATCH 11/21] added options to build docs and examples --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dcf4f032..ce2a7e22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,8 @@ cmake_minimum_required (VERSION 3.10) project(PSOPT_ROOT) +option(BUILD_EXAMPLES "Build examples for dmatrix and PSOPT" OFF) +option(BUILD_DOCS "Build documentation for dmatrix and PSOPT" OFF) + add_subdirectory(dmatrix/) -add_subdirectory(PSOPT/) \ No newline at end of file +add_subdirectory(PSOPT/) From 3562af1de9c6281d3c86add43b176326dcca90cd Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Mon, 20 Jul 2020 23:14:52 +0200 Subject: [PATCH 12/21] added executables for each example --- dmatrix/CMakeLists.txt | 7 +++++-- dmatrix/examples/CMakeLists.txt | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 dmatrix/examples/CMakeLists.txt diff --git a/dmatrix/CMakeLists.txt b/dmatrix/CMakeLists.txt index 05e5ecf6..15402552 100644 --- a/dmatrix/CMakeLists.txt +++ b/dmatrix/CMakeLists.txt @@ -1,10 +1,13 @@ cmake_minimum_required (VERSION 3.10) project(dmatrix LANGUAGES CXX) -file(GLOB SRC src/*.cxx) +file(GLOB SRC src/*.cxx) file(GLOB HEADER include/*.h) add_library(${PROJECT_NAME} ${SRC} ${HEADER}) target_include_directories(${PROJECT_NAME} PUBLIC include/) +set(${PROJECT_NAME} ${PROJECT_NAME} CACHE INTERNAL "${PROJECT_NAME} library target.") -set(${PROJECT_NAME} ${PROJECT_NAME} CACHE INTERNAL "${PROJECT_NAME} library target.") \ No newline at end of file +if(${BUILD_EXAMPLES}) + add_subdirectory(examples/) +endif() \ No newline at end of file diff --git a/dmatrix/examples/CMakeLists.txt b/dmatrix/examples/CMakeLists.txt new file mode 100644 index 00000000..ece091e8 --- /dev/null +++ b/dmatrix/examples/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required (VERSION 3.10) +project(dmatrix_examples LANGUAGES CXX) + +add_executable(colon "colon.cxx") +target_link_libraries(colon PUBLIC dmatrix) + +add_executable(expm "expm.cxx") +target_link_libraries(expm PUBLIC dmatrix) + +add_executable(rand "rand.cxx") +target_link_libraries(rand PUBLIC dmatrix) + +add_executable(ricc "ricc.cxx") +target_link_libraries(ricc PUBLIC dmatrix) + +add_executable(sparse "sparse.cxx") +target_link_libraries(sparse PUBLIC dmatrix) + +add_executable(template "template.cxx") +target_link_libraries(template PUBLIC dmatrix) From b5158b63fac98ff59c4c4596d621afb96a2939fc Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Tue, 21 Jul 2020 11:30:06 +0200 Subject: [PATCH 13/21] sparse matrix class has been moved to its own file --- dmatrix/include/SparseMatrix.h | 596 ++++++++++ dmatrix/src/SparseMatrix.cxx | 1971 ++++++++++++++++++++++++++++++++ 2 files changed, 2567 insertions(+) create mode 100644 dmatrix/include/SparseMatrix.h create mode 100644 dmatrix/src/SparseMatrix.cxx diff --git a/dmatrix/include/SparseMatrix.h b/dmatrix/include/SparseMatrix.h new file mode 100644 index 00000000..d0c31758 --- /dev/null +++ b/dmatrix/include/SparseMatrix.h @@ -0,0 +1,596 @@ +// +// SparseMatrix.hpp +// dmatrix +// +// Created by Philipp Waxweiler on 21.07.20. +// + +#ifndef SparseMatrix_hpp +#define SparseMatrix_hpp + +#include "dmatrix.h" +#include "cs.h" + +//! SparseMatrix class +/** + A C++ class for sparse numerical linear algebra with interfaces to + a number of CXSparse and LUSOL functions +*/ +class SparseMatrix { +protected: +//! Array to store matrix elements + double *a; +//! Number of matrix rows + int n; +//! Number of matrix columns + int m; +//! Number of allocated elements in a + int asize; +//! Number of non-zero elements + int nz; +//! Array of nonzero row indices + int *RowIndx; +//! Array of nonzero column indices + int *ColIndx; + +public: + + // Interface functions + //! Gets the number of rows from the calling object + /** + \return integer value with the number of rows. + */ + int GetNoRows() const { return n; } + //! Gets the number of columns from the calling object + /** + \return integer value with the number of columns. + */ + int GetNoCols() const { return m; } + //! Gets the number of non-zero elements from the calling object + /** + \return integer value with the number of non-zero elements. + */ + int GetNonZero() const {return nz;} + //! Returns a DMatrix object with the row indices for the non-zero elements + /** + \return Temporary DMatrix object with the row indices for the non-zero elements + */ + DMatrix& GetRowIndxDMatrix(); + //! Returns a DMatrix object with the column indices for the non-zero elements + /** + \return Temporary DMatrix object with the column indices for the non-zero elements + */ + DMatrix& GetColIndxDMatrix(); + //! Returns a int pointer to the start of an array of row indices for the non-zero elements + /** + \return int pointer to the start of the array + */ + int* GetRowIndx_C_Array() const {return RowIndx;} + //! Returns a int pointer to the start of an array of column indices for the non-zero elements + /** + \return int pointer to the start of the array + */ + int* GetColIndx_C_Array() const {return ColIndx;} + //! Returns a double pointer to the start of an array where the non-zero elements are stored + /** + \return double pointer to the start of the array + */ + double *GetPr() const { return a; } + //! Inserts a non-zero value at a specified location of the sparse matrix. The function re-allocates storage as required. + /** + \param i row index (starting from 1) + \param j column index (starting from 1) + \param val non-zero double value to be inserted. + \return void + */ + void InsertNonZero(int i, int j, double val); + //! Saves a sparse matrix in triplet form. The first row of the saved file contains the number of rows, number of columns and the number of non-zeros of the matrix. Each subsequent row contains the row index, the column index and the corresponding nonzero value. + /** + \param fname name of the file to be created + \return void + */ + void Save(const char* fname) const; + //! Saves a sparse sparsity pattern for the sparse matrix, such that the saved matrix contains only zeros and asterisks. + /** + \param fname name of the file to be created + \return void + */ + void SaveSparsityPattern(const char* fname) const; + //! Loads a sparse matrix in triplet form. The first row of the specified file must contain the number of rows, number of columns and the number of non-zeros of the matrix. Each subsequent row must contain the row index, the column index and the corresponding nonzero value, separated by spaces. An error is thrown is the file cannot be opened. + /** + \param fname name of the file to be read + \return void + */ + void Load(const char* fname); + //! This function transposes a sparse matrix and returns the transposed sparse matrix. + /** + \param A sparse matrix to be transposed + \return a temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& tra(const SparseMatrix& A); + //! Extracts a specified sub-matrix from a sparse matrix and returns a sparse matrix. + /** + \param istart: start of row range + \param iend: end of row range + \param jstart: start of column range + \param jend: end of column range + \return Temporary SparseMatrix object with the specified sub-matrix + */ + SparseMatrix& sub_matrix(int istart, int iend, int jstart, int jend) const; + //! Extracts a specified column from a sparse matrix and returns a DMatrix object. + /** + \param j: column index + \return Temporary DMatrix object with the specified column + */ + DMatrix& Column(int j) const; + //! Extracts a specified row from a sparse matrix and returns a DMatrix object. + /** + \param i: row index + \return Temporary DMatrix object with the specified row + */ + DMatrix& Row(int i) const; + //! Assigns the elements of a SparseMatrix object to a section of the calling object. + /** + \param istart: start of row range + \param iend: end of row range + \param jstart: start of column range + \param jend: end of column range + \param B: SparseMatrix object whose element values are to be copied into the calling object + \return void + */ + void set_sub_matrix(const SparseMatrix& B, int istart, int iend, int jstart, int jend); + + // Display functions + //! Prints a sparse matrix in triplet format. + /** + \param text: label to identify the sparse matrix to be printed + \return void + */ + void Print(const char* text); + + // Constructors + //! Default constructor. Creates an empty sparse matrix with zero rows and columns. + SparseMatrix(void); // Default constructor + //! Constructor using triplet arrays. + /** + \param aa: array with double non-zero elements + \param nn: number of rows + \param mm: number of columns + \param nnz: number of non-zero elements + \param RowIndxArg: array of int values with the row indices of the nonzero elements (indices start from 1). + \param ColIndxArg: array of int values with the column indices of the nonzero elements (indices start from 1). + */ + SparseMatrix(double* aa, int nn, int mm, int nnz, int* RowIndxArg, int* ColIndxArg); // Constructor using arrays + //! Constructor using DMatrix object. Creates a sparse matrix with the same number of rows and columns as the argument, and copies the non-zero values of the argument into the created sparse matrix. + /** + \param A: DMatrix object + */ + SparseMatrix( const DMatrix& A ); // Constructor using DMatrix object + //! Copy constructor. Creates a copy of the argument. + /** + \param A: SparseMatrix object + */ + SparseMatrix( const SparseMatrix& A); // copy constructor + //! Constructor without element asignment. Creates a SparseMatrix object with storage for a specified number of non-zero values. + /** + \param nn: number of rows. + \param mm: number of columns. + \param nnz: number of non-zero values. + */ + SparseMatrix( int nn, int mm, int nnz); // Constructor without element assigment + + // Destructor + //! Desctructor. + ~SparseMatrix(); + + // Other functions + //! Resizes a SparseMatrix object + /** + \param nnew: new number of rows. + \param mnew: new number of columns. + \param nznew: new number of non-zero values. + \return void + */ + void Resize(int nnew, int mnew, int nznew); + //! Inverts a SparseMatrix object and returns a SparseMatrix object + /** + \param A: SparseMatrix object to be inverted + \return A temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& inv(SparseMatrix& A); + //! Transposes a SparseMatrix object. + /** + \return void + */ + void Transpose(); + //! Computes the product of two sparse matrices and returns a SparseMatrix object. The inner matrix dimensions must be consistent, otherwise an error is thrown. + /** + \param A: SparseMatrix object + \param B: SparseMatrix object + \return A temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B); + //! Computes the product of two sparse matrices and returns a SparseMatrix object. The left hand side matrix is transposed. The matrix dimensions must be consistent, otherwise an error is thrown. + /** + \param A: SparseMatrix object + \param B: SparseMatrix object + \return A temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B); + //! Computes the product of two sparse matrices and returns a SparseMatrix object. The right hand side matrix is transposed. The matrix dimensions must be consistent, otherwise an error is thrown. + /** + \param A: SparseMatrix object + \param B: SparseMatrix object + \return A temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& ProductT(SparseMatrix& A, SparseMatrix& B); + //! This function computes and returns the element-wise product of two sparse matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. + /** + \param A is a SparseMatrix object. + \param B is a SparseMatrix object. + \return a temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B); + //! Converts a DMatrix object into a SparseMatrix object. + /** + \param A: DMatrix object + \return A temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& sparse(DMatrix& A); + //! Creates a sparse identity matrix of specified dimension. + /** + \param n: number of rows and columns of the sparse matrix to be created. + \return A temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& speye(int n); + //! Creates a sparse matrix with ones and zeros based on the sparsity pattern of a sparse matrix. + /** + \param s: SparseMatrix object + \return A temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& spones(const SparseMatrix& s); + //! Creates a SparseMatrix object given triplet information stored in the columns of a DMatrix object. + /** + \param A: DMatrix object. The first column contains the row indices, the second column contains the column indices and the third column contains the non-zero values. + \return A temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& spconvert(DMatrix& A); + //! Creates a DMatrix object given a SparseMatrix object. + /** + \param A: SparseMatrix object. + \return A temporary DMatrix object with the result of the operation + */ + friend DMatrix& full(const SparseMatrix& A); + //! This function returns Z, the orthonormal basis for the null space of a sparse matrix A, such that \f$ Z Z' = I \f$ and \f$ A Z=0 \f$. The number of columns of Z is the nullity of A. + /** + \param A is a SparseMatrix object + \return Reference to a temporary DMatrix object with the result of the operation + */ + friend DMatrix& null( const SparseMatrix& A ); + //! Returns the singular value decomposition of a sparse matrix \f$ A = U' diag(s) V \f$, where vector s contains the singular values of A. The function uses the LAPACK routine dgesvd_(). + /** + \param A is a SparseMatrix object· + \param U is a pointer to a DMatrix object, which is modified on output to contain the U factor of the decomposition. + \param V is a pointer to a DMatrix object, which is modified on output to contain the V factor of the decomposition. + \return Reference to a temporary DMatrix object with a vector that contains the singular values of matrix A. + */ + friend DMatrix& SVD(const SparseMatrix& A); + friend DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V ); + //! Returns the QR factorisation of a sparse matrix A. The number of rows of matrix A must be greater or equal than the number of columns. + /** + \param A is a SparseMatrix object· + \return Reference to a temporary DMatrix object with the result of the operation + */ + friend DMatrix& QR( const SparseMatrix& A ); + //! Returns the LQ factorisation of a matrix A. The function uses the LAPACK routine dgelqf_(). + /** + \param A is a SparseMatrix object· + \param Q is a pointer to a DMatrix object, which is modified on output to contain the Q factor of the decomposition. + \return Reference to a temporary DMatrix object with the L factor of the decomposition. + */ + friend DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ); + //! This function returns Q, the orthonormal basis for the range of a sparse matrix A, such that \f$ Q Q' = I \f$. The number of columns of Q is the rank of A. + /** + \param A is a SparseMatrix object + \return Reference to a temporary DMatrix object with the result of the operation + */ + friend DMatrix& orth( const SparseMatrix& A ); + //! This function computes and returns the Schur decomposition of a sparse matrix A, such that \f$ A=Q'U Q \f$, where U is an upper triangular matrix and Q is a unitary matrix. This function uses the LAPACK routine dgees_() + /** + \param A is a SparseMatrix object. + \param U is a pointer to a DMatrix object. + \return Reference to a temporary DMatrix object with the unitary matrix Q. + */ + friend DMatrix& schur(const SparseMatrix& A); + friend DMatrix& schur(const SparseMatrix& A, DMatrix* U ); + //! This function computes the eigenvalues and (optionally) the eigenvectors of a sparse matrix A. This function uses the LAPACK routines dsyev_() and dgeev_. + /** + \param A is a SparseMatrix object. + \param V is a pointer to a DMatrix object. + \return Reference to a temporary DMatrix object with the real part of the eigenvalues in the first column and the complex part of the eigenvalues in the second column. + */ + friend DMatrix& eig(const SparseMatrix& A); + friend DMatrix& eig(const SparseMatrix& A, DMatrix* V ); + //! This function computes and return the Euclidean norm of a sparse matrix A, which is the square root of the sum of its (nonzero) squared elements. + /** + \param A is a SparseMatrix object. + \return the value of the Euclidean norm. + */ + friend double enorm(const SparseMatrix& A); + //! This function computes 2-norm of sparse matrix A, which is computed as the maximum singular value of A. + /** + \param A is a SparseMatrix object. + \return the value of the 2-norm + */ + friend double norm(const SparseMatrix& A); + //! This function computes and returns the element-wise absolute value of a sparse matrix A. + /** + \param A is a SparseMatrix object. + \return a reference to a temporary SparseMatrix object with the result of the operation. + */ + friend SparseMatrix& Abs(const SparseMatrix& A); + //! This function calculates the 2-norm condition number of a sparse matrix, which is the ratio of the maximum singular value to the minimum singular value of the matrix. A large condition number indicates a nearly singular matrix. If the input matrix is not square, an error is thrown. + /** + \param A is a SparseMatrix object. + \return the 2-norm condition number + */ + friend double cond( const SparseMatrix& A ); + //! This function estimates the 1-norm reciprocal condition number of a sparse matrix. The function uses the LAPACK function dgecon. if A is well conditioned, then rcond(A) is near 1. If A is badly conditioned, then rcond(A) is close to the machine numerical precision (very small). If the input matrix is not square, an error is thrown. + /** + \param A is a SparseMatrix object. + \return the reciprocal condition number estimate + */ + friend double rcond( const SparseMatrix& A ); + //! This function returns an estimate of the rank of a sparse matrix, which is the number of linearly independent rows or columns. + /** + \param A is a SparseMatrix object. + \return the rank estimate. + */ + friend int rank_sparse( const SparseMatrix& A ); + //! This function returns a sparse matrix with a given sparsity pattern where each non-zero element is a uniform pseudo-random number in the range (0,1). + /** + \param S is a SparseMatrix object from which the sparsity pattern is taken. + \return a temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& sprand(const SparseMatrix& S); + //! This function returns a sparse matrix with a given density where each non-zero element is a uniform pseudo-random number in the range (0,1). + /** + \param n is the number of rows + \param m is the number of columns + \param density is the desired density of the sparse matrix to be created. + \return a temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& sprand(int n, int m, double density); + //! This function returns a sparse matrix with a given sparsity pattern where each non-zero element is a Gaussian pseudo-random number in the range with zero mean and unit variance. + /** + \param S is a SparseMatrix object from which the sparsity pattern is taken. + \return a temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& sprandn(const SparseMatrix& S); + //! This function returns a sparse matrix with a given density where each non-zero element is a Gaussian pseudo-random number with zero mean and unit variance. + /** + \param n is the number of rows + \param m is the number of columns + \param density is the desired density of the sparse matrix to be created. + \return a temporary SparseMatrix object with the result of the operation + */ + friend SparseMatrix& sprandn(int n, int m, double density); + + //! This function eliminates zero elements from a sparse matrix and deletes unnecessary storage. + /** + \return void + */ + void Compress(); + + // Operators + //! Sparse matrix addition and substitution operator. The sizes of the matrices being added must be the same, otherwise an error is thrown.The left hand side object is replaced with the result of the operation. + /** + \param rval: SparseMatrix object located right hand side of the operator. + \return Reference to the calling SparseMatrix object + */ + SparseMatrix& operator += (const SparseMatrix &rval); + //! Sparse matrix subtraction and substitution operator. The sizes of the matrices being subtracted must be the same, otherwise an error is thrown. The left hand side object is replaced with the result of the operation. + /** + \param rval: SparseMatrix object located right hand side of the operator. + \return Reference to the calling SparseMatrix object + */ + SparseMatrix& operator -= (const SparseMatrix &rval); + //! Sparse matrix product and substitution operator. The inner sizes of the matrices being multiplied must be the consistent, otherwise an error is thrown. The left hand side object is replaced with the result of the operation. + /** + \param rval: SparseMatrix object located right hand side of the operator. + \return Reference to the calling SparseMatrix object + */ + SparseMatrix& operator *= (const SparseMatrix &rval); + //! Computes the product of a sparse matrix (left hand side of the operator) times a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. + /** + \param Arg: double value that will multiply each non-zero element of the sparse matrix. + \return Reference the calling SparseMatrix object + */ + SparseMatrix& operator*= (double Arg); + //! Computes the division of a sparse matrix (left hand side of the operator) by a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. + /** + \param Arg: double value that will divide each non-zero element of the sparse matrix. + \return Reference the calling SparseMatrix object + */ + SparseMatrix& operator/= (double Arg); + //! Sparse matrix addition operator. The row and column sizes of the matrices being added must be the same, otherwise an error is thrown. + /** + \param rval: sparse matrix located at the right hand side of the operator. + \return Reference to a temporary SparseMatrix object with the result of the operation + */ + SparseMatrix& operator+ (const SparseMatrix& rval) const; + //! Sparse matrix subtraction operator. The row and column sizes of the matrices being subtracted must be the same, otherwise an error is thrown. + /** + \param rval: sparse matrix located at the right hand side of the operator. + \return Reference to a temporary SparseMatrix object with the result of the operation + */ + SparseMatrix& operator - (const SparseMatrix& rval) const; + //! Sparse matrix product operator. The inner dimensions of the matrices being multiplied must be the same, otherwise an error is thrown. + /** + \param rval: sparse matrix located at the right hand side of the operator. + \return Reference to a temporary SparseMatrix object with the result of the operation + */ + SparseMatrix& operator* (const SparseMatrix& rval) const; + //! This operator computes the product of a sparse matrix by a dense matrix and returns a sparse matrix object. The inner dimensions of the matrices being multiplied must be the same, otherwise an error is thrown. + /** + \param rval: DMatrix object located at the right hand side of the operator. + \return Reference to a temporary SparseMatrix object with the result of the operation + */ + SparseMatrix& operator* (DMatrix& rval) const; + //! Computes the product of a sparse matrix (left hand side of the operator) times a real scalar (right hand side value). + /** + \param Arg: double value that will multiply each non-zero element of the sparse matrix. + \return Reference to a temporary object with the result of the operation. + */ + SparseMatrix& operator* (double Arg) const; + //! Computes the product of a real value (left hand side of the operator) by a sparse matrix (right hand side of the operator). + /** + \param Arg: double value that will multiply each non-zero element of the sparse matrix. + \param A: SparseMatrix object to be multiplied by a real value. + \return Reference to a temporary object with the result of the operation. + */ + friend SparseMatrix& operator *(double Arg, const SparseMatrix& A); + //! Computes the division of a sparse matrix (left hand side of the operator) by a real scalar (right hand side value). + /** + \param Arg: double value that will divide each non-zero element of the sparse matrix. + \return Reference to a temporary object with the result of the operation. + */ + SparseMatrix& operator/ (double Arg) const; + //! Computes the right division of a sparse matrix (left hand side of the operator) by another sparse matrix (right hand side value). This is conceptually equivalent to multiplying the left object by the inverse of the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The right hand side object must be a square sparse matrix. + /** + \param rval: SparseMatrix object at the right hand side of the operator. + \return Reference to a temporary SparseMatrix object with the result of the operation + */ + SparseMatrix& operator/ (SparseMatrix& rval); + //! Sparse matrix assignment. The size of the left hand side object is modified if necessary, and the values of all non-zero real elements of the right hand side object and copied to the left hand side object. + /** + \param rval: SparseMatrix object at the right hand side of the operator + \return Reference to the calling SparseMatrix object + */ + SparseMatrix& operator= (const SparseMatrix& rval); + //! Elementwise power operator. Returns a SparseMatrix object with the same dimensions of the calling object and each of its elements is computed as the corresponding element of the calling object to the power of the right hand side argument. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A^x). + /** + \param x: double argument at the right hand side of the operator. + \return Reference to a temporary DMatrix object with the result of the operation + */ + SparseMatrix& operator^(double x) const; + //! Concatenates two sparse matrices side by side. The number of rows of the matrices involved must be the same, otherwise an error is thrown. The number of columns of the resulting matrix is the addition of the number of columns of both matrices involved. + /** + \param B: SparseMatrix object at the right hand side of the operator. + \return Reference to a temporary SparseMatrix object with the result of the operation + */ + SparseMatrix& operator||(SparseMatrix& B) const; + //! Stacks the right hand side matrix below the left hand side matrix. The dimensions number of columns of the matrices involved must be the same, otherwise an error is thrown. The number of rows of the resulting matrix is the addition of the number of rows of both matrices involved. + /** + \param B: SparseMatrix object at the right hand side of the operator. + \return Reference to a temporary SparseMatrix object with the result of the operation + */ + SparseMatrix& operator&&(SparseMatrix& B) const; + //! Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row and column indices. Indices start from 1. If the row and column indices refer to a zero (non-allocated) element, a new element with zero value is allocated so that it can be returned as a reference. + /** + \param row: Row index starting from 1. + \param col: Column index starting from 1. + \return Reference to the indexed matrix element. + */ + double& operator() (int row,int col); + //! Matrix indexing. Returns the value of the matrix element located at the position indicated by the row and column indices. Indices start from 1. + /** + \param row: Row index starting from 1. + \param col: Column index starting from 1. + \return double value of the element at the indicated position. + */ + double operator() (int row,int col) const; + //! Computes the left division of a sparse matrix (left hand side of the operator) by another sparse matrix (right hand side value). This is conceptually equivalent to multiplying the inverse of the left object by the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The left hand side object must be a square matrix. + /** + \param B: SparseMatrix object at the right hand side of the operator. + \return Reference to a temporary SparseMatrix object with the result of the operation + */ + SparseMatrix& operator %(SparseMatrix& B); + //! Solves a sparse system of equations \f$ Ax = b \f$ by using sparse LU decomposition. Matrix A must be a square matrix. This function uses LUSOL library functions. + /** + \param A: SparseMatrix object + \param b: SparseMatrix object + \param x: Reference to DMatrix object. Upon return this vector contains the solution to the system of equations. + \param r: Reference to DMatrix object. Upon return this vector contains the residual of the solution, \f$ r=Ax-b \f$. + \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. + \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. + \return void + */ + friend void SparseLUSolve(SparseMatrix& A, DMatrix& b, DMatrix& x, DMatrix& r, int argc, char *argv[]); + //! Finds the sparse LU factor of a sparse matrix A. Matrix A must be a square matrix. This function uses LUSOL library functions. + /** + \param A: SparseMatrix object + \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. + \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. + \return void pointer. + \sa SparseLUSolveGivenFactor() + */ + friend void* SparseLUFactor(SparseMatrix& A, int argc, char *argv[]); + //! Solves a sparse system of equations \f$ Ax = b \f$ by using sparse LU decomposition and a given LU factor. Matrix A must be a square matrix. This function uses LUSOL library functions. + /** + \param LUSOLv: void pointer resulting from a previous call to SparseLUFactor(). + \param A: SparseMatrix object + \param b: SparseMatrix object + \param x: Reference to DMatrix object. Upon return this vector contains the solution to the system of equations. + \param r: Reference to DMatrix object. Upon return this vector contains the residual of the solution, \f$ r=Ax-b \f$. + \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. + \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. + \return void + \sa SparseLUFactor() + */ + friend void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& b, DMatrix& x, DMatrix& r, int argc, char *argv[]); + //! This function prints an error message and throws an exception to be handled by the ErrorHandler class. + /** + \param error_text is a character string with the error message + \return void + */ + friend void sp_error_message(const char *error_text); + + +}; + +// Declaration of all friend functions of SparseMatrix class + +void SparseLUSolve(SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc=1, char *argv[]=NULL); + +void* SparseLUFactor(SparseMatrix& A, int argc=1, char *argv[]=NULL); + +void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc=1, char *argv[]=NULL); + +void sp_error_message(const char *error_text); + +SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B); + +SparseMatrix& ProductT(SparseMatrix& A, SparseMatrix& B); + +SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B); + +SparseMatrix& tra(const SparseMatrix& A); +SparseMatrix& inv(SparseMatrix& A); +SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B); +SparseMatrix& sparse(DMatrix& A); +SparseMatrix& speye(int n); +SparseMatrix& spones(const SparseMatrix& s); +SparseMatrix& spconvert(DMatrix& A); +DMatrix& full(const SparseMatrix& A); +DMatrix& null( const SparseMatrix& A ); +DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V ); +DMatrix& QR( const SparseMatrix& A ); +DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ); +DMatrix& orth( const SparseMatrix& A ); +DMatrix& schur(const SparseMatrix& A, DMatrix* U ); +DMatrix& eig(const SparseMatrix& A, DMatrix* V ); +double enorm(const SparseMatrix& A); +double norm(const SparseMatrix& A); +SparseMatrix& Abs(const SparseMatrix& A); +double cond( const SparseMatrix& A ); +double rcond( const SparseMatrix& A ); +int rank_sparse( const SparseMatrix& A ); +SparseMatrix& sprand(const SparseMatrix& S); +SparseMatrix& sprand(int n, int m, double density); +SparseMatrix& sprandn(const SparseMatrix& S); +SparseMatrix& sprandn(int n, int m, double density); +SparseMatrix& operator *(double Arg, const SparseMatrix& A); + + +#endif /* SparseMatrix_hpp */ diff --git a/dmatrix/src/SparseMatrix.cxx b/dmatrix/src/SparseMatrix.cxx new file mode 100644 index 00000000..e9af7e2c --- /dev/null +++ b/dmatrix/src/SparseMatrix.cxx @@ -0,0 +1,1971 @@ +// +// SparseMatrix.cpp +// dmatrix +// +// Created by Philipp Waxweiler on 21.07.20. +// + +#include "SparseMatrix.h" + + +void SparseMatrix::InsertNonZero(int i, int j, double val) +{ + int k; + + double* anew; + int* RowNew; + int* ColNew; + int nznew=nz+1; + int eflag = 0; + + anew = new double[nznew]; + RowNew= new int[nznew]; + ColNew= new int[nznew]; + + for (k=0; k< nz; k++) + { + if (RowIndx[k]==i && ColIndx[k]==j) { + a[k]= val; + eflag = 1; + break; + } + } + + if (!eflag) { + memcpy(anew, a, nz*sizeof(double) ); + memcpy(RowNew, RowIndx, nz*sizeof(int) ); + memcpy(ColNew, ColIndx, nz*sizeof(int) ); + + delete a; + delete RowIndx; + delete ColIndx; + + a = anew; + RowIndx = RowNew; + ColIndx = ColNew; + nz = nznew; + asize = nznew; + + RowIndx[nznew-1] = i; + ColIndx[nznew-1] = j; + a[nznew-1] = val; + } + + // Now resize the matrix if necessary + for (k=0;kn) + n = RowIndx[k]; + if (ColIndx[k]>m) + m = ColIndx[k]; + } + +} + + +// Operators + +SparseMatrix& SparseMatrix::operator += (const SparseMatrix &rval) +{ + int i; + + if ( (this->n != rval.n) || (this->m != rval.m) ) + fprintf(stderr,"\nSparseMatrix::operator += error: matrix dimensions do not agree"); + + for (i=0; ia[i] += rval.a[i]; + else + this->InsertNonZero( rval.RowIndx[i], rval.ColIndx[i], rval.a[i] ); + } + this->Compress(); + return (*this); +} + + +SparseMatrix& SparseMatrix::operator+ (const SparseMatrix& Other_matrix) const +{ + SparseMatrix* Result; + + Result = new SparseMatrix; + + (*Result)=(*this); + + return ((*Result)+=Other_matrix); + +} + +SparseMatrix& SparseMatrix::operator -= (const SparseMatrix &rval) +{ + int i; + + if ( (this->n != rval.n) || (this->m != rval.m) ) + fprintf(stderr,"\nSparseMatrix::operator -= error: matrix dimensions do not agree"); + + for (i=0; ia[i] -= rval.a[i]; + else + this->InsertNonZero( rval.RowIndx[i], rval.ColIndx[i], -rval.a[i] ); + } + this->Compress(); + return (*this); +} + + +SparseMatrix& SparseMatrix::operator- (const SparseMatrix& Other_matrix) const +{ + SparseMatrix* Result; + + Result = new SparseMatrix; + + (*Result)=(*this); + + return ((*Result)-=Other_matrix); +} + + +SparseMatrix& SparseMatrix::operator* (DMatrix& A) const +{ + int k; + int i, j, icol, q; + DMatrix x; + DMatrix r(n,1); + SparseMatrix* sp; + + sp = new SparseMatrix( n, A.GetNoCols(), 0 ); + + + for (icol=1; icol<=A.m; icol++) { + x = A(colon(),(long) icol); + r.FillWithZeros(); + for (k = 0; k < nz; k++) { + j = ColIndx[k]; + i = RowIndx[k]; + r(i) += a[k]*x(j); + } + for (q=1; q<=length(r); q++) { + sp->InsertNonZero(q,icol, r(q) ); + } + } + + sp->Compress(); + + return (*sp); + +} + +SparseMatrix& SparseMatrix::operator*= (double Arg) +{ + int i; + for (i=0; inz>=0) return (NULL) ; /* check inputs */ + + m = C->m ; n = C->n ; + nz = C->p[n]; + T = cs_spalloc (m, n, nz, 1, 1) ; /* allocate result */ + Ti = T->i ; Tj = T->p ; Tx = T->x ; + T->nz = nz; + w = (int*) cs_calloc (n, sizeof (int)) ; /* get workspace */ + if (!T || !w) return (cs_done (T, w, NULL, 0)) ; /* out of memory */ + Cp = C->p ; Ci = C->i ; Cx = C->x ; + for (k=0; kn; k++) + { + if (k==C->n) jlim = nz; + else jlim = Cp[k+1]; + for (j=Cp[k]; j=0) + { + Tj[ j ] = k; + Tx[ j ] = Cx[ j ]; + Ti[ j ] = Ci[ j ]; + } + } + + return (cs_done (T, w, NULL, 1)) ; /* success; free w and return T */ + + +} + + + +SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B) +{ + + /* cs *cs_multiply (const cs *A, const cs *B) */ + int i; + SparseMatrix *r = new SparseMatrix(A.GetNoRows(), B.GetNoCols(),0); + + int an = A.GetNoRows(); + int am = A.GetNoCols(); + int bn = B.GetNoRows(); + int bm = B.GetNoCols(); + int *ira = A.GetRowIndx_C_Array(); + int *irb = B.GetRowIndx_C_Array(); + int *ica = A.GetColIndx_C_Array(); + int *icb = B.GetColIndx_C_Array(); + int anz = A.GetNonZero(); + int bnz = B.GetNonZero(); + double *a = A.GetPr(); + double *b = B.GetPr(); + int *irr; + int *icr; + + + + + cs* Acs = cs_spalloc( an, am, anz, 1, 1 ); + cs* Bcs = cs_spalloc( bn, bm, bnz, 1, 1 ); + cs* CAcs; + cs* CBcs; + cs* TABcs; + + Acs->nz=anz; + Bcs->nz=bnz; + + for(i=0;ii[i]=ira[i]-1; + Acs->p[i]=ica[i]-1; + Acs->x[i]=a[i]; + } + + for(i=0;ii[i]=irb[i]-1; + Bcs->p[i]=icb[i]-1; + Bcs->x[i]=b[i]; + } + + cs* ABcs; + + CAcs = cs_compress (Acs); + CBcs = cs_compress (Bcs); + ABcs = cs_multiply( CAcs, CBcs ); + + r->Resize(an, bm, ABcs->nzmax); + + TABcs = convert2triplet(ABcs); + + irr = r->GetRowIndx_C_Array(); + icr = r->GetColIndx_C_Array(); + + for(i=0;i< TABcs->nz; i++) { + irr[i]= TABcs->i[i]+1; + icr[i]= TABcs->p[i]+1; + } + + + memcpy( r->GetPr() , ABcs->x, TABcs->nzmax*sizeof(double) ); + + cs_spfree (ABcs); + cs_spfree (TABcs); +/* cs_spfree (Acs);*/ + cs_spfree (Bcs); + cs_spfree (CAcs); + cs_spfree (CBcs); + + + return (*r); + +} + + +// { +// int i, j; +// +// double sum; +// +// SparseMatrix *sp = new SparseMatrix( A.GetNoRows(), B.GetNoCols(), 0 ); +// +// VecElem *row_p = new VecElem; +// VecElem *col_p = new VecElem; +// +// if (A.GetNoCols() != B.GetNoRows()) +// sp_error_message("Inconsistent matrix dimensions in SparseMatrix::operator*"); +// +// +// +// for (i = 1; i <= A.GetNoRows(); i++) { +// for (j = 1; j <= B.GetNoCols(); j++) { +// // row_p = A->rows [i]; +// // col_p = B->cols [j]; +// row_p->index = 0; +// col_p->index = 0; +// row_p->previous = 0; +// col_p->previous = 0; +// sum = 0; +// +// A. Find_Next_NonZero_in_Row(i, row_p); +// B. Find_Next_NonZero_in_Col(j, col_p); +// while ((row_p->index != -1) && (col_p->index != -1)) { +// if (row_p->index == col_p->index) { +// sum += row_p->value * col_p->value; +// A. Find_Next_NonZero_in_Row(i, row_p); +// B. Find_Next_NonZero_in_Col(j, col_p); +// } +// else if (row_p->index < col_p->index) { +// A. Find_Next_NonZero_in_Row(i, row_p); +// } +// else { +// B.Find_Next_NonZero_in_Col(j, col_p); +// } +// } +// if (sum!=0.0) sp->InsertNonZero(i, j, sum); +// } +// } +// +// return (*sp); +// +// } + + + +SparseMatrix& SparseMatrix::operator* (const SparseMatrix& B) const +{ + + return Product(*this,B); + +} + + +SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B) +{ + SparseMatrix *sp= new SparseMatrix(A.GetNoRows(),B.GetNoCols(),0); + + A.Transpose(); + + {*sp=Product(A,B);} + + A.Transpose(); + + return (*sp); + +} + + +SparseMatrix& ProductT(SparseMatrix& A,SparseMatrix& B) +{ + + SparseMatrix *sp= new SparseMatrix(A.GetNoCols(),B.GetNoCols(),0); + + B.Transpose(); + + {*sp=Product(A,B);} + + B.Transpose(); + + return (*sp); + + +} + +SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B) +{ + int i, j, k; + + double sum; + + double *a = A.GetPr(); + + int *RowIndx = A.GetRowIndx_C_Array(); + int *ColIndx = A.GetColIndx_C_Array(); + + SparseMatrix *sp = new SparseMatrix( A.GetNoRows(), B.GetNoCols(), 0 ); + + if (A.GetNoRows() != B.GetNoRows() || A.GetNoCols() != B.GetNoCols()) + sp_error_message("Inconsistent matrix dimensions in SparseMatrix elemProduct()"); + + + + for (k = 0; k < A.GetNonZero(); k++) { + i = RowIndx[k]; + j = ColIndx[k]; + sum = a[k]*B(i,j); + if (sum!=0.0) sp->InsertNonZero(i, j, sum); + } + + return (*sp); +} + + +SparseMatrix& SparseMatrix::operator/= (double Arg) +{ + int i; + + if (Arg==0.0) sp_error_message("Division by zero in SparseMatrix::operator/"); + + for (i=0; iResize(Other_matrix.n, Other_matrix.m, Other_matrix.nz); + memcpy(a, Other_matrix.a, nz*sizeof(double) ); + memcpy(RowIndx, Other_matrix.RowIndx, nz*sizeof(int) ); + memcpy(ColIndx, Other_matrix.ColIndx, nz*sizeof(int) ); + return (*this); +} + +double& SparseMatrix::operator() (int i,int j) +{ + int k; + + int ii; + + int eflag = 0; + + for (k=0; k< nz; k++) + { + if (RowIndx[k]==i && ColIndx[k]==j) { + ii = k; + eflag = 1; + break; + } + + } + + if( !eflag ) { + + for (k=0; kInsertNonZero(i,j,0.0); + ii = nz-1; + } + + return a[ii]; + +} + +double SparseMatrix::operator() (int row,int col) const +{ + int i; + double retval = 0.0; + + if ( (row>n) || (row<0) || (col<0) || (col>m) ) { + error_message("Out of range index in SparseMatrix::operator()"); + } + + for (i=0; i< nz; i++) { + if (RowIndx[i]==row && ColIndx[i]==col) + { + retval = a[i]; + break; + } + } + + return retval; +} + +//double SparseMatrix::operator() (int row,int col) +//{ +// +//} + +void SparseMatrix::Print(const char* text) +{ + int i; + + fprintf(stderr,"\nSparse matrix %s",text); + fprintf(stderr,"\nNumber of rows: %i", n); + fprintf(stderr,"\nNumber of columns: %i", m); + fprintf(stderr,"\nNumber of non-zero elements: %i", nz); + if (n*m!=0) fprintf(stderr,"\nDensity: %f%%", ( ((double) nz*100)/(double) (n*m) ) ); + if (nz>0) fprintf(stderr,"\n(Row,Col)\tValue"); + + for (i=0; iResize(n, n, n); + + for (i=0;inz;i++) { + sp->RowIndx[i]=i+1; + sp->ColIndx[i]=i+1; + sp->a[i]=1.0; + } + + return (*sp); +} + +SparseMatrix& spones(const SparseMatrix& s) +{ +// Returns a sparse identity matrix + SparseMatrix *sp = new SparseMatrix(s); + int i; + + for (i=0;inz;i++) { + sp->a[i]=1.0; + } + + return (*sp); +} + +SparseMatrix& spconvert(DMatrix& A) +{ + int i; + if (A.GetNoCols()!=3) + sp_error_message("Incorrect number of columns of input matrix in spconvert()"); + DMatrix I; + DMatrix J; + DMatrix Aij; + int nzmax = A.GetNoRows(); + + I = A(colon(),1); + J = A(colon(),2); + Aij = A(colon(),3); + + int maxI = (int) Max(I); + int maxJ = (int) Max(J); + + SparseMatrix* sp = new SparseMatrix(maxI, maxJ, nzmax); + + for (i=0; iRowIndx[i] = (int) I(i+1); + sp->ColIndx[i] = (int) J(i+1); + sp->a[i] = Aij(i+1); + } + + sp->Compress(); + + return (*sp); +} + + +void SparseMatrix::Load(const char* fname) +{ + int nrow, ncol, nnz; + + int k; + + FILE *fp; + + if ( (fp = fopen(fname,"r")) == NULL ) + + { sp_error_message( "Error opening file in SparseMatrix::Load()"); } + + + fscanf(fp,"%i", &nrow); + fscanf(fp,"%i", &ncol); + fscanf(fp,"%i", &nnz); + + this->Resize(nrow, ncol, nnz); + + for (k=0;kRowIndx, A.ColIndx, A.nz*sizeof(int) ); + memcpy(sp->ColIndx, A.RowIndx, A.nz*sizeof(int) ); + memcpy(sp->a , A.a, A.nz*sizeof(double) ); + + return (*sp); + +} + +SparseMatrix& inv(SparseMatrix& A) +{ +// Returns the inverse (if it exists) of a sparse matrix A. + int i,j; + + if (A.GetNoCols()!=A.GetNoRows()) + sp_error_message("Sparse matrix must be square in function inv()"); + + void* LUSOLv; + + DMatrix x(A.GetNoRows(),1); + + DMatrix r(A.GetNoRows(),1); + + DMatrix b(A.GetNoRows(),1); + + SparseMatrix *sp = new SparseMatrix(A.GetNoRows(), A.GetNoCols(), 0); + + LUSOLv = SparseLUFactor(A); + + for(j=1; j<=A.GetNoCols(); j++) + { + b.FillWithZeros(); + b(j) = 1.0; + SparseLUSolveGivenFactor(LUSOLv, A, b, x, r); + for(i=1;i<=A.GetNoRows();i++) + { + if (x(i)!=0.0) + sp->InsertNonZero(i,j,x(i)); + } + } + + return (*sp); + +} + +SparseMatrix& SparseMatrix::operator %(SparseMatrix& B) +{ +// Left divition implementation A%B is conceptually equivalent to inv(A)*B +// but it is numerically more efficient + int i,j,k; + + if (this->GetNoCols()!=this->GetNoRows()) + sp_error_message("Sparse matrix must be square in function SparseMatrix::operator%"); + + if (this->GetNoCols()!=B.GetNoRows()) + sp_error_message("Incorrect dimensions in SparseMatrix::operator% "); + + void* LUSOLv; + + DMatrix x(this->GetNoCols(),1); + + DMatrix r(B.GetNoRows(),1); + + DMatrix b(B.GetNoRows(),1); + + SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), B.GetNoCols(), 0); + + LUSOLv = SparseLUFactor(*this); + + for(j=1; j<=B.GetNoCols(); j++) + { + for (k=1;k<=B.GetNoRows();k++) b(k) = B(k,j); + SparseLUSolveGivenFactor(LUSOLv, *this, b, x, r); + for(i=1;i<=this->GetNoRows();i++) + { + if (x(i)!=0.0) + sp->InsertNonZero(i,j,x(i)); + } + } + + return (*sp); + +} + + +SparseMatrix& SparseMatrix::operator/ (SparseMatrix& B) +{ +// Right divition implementation A/B is conceptually equivalent to A*inv(B) +// but it is numerically more efficient + + if (this->GetNoCols()!=this->GetNoRows()) + sp_error_message("Sparse matrix must be square in function SparseMatrix::operator/"); + + if (this->GetNoCols()!=B.GetNoRows()) + sp_error_message("Incorrect dimensions in SparseMatrix::operator/ "); + + SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), B.GetNoCols(), 0); + + B.Transpose(); + + this->Transpose(); + + {*sp = B%(*this);} + + sp->Transpose(); + + B.Transpose(); + + this->Transpose(); + + return (*sp); + +} + +SparseMatrix& SparseMatrix::operator||(SparseMatrix& B) const +{ + // Returns the horizontal concatenation of two sparse matrices + + int i; + + if (this->GetNoRows()!=B.GetNoRows()) + sp_error_message("Number of rows must be equal in SparseMatrix::operator||"); + + SparseMatrix *sp = new SparseMatrix(n, m+B.m, nz+B.nz); + + memcpy(sp->a, a, nz*sizeof(double) ); + memcpy(sp->RowIndx, RowIndx, nz*sizeof(int) ); + memcpy(sp->ColIndx, ColIndx, nz*sizeof(int) ); + + memcpy(sp->a+nz, B.a, B.nz*sizeof(double) ); + memcpy(sp->RowIndx+nz, B.RowIndx, B.nz*sizeof(int) ); + + for(i=0; iColIndx[nz+i] = m + B.ColIndx[i]; + } + + return (*sp); + +} + + + +SparseMatrix& SparseMatrix::operator&&(SparseMatrix& B) const +{ + // Returns the vertical concatenation of two sparse matrices + + int i; + + if (m!=B.m) + sp_error_message("Number of cols must be equal in SparseMatrix::operator&&"); + + SparseMatrix *sp = new SparseMatrix(n + B.n, m, nz+B.nz); + + memcpy(sp->a, a, nz*sizeof(double) ); + memcpy(sp->RowIndx, RowIndx, nz*sizeof(int) ); + memcpy(sp->ColIndx, ColIndx, nz*sizeof(int) ); + + memcpy(sp->a+nz, B.a, B.nz*sizeof(double) ); + memcpy(sp->ColIndx+nz, B.ColIndx, B.nz*sizeof(int) ); + + for(i=0; iRowIndx[nz+i] = n + B.RowIndx[i]; + } + + return (*sp); + +} + +SparseMatrix& SparseMatrix::sub_matrix(int istart, int iend, int jstart, int jend) const +{ + // Returns a submatrix of the calling object + int i,j; + double value; + + if ((istart<1)||(istart>n)||(iend<1)||(iend>n)||(jstart<1)||(jstart>m)||(istart>iend)||(jstart>jend)) + sp_error_message("Index error in SparseMatrix::sub_matrix"); + + int nnew = iend-istart+1; + int mnew = jend-jstart+1; + + SparseMatrix *sp = new SparseMatrix(nnew, mnew, 0); + + for (i=1; i<=nnew; i++) { + for(j=1; j<=mnew; j++) { + value = (*this)(istart+i-1,jstart+j-1); + if ( value!=0.0 ) { + sp->InsertNonZero(i,j,value); + } + } + } + + return (*sp); + + + +} + +DMatrix& SparseMatrix::Column(int j) const +{ +// Returns a dense column vector (DMatrix object) with the j-th column of the calling +// sparse matrix. + DMatrix* Temp; + Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); + Temp->Resize( this->GetNoRows(), 1 ); + Temp->FillWithZeros(); + for(int i=0;iResize( 1, this->GetNoCols()); + Temp->FillWithZeros(); + for(int j=0;jn)||(iend<1)||(iend>n)||(jstart<1)||(jstart>m)||(istart>iend)||(jstart>jend)) + sp_error_message("Index error in SparseMatrix::set_sub_matrix"); + + int nn = iend-istart+1; + int mm = jend-jstart+1; + + if (B.n != nn || B.m != mm) + sp_error_message("Range must be consistent with input matrix size in SparseMatrix::set_sub_matrix"); + + for (i=1; i<=nn; i++) { + for(j=1; j<=mm; j++) { + value = B(i,j); + if ( value!=0.0 ) { + this->InsertNonZero(istart+i-1,jstart+j-1,value); + } + } + } + + return; + +} + + + +void SparseMatrix::Transpose() +{ +// Transposes a sparse matrix object + int s; + int *temp = new int[nz]; + + + memcpy(temp, RowIndx, nz*sizeof(int) ); + memcpy(RowIndx, ColIndx, nz*sizeof(int) ); + memcpy(ColIndx, temp, nz*sizeof(int) ); + + s = n; + n = m; + m = s; + + return; + +} + +SparseMatrix& SparseMatrix::operator^(double x) const +{ + // Element-wise power of a sparse matrix + int i; + SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), this->GetNoCols(), this->GetNonZero() ); + + memcpy(sp->RowIndx, this->RowIndx, this->nz*sizeof(int) ); + memcpy(sp->ColIndx, this->ColIndx, this->nz*sizeof(int) ); + for (i=0; inz; i++) + { + sp->a[i] = pow( this->a[i], x ); + } + + return (*sp); + + +} + + + + +MYBOOL isNum(char val) +{ + int ord; + ord = (int) val - 48; + return( (MYBOOL) ((ord >= 0) && (ord <= 9)) ); +} +void SparseLUSolve(SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc, char *argv[]) +{ + +/* Output device */ + FILE *outunit = stderr; + + int diagnostics_level=1; + +/* Overall dimensions allocated */ + int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, + replace = 0, randcol = 0; + MYBOOL ftran = TRUE; + +/* Storage for A, b */ + REAL *Aij, *b, *xexact; + int *iA, *jA; + +/* Storage for LUSOL */ + LUSOLrec *LUSOL = NULL; + +/* Define local storage variables */ + int i , inform, j , k , i1 , + m , lenb, lenx, + n , nelem , nnzero; + REAL Amax , test , + bnorm , rnorm , xnorm, + *rhs , *r , *x; + MYBOOL printsolution = FALSE, success = TRUE; + +/* Create the LUSOL object and set user options */ + LUSOL = LUSOL_create(outunit, 0, LUSOL_PIVMOD_TPP, 0); + LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = 10; + i = 1; + n = A.GetNoCols(); + m = A.GetNoRows(); + nnzero = A.GetNonZero(); + + + while((n == 0) && (i < argc)) { + if(strcmp("-p", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < 0 || m > LUSOL_PIVMOD_MAX) + continue; + LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; + } + } + else if(strcmp("-t", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + Amax = atof(argv[i]); + if(Amax < 1 || Amax > 100) + continue; + LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; + } + } + else if(strcmp("-m", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < LUSOL_MULT_nz_a || m > 100) + continue; + LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); + } + } + else if(strcmp("-s", argv[i]) == 0) + printsolution = TRUE; + else if(strcmp("-b", argv[i]) == 0) + ftran = FALSE; + else if(strcmp("-r", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < 0 || m > 10) + continue; + } + else + m = 1; + srand((unsigned) time( NULL )); + replace = 2*m; + } + } /* end while */ + + + + maxn = A.GetNoCols(); + maxm = A.GetNoRows(); + maxnz= A.GetNonZero(); + +/* Create the arrays */ + + Aij = A.GetPr() - BLAS_BASE; + iA = A.GetRowIndx_C_Array() - BLAS_BASE; + jA = A.GetColIndx_C_Array() - BLAS_BASE; + if(ftran) + lenb = maxm; + else + lenb = maxn; + b = bb.GetPr()-BLAS_BASE; + rhs = (REAL *) calloc(lenb+BLAS_BASE, sizeof(REAL)); + + if(ftran) + lenx = maxn; + else + lenx = maxm; + xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); + r = rr.GetPr() - BLAS_BASE; + x = xx.GetPr() - BLAS_BASE; + + +/* ----------------------------------------------------------------- + Load A into (a, indc, indr). + ----------------------------------------------------------------- */ + + if(!LUSOL_assign(LUSOL, iA, jA, Aij, nnzero, TRUE)) { + fprintf(outunit, "Error: LUSOL failed due to insufficient memory.\n"); + goto x900; + } + +/* ------------------------------------------------------------------ + Factor A = L U. + ------------------------------------------------------------------ */ + nelem = nnzero; + LU1FAC( LUSOL, &inform ); + if (inform > LUSOL_INFORM_SERIOUS) { + fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); + goto x900; + } + /* Get the largest element in A; we use it below as an estimate + of ||A||_inf, even though it isn't a proper norm. */ + Amax = LUSOL->parmlu[LUSOL_RP_MAXELEM_A]; + +/* ------------------------------------------------------------------ + SOLVE A x = b. + Save b first because lu6sol() overwrites rhs when computing x. + ------------------------------------------------------------------ */ +Resolve: +#if 1 + MEMCOPY(x, b, lenb+BLAS_BASE); + if(ftran) + inform = LUSOL_ftran(LUSOL, x, NULL, FALSE); + else + inform = LUSOL_btran(LUSOL, x, NULL); +#else + MEMCOPY(rhs, b, lenb+BLAS_BASE); + if(ftran) + LU6SOL( LUSOL, LUSOL_SOLVE_Aw_v, rhs, x, NULL, &inform ); + else + LU6SOL( LUSOL, LUSOL_SOLVE_Atv_w, x, rhs, NULL, &inform ); +#endif + if (inform > LUSOL_INFORM_SERIOUS) { + fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); + goto x900; + } + if(printsolution) { + char* msg; + sprintf(msg,"\nSolution vector="); + blockWriteREAL(outunit, msg, x, 1, lenb); + } + +/* ------------------------------------------------------------------ + Set r = b - Ax. + Find norm of r and x. + ------------------------------------------------------------------ */ + MEMCOPY(r, b, lenb+BLAS_BASE); + for (k = 1; k <= nnzero; k++) { + i = iA[k]; + j = jA[k]; + if(ftran) + r[i] -= Aij[k]*x[j]; + else + r[j] -= Aij[k]*x[i]; + } + bnorm = dnormi( lenb, b ); + rnorm = dnormi( lenb, r ); + xnorm = dnormi( lenx, x ); + +/* ------------------------------------------------------------------ + Report the findings. + ------------------------------------------------------------------ */ + if(randcol > 0) + fprintf(outunit, "\n\nColumn %d was %s\n", + randcol, + (mod(replace,2) == 1 ? "replaced with random data" : "restored")); + if (diagnostics_level>=2) { + fprintf(outunit, "\nLU size statistics (%d reallocations):\n", + LUSOL->expanded_a); + } + test = LUSOL->luparm[LUSOL_IP_NONZEROS_U0]+LUSOL->luparm[LUSOL_IP_NONZEROS_ROW]; + if (diagnostics_level>=2) { + fprintf(outunit, "L0-size = %d U0-size = %d LU-nonzeros = %d Fill-in = %.1fx\n", + LUSOL->luparm[LUSOL_IP_NONZEROS_L0], + LUSOL->luparm[LUSOL_IP_NONZEROS_U0], + (int) test, test/nnzero); + } + test = rnorm / (Amax*xnorm); + if (diagnostics_level>=2) { + fprintf(outunit, "\nAccuracy statistics:\n"); + fprintf(outunit, "%s with a factor tolerance of %g gave a relative error of %g\n", + LUSOL_pivotLabel(LUSOL), LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij], test); + fprintf(outunit, "Amax = %g bnorm = %g rnorm = %g xnorm = %g\n", + Amax, bnorm, rnorm, xnorm); + fprintf(outunit, "\n"); + } + if (test <= 1.0e-8 ) {} + /* fprintf(outunit, "The equations were solved with very high accuracy.\n");*/ + else if (test <= 1.0e-6) {} + // fprintf(outunit, "The equations were solved with reasonably good accuracy.\n"); + else { + if (test <= 1.0e-4) + fprintf(outunit, "SparseLUSolve: Questionable accuracy; the LU factors may not be good enough.\n"); + else + fprintf(outunit, "SparseLUSolve: Poor accuracy; the LU factorization probably failed.\n"); + if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP) + fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance (current is %g).\n", + LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]); + else + fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance and/or TRP pivoting.\n"); + } + + /* Check if we should replace a column and resolve */ + if(replace > 0) { + replace--; + if(mod(replace, 2) == 1) { + /* Randomly find a column and replace the data with the data in b */ + rnorm = rand(); + randcol = (int) (n * rnorm / (RAND_MAX+1)) + 1; +#if 1 + MEMCLEAR(x, m+1); + for(i = 1; i < m; i++) + x[i] = Amax * rand() / RAND_MAX; + inform = LUSOL_replaceColumn(LUSOL, randcol, x); +#else + inform = LUSOL_replaceColumn(LUSOL, randcol, b); +#endif + } + else { + /* Set the previously replaced column back and resolve */ + for (k = 1; k <= nnzero; k++) { + i = iA[k]; + j = jA[k]; + if(j == randcol) + x[i] = Aij[k]; + } + inform = LUSOL_replaceColumn(LUSOL, randcol, x); + } + if(inform != LUSOL_INFORM_LUSUCCESS) + fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); + else + goto Resolve; + } + + +/* Free memory */ +x900: + if(!success) + fprintf(outunit, "Insufficient memory or data file not found.\n"); + + free(xexact); + + LUSOL_free(LUSOL); + + +} + + +void* SparseLUFactor(SparseMatrix& A, int argc, char *argv[]) +{ +/* Output device */ + FILE *outunit = stderr; + +/* Overall dimensions allocated */ + int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, + replace = 0; + MYBOOL ftran = TRUE; + +/* Storage for A, b */ + REAL *Aij, *xexact; + int *iA, *jA; + +/* Storage for LUSOL */ + LUSOLrec *LUSOL = NULL; + +/* Define local storage variables */ + int i , inform, i1 , + m , lenx, + n , nelem , nnzero; + REAL Amax; + + MYBOOL printsolution = FALSE; + +/* Create the LUSOL object and set user options */ + LUSOL = LUSOL_create(outunit, 0, LUSOL_PIVMOD_TPP, 0); + LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = 10; + i = 1; + n = A.GetNoCols(); + m = A.GetNoRows(); + nnzero = A.GetNonZero(); + + + while((n == 0) && (i < argc)) { + if(strcmp("-p", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < 0 || m > LUSOL_PIVMOD_MAX) + continue; + LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; + } + } + else if(strcmp("-t", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + Amax = atof(argv[i]); + if(Amax < 1 || Amax > 100) + continue; + LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; + } + } + else if(strcmp("-m", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < LUSOL_MULT_nz_a || m > 100) + continue; + LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); + } + } + else if(strcmp("-s", argv[i]) == 0) + printsolution = TRUE; + else if(strcmp("-b", argv[i]) == 0) + ftran = FALSE; + else if(strcmp("-r", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < 0 || m > 10) + continue; + } + else + m = 1; + srand((unsigned) time( NULL )); + replace = 2*m; + } + } /* end while */ + + + + maxn = A.GetNoCols(); + maxm = A.GetNoRows(); + maxnz= A.GetNonZero(); + +/* Create the arrays */ + + Aij = A.GetPr() - BLAS_BASE; + iA = A.GetRowIndx_C_Array() - BLAS_BASE; + jA = A.GetColIndx_C_Array() - BLAS_BASE; + + + if(ftran) + lenx = maxn; + else + lenx = maxm; + xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); + +/* ----------------------------------------------------------------- + Load A into (a, indc, indr). + ----------------------------------------------------------------- */ + + if(!LUSOL_assign(LUSOL, iA, jA, Aij, nnzero, TRUE)) { + fprintf(outunit, "Error: LUSOL failed due to insufficient memory.\n"); + goto x900; + } + +/* ------------------------------------------------------------------ + Factor A = L U. + ------------------------------------------------------------------ */ + nelem = nnzero; + LU1FAC( LUSOL, &inform ); + if (inform > LUSOL_INFORM_SERIOUS) { + fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); + goto x900; + } + +x900: + return ((void*) LUSOL); + +} + +void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc, char *argv[]) +{ +/* Output device */ + FILE *outunit = stderr; + + int diagnostics_level=1; + +/* Overall dimensions allocated */ + int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, + replace = 0, randcol = 0; + MYBOOL ftran = TRUE; + +/* Storage for A, b */ + REAL *Aij, *b, *xexact; + int *iA, *jA; + +/* Storage for LUSOL */ + LUSOLrec *LUSOL = (LUSOLrec*) LUSOLv; + +/* Define local storage variables */ + int i , inform, j , k , i1 , + m , lenb, lenx, + n , nnzero; + REAL Amax , test , + bnorm , rnorm , xnorm, + *rhs , *r , *x; + MYBOOL printsolution = FALSE, success = TRUE; + +/* set user options */ + + i = 1; + n = LUSOL->n; + m = LUSOL->m; + nnzero = LUSOL->nelem; + + + while((n == 0) && (i < argc)) { + if(strcmp("-p", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < 0 || m > LUSOL_PIVMOD_MAX) + continue; + LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; + } + } + else if(strcmp("-t", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + Amax = atof(argv[i]); + if(Amax < 1 || Amax > 100) + continue; + LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; + } + } + else if(strcmp("-m", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < LUSOL_MULT_nz_a || m > 100) + continue; + LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); + } + } + else if(strcmp("-s", argv[i]) == 0) + printsolution = TRUE; + else if(strcmp("-b", argv[i]) == 0) + ftran = FALSE; + else if(strcmp("-r", argv[i]) == 0) { + i1 = i+1; + if((i1 < argc) && isNum(argv[i1][1])) { + i = i1; + m = atoi(argv[i]); + if(m < 0 || m > 10) + continue; + } + else + m = 1; + srand((unsigned) time( NULL )); + replace = 2*m; + } + } /* end while */ + + + + maxn = LUSOL->n; + maxm = LUSOL->m; + maxnz= LUSOL->nelem; + +/* Create the arrays */ + + Aij = A.GetPr() - BLAS_BASE; + iA = A.GetRowIndx_C_Array() - BLAS_BASE; + jA = A.GetColIndx_C_Array() - BLAS_BASE; + + if(ftran) + lenb = maxm; + else + lenb = maxn; + b = bb.GetPr()-BLAS_BASE; + rhs = (REAL *) calloc(lenb+BLAS_BASE, sizeof(REAL)); + + if(ftran) + lenx = maxn; + else + lenx = maxm; + xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); + r = rr.GetPr() - BLAS_BASE; + x = xx.GetPr() - BLAS_BASE; + + + /* Get the largest element in A; we use it below as an estimate + of ||A||_inf, even though it isn't a proper norm. */ + Amax = LUSOL->parmlu[LUSOL_RP_MAXELEM_A]; + +/* ------------------------------------------------------------------ + SOLVE A x = b. + Save b first because lu6sol() overwrites rhs when computing x. + ------------------------------------------------------------------ */ +Resolve: +#if 1 + MEMCOPY(x, b, lenb+BLAS_BASE); + if(ftran) + inform = LUSOL_ftran(LUSOL, x, NULL, FALSE); + else + inform = LUSOL_btran(LUSOL, x, NULL); +#else + MEMCOPY(rhs, b, lenb+BLAS_BASE); + if(ftran) + LU6SOL( LUSOL, LUSOL_SOLVE_Aw_v, rhs, x, NULL, &inform ); + else + LU6SOL( LUSOL, LUSOL_SOLVE_Atv_w, x, rhs, NULL, &inform ); +#endif + if (inform > LUSOL_INFORM_SERIOUS) { + fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); + goto x900; + } + if(printsolution) { + char* msg; + sprintf(msg,"\nSolution vector="); + blockWriteREAL(outunit, msg , x, 1, lenb); + } + +/* ------------------------------------------------------------------ + Set r = b - Ax. + Find norm of r and x. + ------------------------------------------------------------------ */ + MEMCOPY(r, b, lenb+BLAS_BASE); + for (k = 1; k <= nnzero; k++) { + i = iA[k]; + j = jA[k]; + if(ftran) + r[i] -= Aij[k]*x[j]; + else + r[j] -= Aij[k]*x[i]; + } + bnorm = dnormi( lenb, b ); + rnorm = dnormi( lenb, r ); + xnorm = dnormi( lenx, x ); + +/* ------------------------------------------------------------------ + Report the findings. + ------------------------------------------------------------------ */ + if(randcol > 0) + fprintf(outunit, "\n\nColumn %d was %s\n", + randcol, + (mod(replace,2) == 1 ? "replaced with random data" : "restored")); + if (diagnostics_level>=2) { + fprintf(outunit, "\nLU size statistics (%d reallocations):\n", + LUSOL->expanded_a); + } + test = LUSOL->luparm[LUSOL_IP_NONZEROS_U0]+LUSOL->luparm[LUSOL_IP_NONZEROS_ROW]; + if (diagnostics_level>=2) { + fprintf(outunit, "L0-size = %d U0-size = %d LU-nonzeros = %d Fill-in = %.1fx\n", + LUSOL->luparm[LUSOL_IP_NONZEROS_L0], + LUSOL->luparm[LUSOL_IP_NONZEROS_U0], + (int) test, test/nnzero); + } + test = rnorm / (Amax*xnorm); + if (diagnostics_level>=2) { + fprintf(outunit, "\nAccuracy statistics:\n"); + fprintf(outunit, "%s with a factor tolerance of %g gave a relative error of %g\n", + LUSOL_pivotLabel(LUSOL), LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij], test); + fprintf(outunit, "Amax = %g bnorm = %g rnorm = %g xnorm = %g\n", + Amax, bnorm, rnorm, xnorm); + fprintf(outunit, "\n"); + } + if (test <= 1.0e-8 ) {} + /* fprintf(outunit, "The equations were solved with very high accuracy.\n");*/ + else if (test <= 1.0e-6) {} + // fprintf(outunit, "The equations were solved with reasonably good accuracy.\n"); + else { + if (test <= 1.0e-4) + fprintf(outunit, "SparseLUSolve: Questionable accuracy; the LU factors may not be good enough.\n"); + else + fprintf(outunit, "SparseLUSolve: Poor accuracy; the LU factorization probably failed.\n"); + if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP) + fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance (current is %g).\n", + LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]); + else + fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance and/or TRP pivoting.\n"); + } + + /* Check if we should replace a column and resolve */ + if(replace > 0) { + replace--; + if(mod(replace, 2) == 1) { + /* Randomly find a column and replace the data with the data in b */ + rnorm = rand(); + randcol = (int) (n * rnorm / (RAND_MAX+1)) + 1; +#if 1 + MEMCLEAR(x, m+1); + for(i = 1; i < m; i++) + x[i] = Amax * rand() / RAND_MAX; + inform = LUSOL_replaceColumn(LUSOL, randcol, x); +#else + inform = LUSOL_replaceColumn(LUSOL, randcol, b); +#endif + } + else { + /* Set the previously replaced column back and resolve */ + for (k = 1; k <= nnzero; k++) { + i = iA[k]; + j = jA[k]; + if(j == randcol) + x[i] = Aij[k]; + } + inform = LUSOL_replaceColumn(LUSOL, randcol, x); + } + if(inform != LUSOL_INFORM_LUSUCCESS) + fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); + else + goto Resolve; + } + + +/* Free memory */ +x900: + if(!success) + fprintf(outunit, "Insufficient memory or data file not found.\n"); + + free(xexact); + +} + +void sp_error_message(const char *error_text) +{ + error_message( error_text ); +} + + +DMatrix& null( const SparseMatrix& A ) +{ + DMatrix* Af = new DMatrix; + DMatrix* r = new DMatrix; + + *Af = full(A); + + *r = null(*Af); + + delete Af; + + return(*r); +} + +DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V) +{ + DMatrix* Af= new DMatrix; + DMatrix* s= new DMatrix; + + *Af = full(A); + + *s = SVD(*Af, U, V); + + delete Af; + + return *s; + +} + +DMatrix& QR( const SparseMatrix& A ) +{ + + DMatrix* Af= new DMatrix; + DMatrix* s= new DMatrix; + + *Af = full(A); + + *s = QR(*Af); + + delete Af; + + return *s; + + +} + +DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ) +{ + DMatrix* Af= new DMatrix; + DMatrix* s= new DMatrix; + + *Af = full(A); + + *s = LQ(*Af, Q); + + delete Af; + + return *s; + + +} + + +DMatrix& orth( const SparseMatrix& A ) +{ + DMatrix* Af= new DMatrix; + DMatrix* s= new DMatrix; + + *Af = full(A); + + *s = orth(*Af); + + delete Af; + + return *s; + +} + +DMatrix& schur(const SparseMatrix& A, DMatrix* U ) +{ + DMatrix* Af= new DMatrix; + DMatrix* s= new DMatrix; + + *Af = full(A); + + *s = schur(*Af, U); + + delete Af; + + return *s; + +} + +DMatrix& eig(const SparseMatrix& A, DMatrix* V ) +{ + DMatrix* Af= new DMatrix; + DMatrix* s= new DMatrix; + + *Af = full(A); + + *s = eig(*Af, V); + + delete Af; + + return *s; + + +} + +double enorm(const SparseMatrix& A) +{ + int i; + double r = 0; + for (i=0;inz; i++) + R->a[i] = fabs(R->a[i]); + + return *R; +} + +double cond( const SparseMatrix& A ) +{ + double r; + + DMatrix* Af= new DMatrix; + + *Af = full(A); + + r = cond(*Af); + + delete Af; + + return r; + +} + +double rcond( const SparseMatrix& A ) +{ + double r; + + DMatrix* Af= new DMatrix; + + *Af = full(A); + + r = rcond(*Af); + + delete Af; + + return r; + +} + +int rank_sparse( const SparseMatrix& A ) +{ + int r; + + DMatrix* Af= new DMatrix; + + *Af = full(A); + + r = rank_matrix(*Af); + + delete Af; + + return r; + +} + +SparseMatrix& sprand(const SparseMatrix& S) +{ + int i; + + SparseMatrix* R= new SparseMatrix(S); + + for (i=0; inz; i++) + R->a[i] = DMatrix::random_uniform(); + + return *R; +} + +SparseMatrix& sprand(int n, int m, double density) +{ + int i, j; + + double r1; + + int nzguess = (int) density*n*m; + + SparseMatrix* R= new SparseMatrix(n,m,nzguess); + + for (i=1; i<=n; i++) + { + for(j=1; j<=m; j++) + { + r1 = DMatrix::random_uniform(); + + if (r1 < density) + { + R->InsertNonZero(i,j, DMatrix::random_uniform()); + } + } + } + + return *R; + +} + +SparseMatrix& sprandn(const SparseMatrix& S) +{ + int i; + + SparseMatrix* R= new SparseMatrix(S); + + for (i=0; inz; i++) + R->a[i] = DMatrix::random_gaussian(); + + return *R; +} + +SparseMatrix& sprandn(int n, int m, double density) +{ + int i, j; + + double r1; + + int nzguess = (int) density*n*m; + + SparseMatrix* R= new SparseMatrix(n,m,nzguess); + + for (i=1; i<=n; i++) + { + for(j=1; j<=m; j++) + { + r1 = DMatrix::random_uniform(); + + if (r1 < density) + { + R->InsertNonZero(i,j, DMatrix::random_gaussian()); + } + } + } + + return *R; +} From c7723d8687dcfa7a5b7b878e563ab10b21195a4c Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Tue, 21 Jul 2020 15:21:15 +0200 Subject: [PATCH 14/21] added implementation for matrix functions which have been deprived of default arguments --- dmatrix/src/dmatrixv.cxx | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/dmatrix/src/dmatrixv.cxx b/dmatrix/src/dmatrixv.cxx index bde595ff..e187b4ff 100644 --- a/dmatrix/src/dmatrixv.cxx +++ b/dmatrix/src/dmatrixv.cxx @@ -3611,7 +3611,9 @@ DMatrix& Std(const DMatrix& A, int ntype) } - +DMatrix& Std(const DMatrix& A) { + return Std(A, 0); +} DMatrix& cov(const DMatrix& A, int ntype) { @@ -3699,7 +3701,9 @@ DMatrix& cov(const DMatrix& A, int ntype) } - +DMatrix& cov(const DMatrix& A) { + return cov(A, 0); +} DMatrix& cov( DMatrix& X, DMatrix& Y, int ntype) { @@ -4072,7 +4076,10 @@ void DMatrix::Fprint( FILE *fp ) } - +double Max(const DMatrix & A) { + return Max(A, nullptr, nullptr); +} + double Max(const DMatrix & A, int* rindx, int* cindx ) { @@ -4152,6 +4159,10 @@ double Min(const DMatrix & A, int* rindx, int* cindx ) } +double MaxAbs(const DMatrix& A) { + return MaxAbs(A, nullptr, nullptr); +} + double MaxAbs(const DMatrix & A, int* rindx, int* cindx ) { @@ -7328,9 +7339,6 @@ void* my_calloc(size_t num, size_t size ) // =====================================SPARSE MATRIX CLASS IMPLEMENTATION ============================== -#ifdef SPARSE_MATRIX - - SparseMatrix::SparseMatrix(void) { @@ -7454,8 +7462,8 @@ SparseMatrix::SparseMatrix( const DMatrix& A ) // Constructor using DMatrix obje memcpy(RowIndx, I, nz*sizeof(int) ); memcpy(ColIndx, J, nz*sizeof(int) ); - delete I; - delete J; + delete[] I; + delete[] J; } @@ -9478,4 +9486,4 @@ SparseMatrix& sprandn(int n, int m, double density) } -#endif // SPARSE_MATRIX +} From 2dd3689058d49d354548632800f7b2ecb74e9cf6 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Tue, 21 Jul 2020 15:21:46 +0200 Subject: [PATCH 15/21] removed code from sparse matrix --- dmatrix/include/dmatrixv.h | 589 ----------- dmatrix/src/dmatrixv.cxx | 1965 ------------------------------------ 2 files changed, 2554 deletions(-) diff --git a/dmatrix/include/dmatrixv.h b/dmatrix/include/dmatrixv.h index 085c6b67..f3b7671f 100644 --- a/dmatrix/include/dmatrixv.h +++ b/dmatrix/include/dmatrixv.h @@ -75,13 +75,6 @@ Author: Dr. Victor M. Becerra, University of Reading, School of Systems Engi #define OUTPUT_STREAM stderr #endif - -#ifdef SPARSE_MATRIX - -#include "cs.h" - -#endif - #ifdef UNIX @@ -1909,588 +1902,6 @@ int dgelqf_(integer *m, integer *n, doublereal *a, integer * #endif /* LAPACK */ -//! SparseMatrix class -/** - A C++ class for sparse numerical linear algebra with interfaces to - a number of CXSparse and LUSOL functions -*/ -class SparseMatrix { -protected: -//! Array to store matrix elements - double *a; -//! Number of matrix rows - int n; -//! Number of matrix columns - int m; -//! Number of allocated elements in a - int asize; -//! Number of non-zero elements - int nz; -//! Array of nonzero row indices - int *RowIndx; -//! Array of nonzero column indices - int *ColIndx; - -public: - - // Interface functions - //! Gets the number of rows from the calling object - /** - \return integer value with the number of rows. - */ - int GetNoRows() const { return n; } - //! Gets the number of columns from the calling object - /** - \return integer value with the number of columns. - */ - int GetNoCols() const { return m; } - //! Gets the number of non-zero elements from the calling object - /** - \return integer value with the number of non-zero elements. - */ - int GetNonZero() const {return nz;} - //! Returns a DMatrix object with the row indices for the non-zero elements - /** - \return Temporary DMatrix object with the row indices for the non-zero elements - */ - DMatrix& GetRowIndxDMatrix(); - //! Returns a DMatrix object with the column indices for the non-zero elements - /** - \return Temporary DMatrix object with the column indices for the non-zero elements - */ - DMatrix& GetColIndxDMatrix(); - //! Returns a int pointer to the start of an array of row indices for the non-zero elements - /** - \return int pointer to the start of the array - */ - int* GetRowIndx_C_Array() const {return RowIndx;} - //! Returns a int pointer to the start of an array of column indices for the non-zero elements - /** - \return int pointer to the start of the array - */ - int* GetColIndx_C_Array() const {return ColIndx;} - //! Returns a double pointer to the start of an array where the non-zero elements are stored - /** - \return double pointer to the start of the array - */ - double *GetPr() const { return a; } - //! Inserts a non-zero value at a specified location of the sparse matrix. The function re-allocates storage as required. - /** - \param i row index (starting from 1) - \param j column index (starting from 1) - \param val non-zero double value to be inserted. - \return void - */ - void InsertNonZero(int i, int j, double val); - //! Saves a sparse matrix in triplet form. The first row of the saved file contains the number of rows, number of columns and the number of non-zeros of the matrix. Each subsequent row contains the row index, the column index and the corresponding nonzero value. - /** - \param fname name of the file to be created - \return void - */ - void Save(const char* fname) const; - //! Saves a sparse sparsity pattern for the sparse matrix, such that the saved matrix contains only zeros and asterisks. - /** - \param fname name of the file to be created - \return void - */ - void SaveSparsityPattern(const char* fname) const; - //! Loads a sparse matrix in triplet form. The first row of the specified file must contain the number of rows, number of columns and the number of non-zeros of the matrix. Each subsequent row must contain the row index, the column index and the corresponding nonzero value, separated by spaces. An error is thrown is the file cannot be opened. - /** - \param fname name of the file to be read - \return void - */ - void Load(const char* fname); - //! This function transposes a sparse matrix and returns the transposed sparse matrix. - /** - \param A sparse matrix to be transposed - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& tra(const SparseMatrix& A); - //! Extracts a specified sub-matrix from a sparse matrix and returns a sparse matrix. - /** - \param istart: start of row range - \param iend: end of row range - \param jstart: start of column range - \param jend: end of column range - \return Temporary SparseMatrix object with the specified sub-matrix - */ - SparseMatrix& sub_matrix(int istart, int iend, int jstart, int jend) const; - //! Extracts a specified column from a sparse matrix and returns a DMatrix object. - /** - \param j: column index - \return Temporary DMatrix object with the specified column - */ - DMatrix& Column(int j) const; - //! Extracts a specified row from a sparse matrix and returns a DMatrix object. - /** - \param i: row index - \return Temporary DMatrix object with the specified row - */ - DMatrix& Row(int i) const; - //! Assigns the elements of a SparseMatrix object to a section of the calling object. - /** - \param istart: start of row range - \param iend: end of row range - \param jstart: start of column range - \param jend: end of column range - \param B: SparseMatrix object whose element values are to be copied into the calling object - \return void - */ - void set_sub_matrix(const SparseMatrix& B, int istart, int iend, int jstart, int jend); - - // Display functions - //! Prints a sparse matrix in triplet format. - /** - \param text: label to identify the sparse matrix to be printed - \return void - */ - void Print(const char* text); - - // Constructors - //! Default constructor. Creates an empty sparse matrix with zero rows and columns. - SparseMatrix(void); // Default constructor - //! Constructor using triplet arrays. - /** - \param aa: array with double non-zero elements - \param nn: number of rows - \param mm: number of columns - \param nnz: number of non-zero elements - \param RowIndxArg: array of int values with the row indices of the nonzero elements (indices start from 1). - \param ColIndxArg: array of int values with the column indices of the nonzero elements (indices start from 1). - */ - SparseMatrix(double* aa, int nn, int mm, int nnz, int* RowIndxArg, int* ColIndxArg); // Constructor using arrays - //! Constructor using DMatrix object. Creates a sparse matrix with the same number of rows and columns as the argument, and copies the non-zero values of the argument into the created sparse matrix. - /** - \param A: DMatrix object - */ - SparseMatrix( const DMatrix& A ); // Constructor using DMatrix object - //! Copy constructor. Creates a copy of the argument. - /** - \param A: SparseMatrix object - */ - SparseMatrix( const SparseMatrix& A); // copy constructor - //! Constructor without element asignment. Creates a SparseMatrix object with storage for a specified number of non-zero values. - /** - \param nn: number of rows. - \param mm: number of columns. - \param nnz: number of non-zero values. - */ - SparseMatrix( int nn, int mm, int nnz); // Constructor without element assigment - - // Destructor - //! Desctructor. - ~SparseMatrix(); - - // Other functions - //! Resizes a SparseMatrix object - /** - \param nnew: new number of rows. - \param mnew: new number of columns. - \param nznew: new number of non-zero values. - \return void - */ - void Resize(int nnew, int mnew, int nznew); - //! Inverts a SparseMatrix object and returns a SparseMatrix object - /** - \param A: SparseMatrix object to be inverted - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& inv(SparseMatrix& A); - //! Transposes a SparseMatrix object. - /** - \return void - */ - void Transpose(); - //! Computes the product of two sparse matrices and returns a SparseMatrix object. The inner matrix dimensions must be consistent, otherwise an error is thrown. - /** - \param A: SparseMatrix object - \param B: SparseMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B); - //! Computes the product of two sparse matrices and returns a SparseMatrix object. The left hand side matrix is transposed. The matrix dimensions must be consistent, otherwise an error is thrown. - /** - \param A: SparseMatrix object - \param B: SparseMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B); - //! Computes the product of two sparse matrices and returns a SparseMatrix object. The right hand side matrix is transposed. The matrix dimensions must be consistent, otherwise an error is thrown. - /** - \param A: SparseMatrix object - \param B: SparseMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& ProductT(SparseMatrix& A, SparseMatrix& B); - //! This function computes and returns the element-wise product of two sparse matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. - /** - \param A is a SparseMatrix object. - \param B is a SparseMatrix object. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B); - //! Converts a DMatrix object into a SparseMatrix object. - /** - \param A: DMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sparse(DMatrix& A); - //! Creates a sparse identity matrix of specified dimension. - /** - \param n: number of rows and columns of the sparse matrix to be created. - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& speye(int n); - //! Creates a sparse matrix with ones and zeros based on the sparsity pattern of a sparse matrix. - /** - \param s: SparseMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& spones(const SparseMatrix& s); - //! Creates a SparseMatrix object given triplet information stored in the columns of a DMatrix object. - /** - \param A: DMatrix object. The first column contains the row indices, the second column contains the column indices and the third column contains the non-zero values. - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& spconvert(DMatrix& A); - //! Creates a DMatrix object given a SparseMatrix object. - /** - \param A: SparseMatrix object. - \return A temporary DMatrix object with the result of the operation - */ - friend DMatrix& full(const SparseMatrix& A); - //! This function returns Z, the orthonormal basis for the null space of a sparse matrix A, such that \f$ Z Z' = I \f$ and \f$ A Z=0 \f$. The number of columns of Z is the nullity of A. - /** - \param A is a SparseMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& null( const SparseMatrix& A ); - //! Returns the singular value decomposition of a sparse matrix \f$ A = U' diag(s) V \f$, where vector s contains the singular values of A. The function uses the LAPACK routine dgesvd_(). - /** - \param A is a SparseMatrix object· - \param U is a pointer to a DMatrix object, which is modified on output to contain the U factor of the decomposition. - \param V is a pointer to a DMatrix object, which is modified on output to contain the V factor of the decomposition. - \return Reference to a temporary DMatrix object with a vector that contains the singular values of matrix A. - */ - friend DMatrix& SVD(const SparseMatrix& A); - friend DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V ); - //! Returns the QR factorisation of a sparse matrix A. The number of rows of matrix A must be greater or equal than the number of columns. - /** - \param A is a SparseMatrix object· - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& QR( const SparseMatrix& A ); - //! Returns the LQ factorisation of a matrix A. The function uses the LAPACK routine dgelqf_(). - /** - \param A is a SparseMatrix object· - \param Q is a pointer to a DMatrix object, which is modified on output to contain the Q factor of the decomposition. - \return Reference to a temporary DMatrix object with the L factor of the decomposition. - */ - friend DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ); - //! This function returns Q, the orthonormal basis for the range of a sparse matrix A, such that \f$ Q Q' = I \f$. The number of columns of Q is the rank of A. - /** - \param A is a SparseMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& orth( const SparseMatrix& A ); - //! This function computes and returns the Schur decomposition of a sparse matrix A, such that \f$ A=Q'U Q \f$, where U is an upper triangular matrix and Q is a unitary matrix. This function uses the LAPACK routine dgees_() - /** - \param A is a SparseMatrix object. - \param U is a pointer to a DMatrix object. - \return Reference to a temporary DMatrix object with the unitary matrix Q. - */ - friend DMatrix& schur(const SparseMatrix& A); - friend DMatrix& schur(const SparseMatrix& A, DMatrix* U ); - //! This function computes the eigenvalues and (optionally) the eigenvectors of a sparse matrix A. This function uses the LAPACK routines dsyev_() and dgeev_. - /** - \param A is a SparseMatrix object. - \param V is a pointer to a DMatrix object. - \return Reference to a temporary DMatrix object with the real part of the eigenvalues in the first column and the complex part of the eigenvalues in the second column. - */ - friend DMatrix& eig(const SparseMatrix& A); - friend DMatrix& eig(const SparseMatrix& A, DMatrix* V ); - //! This function computes and return the Euclidean norm of a sparse matrix A, which is the square root of the sum of its (nonzero) squared elements. - /** - \param A is a SparseMatrix object. - \return the value of the Euclidean norm. - */ - friend double enorm(const SparseMatrix& A); - //! This function computes 2-norm of sparse matrix A, which is computed as the maximum singular value of A. - /** - \param A is a SparseMatrix object. - \return the value of the 2-norm - */ - friend double norm(const SparseMatrix& A); - //! This function computes and returns the element-wise absolute value of a sparse matrix A. - /** - \param A is a SparseMatrix object. - \return a reference to a temporary SparseMatrix object with the result of the operation. - */ - friend SparseMatrix& Abs(const SparseMatrix& A); - //! This function calculates the 2-norm condition number of a sparse matrix, which is the ratio of the maximum singular value to the minimum singular value of the matrix. A large condition number indicates a nearly singular matrix. If the input matrix is not square, an error is thrown. - /** - \param A is a SparseMatrix object. - \return the 2-norm condition number - */ - friend double cond( const SparseMatrix& A ); - //! This function estimates the 1-norm reciprocal condition number of a sparse matrix. The function uses the LAPACK function dgecon. if A is well conditioned, then rcond(A) is near 1. If A is badly conditioned, then rcond(A) is close to the machine numerical precision (very small). If the input matrix is not square, an error is thrown. - /** - \param A is a SparseMatrix object. - \return the reciprocal condition number estimate - */ - friend double rcond( const SparseMatrix& A ); - //! This function returns an estimate of the rank of a sparse matrix, which is the number of linearly independent rows or columns. - /** - \param A is a SparseMatrix object. - \return the rank estimate. - */ - friend int rank_sparse( const SparseMatrix& A ); - //! This function returns a sparse matrix with a given sparsity pattern where each non-zero element is a uniform pseudo-random number in the range (0,1). - /** - \param S is a SparseMatrix object from which the sparsity pattern is taken. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sprand(const SparseMatrix& S); - //! This function returns a sparse matrix with a given density where each non-zero element is a uniform pseudo-random number in the range (0,1). - /** - \param n is the number of rows - \param m is the number of columns - \param density is the desired density of the sparse matrix to be created. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sprand(int n, int m, double density); - //! This function returns a sparse matrix with a given sparsity pattern where each non-zero element is a Gaussian pseudo-random number in the range with zero mean and unit variance. - /** - \param S is a SparseMatrix object from which the sparsity pattern is taken. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sprandn(const SparseMatrix& S); - //! This function returns a sparse matrix with a given density where each non-zero element is a Gaussian pseudo-random number with zero mean and unit variance. - /** - \param n is the number of rows - \param m is the number of columns - \param density is the desired density of the sparse matrix to be created. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sprandn(int n, int m, double density); - - //! This function eliminates zero elements from a sparse matrix and deletes unnecessary storage. - /** - \return void - */ - void Compress(); - - // Operators - //! Sparse matrix addition and substitution operator. The sizes of the matrices being added must be the same, otherwise an error is thrown.The left hand side object is replaced with the result of the operation. - /** - \param rval: SparseMatrix object located right hand side of the operator. - \return Reference to the calling SparseMatrix object - */ - SparseMatrix& operator += (const SparseMatrix &rval); - //! Sparse matrix subtraction and substitution operator. The sizes of the matrices being subtracted must be the same, otherwise an error is thrown. The left hand side object is replaced with the result of the operation. - /** - \param rval: SparseMatrix object located right hand side of the operator. - \return Reference to the calling SparseMatrix object - */ - SparseMatrix& operator -= (const SparseMatrix &rval); - //! Sparse matrix product and substitution operator. The inner sizes of the matrices being multiplied must be the consistent, otherwise an error is thrown. The left hand side object is replaced with the result of the operation. - /** - \param rval: SparseMatrix object located right hand side of the operator. - \return Reference to the calling SparseMatrix object - */ - SparseMatrix& operator *= (const SparseMatrix &rval); - //! Computes the product of a sparse matrix (left hand side of the operator) times a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. - /** - \param Arg: double value that will multiply each non-zero element of the sparse matrix. - \return Reference the calling SparseMatrix object - */ - SparseMatrix& operator*= (double Arg); - //! Computes the division of a sparse matrix (left hand side of the operator) by a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. - /** - \param Arg: double value that will divide each non-zero element of the sparse matrix. - \return Reference the calling SparseMatrix object - */ - SparseMatrix& operator/= (double Arg); - //! Sparse matrix addition operator. The row and column sizes of the matrices being added must be the same, otherwise an error is thrown. - /** - \param rval: sparse matrix located at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator+ (const SparseMatrix& rval) const; - //! Sparse matrix subtraction operator. The row and column sizes of the matrices being subtracted must be the same, otherwise an error is thrown. - /** - \param rval: sparse matrix located at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator - (const SparseMatrix& rval) const; - //! Sparse matrix product operator. The inner dimensions of the matrices being multiplied must be the same, otherwise an error is thrown. - /** - \param rval: sparse matrix located at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator* (const SparseMatrix& rval) const; - //! This operator computes the product of a sparse matrix by a dense matrix and returns a sparse matrix object. The inner dimensions of the matrices being multiplied must be the same, otherwise an error is thrown. - /** - \param rval: DMatrix object located at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator* (DMatrix& rval) const; - //! Computes the product of a sparse matrix (left hand side of the operator) times a real scalar (right hand side value). - /** - \param Arg: double value that will multiply each non-zero element of the sparse matrix. - \return Reference to a temporary object with the result of the operation. - */ - SparseMatrix& operator* (double Arg) const; - //! Computes the product of a real value (left hand side of the operator) by a sparse matrix (right hand side of the operator). - /** - \param Arg: double value that will multiply each non-zero element of the sparse matrix. - \param A: SparseMatrix object to be multiplied by a real value. - \return Reference to a temporary object with the result of the operation. - */ - friend SparseMatrix& operator *(double Arg, const SparseMatrix& A); - //! Computes the division of a sparse matrix (left hand side of the operator) by a real scalar (right hand side value). - /** - \param Arg: double value that will divide each non-zero element of the sparse matrix. - \return Reference to a temporary object with the result of the operation. - */ - SparseMatrix& operator/ (double Arg) const; - //! Computes the right division of a sparse matrix (left hand side of the operator) by another sparse matrix (right hand side value). This is conceptually equivalent to multiplying the left object by the inverse of the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The right hand side object must be a square sparse matrix. - /** - \param rval: SparseMatrix object at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator/ (SparseMatrix& rval); - //! Sparse matrix assignment. The size of the left hand side object is modified if necessary, and the values of all non-zero real elements of the right hand side object and copied to the left hand side object. - /** - \param rval: SparseMatrix object at the right hand side of the operator - \return Reference to the calling SparseMatrix object - */ - SparseMatrix& operator= (const SparseMatrix& rval); - //! Elementwise power operator. Returns a SparseMatrix object with the same dimensions of the calling object and each of its elements is computed as the corresponding element of the calling object to the power of the right hand side argument. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A^x). - /** - \param x: double argument at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - SparseMatrix& operator^(double x) const; - //! Concatenates two sparse matrices side by side. The number of rows of the matrices involved must be the same, otherwise an error is thrown. The number of columns of the resulting matrix is the addition of the number of columns of both matrices involved. - /** - \param B: SparseMatrix object at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator||(SparseMatrix& B) const; - //! Stacks the right hand side matrix below the left hand side matrix. The dimensions number of columns of the matrices involved must be the same, otherwise an error is thrown. The number of rows of the resulting matrix is the addition of the number of rows of both matrices involved. - /** - \param B: SparseMatrix object at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator&&(SparseMatrix& B) const; - //! Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row and column indices. Indices start from 1. If the row and column indices refer to a zero (non-allocated) element, a new element with zero value is allocated so that it can be returned as a reference. - /** - \param row: Row index starting from 1. - \param col: Column index starting from 1. - \return Reference to the indexed matrix element. - */ - double& operator() (int row,int col); - //! Matrix indexing. Returns the value of the matrix element located at the position indicated by the row and column indices. Indices start from 1. - /** - \param row: Row index starting from 1. - \param col: Column index starting from 1. - \return double value of the element at the indicated position. - */ - double operator() (int row,int col) const; - //! Computes the left division of a sparse matrix (left hand side of the operator) by another sparse matrix (right hand side value). This is conceptually equivalent to multiplying the inverse of the left object by the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The left hand side object must be a square matrix. - /** - \param B: SparseMatrix object at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator %(SparseMatrix& B); - //! Solves a sparse system of equations \f$ Ax = b \f$ by using sparse LU decomposition. Matrix A must be a square matrix. This function uses LUSOL library functions. - /** - \param A: SparseMatrix object - \param b: SparseMatrix object - \param x: Reference to DMatrix object. Upon return this vector contains the solution to the system of equations. - \param r: Reference to DMatrix object. Upon return this vector contains the residual of the solution, \f$ r=Ax-b \f$. - \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. - \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. - \return void - */ - friend void SparseLUSolve(SparseMatrix& A, DMatrix& b, DMatrix& x, DMatrix& r, int argc, char *argv[]); - //! Finds the sparse LU factor of a sparse matrix A. Matrix A must be a square matrix. This function uses LUSOL library functions. - /** - \param A: SparseMatrix object - \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. - \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. - \return void pointer. - \sa SparseLUSolveGivenFactor() - */ - friend void* SparseLUFactor(SparseMatrix& A, int argc, char *argv[]); - //! Solves a sparse system of equations \f$ Ax = b \f$ by using sparse LU decomposition and a given LU factor. Matrix A must be a square matrix. This function uses LUSOL library functions. - /** - \param LUSOLv: void pointer resulting from a previous call to SparseLUFactor(). - \param A: SparseMatrix object - \param b: SparseMatrix object - \param x: Reference to DMatrix object. Upon return this vector contains the solution to the system of equations. - \param r: Reference to DMatrix object. Upon return this vector contains the residual of the solution, \f$ r=Ax-b \f$. - \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. - \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. - \return void - \sa SparseLUFactor() - */ - friend void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& b, DMatrix& x, DMatrix& r, int argc, char *argv[]); - //! This function prints an error message and throws an exception to be handled by the ErrorHandler class. - /** - \param error_text is a character string with the error message - \return void - */ - friend void sp_error_message(const char *error_text); - - -}; - -// Declaration of all friend functions of SparseMatrix class - -void SparseLUSolve(SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc=1, char *argv[]=NULL); - -void* SparseLUFactor(SparseMatrix& A, int argc=1, char *argv[]=NULL); - -void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc=1, char *argv[]=NULL); - -void sp_error_message(const char *error_text); - -SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B); - -SparseMatrix& ProductT(SparseMatrix& A, SparseMatrix& B); - -SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B); - -SparseMatrix& tra(const SparseMatrix& A); -SparseMatrix& inv(SparseMatrix& A); -SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B); -SparseMatrix& sparse(DMatrix& A); -SparseMatrix& speye(int n); -SparseMatrix& spones(const SparseMatrix& s); -SparseMatrix& spconvert(DMatrix& A); -DMatrix& full(const SparseMatrix& A); -DMatrix& null( const SparseMatrix& A ); -DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V ); -DMatrix& QR( const SparseMatrix& A ); -DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ); -DMatrix& orth( const SparseMatrix& A ); -DMatrix& schur(const SparseMatrix& A, DMatrix* U ); -DMatrix& eig(const SparseMatrix& A, DMatrix* V ); -double enorm(const SparseMatrix& A); -double norm(const SparseMatrix& A); -SparseMatrix& Abs(const SparseMatrix& A); -double cond( const SparseMatrix& A ); -double rcond( const SparseMatrix& A ); -int rank_sparse( const SparseMatrix& A ); -SparseMatrix& sprand(const SparseMatrix& S); -SparseMatrix& sprand(int n, int m, double density); -SparseMatrix& sprandn(const SparseMatrix& S); -SparseMatrix& sprandn(int n, int m, double density); -SparseMatrix& operator *(double Arg, const SparseMatrix& A); - - // =========================================================== diff --git a/dmatrix/src/dmatrixv.cxx b/dmatrix/src/dmatrixv.cxx index e187b4ff..ee046539 100644 --- a/dmatrix/src/dmatrixv.cxx +++ b/dmatrix/src/dmatrixv.cxx @@ -7522,1968 +7522,3 @@ DMatrix& full(const SparseMatrix& A) return (*R); } - -void SparseMatrix::InsertNonZero(int i, int j, double val) -{ - int k; - - double* anew; - int* RowNew; - int* ColNew; - int nznew=nz+1; - int eflag = 0; - - anew = new double[nznew]; - RowNew= new int[nznew]; - ColNew= new int[nznew]; - - for (k=0; k< nz; k++) - { - if (RowIndx[k]==i && ColIndx[k]==j) { - a[k]= val; - eflag = 1; - break; - } - } - - if (!eflag) { - memcpy(anew, a, nz*sizeof(double) ); - memcpy(RowNew, RowIndx, nz*sizeof(int) ); - memcpy(ColNew, ColIndx, nz*sizeof(int) ); - - delete a; - delete RowIndx; - delete ColIndx; - - a = anew; - RowIndx = RowNew; - ColIndx = ColNew; - nz = nznew; - asize = nznew; - - RowIndx[nznew-1] = i; - ColIndx[nznew-1] = j; - a[nznew-1] = val; - } - - // Now resize the matrix if necessary - for (k=0;kn) - n = RowIndx[k]; - if (ColIndx[k]>m) - m = ColIndx[k]; - } - -} - - -// Operators - -SparseMatrix& SparseMatrix::operator += (const SparseMatrix &rval) -{ - int i; - - if ( (this->n != rval.n) || (this->m != rval.m) ) - fprintf(stderr,"\nSparseMatrix::operator += error: matrix dimensions do not agree"); - - for (i=0; ia[i] += rval.a[i]; - else - this->InsertNonZero( rval.RowIndx[i], rval.ColIndx[i], rval.a[i] ); - } - this->Compress(); - return (*this); -} - - -SparseMatrix& SparseMatrix::operator+ (const SparseMatrix& Other_matrix) const -{ - SparseMatrix* Result; - - Result = new SparseMatrix; - - (*Result)=(*this); - - return ((*Result)+=Other_matrix); - -} - -SparseMatrix& SparseMatrix::operator -= (const SparseMatrix &rval) -{ - int i; - - if ( (this->n != rval.n) || (this->m != rval.m) ) - fprintf(stderr,"\nSparseMatrix::operator -= error: matrix dimensions do not agree"); - - for (i=0; ia[i] -= rval.a[i]; - else - this->InsertNonZero( rval.RowIndx[i], rval.ColIndx[i], -rval.a[i] ); - } - this->Compress(); - return (*this); -} - - -SparseMatrix& SparseMatrix::operator- (const SparseMatrix& Other_matrix) const -{ - SparseMatrix* Result; - - Result = new SparseMatrix; - - (*Result)=(*this); - - return ((*Result)-=Other_matrix); -} - - -SparseMatrix& SparseMatrix::operator* (DMatrix& A) const -{ - int k; - int i, j, icol, q; - DMatrix x; - DMatrix r(n,1); - SparseMatrix* sp; - - sp = new SparseMatrix( n, A.GetNoCols(), 0 ); - - - for (icol=1; icol<=A.m; icol++) { - x = A(colon(),(long) icol); - r.FillWithZeros(); - for (k = 0; k < nz; k++) { - j = ColIndx[k]; - i = RowIndx[k]; - r(i) += a[k]*x(j); - } - for (q=1; q<=length(r); q++) { - sp->InsertNonZero(q,icol, r(q) ); - } - } - - sp->Compress(); - - return (*sp); - -} - -SparseMatrix& SparseMatrix::operator*= (double Arg) -{ - int i; - for (i=0; inz>=0) return (NULL) ; /* check inputs */ - - m = C->m ; n = C->n ; - nz = C->p[n]; - T = cs_spalloc (m, n, nz, 1, 1) ; /* allocate result */ - Ti = T->i ; Tj = T->p ; Tx = T->x ; - T->nz = nz; - w = (int*) cs_calloc (n, sizeof (int)) ; /* get workspace */ - if (!T || !w) return (cs_done (T, w, NULL, 0)) ; /* out of memory */ - Cp = C->p ; Ci = C->i ; Cx = C->x ; - for (k=0; kn; k++) - { - if (k==C->n) jlim = nz; - else jlim = Cp[k+1]; - for (j=Cp[k]; j=0) - { - Tj[ j ] = k; - Tx[ j ] = Cx[ j ]; - Ti[ j ] = Ci[ j ]; - } - } - - return (cs_done (T, w, NULL, 1)) ; /* success; free w and return T */ - - -} - - - -SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B) -{ - - /* cs *cs_multiply (const cs *A, const cs *B) */ - int i; - SparseMatrix *r = new SparseMatrix(A.GetNoRows(), B.GetNoCols(),0); - - int an = A.GetNoRows(); - int am = A.GetNoCols(); - int bn = B.GetNoRows(); - int bm = B.GetNoCols(); - int *ira = A.GetRowIndx_C_Array(); - int *irb = B.GetRowIndx_C_Array(); - int *ica = A.GetColIndx_C_Array(); - int *icb = B.GetColIndx_C_Array(); - int anz = A.GetNonZero(); - int bnz = B.GetNonZero(); - double *a = A.GetPr(); - double *b = B.GetPr(); - int *irr; - int *icr; - - - - - cs* Acs = cs_spalloc( an, am, anz, 1, 1 ); - cs* Bcs = cs_spalloc( bn, bm, bnz, 1, 1 ); - cs* CAcs; - cs* CBcs; - cs* TABcs; - - Acs->nz=anz; - Bcs->nz=bnz; - - for(i=0;ii[i]=ira[i]-1; - Acs->p[i]=ica[i]-1; - Acs->x[i]=a[i]; - } - - for(i=0;ii[i]=irb[i]-1; - Bcs->p[i]=icb[i]-1; - Bcs->x[i]=b[i]; - } - - cs* ABcs; - - CAcs = cs_compress (Acs); - CBcs = cs_compress (Bcs); - ABcs = cs_multiply( CAcs, CBcs ); - - r->Resize(an, bm, ABcs->nzmax); - - TABcs = convert2triplet(ABcs); - - irr = r->GetRowIndx_C_Array(); - icr = r->GetColIndx_C_Array(); - - for(i=0;i< TABcs->nz; i++) { - irr[i]= TABcs->i[i]+1; - icr[i]= TABcs->p[i]+1; - } - - - memcpy( r->GetPr() , ABcs->x, TABcs->nzmax*sizeof(double) ); - - cs_spfree (ABcs); - cs_spfree (TABcs); -/* cs_spfree (Acs);*/ - cs_spfree (Bcs); - cs_spfree (CAcs); - cs_spfree (CBcs); - - - return (*r); - -} - - -// { -// int i, j; -// -// double sum; -// -// SparseMatrix *sp = new SparseMatrix( A.GetNoRows(), B.GetNoCols(), 0 ); -// -// VecElem *row_p = new VecElem; -// VecElem *col_p = new VecElem; -// -// if (A.GetNoCols() != B.GetNoRows()) -// sp_error_message("Inconsistent matrix dimensions in SparseMatrix::operator*"); -// -// -// -// for (i = 1; i <= A.GetNoRows(); i++) { -// for (j = 1; j <= B.GetNoCols(); j++) { -// // row_p = A->rows [i]; -// // col_p = B->cols [j]; -// row_p->index = 0; -// col_p->index = 0; -// row_p->previous = 0; -// col_p->previous = 0; -// sum = 0; -// -// A. Find_Next_NonZero_in_Row(i, row_p); -// B. Find_Next_NonZero_in_Col(j, col_p); -// while ((row_p->index != -1) && (col_p->index != -1)) { -// if (row_p->index == col_p->index) { -// sum += row_p->value * col_p->value; -// A. Find_Next_NonZero_in_Row(i, row_p); -// B. Find_Next_NonZero_in_Col(j, col_p); -// } -// else if (row_p->index < col_p->index) { -// A. Find_Next_NonZero_in_Row(i, row_p); -// } -// else { -// B.Find_Next_NonZero_in_Col(j, col_p); -// } -// } -// if (sum!=0.0) sp->InsertNonZero(i, j, sum); -// } -// } -// -// return (*sp); -// -// } - - - -SparseMatrix& SparseMatrix::operator* (const SparseMatrix& B) const -{ - - return Product(*this,B); - -} - - -SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B) -{ - SparseMatrix *sp= new SparseMatrix(A.GetNoRows(),B.GetNoCols(),0); - - A.Transpose(); - - {*sp=Product(A,B);} - - A.Transpose(); - - return (*sp); - -} - - -SparseMatrix& ProductT(SparseMatrix& A,SparseMatrix& B) -{ - - SparseMatrix *sp= new SparseMatrix(A.GetNoCols(),B.GetNoCols(),0); - - B.Transpose(); - - {*sp=Product(A,B);} - - B.Transpose(); - - return (*sp); - - -} - -SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B) -{ - int i, j, k; - - double sum; - - double *a = A.GetPr(); - - int *RowIndx = A.GetRowIndx_C_Array(); - int *ColIndx = A.GetColIndx_C_Array(); - - SparseMatrix *sp = new SparseMatrix( A.GetNoRows(), B.GetNoCols(), 0 ); - - if (A.GetNoRows() != B.GetNoRows() || A.GetNoCols() != B.GetNoCols()) - sp_error_message("Inconsistent matrix dimensions in SparseMatrix elemProduct()"); - - - - for (k = 0; k < A.GetNonZero(); k++) { - i = RowIndx[k]; - j = ColIndx[k]; - sum = a[k]*B(i,j); - if (sum!=0.0) sp->InsertNonZero(i, j, sum); - } - - return (*sp); -} - - -SparseMatrix& SparseMatrix::operator/= (double Arg) -{ - int i; - - if (Arg==0.0) sp_error_message("Division by zero in SparseMatrix::operator/"); - - for (i=0; iResize(Other_matrix.n, Other_matrix.m, Other_matrix.nz); - memcpy(a, Other_matrix.a, nz*sizeof(double) ); - memcpy(RowIndx, Other_matrix.RowIndx, nz*sizeof(int) ); - memcpy(ColIndx, Other_matrix.ColIndx, nz*sizeof(int) ); - return (*this); -} - -double& SparseMatrix::operator() (int i,int j) -{ - int k; - - int ii; - - int eflag = 0; - - for (k=0; k< nz; k++) - { - if (RowIndx[k]==i && ColIndx[k]==j) { - ii = k; - eflag = 1; - break; - } - - } - - if( !eflag ) { - - for (k=0; kInsertNonZero(i,j,0.0); - ii = nz-1; - } - - return a[ii]; - -} - -double SparseMatrix::operator() (int row,int col) const -{ - int i; - double retval = 0.0; - - if ( (row>n) || (row<0) || (col<0) || (col>m) ) { - error_message("Out of range index in SparseMatrix::operator()"); - } - - for (i=0; i< nz; i++) { - if (RowIndx[i]==row && ColIndx[i]==col) - { - retval = a[i]; - break; - } - } - - return retval; -} - -//double SparseMatrix::operator() (int row,int col) -//{ -// -//} - -void SparseMatrix::Print(const char* text) -{ - int i; - - fprintf(stderr,"\nSparse matrix %s",text); - fprintf(stderr,"\nNumber of rows: %i", n); - fprintf(stderr,"\nNumber of columns: %i", m); - fprintf(stderr,"\nNumber of non-zero elements: %i", nz); - if (n*m!=0) fprintf(stderr,"\nDensity: %f%%", ( ((double) nz*100)/(double) (n*m) ) ); - if (nz>0) fprintf(stderr,"\n(Row,Col)\tValue"); - - for (i=0; iResize(n, n, n); - - for (i=0;inz;i++) { - sp->RowIndx[i]=i+1; - sp->ColIndx[i]=i+1; - sp->a[i]=1.0; - } - - return (*sp); -} - -SparseMatrix& spones(const SparseMatrix& s) -{ -// Returns a sparse identity matrix - SparseMatrix *sp = new SparseMatrix(s); - int i; - - for (i=0;inz;i++) { - sp->a[i]=1.0; - } - - return (*sp); -} - -SparseMatrix& spconvert(DMatrix& A) -{ - int i; - if (A.GetNoCols()!=3) - sp_error_message("Incorrect number of columns of input matrix in spconvert()"); - DMatrix I; - DMatrix J; - DMatrix Aij; - int nzmax = A.GetNoRows(); - - I = A(colon(),1); - J = A(colon(),2); - Aij = A(colon(),3); - - int maxI = (int) Max(I); - int maxJ = (int) Max(J); - - SparseMatrix* sp = new SparseMatrix(maxI, maxJ, nzmax); - - for (i=0; iRowIndx[i] = (int) I(i+1); - sp->ColIndx[i] = (int) J(i+1); - sp->a[i] = Aij(i+1); - } - - sp->Compress(); - - return (*sp); -} - - -void SparseMatrix::Load(const char* fname) -{ - int nrow, ncol, nnz; - - int k; - - FILE *fp; - - if ( (fp = fopen(fname,"r")) == NULL ) - - { sp_error_message( "Error opening file in SparseMatrix::Load()"); } - - - fscanf(fp,"%i", &nrow); - fscanf(fp,"%i", &ncol); - fscanf(fp,"%i", &nnz); - - this->Resize(nrow, ncol, nnz); - - for (k=0;kRowIndx, A.ColIndx, A.nz*sizeof(int) ); - memcpy(sp->ColIndx, A.RowIndx, A.nz*sizeof(int) ); - memcpy(sp->a , A.a, A.nz*sizeof(double) ); - - return (*sp); - -} - -SparseMatrix& inv(SparseMatrix& A) -{ -// Returns the inverse (if it exists) of a sparse matrix A. - int i,j; - - if (A.GetNoCols()!=A.GetNoRows()) - sp_error_message("Sparse matrix must be square in function inv()"); - - void* LUSOLv; - - DMatrix x(A.GetNoRows(),1); - - DMatrix r(A.GetNoRows(),1); - - DMatrix b(A.GetNoRows(),1); - - SparseMatrix *sp = new SparseMatrix(A.GetNoRows(), A.GetNoCols(), 0); - - LUSOLv = SparseLUFactor(A); - - for(j=1; j<=A.GetNoCols(); j++) - { - b.FillWithZeros(); - b(j) = 1.0; - SparseLUSolveGivenFactor(LUSOLv, A, b, x, r); - for(i=1;i<=A.GetNoRows();i++) - { - if (x(i)!=0.0) - sp->InsertNonZero(i,j,x(i)); - } - } - - return (*sp); - -} - -SparseMatrix& SparseMatrix::operator %(SparseMatrix& B) -{ -// Left divition implementation A%B is conceptually equivalent to inv(A)*B -// but it is numerically more efficient - int i,j,k; - - if (this->GetNoCols()!=this->GetNoRows()) - sp_error_message("Sparse matrix must be square in function SparseMatrix::operator%"); - - if (this->GetNoCols()!=B.GetNoRows()) - sp_error_message("Incorrect dimensions in SparseMatrix::operator% "); - - void* LUSOLv; - - DMatrix x(this->GetNoCols(),1); - - DMatrix r(B.GetNoRows(),1); - - DMatrix b(B.GetNoRows(),1); - - SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), B.GetNoCols(), 0); - - LUSOLv = SparseLUFactor(*this); - - for(j=1; j<=B.GetNoCols(); j++) - { - for (k=1;k<=B.GetNoRows();k++) b(k) = B(k,j); - SparseLUSolveGivenFactor(LUSOLv, *this, b, x, r); - for(i=1;i<=this->GetNoRows();i++) - { - if (x(i)!=0.0) - sp->InsertNonZero(i,j,x(i)); - } - } - - return (*sp); - -} - - -SparseMatrix& SparseMatrix::operator/ (SparseMatrix& B) -{ -// Right divition implementation A/B is conceptually equivalent to A*inv(B) -// but it is numerically more efficient - - if (this->GetNoCols()!=this->GetNoRows()) - sp_error_message("Sparse matrix must be square in function SparseMatrix::operator/"); - - if (this->GetNoCols()!=B.GetNoRows()) - sp_error_message("Incorrect dimensions in SparseMatrix::operator/ "); - - SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), B.GetNoCols(), 0); - - B.Transpose(); - - this->Transpose(); - - {*sp = B%(*this);} - - sp->Transpose(); - - B.Transpose(); - - this->Transpose(); - - return (*sp); - -} - -SparseMatrix& SparseMatrix::operator||(SparseMatrix& B) const -{ - // Returns the horizontal concatenation of two sparse matrices - - int i; - - if (this->GetNoRows()!=B.GetNoRows()) - sp_error_message("Number of rows must be equal in SparseMatrix::operator||"); - - SparseMatrix *sp = new SparseMatrix(n, m+B.m, nz+B.nz); - - memcpy(sp->a, a, nz*sizeof(double) ); - memcpy(sp->RowIndx, RowIndx, nz*sizeof(int) ); - memcpy(sp->ColIndx, ColIndx, nz*sizeof(int) ); - - memcpy(sp->a+nz, B.a, B.nz*sizeof(double) ); - memcpy(sp->RowIndx+nz, B.RowIndx, B.nz*sizeof(int) ); - - for(i=0; iColIndx[nz+i] = m + B.ColIndx[i]; - } - - return (*sp); - -} - - - -SparseMatrix& SparseMatrix::operator&&(SparseMatrix& B) const -{ - // Returns the vertical concatenation of two sparse matrices - - int i; - - if (m!=B.m) - sp_error_message("Number of cols must be equal in SparseMatrix::operator&&"); - - SparseMatrix *sp = new SparseMatrix(n + B.n, m, nz+B.nz); - - memcpy(sp->a, a, nz*sizeof(double) ); - memcpy(sp->RowIndx, RowIndx, nz*sizeof(int) ); - memcpy(sp->ColIndx, ColIndx, nz*sizeof(int) ); - - memcpy(sp->a+nz, B.a, B.nz*sizeof(double) ); - memcpy(sp->ColIndx+nz, B.ColIndx, B.nz*sizeof(int) ); - - for(i=0; iRowIndx[nz+i] = n + B.RowIndx[i]; - } - - return (*sp); - -} - -SparseMatrix& SparseMatrix::sub_matrix(int istart, int iend, int jstart, int jend) const -{ - // Returns a submatrix of the calling object - int i,j; - double value; - - if ((istart<1)||(istart>n)||(iend<1)||(iend>n)||(jstart<1)||(jstart>m)||(istart>iend)||(jstart>jend)) - sp_error_message("Index error in SparseMatrix::sub_matrix"); - - int nnew = iend-istart+1; - int mnew = jend-jstart+1; - - SparseMatrix *sp = new SparseMatrix(nnew, mnew, 0); - - for (i=1; i<=nnew; i++) { - for(j=1; j<=mnew; j++) { - value = (*this)(istart+i-1,jstart+j-1); - if ( value!=0.0 ) { - sp->InsertNonZero(i,j,value); - } - } - } - - return (*sp); - - - -} - -DMatrix& SparseMatrix::Column(int j) const -{ -// Returns a dense column vector (DMatrix object) with the j-th column of the calling -// sparse matrix. - DMatrix* Temp; - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - Temp->Resize( this->GetNoRows(), 1 ); - Temp->FillWithZeros(); - for(int i=0;iResize( 1, this->GetNoCols()); - Temp->FillWithZeros(); - for(int j=0;jn)||(iend<1)||(iend>n)||(jstart<1)||(jstart>m)||(istart>iend)||(jstart>jend)) - sp_error_message("Index error in SparseMatrix::set_sub_matrix"); - - int nn = iend-istart+1; - int mm = jend-jstart+1; - - if (B.n != nn || B.m != mm) - sp_error_message("Range must be consistent with input matrix size in SparseMatrix::set_sub_matrix"); - - for (i=1; i<=nn; i++) { - for(j=1; j<=mm; j++) { - value = B(i,j); - if ( value!=0.0 ) { - this->InsertNonZero(istart+i-1,jstart+j-1,value); - } - } - } - - return; - -} - - - -void SparseMatrix::Transpose() -{ -// Transposes a sparse matrix object - int s; - int *temp = new int[nz]; - - - memcpy(temp, RowIndx, nz*sizeof(int) ); - memcpy(RowIndx, ColIndx, nz*sizeof(int) ); - memcpy(ColIndx, temp, nz*sizeof(int) ); - - s = n; - n = m; - m = s; - - return; - -} - -SparseMatrix& SparseMatrix::operator^(double x) const -{ - // Element-wise power of a sparse matrix - int i; - SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), this->GetNoCols(), this->GetNonZero() ); - - memcpy(sp->RowIndx, this->RowIndx, this->nz*sizeof(int) ); - memcpy(sp->ColIndx, this->ColIndx, this->nz*sizeof(int) ); - for (i=0; inz; i++) - { - sp->a[i] = pow( this->a[i], x ); - } - - return (*sp); - - -} - - - - -MYBOOL isNum(char val) -{ - int ord; - ord = (int) val - 48; - return( (MYBOOL) ((ord >= 0) && (ord <= 9)) ); -} -void SparseLUSolve(SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc, char *argv[]) -{ - -/* Output device */ - FILE *outunit = stderr; - - int diagnostics_level=1; - -/* Overall dimensions allocated */ - int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, - replace = 0, randcol = 0; - MYBOOL ftran = TRUE; - -/* Storage for A, b */ - REAL *Aij, *b, *xexact; - int *iA, *jA; - -/* Storage for LUSOL */ - LUSOLrec *LUSOL = NULL; - -/* Define local storage variables */ - int i , inform, j , k , i1 , - m , lenb, lenx, - n , nelem , nnzero; - REAL Amax , test , - bnorm , rnorm , xnorm, - *rhs , *r , *x; - MYBOOL printsolution = FALSE, success = TRUE; - -/* Create the LUSOL object and set user options */ - LUSOL = LUSOL_create(outunit, 0, LUSOL_PIVMOD_TPP, 0); - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = 10; - i = 1; - n = A.GetNoCols(); - m = A.GetNoRows(); - nnzero = A.GetNonZero(); - - - while((n == 0) && (i < argc)) { - if(strcmp("-p", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > LUSOL_PIVMOD_MAX) - continue; - LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; - } - } - else if(strcmp("-t", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - Amax = atof(argv[i]); - if(Amax < 1 || Amax > 100) - continue; - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; - } - } - else if(strcmp("-m", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < LUSOL_MULT_nz_a || m > 100) - continue; - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); - } - } - else if(strcmp("-s", argv[i]) == 0) - printsolution = TRUE; - else if(strcmp("-b", argv[i]) == 0) - ftran = FALSE; - else if(strcmp("-r", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > 10) - continue; - } - else - m = 1; - srand((unsigned) time( NULL )); - replace = 2*m; - } - } /* end while */ - - - - maxn = A.GetNoCols(); - maxm = A.GetNoRows(); - maxnz= A.GetNonZero(); - -/* Create the arrays */ - - Aij = A.GetPr() - BLAS_BASE; - iA = A.GetRowIndx_C_Array() - BLAS_BASE; - jA = A.GetColIndx_C_Array() - BLAS_BASE; - if(ftran) - lenb = maxm; - else - lenb = maxn; - b = bb.GetPr()-BLAS_BASE; - rhs = (REAL *) calloc(lenb+BLAS_BASE, sizeof(REAL)); - - if(ftran) - lenx = maxn; - else - lenx = maxm; - xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); - r = rr.GetPr() - BLAS_BASE; - x = xx.GetPr() - BLAS_BASE; - - -/* ----------------------------------------------------------------- - Load A into (a, indc, indr). - ----------------------------------------------------------------- */ - - if(!LUSOL_assign(LUSOL, iA, jA, Aij, nnzero, TRUE)) { - fprintf(outunit, "Error: LUSOL failed due to insufficient memory.\n"); - goto x900; - } - -/* ------------------------------------------------------------------ - Factor A = L U. - ------------------------------------------------------------------ */ - nelem = nnzero; - LU1FAC( LUSOL, &inform ); - if (inform > LUSOL_INFORM_SERIOUS) { - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - goto x900; - } - /* Get the largest element in A; we use it below as an estimate - of ||A||_inf, even though it isn't a proper norm. */ - Amax = LUSOL->parmlu[LUSOL_RP_MAXELEM_A]; - -/* ------------------------------------------------------------------ - SOLVE A x = b. - Save b first because lu6sol() overwrites rhs when computing x. - ------------------------------------------------------------------ */ -Resolve: -#if 1 - MEMCOPY(x, b, lenb+BLAS_BASE); - if(ftran) - inform = LUSOL_ftran(LUSOL, x, NULL, FALSE); - else - inform = LUSOL_btran(LUSOL, x, NULL); -#else - MEMCOPY(rhs, b, lenb+BLAS_BASE); - if(ftran) - LU6SOL( LUSOL, LUSOL_SOLVE_Aw_v, rhs, x, NULL, &inform ); - else - LU6SOL( LUSOL, LUSOL_SOLVE_Atv_w, x, rhs, NULL, &inform ); -#endif - if (inform > LUSOL_INFORM_SERIOUS) { - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - goto x900; - } - if(printsolution) { - char* msg; - sprintf(msg,"\nSolution vector="); - blockWriteREAL(outunit, msg, x, 1, lenb); - } - -/* ------------------------------------------------------------------ - Set r = b - Ax. - Find norm of r and x. - ------------------------------------------------------------------ */ - MEMCOPY(r, b, lenb+BLAS_BASE); - for (k = 1; k <= nnzero; k++) { - i = iA[k]; - j = jA[k]; - if(ftran) - r[i] -= Aij[k]*x[j]; - else - r[j] -= Aij[k]*x[i]; - } - bnorm = dnormi( lenb, b ); - rnorm = dnormi( lenb, r ); - xnorm = dnormi( lenx, x ); - -/* ------------------------------------------------------------------ - Report the findings. - ------------------------------------------------------------------ */ - if(randcol > 0) - fprintf(outunit, "\n\nColumn %d was %s\n", - randcol, - (mod(replace,2) == 1 ? "replaced with random data" : "restored")); - if (diagnostics_level>=2) { - fprintf(outunit, "\nLU size statistics (%d reallocations):\n", - LUSOL->expanded_a); - } - test = LUSOL->luparm[LUSOL_IP_NONZEROS_U0]+LUSOL->luparm[LUSOL_IP_NONZEROS_ROW]; - if (diagnostics_level>=2) { - fprintf(outunit, "L0-size = %d U0-size = %d LU-nonzeros = %d Fill-in = %.1fx\n", - LUSOL->luparm[LUSOL_IP_NONZEROS_L0], - LUSOL->luparm[LUSOL_IP_NONZEROS_U0], - (int) test, test/nnzero); - } - test = rnorm / (Amax*xnorm); - if (diagnostics_level>=2) { - fprintf(outunit, "\nAccuracy statistics:\n"); - fprintf(outunit, "%s with a factor tolerance of %g gave a relative error of %g\n", - LUSOL_pivotLabel(LUSOL), LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij], test); - fprintf(outunit, "Amax = %g bnorm = %g rnorm = %g xnorm = %g\n", - Amax, bnorm, rnorm, xnorm); - fprintf(outunit, "\n"); - } - if (test <= 1.0e-8 ) {} - /* fprintf(outunit, "The equations were solved with very high accuracy.\n");*/ - else if (test <= 1.0e-6) {} - // fprintf(outunit, "The equations were solved with reasonably good accuracy.\n"); - else { - if (test <= 1.0e-4) - fprintf(outunit, "SparseLUSolve: Questionable accuracy; the LU factors may not be good enough.\n"); - else - fprintf(outunit, "SparseLUSolve: Poor accuracy; the LU factorization probably failed.\n"); - if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP) - fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance (current is %g).\n", - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]); - else - fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance and/or TRP pivoting.\n"); - } - - /* Check if we should replace a column and resolve */ - if(replace > 0) { - replace--; - if(mod(replace, 2) == 1) { - /* Randomly find a column and replace the data with the data in b */ - rnorm = rand(); - randcol = (int) (n * rnorm / (RAND_MAX+1)) + 1; -#if 1 - MEMCLEAR(x, m+1); - for(i = 1; i < m; i++) - x[i] = Amax * rand() / RAND_MAX; - inform = LUSOL_replaceColumn(LUSOL, randcol, x); -#else - inform = LUSOL_replaceColumn(LUSOL, randcol, b); -#endif - } - else { - /* Set the previously replaced column back and resolve */ - for (k = 1; k <= nnzero; k++) { - i = iA[k]; - j = jA[k]; - if(j == randcol) - x[i] = Aij[k]; - } - inform = LUSOL_replaceColumn(LUSOL, randcol, x); - } - if(inform != LUSOL_INFORM_LUSUCCESS) - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - else - goto Resolve; - } - - -/* Free memory */ -x900: - if(!success) - fprintf(outunit, "Insufficient memory or data file not found.\n"); - - free(xexact); - - LUSOL_free(LUSOL); - - -} - - -void* SparseLUFactor(SparseMatrix& A, int argc, char *argv[]) -{ -/* Output device */ - FILE *outunit = stderr; - -/* Overall dimensions allocated */ - int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, - replace = 0; - MYBOOL ftran = TRUE; - -/* Storage for A, b */ - REAL *Aij, *xexact; - int *iA, *jA; - -/* Storage for LUSOL */ - LUSOLrec *LUSOL = NULL; - -/* Define local storage variables */ - int i , inform, i1 , - m , lenx, - n , nelem , nnzero; - REAL Amax; - - MYBOOL printsolution = FALSE; - -/* Create the LUSOL object and set user options */ - LUSOL = LUSOL_create(outunit, 0, LUSOL_PIVMOD_TPP, 0); - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = 10; - i = 1; - n = A.GetNoCols(); - m = A.GetNoRows(); - nnzero = A.GetNonZero(); - - - while((n == 0) && (i < argc)) { - if(strcmp("-p", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > LUSOL_PIVMOD_MAX) - continue; - LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; - } - } - else if(strcmp("-t", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - Amax = atof(argv[i]); - if(Amax < 1 || Amax > 100) - continue; - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; - } - } - else if(strcmp("-m", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < LUSOL_MULT_nz_a || m > 100) - continue; - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); - } - } - else if(strcmp("-s", argv[i]) == 0) - printsolution = TRUE; - else if(strcmp("-b", argv[i]) == 0) - ftran = FALSE; - else if(strcmp("-r", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > 10) - continue; - } - else - m = 1; - srand((unsigned) time( NULL )); - replace = 2*m; - } - } /* end while */ - - - - maxn = A.GetNoCols(); - maxm = A.GetNoRows(); - maxnz= A.GetNonZero(); - -/* Create the arrays */ - - Aij = A.GetPr() - BLAS_BASE; - iA = A.GetRowIndx_C_Array() - BLAS_BASE; - jA = A.GetColIndx_C_Array() - BLAS_BASE; - - - if(ftran) - lenx = maxn; - else - lenx = maxm; - xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); - -/* ----------------------------------------------------------------- - Load A into (a, indc, indr). - ----------------------------------------------------------------- */ - - if(!LUSOL_assign(LUSOL, iA, jA, Aij, nnzero, TRUE)) { - fprintf(outunit, "Error: LUSOL failed due to insufficient memory.\n"); - goto x900; - } - -/* ------------------------------------------------------------------ - Factor A = L U. - ------------------------------------------------------------------ */ - nelem = nnzero; - LU1FAC( LUSOL, &inform ); - if (inform > LUSOL_INFORM_SERIOUS) { - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - goto x900; - } - -x900: - return ((void*) LUSOL); - -} - -void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc, char *argv[]) -{ -/* Output device */ - FILE *outunit = stderr; - - int diagnostics_level=1; - -/* Overall dimensions allocated */ - int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, - replace = 0, randcol = 0; - MYBOOL ftran = TRUE; - -/* Storage for A, b */ - REAL *Aij, *b, *xexact; - int *iA, *jA; - -/* Storage for LUSOL */ - LUSOLrec *LUSOL = (LUSOLrec*) LUSOLv; - -/* Define local storage variables */ - int i , inform, j , k , i1 , - m , lenb, lenx, - n , nnzero; - REAL Amax , test , - bnorm , rnorm , xnorm, - *rhs , *r , *x; - MYBOOL printsolution = FALSE, success = TRUE; - -/* set user options */ - - i = 1; - n = LUSOL->n; - m = LUSOL->m; - nnzero = LUSOL->nelem; - - - while((n == 0) && (i < argc)) { - if(strcmp("-p", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > LUSOL_PIVMOD_MAX) - continue; - LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; - } - } - else if(strcmp("-t", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - Amax = atof(argv[i]); - if(Amax < 1 || Amax > 100) - continue; - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; - } - } - else if(strcmp("-m", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < LUSOL_MULT_nz_a || m > 100) - continue; - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); - } - } - else if(strcmp("-s", argv[i]) == 0) - printsolution = TRUE; - else if(strcmp("-b", argv[i]) == 0) - ftran = FALSE; - else if(strcmp("-r", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > 10) - continue; - } - else - m = 1; - srand((unsigned) time( NULL )); - replace = 2*m; - } - } /* end while */ - - - - maxn = LUSOL->n; - maxm = LUSOL->m; - maxnz= LUSOL->nelem; - -/* Create the arrays */ - - Aij = A.GetPr() - BLAS_BASE; - iA = A.GetRowIndx_C_Array() - BLAS_BASE; - jA = A.GetColIndx_C_Array() - BLAS_BASE; - - if(ftran) - lenb = maxm; - else - lenb = maxn; - b = bb.GetPr()-BLAS_BASE; - rhs = (REAL *) calloc(lenb+BLAS_BASE, sizeof(REAL)); - - if(ftran) - lenx = maxn; - else - lenx = maxm; - xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); - r = rr.GetPr() - BLAS_BASE; - x = xx.GetPr() - BLAS_BASE; - - - /* Get the largest element in A; we use it below as an estimate - of ||A||_inf, even though it isn't a proper norm. */ - Amax = LUSOL->parmlu[LUSOL_RP_MAXELEM_A]; - -/* ------------------------------------------------------------------ - SOLVE A x = b. - Save b first because lu6sol() overwrites rhs when computing x. - ------------------------------------------------------------------ */ -Resolve: -#if 1 - MEMCOPY(x, b, lenb+BLAS_BASE); - if(ftran) - inform = LUSOL_ftran(LUSOL, x, NULL, FALSE); - else - inform = LUSOL_btran(LUSOL, x, NULL); -#else - MEMCOPY(rhs, b, lenb+BLAS_BASE); - if(ftran) - LU6SOL( LUSOL, LUSOL_SOLVE_Aw_v, rhs, x, NULL, &inform ); - else - LU6SOL( LUSOL, LUSOL_SOLVE_Atv_w, x, rhs, NULL, &inform ); -#endif - if (inform > LUSOL_INFORM_SERIOUS) { - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - goto x900; - } - if(printsolution) { - char* msg; - sprintf(msg,"\nSolution vector="); - blockWriteREAL(outunit, msg , x, 1, lenb); - } - -/* ------------------------------------------------------------------ - Set r = b - Ax. - Find norm of r and x. - ------------------------------------------------------------------ */ - MEMCOPY(r, b, lenb+BLAS_BASE); - for (k = 1; k <= nnzero; k++) { - i = iA[k]; - j = jA[k]; - if(ftran) - r[i] -= Aij[k]*x[j]; - else - r[j] -= Aij[k]*x[i]; - } - bnorm = dnormi( lenb, b ); - rnorm = dnormi( lenb, r ); - xnorm = dnormi( lenx, x ); - -/* ------------------------------------------------------------------ - Report the findings. - ------------------------------------------------------------------ */ - if(randcol > 0) - fprintf(outunit, "\n\nColumn %d was %s\n", - randcol, - (mod(replace,2) == 1 ? "replaced with random data" : "restored")); - if (diagnostics_level>=2) { - fprintf(outunit, "\nLU size statistics (%d reallocations):\n", - LUSOL->expanded_a); - } - test = LUSOL->luparm[LUSOL_IP_NONZEROS_U0]+LUSOL->luparm[LUSOL_IP_NONZEROS_ROW]; - if (diagnostics_level>=2) { - fprintf(outunit, "L0-size = %d U0-size = %d LU-nonzeros = %d Fill-in = %.1fx\n", - LUSOL->luparm[LUSOL_IP_NONZEROS_L0], - LUSOL->luparm[LUSOL_IP_NONZEROS_U0], - (int) test, test/nnzero); - } - test = rnorm / (Amax*xnorm); - if (diagnostics_level>=2) { - fprintf(outunit, "\nAccuracy statistics:\n"); - fprintf(outunit, "%s with a factor tolerance of %g gave a relative error of %g\n", - LUSOL_pivotLabel(LUSOL), LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij], test); - fprintf(outunit, "Amax = %g bnorm = %g rnorm = %g xnorm = %g\n", - Amax, bnorm, rnorm, xnorm); - fprintf(outunit, "\n"); - } - if (test <= 1.0e-8 ) {} - /* fprintf(outunit, "The equations were solved with very high accuracy.\n");*/ - else if (test <= 1.0e-6) {} - // fprintf(outunit, "The equations were solved with reasonably good accuracy.\n"); - else { - if (test <= 1.0e-4) - fprintf(outunit, "SparseLUSolve: Questionable accuracy; the LU factors may not be good enough.\n"); - else - fprintf(outunit, "SparseLUSolve: Poor accuracy; the LU factorization probably failed.\n"); - if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP) - fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance (current is %g).\n", - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]); - else - fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance and/or TRP pivoting.\n"); - } - - /* Check if we should replace a column and resolve */ - if(replace > 0) { - replace--; - if(mod(replace, 2) == 1) { - /* Randomly find a column and replace the data with the data in b */ - rnorm = rand(); - randcol = (int) (n * rnorm / (RAND_MAX+1)) + 1; -#if 1 - MEMCLEAR(x, m+1); - for(i = 1; i < m; i++) - x[i] = Amax * rand() / RAND_MAX; - inform = LUSOL_replaceColumn(LUSOL, randcol, x); -#else - inform = LUSOL_replaceColumn(LUSOL, randcol, b); -#endif - } - else { - /* Set the previously replaced column back and resolve */ - for (k = 1; k <= nnzero; k++) { - i = iA[k]; - j = jA[k]; - if(j == randcol) - x[i] = Aij[k]; - } - inform = LUSOL_replaceColumn(LUSOL, randcol, x); - } - if(inform != LUSOL_INFORM_LUSUCCESS) - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - else - goto Resolve; - } - - -/* Free memory */ -x900: - if(!success) - fprintf(outunit, "Insufficient memory or data file not found.\n"); - - free(xexact); - -} - -void sp_error_message(const char *error_text) -{ - error_message( error_text ); -} - - -DMatrix& null( const SparseMatrix& A ) -{ - DMatrix* Af = new DMatrix; - DMatrix* r = new DMatrix; - - *Af = full(A); - - *r = null(*Af); - - delete Af; - - return(*r); -} - -DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = SVD(*Af, U, V); - - delete Af; - - return *s; - -} - -DMatrix& QR( const SparseMatrix& A ) -{ - - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = QR(*Af); - - delete Af; - - return *s; - - -} - -DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = LQ(*Af, Q); - - delete Af; - - return *s; - - -} - - -DMatrix& orth( const SparseMatrix& A ) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = orth(*Af); - - delete Af; - - return *s; - -} - -DMatrix& schur(const SparseMatrix& A, DMatrix* U ) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = schur(*Af, U); - - delete Af; - - return *s; - -} - -DMatrix& eig(const SparseMatrix& A, DMatrix* V ) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = eig(*Af, V); - - delete Af; - - return *s; - - -} - -double enorm(const SparseMatrix& A) -{ - int i; - double r = 0; - for (i=0;inz; i++) - R->a[i] = fabs(R->a[i]); - - return *R; -} - -double cond( const SparseMatrix& A ) -{ - double r; - - DMatrix* Af= new DMatrix; - - *Af = full(A); - - r = cond(*Af); - - delete Af; - - return r; - -} - -double rcond( const SparseMatrix& A ) -{ - double r; - - DMatrix* Af= new DMatrix; - - *Af = full(A); - - r = rcond(*Af); - - delete Af; - - return r; - -} - -int rank_sparse( const SparseMatrix& A ) -{ - int r; - - DMatrix* Af= new DMatrix; - - *Af = full(A); - - r = rank_matrix(*Af); - - delete Af; - - return r; - -} - -SparseMatrix& sprand(const SparseMatrix& S) -{ - int i; - - SparseMatrix* R= new SparseMatrix(S); - - for (i=0; inz; i++) - R->a[i] = DMatrix::random_uniform(); - - return *R; -} - -SparseMatrix& sprand(int n, int m, double density) -{ - int i, j; - - double r1; - - int nzguess = (int) density*n*m; - - SparseMatrix* R= new SparseMatrix(n,m,nzguess); - - for (i=1; i<=n; i++) - { - for(j=1; j<=m; j++) - { - r1 = DMatrix::random_uniform(); - - if (r1 < density) - { - R->InsertNonZero(i,j, DMatrix::random_uniform()); - } - } - } - - return *R; - -} - -SparseMatrix& sprandn(const SparseMatrix& S) -{ - int i; - - SparseMatrix* R= new SparseMatrix(S); - - for (i=0; inz; i++) - R->a[i] = DMatrix::random_gaussian(); - - return *R; -} - -SparseMatrix& sprandn(int n, int m, double density) -{ - int i, j; - - double r1; - - int nzguess = (int) density*n*m; - - SparseMatrix* R= new SparseMatrix(n,m,nzguess); - - for (i=1; i<=n; i++) - { - for(j=1; j<=m; j++) - { - r1 = DMatrix::random_uniform(); - - if (r1 < density) - { - R->InsertNonZero(i,j, DMatrix::random_gaussian()); - } - } - } - - return *R; -} - - -} From c20b13e699cd9a2ca413078f8a4cb0ac31966aa2 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Tue, 21 Jul 2020 15:38:10 +0200 Subject: [PATCH 16/21] moved the last chunk of sparse matrix code to sparsematrix.cxx --- dmatrix/src/SparseMatrix.cxx | 187 +++++++++++++++++++++++++++++++++++ dmatrix/src/dmatrixv.cxx | 187 ----------------------------------- 2 files changed, 187 insertions(+), 187 deletions(-) diff --git a/dmatrix/src/SparseMatrix.cxx b/dmatrix/src/SparseMatrix.cxx index e9af7e2c..a1904610 100644 --- a/dmatrix/src/SparseMatrix.cxx +++ b/dmatrix/src/SparseMatrix.cxx @@ -8,6 +8,193 @@ #include "SparseMatrix.h" +// =====================================SPARSE MATRIX CLASS IMPLEMENTATION ============================== + + +SparseMatrix::SparseMatrix(void) +{ +// Default constructor + asize = 0; + a = 0; + n = 0; + m = 0; + nz = 0; + + a = NULL; + RowIndx = NULL; + ColIndx = NULL; +} + + +SparseMatrix::SparseMatrix( int nn, int mm, int nzz) +{ + n = nn; + m = mm; + nz= nzz; + asize = nz; + a = new double[nz]; + RowIndx = new int[nz]; + ColIndx = new int[nz]; + + for(int k=0;kFillWithZeros(); + + for (k=0; k< A.GetNonZero(); k++ ) + { + R->elem( rowA[k], colA[k] ) = Aij[k]; + } + + return (*R); + +} + + void SparseMatrix::InsertNonZero(int i, int j, double val) { int k; diff --git a/dmatrix/src/dmatrixv.cxx b/dmatrix/src/dmatrixv.cxx index ee046539..d2856169 100644 --- a/dmatrix/src/dmatrixv.cxx +++ b/dmatrix/src/dmatrixv.cxx @@ -7335,190 +7335,3 @@ void* my_calloc(size_t num, size_t size ) } return pointer; } - - -// =====================================SPARSE MATRIX CLASS IMPLEMENTATION ============================== - - -SparseMatrix::SparseMatrix(void) -{ -// Default constructor - asize = 0; - a = 0; - n = 0; - m = 0; - nz = 0; - - a = NULL; - RowIndx = NULL; - ColIndx = NULL; -} - - -SparseMatrix::SparseMatrix( int nn, int mm, int nzz) -{ - n = nn; - m = mm; - nz= nzz; - asize = nz; - a = new double[nz]; - RowIndx = new int[nz]; - ColIndx = new int[nz]; - - for(int k=0;kFillWithZeros(); - - for (k=0; k< A.GetNonZero(); k++ ) - { - R->elem( rowA[k], colA[k] ) = Aij[k]; - } - - return (*R); - -} From 765b4abf9f073d97787afa646f42fb312c62f3cd Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Thu, 23 Jul 2020 16:05:07 +0200 Subject: [PATCH 17/21] added suite sparse and lusol to project --- dmatrix/CMakeLists-lusol.txt.in | 15 +++++++ dmatrix/CMakeLists-suitesparse.txt.in | 15 +++++++ dmatrix/CMakeLists.txt | 63 ++++++++++++++++++++++++++- 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 dmatrix/CMakeLists-lusol.txt.in create mode 100644 dmatrix/CMakeLists-suitesparse.txt.in diff --git a/dmatrix/CMakeLists-lusol.txt.in b/dmatrix/CMakeLists-lusol.txt.in new file mode 100644 index 00000000..fc9fe51d --- /dev/null +++ b/dmatrix/CMakeLists-lusol.txt.in @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8.2) + +project(lusol-download NONE) + +include(ExternalProject) +ExternalProject_Add(lusol + URL http://www.stanford.edu/group/SOL/software/lusol/lusol.zip + SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/lusol-src" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) \ No newline at end of file diff --git a/dmatrix/CMakeLists-suitesparse.txt.in b/dmatrix/CMakeLists-suitesparse.txt.in new file mode 100644 index 00000000..71a4bab3 --- /dev/null +++ b/dmatrix/CMakeLists-suitesparse.txt.in @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8.2) + +project(SuiteSparse-download NONE) + +include(ExternalProject) +ExternalProject_Add(SuiteSparse + GIT_REPOSITORY https://github.com/DrTimothyAldenDavis/SuiteSparse.git + GIT_TAG master + BUILD_IN_SOURCE ON + SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) \ No newline at end of file diff --git a/dmatrix/CMakeLists.txt b/dmatrix/CMakeLists.txt index 15402552..a570b819 100644 --- a/dmatrix/CMakeLists.txt +++ b/dmatrix/CMakeLists.txt @@ -4,10 +4,69 @@ project(dmatrix LANGUAGES CXX) file(GLOB SRC src/*.cxx) file(GLOB HEADER include/*.h) +# Download and unpack SuiteSparse at configure time + +configure_file(CMakeLists-SuiteSparse.txt.in SuiteSparse-download/CMakeLists.txt) +execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-download ) + +if(result) + message(FATAL_ERROR "CMake step for SuiteSparse failed: ${result}") +endif() + +execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-download ) + +if(result) + message(FATAL_ERROR "Build step for SuiteSparse failed: ${result}") +endif() + +execute_process(COMMAND make -j4 + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src/) + +if(result) + message(FATAL_ERROR "Install step for SuiteSparse failed: ${result}") +endif() + + +add_library(SuiteSparse STATIC IMPORTED) +target_include_directories(SuiteSparse INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src/include/ ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src/include/) +set_target_properties(SuiteSparse PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src/lib) + +# --- download and unpack lusol +configure_file(CMakeLists-lusol.txt.in lusol-download/CMakeLists.txt) +execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lusol-download ) + +if(result) + message(FATAL_ERROR "CMake step for lusol failed: ${result}") +endif() + +execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lusol-download ) + +if(result) + message(FATAL_ERROR "Build step for lusol failed: ${result}") +endif() + +file(GLOB LUSOL_SRC ${CMAKE_CURRENT_BINARY_DIR}/lusol-src/csrc/*.c) +list(REMOVE_ITEM LUSOL_SRC ${CMAKE_CURRENT_BINARY_DIR}/lusol-src/csrc/LU1LOT.c) +file(GLOB LUSOL_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/lusol-src/csrc/*.h) +add_library(lusol ${LUSOL_SRC} ${LUSOL_HEADERS}) +target_include_directories(lusol PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/lusol-src/csrc/) +# --- + add_library(${PROJECT_NAME} ${SRC} ${HEADER}) -target_include_directories(${PROJECT_NAME} PUBLIC include/) +target_include_directories(${PROJECT_NAME} PUBLIC include/ PRIVATE ${SuiteSparse_INCLUDE_DIRS}) +target_link_libraries(${PROJECT_NAME} PRIVATE SuiteSparse lusol) + set(${PROJECT_NAME} ${PROJECT_NAME} CACHE INTERNAL "${PROJECT_NAME} library target.") if(${BUILD_EXAMPLES}) add_subdirectory(examples/) -endif() \ No newline at end of file +endif() From a7f3e43d1d7ce3eda3c6ea5e2e17a622f1966ee7 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Thu, 23 Jul 2020 16:05:29 +0200 Subject: [PATCH 18/21] added sparse matrix header --- dmatrix/examples/sparse.cxx | 2 +- dmatrix/include/SparseMatrix.h | 4 +- dmatrix/include/dmatrixv.h | 19 ---------- dmatrix/include/helper.h | 67 ++++++++++++++++++++++++++++++++++ dmatrix/src/SparseMatrix.cxx | 4 +- dmatrix/src/dmatrixv.cxx | 44 +--------------------- 6 files changed, 74 insertions(+), 66 deletions(-) create mode 100644 dmatrix/include/helper.h diff --git a/dmatrix/examples/sparse.cxx b/dmatrix/examples/sparse.cxx index d7337b2a..fc3adc32 100644 --- a/dmatrix/examples/sparse.cxx +++ b/dmatrix/examples/sparse.cxx @@ -1,4 +1,4 @@ -#include "dmatrixv.h" +#include "SparseMatrix.h" // This file is provided as a template for testing the examples given // in the DMatrix class manual diff --git a/dmatrix/include/SparseMatrix.h b/dmatrix/include/SparseMatrix.h index d0c31758..0e16d04e 100644 --- a/dmatrix/include/SparseMatrix.h +++ b/dmatrix/include/SparseMatrix.h @@ -8,8 +8,8 @@ #ifndef SparseMatrix_hpp #define SparseMatrix_hpp -#include "dmatrix.h" -#include "cs.h" +#include "dmatrixv.h" +#include //! SparseMatrix class /** diff --git a/dmatrix/include/dmatrixv.h b/dmatrix/include/dmatrixv.h index f3b7671f..08054663 100644 --- a/dmatrix/include/dmatrixv.h +++ b/dmatrix/include/dmatrixv.h @@ -1906,25 +1906,6 @@ int dgelqf_(integer *m, integer *n, doublereal *a, integer * -//! ErrorHandler class -/** - This is a C++ class intended to handle error conditions. -*/ -class ErrorHandler -{ - public: - //! A string of characters which contains the error message - string error_message; - //! A constructor which takes the error message as an argument and assigns it to error_message - /** - \param m is the error message string. - \sa function error_message(). - */ - ErrorHandler(const string m); -}; - - - #endif /* DMATRIX_H */ diff --git a/dmatrix/include/helper.h b/dmatrix/include/helper.h new file mode 100644 index 00000000..1f398a0c --- /dev/null +++ b/dmatrix/include/helper.h @@ -0,0 +1,67 @@ +// +// helper.h +// dmatrix +// +// Created by Philipp Waxweiler on 22.07.20. +// + +#ifndef helper_h +#define helper_h + +#ifndef MAX +#define MAX(a, b) ( (a)>(b)? (a):(b) ) +#endif +#ifndef MIN +#define MIN(a, b) ( (a)<(b)? (a):(b) ) +#endif + +#ifdef MATLAB_MEX_FILE + +#define ERROR_MESSAGE error_message + +#define PRINTF mexPrintf + + +#else + +#define ERROR_MESSAGE error_message + +#define PRINTF printf + +#endif + +//! ErrorHandler class +/** + This is a C++ class intended to handle error conditions. +*/ +class ErrorHandler +{ + public: + //! A string of characters which contains the error message + string error_message; + //! A constructor which takes the error message as an argument and assigns it to error_message + /** + \param m is the error message string. + \sa function error_message(). + */ + ErrorHandler(const string m); +}; + +inline long ChkTmpIndx( long taindx ) +{ + if ( taindx >= N_TEMP_OBJECTS ) + + ERROR_MESSAGE(" Temporary arrays error: Increase N_TEMP_OBJECTS"); + +#ifdef DEBUG_TEMPS + + printf("\n Temp Created --> indx: %d", taindx ); + +#endif + + return taindx; +} + + + +#endif /* helper_h */ diff --git a/dmatrix/src/SparseMatrix.cxx b/dmatrix/src/SparseMatrix.cxx index a1904610..a9e3c7ba 100644 --- a/dmatrix/src/SparseMatrix.cxx +++ b/dmatrix/src/SparseMatrix.cxx @@ -6,7 +6,8 @@ // #include "SparseMatrix.h" - +#include +#include "helper.h" // =====================================SPARSE MATRIX CLASS IMPLEMENTATION ============================== @@ -1124,6 +1125,7 @@ SparseMatrix& SparseMatrix::sub_matrix(int istart, int iend, int jstart, int jen } + DMatrix& SparseMatrix::Column(int j) const { // Returns a dense column vector (DMatrix object) with the j-th column of the calling diff --git a/dmatrix/src/dmatrixv.cxx b/dmatrix/src/dmatrixv.cxx index d2856169..600d554b 100644 --- a/dmatrix/src/dmatrixv.cxx +++ b/dmatrix/src/dmatrixv.cxx @@ -105,30 +105,7 @@ extern "C" { #endif - -#ifdef MATLAB_MEX_FILE - -#define ERROR_MESSAGE error_message - -#define PRINTF mexPrintf - - -#else - -#define ERROR_MESSAGE error_message - -#define PRINTF printf - -#endif - - -#ifndef MAX -#define MAX(a, b) ( (a)>(b)? (a):(b) ) -#endif -#ifndef MIN -#define MIN(a, b) ( (a)<(b)? (a):(b) ) -#endif - +#include "helper.h" DMatrix* DMatrix::GetTempPr(int i) { @@ -141,25 +118,6 @@ DMatrix* DMatrix::GetTempPr(int i) { } -inline long ChkTmpIndx( long taindx ) -{ - - - if ( taindx >= N_TEMP_OBJECTS ) - - ERROR_MESSAGE(" Temporary arrays error: Increase N_TEMP_OBJECTS"); - -#ifdef DEBUG_TEMPS - - printf("\n Temp Created --> indx: %d", taindx ); - -#endif - - return taindx; - - -} - /* Definition of static member variables of class DMatrix */ From 47b7c8a19599251815517ca8bd4aa833a8cf2344 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Fri, 24 Jul 2020 04:19:14 +0200 Subject: [PATCH 19/21] removed dmatrix to make place for Eigen3 --- .gitignore | 1 + ...ts-adolc.txt.in => CMakeLists-adolc.txt.in | 0 CMakeLists.txt | 40 +- Makefile | 199 - Makefile.cxsparse.vc | 92 - Makefile.ipopt | 199 - Makefile.lusol | 33 - Makefile.lusol.vc | 31 - Makefile.vc | 533 -- PSOPT/CMakeLists.txt | 38 - PSOPT/lib/Makefile | 51 - PSOPT/lib/Makefile.vc | 60 - dmatrix/CMakeLists-lusol.txt.in | 15 - dmatrix/CMakeLists-suitesparse.txt.in | 15 - dmatrix/CMakeLists.txt | 72 - dmatrix/LICENSE.txt | 460 -- dmatrix/README | 31 - dmatrix/doc/DMatrix_Class_Reference.pdf | Bin 760126 -> 0 bytes dmatrix/doc/html/annotated.html | 63 - dmatrix/doc/html/bc_s.png | Bin 677 -> 0 bytes dmatrix/doc/html/classDMatrix-members.html | 307 - dmatrix/doc/html/classDMatrix.html | 7012 ---------------- .../doc/html/classErrorHandler-members.html | 50 - dmatrix/doc/html/classErrorHandler.html | 101 - .../classInitializeDMatrixClass-members.html | 50 - .../doc/html/classInitializeDMatrixClass.html | 72 - dmatrix/doc/html/classes.html | 59 - dmatrix/doc/html/closed.png | Bin 126 -> 0 bytes dmatrix/doc/html/dmatrixv_8h_source.html | 1168 --- dmatrix/doc/html/doxygen.css | 800 -- dmatrix/doc/html/doxygen.png | Bin 3942 -> 0 bytes dmatrix/doc/html/f2c_8h_source.html | 265 - dmatrix/doc/html/files.html | 50 - dmatrix/doc/html/form_0.png | Bin 226 -> 0 bytes dmatrix/doc/html/form_1.png | Bin 240 -> 0 bytes dmatrix/doc/html/form_2.png | Bin 481 -> 0 bytes dmatrix/doc/html/form_3.png | Bin 287 -> 0 bytes dmatrix/doc/html/form_4.png | Bin 240 -> 0 bytes dmatrix/doc/html/form_5.png | Bin 238 -> 0 bytes dmatrix/doc/html/form_6.png | Bin 319 -> 0 bytes dmatrix/doc/html/form_7.png | Bin 359 -> 0 bytes dmatrix/doc/html/formula.repository | 8 - dmatrix/doc/html/functions.html | 118 - dmatrix/doc/html/functions_0x63.html | 133 - dmatrix/doc/html/functions_0x64.html | 106 - dmatrix/doc/html/functions_0x65.html | 116 - dmatrix/doc/html/functions_0x66.html | 91 - dmatrix/doc/html/functions_0x67.html | 139 - dmatrix/doc/html/functions_0x69.html | 112 - dmatrix/doc/html/functions_0x6b.html | 82 - dmatrix/doc/html/functions_0x6c.html | 106 - dmatrix/doc/html/functions_0x6d.html | 118 - dmatrix/doc/html/functions_0x6e.html | 91 - dmatrix/doc/html/functions_0x6f.html | 151 - dmatrix/doc/html/functions_0x70.html | 100 - dmatrix/doc/html/functions_0x71.html | 88 - dmatrix/doc/html/functions_0x72.html | 118 - dmatrix/doc/html/functions_0x73.html | 175 - dmatrix/doc/html/functions_0x74.html | 109 - dmatrix/doc/html/functions_0x76.html | 85 - dmatrix/doc/html/functions_0x7a.html | 82 - dmatrix/doc/html/functions_0x7e.html | 85 - dmatrix/doc/html/functions_func.html | 433 - dmatrix/doc/html/functions_rela.html | 409 - dmatrix/doc/html/functions_vars.html | 128 - dmatrix/doc/html/index.html | 57 - dmatrix/doc/html/nav_f.png | Bin 159 -> 0 bytes dmatrix/doc/html/nav_h.png | Bin 97 -> 0 bytes dmatrix/doc/html/open.png | Bin 118 -> 0 bytes dmatrix/doc/html/structNamelist-members.html | 51 - dmatrix/doc/html/structNamelist.html | 64 - dmatrix/doc/html/structVardesc-members.html | 52 - dmatrix/doc/html/structVardesc.html | 66 - dmatrix/doc/html/structalist-members.html | 50 - dmatrix/doc/html/structalist.html | 62 - dmatrix/doc/html/structcilist-members.html | 53 - dmatrix/doc/html/structcilist.html | 68 - dmatrix/doc/html/structcllist-members.html | 51 - dmatrix/doc/html/structcllist.html | 64 - dmatrix/doc/html/structcomplex-members.html | 50 - dmatrix/doc/html/structcomplex.html | 62 - .../doc/html/structdoublecomplex-members.html | 50 - dmatrix/doc/html/structdoublecomplex.html | 62 - dmatrix/doc/html/structicilist-members.html | 54 - dmatrix/doc/html/structicilist.html | 70 - dmatrix/doc/html/structinlist-members.html | 74 - dmatrix/doc/html/structinlist.html | 110 - dmatrix/doc/html/structolist-members.html | 57 - dmatrix/doc/html/structolist.html | 76 - dmatrix/doc/html/tab_a.png | Bin 140 -> 0 bytes dmatrix/doc/html/tab_b.gif | Bin 35 -> 0 bytes dmatrix/doc/html/tab_b.png | Bin 178 -> 0 bytes dmatrix/doc/html/tab_h.png | Bin 192 -> 0 bytes dmatrix/doc/html/tab_l.gif | Bin 706 -> 0 bytes dmatrix/doc/html/tab_r.gif | Bin 2585 -> 0 bytes dmatrix/doc/html/tab_s.png | Bin 189 -> 0 bytes dmatrix/doc/html/tabs.css | 59 - dmatrix/doc/html/unionMultitype-members.html | 55 - dmatrix/doc/html/unionMultitype.html | 72 - dmatrix/doc/latex/DMatrix_Class_Reference.pdf | Bin 760126 -> 0 bytes dmatrix/doc/latex/Makefile | 19 - dmatrix/doc/latex/annotated.tex | 17 - dmatrix/doc/latex/classDMatrix.tex | 5325 ------------ dmatrix/doc/latex/classErrorHandler.tex | 58 - .../doc/latex/classInitializeDMatrixClass.tex | 34 - dmatrix/doc/latex/doxygen.sty | 445 - dmatrix/doc/latex/index.tex | 13 - dmatrix/doc/latex/missfont.log | 1 - dmatrix/doc/latex/refman.log | 861 -- dmatrix/doc/latex/refman.tex | 76 - dmatrix/doc/latex/structNamelist.tex | 27 - dmatrix/doc/latex/structVardesc.tex | 32 - dmatrix/doc/latex/structalist.tex | 22 - dmatrix/doc/latex/structcilist.tex | 37 - dmatrix/doc/latex/structcllist.tex | 27 - dmatrix/doc/latex/structcomplex.tex | 22 - dmatrix/doc/latex/structdoublecomplex.tex | 22 - dmatrix/doc/latex/structicilist.tex | 42 - dmatrix/doc/latex/structinlist.tex | 142 - dmatrix/doc/latex/structolist.tex | 57 - dmatrix/doc/latex/unionMultitype.tex | 47 - dmatrix/examples/A.dat | 7 - dmatrix/examples/CMakeLists.txt | 20 - dmatrix/examples/Makefile | 76 - dmatrix/examples/Makefile.vc | 78 - dmatrix/examples/colon.cxx | 130 - dmatrix/examples/expm.cxx | 26 - dmatrix/examples/rand.cxx | 24 - dmatrix/examples/ricc.cxx | 38 - dmatrix/examples/sparse.cxx | 174 - dmatrix/examples/template.cxx | 29 - dmatrix/include/Doxyfile | 1417 ---- dmatrix/include/SparseMatrix.h | 596 -- dmatrix/include/dmatrixv.h | 1912 ----- dmatrix/include/f2c.h | 223 - dmatrix/include/helper.h | 67 - dmatrix/lib/Makefile | 49 - dmatrix/lib/Makefile.vc | 61 - dmatrix/src/SparseMatrix.cxx | 2160 ----- dmatrix/src/dmatrixv.cxx | 7295 ----------------- {PSOPT/doc => doc}/PSOPT_Manual_R4.pdf | Bin examples/.DS_Store | Bin 0 -> 8196 bytes .../CMakeFiles/3.17.3/CMakeCXXCompiler.cmake | 88 + examples/CMakeFiles/3.17.3/CMakeSystem.cmake | 15 + .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 660 ++ .../3.17.3/CompilerIdCXX/CompilerIdCXX | Bin 0 -> 9072 bytes ...dCXX-all-non-framework-target-headers.hmap | Bin 0 -> 121 bytes .../CompilerIdCXX-all-target-headers.hmap | Bin 0 -> 121 bytes .../CompilerIdCXX-generated-files.hmap | Bin 0 -> 121 bytes .../CompilerIdCXX-own-target-headers.hmap | Bin 0 -> 121 bytes .../CompilerIdCXX-project-headers.hmap | Bin 0 -> 121 bytes .../CompilerIdCXX.build/CompilerIdCXX.hmap | Bin 0 -> 121 bytes .../x86_64/CMakeCXXCompilerId.d | 2 + .../x86_64/CMakeCXXCompilerId.dia | Bin 0 -> 220 bytes .../x86_64/CompilerIdCXX.LinkFileList | 1 + .../x86_64/CompilerIdCXX_dependency_info.dat | Bin 0 -> 28350 bytes .../Script-2C8FEB8E15DC1A1A00E56A5D.sh | 2 + .../all-product-headers.yaml | 1 + .../CompilerIdCXX.xcodeproj/project.pbxproj | 113 + ...acheIndex-5b7f4da6c739b1aa859fd167c37a6781 | Bin 0 -> 44 bytes .../3.17.3/CompilerIdCXX/XCBuildData/build.db | Bin 0 -> 90112 bytes ...9247203afa8d296fcadb07eed2742-desc.xcbuild | Bin 0 -> 52438 bytes ...203afa8d296fcadb07eed2742-manifest.xcbuild | 58 + examples/CMakeFiles/CMakeList.txt | 5 + examples/CMakeFiles/CMakeOutput.log | 135 + examples/CMakeFiles/CMakeTmp/CMakeCache.txt | 258 + .../CMakeTmp/CMakeFiles/TargetDirectories.txt | 2 + .../CMakeTmp/CMakeFiles/cmake.check_cache | 1 + examples/CMakeFiles/CMakeTmp/CMakeLists.txt | 18 + .../CMakeFiles/CMakeTmp/cmake_install.cmake | 44 + examples/CMakeLists.txt | 47 + {PSOPT/examples => examples}/Makefile.inc | 0 .../examples => examples}/Makefile_linux.inc | 0 examples/alpine/CMakeList.txt | 5 + {PSOPT/examples => examples}/alpine/Makefile | 0 .../examples => examples}/alpine/Makefile.vc | 0 .../examples => examples}/alpine/alpine.cxx | 0 .../examples => examples}/alpine/alpine.txt | 0 .../alpine/alpine_control1.pdf | Bin .../alpine/alpine_control2.pdf | Bin .../alpine/alpine_controls.pdf | Bin .../alpine/alpine_state1.pdf | Bin .../alpine/alpine_state2.pdf | Bin .../alpine/alpine_state3.pdf | Bin .../alpine/alpine_state4.pdf | Bin .../alpine/alpine_states.pdf | Bin .../alpine/constraint_summary.txt | 0 .../alpine/mesh_statistics.txt | 0 .../alpine/mesh_statistics_alpine.tex | 0 .../alpine/psopt_solution_alpine.txt | 0 .../alpine/psopt_solution_summary.txt | 0 examples/bioreactor/CMakeList.txt | 5 + .../examples => examples}/bioreactor/Makefile | 0 .../bioreactor/Makefile.vc | 0 .../bioreactor/bioreactor.cxx | 0 .../bioreactor/bioreactor.txt | 0 .../bioreactor/bioreactor_controls.pdf | Bin .../bioreactor/bioreactor_states.pdf | Bin .../bioreactor/constraint_summary.txt | 0 .../bioreactor/mesh_statistics.txt | 0 .../bioreactor/psopt_solution_bioreactor.txt | 0 examples/brac1/CMakeList.txt | 5 + {PSOPT/examples => examples}/brac1/Makefile | 0 .../examples => examples}/brac1/Makefile.vc | 0 {PSOPT/examples => examples}/brac1/brac1.cxx | 0 {PSOPT/examples => examples}/brac1/brac1.txt | 0 .../examples => examples}/brac1/brac1_H.pdf | Bin .../brac1/brac1_control.pdf | Bin .../brac1/brac1_costates.pdf | Bin .../brac1/brac1_hamiltonian.pdf | Bin .../brac1/brac1_states.pdf | Bin .../brac1/constraint_summary.txt | 0 .../brac1/mesh_statistics.txt | 0 .../brac1/psopt_solution_brac1.txt | 0 .../brac1/psopt_solution_saved.txt | 0 .../brac1/psopt_solution_summary.txt | 0 examples/breakwell/CMakeList.txt | 5 + .../examples => examples}/breakwell/Makefile | 0 .../breakwell/Makefile.vc | 0 .../breakwell/breakwell.cxx | 0 .../breakwell/breakwell.txt | 0 .../breakwell/breakwell_control.pdf | Bin .../breakwell/breakwell_costates.pdf | Bin .../breakwell/breakwell_states.pdf | Bin .../examples => examples}/breakwell/brymr.txt | 0 .../breakwell/brymr_controls.pdf | Bin .../breakwell/brymr_states.pdf | Bin .../breakwell/constraint_summary.txt | 0 .../breakwell/error_message.txt | 0 .../breakwell/mesh_statistics.txt | 0 .../breakwell/psopt_solution_breakwell.txt | 0 .../breakwell/psopt_solution_brymr.txt | 0 examples/bryden/CMakeList.txt | 5 + {PSOPT/examples => examples}/bryden/Makefile | 0 .../examples => examples}/bryden/Makefile.vc | 0 .../examples => examples}/bryden/bryden.txt | 0 .../bryden/bryden_control.pdf | Bin .../bryden/bryden_lambda.pdf | Bin .../bryden/bryden_states.pdf | Bin .../bryden/bryson_denham.cxx | 0 .../bryden/constraint_summary.txt | 0 .../bryden/mesh_statistics.txt | 0 .../bryden/psopt_solution_bryden.txt | 0 examples/brymr/CMakeList.txt | 5 + {PSOPT/examples => examples}/brymr/Makefile | 0 .../examples => examples}/brymr/Makefile.vc | 0 {PSOPT/examples => examples}/brymr/brymr.txt | 0 .../brymr/brymr_controls.pdf | Bin .../brymr/brymr_states.pdf | Bin .../brymr/bryson_max_range.cxx | 0 .../brymr/constraint_summary.txt | 0 .../brymr/mesh_statistics.txt | 0 .../brymr/psopt_solution_brymr.txt | 0 examples/catmix/CMakeList.txt | 5 + {PSOPT/examples => examples}/catmix/Makefile | 0 .../examples => examples}/catmix/Makefile.vc | 0 .../examples => examples}/catmix/catmix.cxx | 0 .../examples => examples}/catmix/catmix.txt | 0 .../catmix/catmix_control.pdf | Bin .../catmix/catmix_states.pdf | Bin .../catmix/mesh_statistics.txt | 0 .../catmix/psopt_solution_catmix.txt | 0 examples/chain/CMakeList.txt | 5 + {PSOPT/examples => examples}/chain/Makefile | 0 .../examples => examples}/chain/Makefile.vc | 0 {PSOPT/examples => examples}/chain/chain.cxx | 0 {PSOPT/examples => examples}/chain/chain.txt | 0 .../chain/chain_control.pdf | Bin .../chain/chain_state.pdf | Bin .../chain/constraint_summary.txt | 0 .../chain/mesh_statistics.txt | 0 .../chain/psopt_solution_chain.txt | 0 examples/climb/CMakeList.txt | 5 + {PSOPT/examples => examples}/climb/Makefile | 0 .../examples => examples}/climb/Makefile.vc | 0 {PSOPT/examples => examples}/climb/alpha.pdf | Bin {PSOPT/examples => examples}/climb/climb.cxx | 0 {PSOPT/examples => examples}/climb/climb.txt | 0 .../climb/climb_altitude.pdf | Bin .../examples => examples}/climb/climb_fpa.pdf | Bin .../climb/climb_velocity.pdf | Bin .../climb/constraint_summary.txt | 0 .../climb/error_message.txt | 0 .../climb/mesh_statistics.tex | 0 .../climb/mesh_statistics.txt | 0 .../climb/psopt_solution_climb.txt | 0 {PSOPT/examples => examples}/climb/weight.pdf | Bin examples/coulomb/CMakeList.txt | 5 + {PSOPT/examples => examples}/coulomb/Makefile | 0 .../examples => examples}/coulomb/Makefile.vc | 0 .../examples => examples}/coulomb/coulomb.cxx | 0 .../examples => examples}/coulomb/coulomb.txt | 0 .../coulomb/coulomb_control.pdf | Bin .../coulomb/coulomb_states.pdf | Bin .../coulomb/psopt_solution_coulomb.txt | 0 examples/cracking/CMakeList.txt | 5 + .../examples => examples}/cracking/Makefile | 0 .../cracking/Makefile.vc | 0 .../cracking/constraint_summary.txt | 0 .../cracking/cracking.cxx | 0 .../cracking/cracking.txt | 0 .../cracking/cracking_states.pdf | Bin .../cracking/error_message.txt | 0 .../cracking/mesh_statistics.txt | 0 .../cracking/psopt_solution_cracking.txt | 0 examples/crane/CMakeList.txt | 5 + {PSOPT/examples => examples}/crane/Makefile | 0 .../examples => examples}/crane/Makefile.vc | 0 .../crane/constraint_summary.txt | 0 {PSOPT/examples => examples}/crane/crane.cxx | 0 {PSOPT/examples => examples}/crane/crane.txt | 0 .../crane/crane_controls.pdf | Bin .../crane/crane_states.pdf | Bin .../crane/crane_states13.pdf | Bin .../crane/crane_states46.pdf | Bin .../crane/mesh_statistics.txt | 0 .../crane/psopt_solution_crane.txt | 0 examples/dae_i3/CMakeList.txt | 5 + {PSOPT/examples => examples}/dae_i3/Makefile | 0 .../examples => examples}/dae_i3/Makefile.vc | 0 .../examples => examples}/dae_i3/dae_i3.cxx | 0 .../examples => examples}/dae_i3/dae_i3.txt | 0 .../dae_i3/error_message.txt | 0 .../examples => examples}/dae_i3/lambda.pdf | Bin .../dae_i3/mesh_statistics.txt | 0 .../dae_i3/psopt_solution_dae_i3.txt | 0 {PSOPT/examples => examples}/dae_i3/x1.pdf | Bin {PSOPT/examples => examples}/dae_i3/x2.pdf | Bin examples/delay1/CMakeList.txt | 5 + {PSOPT/examples => examples}/delay1/Makefile | 0 .../examples => examples}/delay1/Makefile.vc | 0 .../delay1/constraint_summary.txt | 0 .../examples => examples}/delay1/delay1.cxx | 0 .../examples => examples}/delay1/delay1.txt | 0 .../delay1/delay1_controls.pdf | Bin .../delay1/delay1_states.pdf | Bin .../delay1/mesh_statistics.txt | 0 .../delay1/psopt_solution_delay1.txt | 0 examples/genCMake.sh | 9 + examples/glider/CMakeList.txt | 5 + {PSOPT/examples => examples}/glider/Makefile | 0 .../examples => examples}/glider/Makefile.vc | 0 .../glider/constraint_summary.txt | 0 .../examples => examples}/glider/control.pdf | Bin .../examples => examples}/glider/glider.cxx | 0 .../glider/hang_glider.txt | 0 .../glider/mesh_statistics.txt | 0 .../glider/psopt_solution_hang_glider.txt | 0 {PSOPT/examples => examples}/glider/traj.pdf | Bin .../glider/velocities.pdf | Bin examples/goddard/CMakeList.txt | 5 + {PSOPT/examples => examples}/goddard/Makefile | 0 .../examples => examples}/goddard/Makefile.vc | 0 .../goddard/constraint_summary.txt | 0 .../goddard/error_message.txt | 0 .../examples => examples}/goddard/goddard.cxx | 0 .../examples => examples}/goddard/goddard.txt | 0 .../goddard/goddard_control.pdf | Bin .../goddard/goddard_sigma.pdf | Bin .../goddard/goddard_states.pdf | Bin .../goddard/mesh_statistics.txt | 0 .../goddard/psopt_solution_goddard.txt | 0 examples/heat/CMakeList.txt | 5 + {PSOPT/examples => examples}/heat/Makefile | 0 {PSOPT/examples => examples}/heat/Makefile.vc | 0 .../heat/constraint_summary.txt | 0 {PSOPT/examples => examples}/heat/heat.cxx | 0 {PSOPT/examples => examples}/heat/heat.txt | 0 .../heat/heat_control.pdf | Bin .../heat/heat_state1.pdf | Bin .../heat/heat_stateN.pdf | Bin .../examples => examples}/heat/heat_surf.pdf | Bin .../heat/mesh_statistics.txt | 0 .../heat/psopt_solution_heat.txt | 0 examples/hyper/CMakeList.txt | 5 + {PSOPT/examples => examples}/hyper/Makefile | 0 .../examples => examples}/hyper/Makefile.vc | 0 .../hyper/constraint_summary.txt | 0 {PSOPT/examples => examples}/hyper/hyper.txt | 0 .../examples => examples}/hyper/hyper_H.pdf | Bin .../hyper/hyper_control.pdf | Bin .../hyper/hyper_lambda.pdf | Bin .../hyper/hyper_state.pdf | Bin .../hyper/hypersensitive.cxx | 0 .../hyper/mesh_statistics.txt | 0 .../hyper/psopt_solution_hyper.txt | 0 examples/ipc/CMakeList.txt | 5 + {PSOPT/examples => examples}/ipc/Makefile | 0 {PSOPT/examples => examples}/ipc/Makefile.vc | 0 .../ipc/interior_point.cxx | 0 {PSOPT/examples => examples}/ipc/ipc.txt | 0 .../examples => examples}/ipc/ipc_control.pdf | Bin .../examples => examples}/ipc/ipc_state.pdf | Bin .../ipc/mesh_statistics.txt | 0 .../ipc/psopt_solution_ipc.txt | 0 examples/isop/CMakeList.txt | 5 + {PSOPT/examples => examples}/isop/Makefile | 0 {PSOPT/examples => examples}/isop/Makefile.vc | 0 .../isop/constraint_summary.txt | 0 .../isop/isop_control.pdf | Bin .../examples => examples}/isop/isop_state.pdf | Bin .../isop/isoperimetric.cxx | 0 .../isop/isoperimetric.txt | 0 .../isop/mesh_statistics.txt | 0 .../isop/psopt_solution_isoperimetric.txt | 0 examples/lambert/CMakeList.txt | 5 + {PSOPT/examples => examples}/lambert/Makefile | 0 .../examples => examples}/lambert/Makefile.vc | 0 .../lambert/constraint_summary.txt | 0 .../examples => examples}/lambert/lambert.cxx | 0 .../examples => examples}/lambert/lambert.txt | 0 .../lambert/lambert_xy.pdf | Bin .../lambert/mesh_statistics.txt | 0 .../lambert/psopt_solution_lambert.txt | 0 examples/launch/CMakeList.txt | 5 + {PSOPT/examples => examples}/launch/Makefile | 0 .../examples => examples}/launch/Makefile.vc | 0 .../launch/constraint_summary.txt | 0 .../examples => examples}/launch/launch.cxx | 0 .../examples => examples}/launch/launch.txt | 0 .../launch/launch_altitude.pdf | Bin .../launch/launch_control.pdf | Bin .../launch/launch_position.pdf | Bin .../launch/launch_speed.pdf | Bin .../launch/mesh_statistics.txt | 0 .../launch/psopt_solution_launch.txt | 0 .../launch/psopt_solution_summary.txt | 0 examples/lowthr/CMakeList.txt | 5 + {PSOPT/examples => examples}/lowthr/Makefile | 0 .../examples => examples}/lowthr/Makefile.vc | 0 {PSOPT/examples => examples}/lowthr/T0.dat | 0 {PSOPT/examples => examples}/lowthr/U0.dat | 0 {PSOPT/examples => examples}/lowthr/X0.dat | 0 .../lowthr/constraint_summary.txt | 0 .../lowthr/low_thrust.cxx | 0 .../lowthr/lowthr_u1.pdf | Bin .../lowthr/lowthr_u2.pdf | Bin .../lowthr/lowthr_u3.pdf | Bin .../lowthr/lowthr_x1.pdf | Bin .../lowthr/lowthr_x2.pdf | Bin .../lowthr/lowthr_x3.pdf | Bin .../lowthr/lowthr_x4.pdf | Bin .../lowthr/lowthr_x5.pdf | Bin .../lowthr/lowthr_x6.pdf | Bin .../lowthr/lowthr_x7.pdf | Bin .../lowthr/lowthrust.txt | 0 .../lowthr/mesh_statistics.tex | 0 .../lowthr/mesh_statistics.txt | 0 .../lowthr/psopt_solution_lowthrust.txt | 0 .../lowthr/psopt_solution_summary.txt | 0 .../lowthr/trajectory.pdf | Bin examples/lts/CMakeList.txt | 5 + {PSOPT/examples => examples}/lts/Makefile | 0 {PSOPT/examples => examples}/lts/Makefile.vc | 0 .../lts/constraint_summary.txt | 0 {PSOPT/examples => examples}/lts/lts.cxx | 0 {PSOPT/examples => examples}/lts/lts.txt | 0 .../examples => examples}/lts/lts_control.pdf | Bin .../examples => examples}/lts/lts_states.pdf | Bin .../lts/mesh_statistics.txt | 0 .../lts/psopt_solution_lts.txt | 0 examples/manutec/CMakeList.txt | 5 + {PSOPT/examples => examples}/manutec/Makefile | 0 .../examples => examples}/manutec/Makefile.vc | 0 .../manutec/constraint_summary.txt | 0 .../manutec/controls.pdf | Bin .../examples => examples}/manutec/manutec.cxx | 0 .../examples => examples}/manutec/manutec.txt | 0 .../manutec/mesh_statistics.txt | 0 .../manutec/mesh_statistics_manutec.tex | 0 .../manutec/positions.pdf | Bin .../manutec/psopt_solution_manutec.txt | 0 .../manutec/psopt_solution_summary.txt | 0 .../manutec/velocities.pdf | Bin examples/missile/CMakeList.txt | 5 + {PSOPT/examples => examples}/missile/Makefile | 0 .../examples => examples}/missile/Makefile.vc | 0 .../missile/constraint_summary.txt | 0 .../missile/mesh_statistics.txt | 0 .../examples => examples}/missile/missile.cxx | 0 .../examples => examples}/missile/missile.pdf | Bin .../examples => examples}/missile/missile.txt | 0 .../missile/missile_alpha.pdf | Bin .../missile/missile_alt.pdf | Bin .../missile/missile_alt_vs_x.pdf | Bin .../missile/missile_gamma.pdf | Bin .../missile/missile_speed.pdf | Bin .../missile/psopt_solution_missile.txt | 0 .../missile/psopt_solution_summary.txt | 0 examples/moon/CMakeList.txt | 5 + {PSOPT/examples => examples}/moon/Makefile | 0 {PSOPT/examples => examples}/moon/Makefile.vc | 0 .../moon/constraint_summary.txt | 0 .../moon/mesh_statistics.txt | 0 {PSOPT/examples => examples}/moon/moon.cxx | 0 {PSOPT/examples => examples}/moon/moon.txt | 0 .../moon/moon_control.pdf | Bin .../moon/moon_states.pdf | Bin .../moon/psopt_solution_moon.txt | 0 examples/mpec/CMakeList.txt | 5 + {PSOPT/examples => examples}/mpec/Makefile | 0 {PSOPT/examples => examples}/mpec/Makefile.vc | 0 .../mpec/error_message.txt | 0 .../mpec/mesh_statistics.txt | 0 {PSOPT/examples => examples}/mpec/mpec.cxx | 0 {PSOPT/examples => examples}/mpec/mpec.txt | 0 {PSOPT/examples => examples}/mpec/p.pdf | Bin .../mpec/psopt_solution_mpec.txt | 0 {PSOPT/examples => examples}/mpec/q.pdf | Bin {PSOPT/examples => examples}/mpec/s.pdf | Bin {PSOPT/examples => examples}/mpec/y.pdf | Bin examples/notorious/CMakeList.txt | 5 + .../examples => examples}/notorious/Makefile | 0 .../notorious/Makefile.vc | 0 .../notorious/error_message.txt | 0 .../notorious/mesh_statistics.txt | 0 .../notorious/notorious.cxx | 0 .../notorious/notorious.txt | 0 .../notorious/psopt_solution_notorious.txt | 0 .../notorious/psopt_solution_slm.txt | 0 .../examples => examples}/notorious/slm.txt | 0 examples/obstacle/CMakeList.txt | 5 + .../examples => examples}/obstacle/Makefile | 0 .../obstacle/Makefile.vc | 0 .../obstacle/constraint_summary.txt | 0 .../obstacle/mesh_statistics.txt | 0 .../obstacle/obstacle.cxx | 0 .../obstacle/obstacle.txt | 0 .../obstacle/obstacle_xy.pdf | Bin .../obstacle/psopt_solution_obstacle.txt | 0 examples/param2/CMakeList.txt | 5 + .../examples => examples}/param2/param2.cxx | 0 {PSOPT/examples => examples}/param2/x1.pdf | Bin {PSOPT/examples => examples}/param2/x2.pdf | Bin {PSOPT/examples => examples}/param2/x3.pdf | Bin examples/predator/CMakeList.txt | 5 + .../predator/mesh_statistics_predator.tex | 0 .../predator/predator.cxx | 0 .../predator/predator.dat | 0 {PSOPT/examples => examples}/predator/x1.pdf | Bin .../examples => examples}/predator/x1x2.pdf | Bin {PSOPT/examples => examples}/predator/x2.pdf | Bin {PSOPT/examples => examples}/predator/x3.pdf | Bin examples/rayleigh/CMakeList.txt | 5 + .../examples => examples}/rayleigh/Makefile | 0 .../rayleigh/Makefile.vc | 0 .../rayleigh/error_message.txt | 0 .../examples => examples}/rayleigh/hartl.txt | 0 .../rayleigh/mesh_statistics.txt | 0 .../rayleigh/psopt_solution_hartl.txt | 0 .../rayleigh/psopt_solution_rayleigh.txt | 0 .../rayleigh/rayleigh.cxx | 0 .../rayleigh/rayleigh.txt | 0 .../rayleigh/rayleigh_control.pdf | Bin .../rayleigh/rayleigh_costates.pdf | Bin .../rayleigh/rayleigh_mu.pdf | Bin .../rayleigh/rayleigh_states.pdf | Bin examples/reorientation/CMakeList.txt | 5 + .../reorientation/Makefile | 0 .../reorientation/Makefile.vc | 0 .../reorientation/mesh_statistics.txt | 0 .../psopt_solution_reorientation.txt | 0 .../reorientation/reorientation.cxx | 0 .../reorientation/reorientation.txt | 0 .../reorientation/reorientation_q.pdf | Bin .../reorientation/reorientation_u.pdf | Bin examples/shutt/CMakeList.txt | 5 + {PSOPT/examples => examples}/shutt/Makefile | 0 .../examples => examples}/shutt/Makefile.vc | 0 .../shutt/constraint_summary.txt | 0 .../shutt/mesh_statistics.txt | 0 .../shutt/psopt_solution_shuttle.txt | 0 .../shutt/shutt_alpha.pdf | Bin .../examples => examples}/shutt/shutt_alt.pdf | Bin .../examples => examples}/shutt/shutt_azi.pdf | Bin .../shutt/shutt_beta.pdf | Bin .../examples => examples}/shutt/shutt_fpa.pdf | Bin .../examples => examples}/shutt/shutt_lat.pdf | Bin .../examples => examples}/shutt/shutt_lon.pdf | Bin .../examples => examples}/shutt/shutt_vel.pdf | Bin .../examples => examples}/shutt/shuttle.txt | 0 .../shutt/shuttle_reentry1.cxx | 0 examples/sing5/CMakeList.txt | 5 + {PSOPT/examples => examples}/sing5/Makefile | 0 .../examples => examples}/sing5/Makefile.vc | 0 .../sing5/constraint_summary.txt | 0 .../sing5/mesh_statistics.txt | 0 .../sing5/psopt_solution_sing5.txt | 0 .../sing5/psopt_solution_summary.txt | 0 {PSOPT/examples => examples}/sing5/sing5.txt | 0 .../sing5/sing5_control.pdf | Bin .../sing5/sing5_states.pdf | Bin .../examples => examples}/sing5/singular5.cxx | 0 examples/stc1/CMakeList.txt | 5 + {PSOPT/examples => examples}/stc1/Makefile | 0 {PSOPT/examples => examples}/stc1/Makefile.vc | 0 .../stc1/constraint_summary.txt | 0 .../stc1/mesh_statistics.txt | 0 .../stc1/psopt_solution_stc1.txt | 0 {PSOPT/examples => examples}/stc1/stc1.cxx | 0 {PSOPT/examples => examples}/stc1/stc1.txt | 0 .../stc1/stc1_control.pdf | Bin .../stc1/stc1_states.pdf | Bin examples/steps/CMakeList.txt | 5 + {PSOPT/examples => examples}/steps/Makefile | 0 .../examples => examples}/steps/Makefile.vc | 0 .../steps/constraint_summary.txt | 0 .../steps/error_message.txt | 0 .../steps/mesh_statistics.txt | 0 .../steps/psopt_solution_steps.txt | 0 {PSOPT/examples => examples}/steps/steps.cxx | 0 {PSOPT/examples => examples}/steps/steps.txt | 0 .../steps/steps_control.pdf | Bin .../steps/steps_state.pdf | Bin examples/twoburn/CMakeList.txt | 5 + {PSOPT/examples => examples}/twoburn/Makefile | 0 .../examples => examples}/twoburn/Makefile.vc | 0 .../twoburn/mesh_statistics.tex | 0 .../twoburn/mesh_statistics.txt | 0 {PSOPT/examples => examples}/twoburn/phi2.pdf | Bin {PSOPT/examples => examples}/twoburn/phi4.pdf | Bin .../twoburn/psopt_solution_summary.txt | 0 .../twoburn/psopt_solution_twoburn.txt | 0 .../examples => examples}/twoburn/theta2.pdf | Bin .../examples => examples}/twoburn/theta4.pdf | Bin .../twoburn/trajectory.pdf | Bin .../examples => examples}/twoburn/twoburn.cxx | 0 .../examples => examples}/twoburn/twoburn.txt | 0 examples/twolink/CMakeList.txt | 5 + {PSOPT/examples => examples}/twolink/Makefile | 0 .../examples => examples}/twolink/Makefile.vc | 0 .../twolink/constraint_summary.txt | 0 .../twolink/mesh_statistics.txt | 0 .../twolink/psopt_solution_twolink.txt | 0 .../examples => examples}/twolink/twolink.txt | 0 .../twolink/twolinkarm.cxx | 0 .../twolink/twolinkarm_controls.pdf | Bin .../twolink/twolinkarm_states.pdf | Bin examples/twophro/CMakeList.txt | 5 + {PSOPT/examples => examples}/twophro/Makefile | 0 .../examples => examples}/twophro/Makefile.vc | 0 .../twophro/constraint_summary.txt | 0 .../twophro/mesh_statistics.txt | 0 .../twophro/psopt_solution_twophro.txt | 0 .../twophro/twophase_robot.cxx | 0 .../examples => examples}/twophro/twophro.txt | 0 .../twophro/twophro_controls.pdf | Bin .../twophro/twophro_states.pdf | Bin examples/twophsc/CMakeList.txt | 5 + {PSOPT/examples => examples}/twophsc/Makefile | 0 .../examples => examples}/twophsc/Makefile.vc | 0 .../twophsc/constraint_summary.txt | 0 .../twophsc/mesh_statistics.txt | 0 .../twophsc/psopt_solution_twophsc.txt | 0 .../twophsc/twophase_schwartz.cxx | 0 .../examples => examples}/twophsc/twophsc.txt | 0 .../twophsc/twophsc_control.pdf | Bin .../twophsc/twophsc_states.pdf | Bin examples/user/CMakeList.txt | 5 + {PSOPT/examples => examples}/user/Makefile | 0 {PSOPT/examples => examples}/user/Makefile.vc | 0 {PSOPT/examples => examples}/user/user.cxx | 0 examples/zpm/CMakeList.txt | 5 + {PSOPT/examples => examples}/zpm/Makefile | 0 {PSOPT/examples => examples}/zpm/Makefile.vc | 0 .../zpm/constraint_summary.txt | 0 .../zpm/mesh_statistics.txt | 0 .../zpm/psopt_solution_summary.txt | 0 .../zpm/psopt_solution_zpm.txt | 0 {PSOPT/examples => examples}/zpm/zpm.cxx | 0 {PSOPT/examples => examples}/zpm/zpm.txt | 0 .../zpm/zpm_controls.pdf | Bin {PSOPT/examples => examples}/zpm/zpm_h1.pdf | Bin {PSOPT/examples => examples}/zpm/zpm_h2.pdf | Bin {PSOPT/examples => examples}/zpm/zpm_h3.pdf | Bin .../examples => examples}/zpm/zpm_hnorm.pdf | Bin .../examples => examples}/zpm/zpm_omega1.pdf | Bin .../examples => examples}/zpm/zpm_omega2.pdf | Bin .../examples => examples}/zpm/zpm_omega3.pdf | Bin {PSOPT/examples => examples}/zpm/zpm_phi.pdf | Bin {PSOPT/examples => examples}/zpm/zpm_psi.pdf | Bin .../examples => examples}/zpm/zpm_theta.pdf | Bin {PSOPT/examples => examples}/zpm/zpm_u1.pdf | Bin {PSOPT/examples => examples}/zpm/zpm_u2.pdf | Bin {PSOPT/examples => examples}/zpm/zpm_u3.pdf | Bin {PSOPT/src => src}/IPOPT_interface.cxx | 0 {PSOPT/src => src}/NLP_bounds.cxx | 0 {PSOPT/src => src}/NLP_constraints.cxx | 0 {PSOPT/src => src}/NLP_guess.cxx | 0 {PSOPT/src => src}/NLP_interface.cxx | 0 {PSOPT/src => src}/NLP_objective.cxx | 0 {PSOPT/src => src}/SNOPT_interface.cxx | 0 {PSOPT/src => src}/derivatives.cxx | 0 {PSOPT/src => src}/evaluate.cxx | 0 {PSOPT/src => src}/get_numbers.cxx | 0 {PSOPT/src => src}/get_variables.cxx | 0 {PSOPT/src => src}/integrate.cxx | 0 {PSOPT/src => src}/interpolation.cxx | 0 {PSOPT/src => src}/ipopt_psoc.h | 0 {PSOPT/src => src}/ipopt_psopt.h | 0 {PSOPT/src => src}/mesh.cxx | 0 {PSOPT/src => src}/parameter_estimation.cxx | 0 {PSOPT/src => src}/phases.cxx | 0 {PSOPT/src => src}/plot.cxx | 0 {PSOPT/src => src}/print.cxx | 0 {PSOPT/src => src}/propagate.cxx | 0 {PSOPT/src => src}/pseudospectral.cxx | 0 {PSOPT/src => src}/psopt.cxx | 0 {PSOPT/src => src}/psopt.h | 5 +- {PSOPT/src => src}/scaling.cxx | 0 {PSOPT/src => src}/setup.cxx | 0 {PSOPT/src => src}/solution.cxx | 0 {PSOPT/src => src}/trajectories.cxx | 0 {PSOPT/src => src}/user_functions.cxx | 0 {PSOPT/src => src}/util.cxx | 0 {PSOPT/src => src}/validate.cxx | 0 {PSOPT/src => src}/workspace.cxx | 0 717 files changed, 1716 insertions(+), 38215 deletions(-) rename PSOPT/CMakeLists-adolc.txt.in => CMakeLists-adolc.txt.in (100%) delete mode 100644 Makefile delete mode 100644 Makefile.cxsparse.vc delete mode 100644 Makefile.ipopt delete mode 100644 Makefile.lusol delete mode 100644 Makefile.lusol.vc delete mode 100755 Makefile.vc delete mode 100644 PSOPT/CMakeLists.txt delete mode 100644 PSOPT/lib/Makefile delete mode 100755 PSOPT/lib/Makefile.vc delete mode 100644 dmatrix/CMakeLists-lusol.txt.in delete mode 100644 dmatrix/CMakeLists-suitesparse.txt.in delete mode 100644 dmatrix/CMakeLists.txt delete mode 100644 dmatrix/LICENSE.txt delete mode 100644 dmatrix/README delete mode 100644 dmatrix/doc/DMatrix_Class_Reference.pdf delete mode 100644 dmatrix/doc/html/annotated.html delete mode 100644 dmatrix/doc/html/bc_s.png delete mode 100644 dmatrix/doc/html/classDMatrix-members.html delete mode 100644 dmatrix/doc/html/classDMatrix.html delete mode 100644 dmatrix/doc/html/classErrorHandler-members.html delete mode 100644 dmatrix/doc/html/classErrorHandler.html delete mode 100644 dmatrix/doc/html/classInitializeDMatrixClass-members.html delete mode 100644 dmatrix/doc/html/classInitializeDMatrixClass.html delete mode 100644 dmatrix/doc/html/classes.html delete mode 100644 dmatrix/doc/html/closed.png delete mode 100644 dmatrix/doc/html/dmatrixv_8h_source.html delete mode 100644 dmatrix/doc/html/doxygen.css delete mode 100644 dmatrix/doc/html/doxygen.png delete mode 100644 dmatrix/doc/html/f2c_8h_source.html delete mode 100644 dmatrix/doc/html/files.html delete mode 100644 dmatrix/doc/html/form_0.png delete mode 100644 dmatrix/doc/html/form_1.png delete mode 100644 dmatrix/doc/html/form_2.png delete mode 100644 dmatrix/doc/html/form_3.png delete mode 100644 dmatrix/doc/html/form_4.png delete mode 100644 dmatrix/doc/html/form_5.png delete mode 100644 dmatrix/doc/html/form_6.png delete mode 100644 dmatrix/doc/html/form_7.png delete mode 100644 dmatrix/doc/html/formula.repository delete mode 100644 dmatrix/doc/html/functions.html delete mode 100644 dmatrix/doc/html/functions_0x63.html delete mode 100644 dmatrix/doc/html/functions_0x64.html delete mode 100644 dmatrix/doc/html/functions_0x65.html delete mode 100644 dmatrix/doc/html/functions_0x66.html delete mode 100644 dmatrix/doc/html/functions_0x67.html delete mode 100644 dmatrix/doc/html/functions_0x69.html delete mode 100644 dmatrix/doc/html/functions_0x6b.html delete mode 100644 dmatrix/doc/html/functions_0x6c.html delete mode 100644 dmatrix/doc/html/functions_0x6d.html delete mode 100644 dmatrix/doc/html/functions_0x6e.html delete mode 100644 dmatrix/doc/html/functions_0x6f.html delete mode 100644 dmatrix/doc/html/functions_0x70.html delete mode 100644 dmatrix/doc/html/functions_0x71.html delete mode 100644 dmatrix/doc/html/functions_0x72.html delete mode 100644 dmatrix/doc/html/functions_0x73.html delete mode 100644 dmatrix/doc/html/functions_0x74.html delete mode 100644 dmatrix/doc/html/functions_0x76.html delete mode 100644 dmatrix/doc/html/functions_0x7a.html delete mode 100644 dmatrix/doc/html/functions_0x7e.html delete mode 100644 dmatrix/doc/html/functions_func.html delete mode 100644 dmatrix/doc/html/functions_rela.html delete mode 100644 dmatrix/doc/html/functions_vars.html delete mode 100644 dmatrix/doc/html/index.html delete mode 100644 dmatrix/doc/html/nav_f.png delete mode 100644 dmatrix/doc/html/nav_h.png delete mode 100644 dmatrix/doc/html/open.png delete mode 100644 dmatrix/doc/html/structNamelist-members.html delete mode 100644 dmatrix/doc/html/structNamelist.html delete mode 100644 dmatrix/doc/html/structVardesc-members.html delete mode 100644 dmatrix/doc/html/structVardesc.html delete mode 100644 dmatrix/doc/html/structalist-members.html delete mode 100644 dmatrix/doc/html/structalist.html delete mode 100644 dmatrix/doc/html/structcilist-members.html delete mode 100644 dmatrix/doc/html/structcilist.html delete mode 100644 dmatrix/doc/html/structcllist-members.html delete mode 100644 dmatrix/doc/html/structcllist.html delete mode 100644 dmatrix/doc/html/structcomplex-members.html delete mode 100644 dmatrix/doc/html/structcomplex.html delete mode 100644 dmatrix/doc/html/structdoublecomplex-members.html delete mode 100644 dmatrix/doc/html/structdoublecomplex.html delete mode 100644 dmatrix/doc/html/structicilist-members.html delete mode 100644 dmatrix/doc/html/structicilist.html delete mode 100644 dmatrix/doc/html/structinlist-members.html delete mode 100644 dmatrix/doc/html/structinlist.html delete mode 100644 dmatrix/doc/html/structolist-members.html delete mode 100644 dmatrix/doc/html/structolist.html delete mode 100644 dmatrix/doc/html/tab_a.png delete mode 100644 dmatrix/doc/html/tab_b.gif delete mode 100644 dmatrix/doc/html/tab_b.png delete mode 100644 dmatrix/doc/html/tab_h.png delete mode 100644 dmatrix/doc/html/tab_l.gif delete mode 100644 dmatrix/doc/html/tab_r.gif delete mode 100644 dmatrix/doc/html/tab_s.png delete mode 100644 dmatrix/doc/html/tabs.css delete mode 100644 dmatrix/doc/html/unionMultitype-members.html delete mode 100644 dmatrix/doc/html/unionMultitype.html delete mode 100644 dmatrix/doc/latex/DMatrix_Class_Reference.pdf delete mode 100644 dmatrix/doc/latex/Makefile delete mode 100644 dmatrix/doc/latex/annotated.tex delete mode 100644 dmatrix/doc/latex/classDMatrix.tex delete mode 100644 dmatrix/doc/latex/classErrorHandler.tex delete mode 100644 dmatrix/doc/latex/classInitializeDMatrixClass.tex delete mode 100644 dmatrix/doc/latex/doxygen.sty delete mode 100644 dmatrix/doc/latex/index.tex delete mode 100644 dmatrix/doc/latex/missfont.log delete mode 100644 dmatrix/doc/latex/refman.log delete mode 100644 dmatrix/doc/latex/refman.tex delete mode 100644 dmatrix/doc/latex/structNamelist.tex delete mode 100644 dmatrix/doc/latex/structVardesc.tex delete mode 100644 dmatrix/doc/latex/structalist.tex delete mode 100644 dmatrix/doc/latex/structcilist.tex delete mode 100644 dmatrix/doc/latex/structcllist.tex delete mode 100644 dmatrix/doc/latex/structcomplex.tex delete mode 100644 dmatrix/doc/latex/structdoublecomplex.tex delete mode 100644 dmatrix/doc/latex/structicilist.tex delete mode 100644 dmatrix/doc/latex/structinlist.tex delete mode 100644 dmatrix/doc/latex/structolist.tex delete mode 100644 dmatrix/doc/latex/unionMultitype.tex delete mode 100644 dmatrix/examples/A.dat delete mode 100644 dmatrix/examples/CMakeLists.txt delete mode 100644 dmatrix/examples/Makefile delete mode 100755 dmatrix/examples/Makefile.vc delete mode 100644 dmatrix/examples/colon.cxx delete mode 100644 dmatrix/examples/expm.cxx delete mode 100644 dmatrix/examples/rand.cxx delete mode 100644 dmatrix/examples/ricc.cxx delete mode 100644 dmatrix/examples/sparse.cxx delete mode 100644 dmatrix/examples/template.cxx delete mode 100644 dmatrix/include/Doxyfile delete mode 100644 dmatrix/include/SparseMatrix.h delete mode 100644 dmatrix/include/dmatrixv.h delete mode 100755 dmatrix/include/f2c.h delete mode 100644 dmatrix/include/helper.h delete mode 100644 dmatrix/lib/Makefile delete mode 100755 dmatrix/lib/Makefile.vc delete mode 100644 dmatrix/src/SparseMatrix.cxx delete mode 100644 dmatrix/src/dmatrixv.cxx rename {PSOPT/doc => doc}/PSOPT_Manual_R4.pdf (100%) create mode 100644 examples/.DS_Store create mode 100644 examples/CMakeFiles/3.17.3/CMakeCXXCompiler.cmake create mode 100644 examples/CMakeFiles/3.17.3/CMakeSystem.cmake create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.d create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.dia create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX_dependency_info.dat create mode 100755 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.xcodeproj/project.pbxproj create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/BuildDescriptionCacheIndex-5b7f4da6c739b1aa859fd167c37a6781 create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/build.db create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/eea9247203afa8d296fcadb07eed2742-desc.xcbuild create mode 100644 examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/eea9247203afa8d296fcadb07eed2742-manifest.xcbuild create mode 100644 examples/CMakeFiles/CMakeList.txt create mode 100644 examples/CMakeFiles/CMakeOutput.log create mode 100644 examples/CMakeFiles/CMakeTmp/CMakeCache.txt create mode 100644 examples/CMakeFiles/CMakeTmp/CMakeFiles/TargetDirectories.txt create mode 100644 examples/CMakeFiles/CMakeTmp/CMakeFiles/cmake.check_cache create mode 100644 examples/CMakeFiles/CMakeTmp/CMakeLists.txt create mode 100644 examples/CMakeFiles/CMakeTmp/cmake_install.cmake create mode 100644 examples/CMakeLists.txt rename {PSOPT/examples => examples}/Makefile.inc (100%) rename {PSOPT/examples => examples}/Makefile_linux.inc (100%) create mode 100644 examples/alpine/CMakeList.txt rename {PSOPT/examples => examples}/alpine/Makefile (100%) rename {PSOPT/examples => examples}/alpine/Makefile.vc (100%) rename {PSOPT/examples => examples}/alpine/alpine.cxx (100%) rename {PSOPT/examples => examples}/alpine/alpine.txt (100%) rename {PSOPT/examples => examples}/alpine/alpine_control1.pdf (100%) rename {PSOPT/examples => examples}/alpine/alpine_control2.pdf (100%) rename {PSOPT/examples => examples}/alpine/alpine_controls.pdf (100%) rename {PSOPT/examples => examples}/alpine/alpine_state1.pdf (100%) rename {PSOPT/examples => examples}/alpine/alpine_state2.pdf (100%) rename {PSOPT/examples => examples}/alpine/alpine_state3.pdf (100%) rename {PSOPT/examples => examples}/alpine/alpine_state4.pdf (100%) rename {PSOPT/examples => examples}/alpine/alpine_states.pdf (100%) rename {PSOPT/examples => examples}/alpine/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/alpine/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/alpine/mesh_statistics_alpine.tex (100%) rename {PSOPT/examples => examples}/alpine/psopt_solution_alpine.txt (100%) rename {PSOPT/examples => examples}/alpine/psopt_solution_summary.txt (100%) create mode 100644 examples/bioreactor/CMakeList.txt rename {PSOPT/examples => examples}/bioreactor/Makefile (100%) rename {PSOPT/examples => examples}/bioreactor/Makefile.vc (100%) rename {PSOPT/examples => examples}/bioreactor/bioreactor.cxx (100%) rename {PSOPT/examples => examples}/bioreactor/bioreactor.txt (100%) rename {PSOPT/examples => examples}/bioreactor/bioreactor_controls.pdf (100%) rename {PSOPT/examples => examples}/bioreactor/bioreactor_states.pdf (100%) rename {PSOPT/examples => examples}/bioreactor/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/bioreactor/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/bioreactor/psopt_solution_bioreactor.txt (100%) create mode 100644 examples/brac1/CMakeList.txt rename {PSOPT/examples => examples}/brac1/Makefile (100%) rename {PSOPT/examples => examples}/brac1/Makefile.vc (100%) rename {PSOPT/examples => examples}/brac1/brac1.cxx (100%) rename {PSOPT/examples => examples}/brac1/brac1.txt (100%) rename {PSOPT/examples => examples}/brac1/brac1_H.pdf (100%) rename {PSOPT/examples => examples}/brac1/brac1_control.pdf (100%) rename {PSOPT/examples => examples}/brac1/brac1_costates.pdf (100%) rename {PSOPT/examples => examples}/brac1/brac1_hamiltonian.pdf (100%) rename {PSOPT/examples => examples}/brac1/brac1_states.pdf (100%) rename {PSOPT/examples => examples}/brac1/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/brac1/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/brac1/psopt_solution_brac1.txt (100%) rename {PSOPT/examples => examples}/brac1/psopt_solution_saved.txt (100%) rename {PSOPT/examples => examples}/brac1/psopt_solution_summary.txt (100%) create mode 100644 examples/breakwell/CMakeList.txt rename {PSOPT/examples => examples}/breakwell/Makefile (100%) rename {PSOPT/examples => examples}/breakwell/Makefile.vc (100%) rename {PSOPT/examples => examples}/breakwell/breakwell.cxx (100%) rename {PSOPT/examples => examples}/breakwell/breakwell.txt (100%) rename {PSOPT/examples => examples}/breakwell/breakwell_control.pdf (100%) rename {PSOPT/examples => examples}/breakwell/breakwell_costates.pdf (100%) rename {PSOPT/examples => examples}/breakwell/breakwell_states.pdf (100%) rename {PSOPT/examples => examples}/breakwell/brymr.txt (100%) rename {PSOPT/examples => examples}/breakwell/brymr_controls.pdf (100%) rename {PSOPT/examples => examples}/breakwell/brymr_states.pdf (100%) rename {PSOPT/examples => examples}/breakwell/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/breakwell/error_message.txt (100%) rename {PSOPT/examples => examples}/breakwell/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/breakwell/psopt_solution_breakwell.txt (100%) rename {PSOPT/examples => examples}/breakwell/psopt_solution_brymr.txt (100%) create mode 100644 examples/bryden/CMakeList.txt rename {PSOPT/examples => examples}/bryden/Makefile (100%) rename {PSOPT/examples => examples}/bryden/Makefile.vc (100%) rename {PSOPT/examples => examples}/bryden/bryden.txt (100%) rename {PSOPT/examples => examples}/bryden/bryden_control.pdf (100%) rename {PSOPT/examples => examples}/bryden/bryden_lambda.pdf (100%) rename {PSOPT/examples => examples}/bryden/bryden_states.pdf (100%) rename {PSOPT/examples => examples}/bryden/bryson_denham.cxx (100%) rename {PSOPT/examples => examples}/bryden/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/bryden/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/bryden/psopt_solution_bryden.txt (100%) create mode 100644 examples/brymr/CMakeList.txt rename {PSOPT/examples => examples}/brymr/Makefile (100%) rename {PSOPT/examples => examples}/brymr/Makefile.vc (100%) rename {PSOPT/examples => examples}/brymr/brymr.txt (100%) rename {PSOPT/examples => examples}/brymr/brymr_controls.pdf (100%) rename {PSOPT/examples => examples}/brymr/brymr_states.pdf (100%) rename {PSOPT/examples => examples}/brymr/bryson_max_range.cxx (100%) rename {PSOPT/examples => examples}/brymr/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/brymr/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/brymr/psopt_solution_brymr.txt (100%) create mode 100644 examples/catmix/CMakeList.txt rename {PSOPT/examples => examples}/catmix/Makefile (100%) rename {PSOPT/examples => examples}/catmix/Makefile.vc (100%) rename {PSOPT/examples => examples}/catmix/catmix.cxx (100%) rename {PSOPT/examples => examples}/catmix/catmix.txt (100%) rename {PSOPT/examples => examples}/catmix/catmix_control.pdf (100%) rename {PSOPT/examples => examples}/catmix/catmix_states.pdf (100%) rename {PSOPT/examples => examples}/catmix/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/catmix/psopt_solution_catmix.txt (100%) create mode 100644 examples/chain/CMakeList.txt rename {PSOPT/examples => examples}/chain/Makefile (100%) rename {PSOPT/examples => examples}/chain/Makefile.vc (100%) rename {PSOPT/examples => examples}/chain/chain.cxx (100%) rename {PSOPT/examples => examples}/chain/chain.txt (100%) rename {PSOPT/examples => examples}/chain/chain_control.pdf (100%) rename {PSOPT/examples => examples}/chain/chain_state.pdf (100%) rename {PSOPT/examples => examples}/chain/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/chain/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/chain/psopt_solution_chain.txt (100%) create mode 100644 examples/climb/CMakeList.txt rename {PSOPT/examples => examples}/climb/Makefile (100%) rename {PSOPT/examples => examples}/climb/Makefile.vc (100%) rename {PSOPT/examples => examples}/climb/alpha.pdf (100%) rename {PSOPT/examples => examples}/climb/climb.cxx (100%) rename {PSOPT/examples => examples}/climb/climb.txt (100%) rename {PSOPT/examples => examples}/climb/climb_altitude.pdf (100%) rename {PSOPT/examples => examples}/climb/climb_fpa.pdf (100%) rename {PSOPT/examples => examples}/climb/climb_velocity.pdf (100%) rename {PSOPT/examples => examples}/climb/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/climb/error_message.txt (100%) rename {PSOPT/examples => examples}/climb/mesh_statistics.tex (100%) rename {PSOPT/examples => examples}/climb/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/climb/psopt_solution_climb.txt (100%) rename {PSOPT/examples => examples}/climb/weight.pdf (100%) create mode 100644 examples/coulomb/CMakeList.txt rename {PSOPT/examples => examples}/coulomb/Makefile (100%) rename {PSOPT/examples => examples}/coulomb/Makefile.vc (100%) rename {PSOPT/examples => examples}/coulomb/coulomb.cxx (100%) rename {PSOPT/examples => examples}/coulomb/coulomb.txt (100%) rename {PSOPT/examples => examples}/coulomb/coulomb_control.pdf (100%) rename {PSOPT/examples => examples}/coulomb/coulomb_states.pdf (100%) rename {PSOPT/examples => examples}/coulomb/psopt_solution_coulomb.txt (100%) create mode 100644 examples/cracking/CMakeList.txt rename {PSOPT/examples => examples}/cracking/Makefile (100%) rename {PSOPT/examples => examples}/cracking/Makefile.vc (100%) rename {PSOPT/examples => examples}/cracking/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/cracking/cracking.cxx (100%) rename {PSOPT/examples => examples}/cracking/cracking.txt (100%) rename {PSOPT/examples => examples}/cracking/cracking_states.pdf (100%) rename {PSOPT/examples => examples}/cracking/error_message.txt (100%) rename {PSOPT/examples => examples}/cracking/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/cracking/psopt_solution_cracking.txt (100%) create mode 100644 examples/crane/CMakeList.txt rename {PSOPT/examples => examples}/crane/Makefile (100%) rename {PSOPT/examples => examples}/crane/Makefile.vc (100%) rename {PSOPT/examples => examples}/crane/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/crane/crane.cxx (100%) rename {PSOPT/examples => examples}/crane/crane.txt (100%) rename {PSOPT/examples => examples}/crane/crane_controls.pdf (100%) rename {PSOPT/examples => examples}/crane/crane_states.pdf (100%) rename {PSOPT/examples => examples}/crane/crane_states13.pdf (100%) rename {PSOPT/examples => examples}/crane/crane_states46.pdf (100%) rename {PSOPT/examples => examples}/crane/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/crane/psopt_solution_crane.txt (100%) create mode 100644 examples/dae_i3/CMakeList.txt rename {PSOPT/examples => examples}/dae_i3/Makefile (100%) rename {PSOPT/examples => examples}/dae_i3/Makefile.vc (100%) rename {PSOPT/examples => examples}/dae_i3/dae_i3.cxx (100%) rename {PSOPT/examples => examples}/dae_i3/dae_i3.txt (100%) rename {PSOPT/examples => examples}/dae_i3/error_message.txt (100%) rename {PSOPT/examples => examples}/dae_i3/lambda.pdf (100%) rename {PSOPT/examples => examples}/dae_i3/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/dae_i3/psopt_solution_dae_i3.txt (100%) rename {PSOPT/examples => examples}/dae_i3/x1.pdf (100%) rename {PSOPT/examples => examples}/dae_i3/x2.pdf (100%) create mode 100644 examples/delay1/CMakeList.txt rename {PSOPT/examples => examples}/delay1/Makefile (100%) rename {PSOPT/examples => examples}/delay1/Makefile.vc (100%) rename {PSOPT/examples => examples}/delay1/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/delay1/delay1.cxx (100%) rename {PSOPT/examples => examples}/delay1/delay1.txt (100%) rename {PSOPT/examples => examples}/delay1/delay1_controls.pdf (100%) rename {PSOPT/examples => examples}/delay1/delay1_states.pdf (100%) rename {PSOPT/examples => examples}/delay1/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/delay1/psopt_solution_delay1.txt (100%) create mode 100644 examples/genCMake.sh create mode 100644 examples/glider/CMakeList.txt rename {PSOPT/examples => examples}/glider/Makefile (100%) rename {PSOPT/examples => examples}/glider/Makefile.vc (100%) rename {PSOPT/examples => examples}/glider/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/glider/control.pdf (100%) rename {PSOPT/examples => examples}/glider/glider.cxx (100%) rename {PSOPT/examples => examples}/glider/hang_glider.txt (100%) rename {PSOPT/examples => examples}/glider/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/glider/psopt_solution_hang_glider.txt (100%) rename {PSOPT/examples => examples}/glider/traj.pdf (100%) rename {PSOPT/examples => examples}/glider/velocities.pdf (100%) create mode 100644 examples/goddard/CMakeList.txt rename {PSOPT/examples => examples}/goddard/Makefile (100%) rename {PSOPT/examples => examples}/goddard/Makefile.vc (100%) rename {PSOPT/examples => examples}/goddard/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/goddard/error_message.txt (100%) rename {PSOPT/examples => examples}/goddard/goddard.cxx (100%) rename {PSOPT/examples => examples}/goddard/goddard.txt (100%) rename {PSOPT/examples => examples}/goddard/goddard_control.pdf (100%) rename {PSOPT/examples => examples}/goddard/goddard_sigma.pdf (100%) rename {PSOPT/examples => examples}/goddard/goddard_states.pdf (100%) rename {PSOPT/examples => examples}/goddard/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/goddard/psopt_solution_goddard.txt (100%) create mode 100644 examples/heat/CMakeList.txt rename {PSOPT/examples => examples}/heat/Makefile (100%) rename {PSOPT/examples => examples}/heat/Makefile.vc (100%) rename {PSOPT/examples => examples}/heat/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/heat/heat.cxx (100%) rename {PSOPT/examples => examples}/heat/heat.txt (100%) rename {PSOPT/examples => examples}/heat/heat_control.pdf (100%) rename {PSOPT/examples => examples}/heat/heat_state1.pdf (100%) rename {PSOPT/examples => examples}/heat/heat_stateN.pdf (100%) rename {PSOPT/examples => examples}/heat/heat_surf.pdf (100%) rename {PSOPT/examples => examples}/heat/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/heat/psopt_solution_heat.txt (100%) create mode 100644 examples/hyper/CMakeList.txt rename {PSOPT/examples => examples}/hyper/Makefile (100%) rename {PSOPT/examples => examples}/hyper/Makefile.vc (100%) rename {PSOPT/examples => examples}/hyper/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/hyper/hyper.txt (100%) rename {PSOPT/examples => examples}/hyper/hyper_H.pdf (100%) rename {PSOPT/examples => examples}/hyper/hyper_control.pdf (100%) rename {PSOPT/examples => examples}/hyper/hyper_lambda.pdf (100%) rename {PSOPT/examples => examples}/hyper/hyper_state.pdf (100%) rename {PSOPT/examples => examples}/hyper/hypersensitive.cxx (100%) rename {PSOPT/examples => examples}/hyper/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/hyper/psopt_solution_hyper.txt (100%) create mode 100644 examples/ipc/CMakeList.txt rename {PSOPT/examples => examples}/ipc/Makefile (100%) rename {PSOPT/examples => examples}/ipc/Makefile.vc (100%) rename {PSOPT/examples => examples}/ipc/interior_point.cxx (100%) rename {PSOPT/examples => examples}/ipc/ipc.txt (100%) rename {PSOPT/examples => examples}/ipc/ipc_control.pdf (100%) rename {PSOPT/examples => examples}/ipc/ipc_state.pdf (100%) rename {PSOPT/examples => examples}/ipc/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/ipc/psopt_solution_ipc.txt (100%) create mode 100644 examples/isop/CMakeList.txt rename {PSOPT/examples => examples}/isop/Makefile (100%) rename {PSOPT/examples => examples}/isop/Makefile.vc (100%) rename {PSOPT/examples => examples}/isop/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/isop/isop_control.pdf (100%) rename {PSOPT/examples => examples}/isop/isop_state.pdf (100%) rename {PSOPT/examples => examples}/isop/isoperimetric.cxx (100%) rename {PSOPT/examples => examples}/isop/isoperimetric.txt (100%) rename {PSOPT/examples => examples}/isop/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/isop/psopt_solution_isoperimetric.txt (100%) create mode 100644 examples/lambert/CMakeList.txt rename {PSOPT/examples => examples}/lambert/Makefile (100%) rename {PSOPT/examples => examples}/lambert/Makefile.vc (100%) rename {PSOPT/examples => examples}/lambert/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/lambert/lambert.cxx (100%) rename {PSOPT/examples => examples}/lambert/lambert.txt (100%) rename {PSOPT/examples => examples}/lambert/lambert_xy.pdf (100%) rename {PSOPT/examples => examples}/lambert/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/lambert/psopt_solution_lambert.txt (100%) create mode 100644 examples/launch/CMakeList.txt rename {PSOPT/examples => examples}/launch/Makefile (100%) rename {PSOPT/examples => examples}/launch/Makefile.vc (100%) rename {PSOPT/examples => examples}/launch/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/launch/launch.cxx (100%) rename {PSOPT/examples => examples}/launch/launch.txt (100%) rename {PSOPT/examples => examples}/launch/launch_altitude.pdf (100%) rename {PSOPT/examples => examples}/launch/launch_control.pdf (100%) rename {PSOPT/examples => examples}/launch/launch_position.pdf (100%) rename {PSOPT/examples => examples}/launch/launch_speed.pdf (100%) rename {PSOPT/examples => examples}/launch/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/launch/psopt_solution_launch.txt (100%) rename {PSOPT/examples => examples}/launch/psopt_solution_summary.txt (100%) create mode 100644 examples/lowthr/CMakeList.txt rename {PSOPT/examples => examples}/lowthr/Makefile (100%) rename {PSOPT/examples => examples}/lowthr/Makefile.vc (100%) rename {PSOPT/examples => examples}/lowthr/T0.dat (100%) rename {PSOPT/examples => examples}/lowthr/U0.dat (100%) rename {PSOPT/examples => examples}/lowthr/X0.dat (100%) rename {PSOPT/examples => examples}/lowthr/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/lowthr/low_thrust.cxx (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_u1.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_u2.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_u3.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_x1.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_x2.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_x3.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_x4.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_x5.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_x6.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthr_x7.pdf (100%) rename {PSOPT/examples => examples}/lowthr/lowthrust.txt (100%) rename {PSOPT/examples => examples}/lowthr/mesh_statistics.tex (100%) rename {PSOPT/examples => examples}/lowthr/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/lowthr/psopt_solution_lowthrust.txt (100%) rename {PSOPT/examples => examples}/lowthr/psopt_solution_summary.txt (100%) rename {PSOPT/examples => examples}/lowthr/trajectory.pdf (100%) create mode 100644 examples/lts/CMakeList.txt rename {PSOPT/examples => examples}/lts/Makefile (100%) rename {PSOPT/examples => examples}/lts/Makefile.vc (100%) rename {PSOPT/examples => examples}/lts/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/lts/lts.cxx (100%) rename {PSOPT/examples => examples}/lts/lts.txt (100%) rename {PSOPT/examples => examples}/lts/lts_control.pdf (100%) rename {PSOPT/examples => examples}/lts/lts_states.pdf (100%) rename {PSOPT/examples => examples}/lts/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/lts/psopt_solution_lts.txt (100%) create mode 100644 examples/manutec/CMakeList.txt rename {PSOPT/examples => examples}/manutec/Makefile (100%) rename {PSOPT/examples => examples}/manutec/Makefile.vc (100%) rename {PSOPT/examples => examples}/manutec/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/manutec/controls.pdf (100%) rename {PSOPT/examples => examples}/manutec/manutec.cxx (100%) rename {PSOPT/examples => examples}/manutec/manutec.txt (100%) rename {PSOPT/examples => examples}/manutec/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/manutec/mesh_statistics_manutec.tex (100%) rename {PSOPT/examples => examples}/manutec/positions.pdf (100%) rename {PSOPT/examples => examples}/manutec/psopt_solution_manutec.txt (100%) rename {PSOPT/examples => examples}/manutec/psopt_solution_summary.txt (100%) rename {PSOPT/examples => examples}/manutec/velocities.pdf (100%) create mode 100644 examples/missile/CMakeList.txt rename {PSOPT/examples => examples}/missile/Makefile (100%) rename {PSOPT/examples => examples}/missile/Makefile.vc (100%) rename {PSOPT/examples => examples}/missile/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/missile/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/missile/missile.cxx (100%) rename {PSOPT/examples => examples}/missile/missile.pdf (100%) rename {PSOPT/examples => examples}/missile/missile.txt (100%) rename {PSOPT/examples => examples}/missile/missile_alpha.pdf (100%) rename {PSOPT/examples => examples}/missile/missile_alt.pdf (100%) rename {PSOPT/examples => examples}/missile/missile_alt_vs_x.pdf (100%) rename {PSOPT/examples => examples}/missile/missile_gamma.pdf (100%) rename {PSOPT/examples => examples}/missile/missile_speed.pdf (100%) rename {PSOPT/examples => examples}/missile/psopt_solution_missile.txt (100%) rename {PSOPT/examples => examples}/missile/psopt_solution_summary.txt (100%) create mode 100644 examples/moon/CMakeList.txt rename {PSOPT/examples => examples}/moon/Makefile (100%) rename {PSOPT/examples => examples}/moon/Makefile.vc (100%) rename {PSOPT/examples => examples}/moon/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/moon/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/moon/moon.cxx (100%) rename {PSOPT/examples => examples}/moon/moon.txt (100%) rename {PSOPT/examples => examples}/moon/moon_control.pdf (100%) rename {PSOPT/examples => examples}/moon/moon_states.pdf (100%) rename {PSOPT/examples => examples}/moon/psopt_solution_moon.txt (100%) create mode 100644 examples/mpec/CMakeList.txt rename {PSOPT/examples => examples}/mpec/Makefile (100%) rename {PSOPT/examples => examples}/mpec/Makefile.vc (100%) rename {PSOPT/examples => examples}/mpec/error_message.txt (100%) rename {PSOPT/examples => examples}/mpec/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/mpec/mpec.cxx (100%) rename {PSOPT/examples => examples}/mpec/mpec.txt (100%) rename {PSOPT/examples => examples}/mpec/p.pdf (100%) rename {PSOPT/examples => examples}/mpec/psopt_solution_mpec.txt (100%) rename {PSOPT/examples => examples}/mpec/q.pdf (100%) rename {PSOPT/examples => examples}/mpec/s.pdf (100%) rename {PSOPT/examples => examples}/mpec/y.pdf (100%) create mode 100644 examples/notorious/CMakeList.txt rename {PSOPT/examples => examples}/notorious/Makefile (100%) rename {PSOPT/examples => examples}/notorious/Makefile.vc (100%) rename {PSOPT/examples => examples}/notorious/error_message.txt (100%) rename {PSOPT/examples => examples}/notorious/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/notorious/notorious.cxx (100%) rename {PSOPT/examples => examples}/notorious/notorious.txt (100%) rename {PSOPT/examples => examples}/notorious/psopt_solution_notorious.txt (100%) rename {PSOPT/examples => examples}/notorious/psopt_solution_slm.txt (100%) rename {PSOPT/examples => examples}/notorious/slm.txt (100%) create mode 100644 examples/obstacle/CMakeList.txt rename {PSOPT/examples => examples}/obstacle/Makefile (100%) rename {PSOPT/examples => examples}/obstacle/Makefile.vc (100%) rename {PSOPT/examples => examples}/obstacle/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/obstacle/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/obstacle/obstacle.cxx (100%) rename {PSOPT/examples => examples}/obstacle/obstacle.txt (100%) rename {PSOPT/examples => examples}/obstacle/obstacle_xy.pdf (100%) rename {PSOPT/examples => examples}/obstacle/psopt_solution_obstacle.txt (100%) create mode 100644 examples/param2/CMakeList.txt rename {PSOPT/examples => examples}/param2/param2.cxx (100%) rename {PSOPT/examples => examples}/param2/x1.pdf (100%) rename {PSOPT/examples => examples}/param2/x2.pdf (100%) rename {PSOPT/examples => examples}/param2/x3.pdf (100%) create mode 100644 examples/predator/CMakeList.txt rename {PSOPT/examples => examples}/predator/mesh_statistics_predator.tex (100%) rename {PSOPT/examples => examples}/predator/predator.cxx (100%) rename {PSOPT/examples => examples}/predator/predator.dat (100%) rename {PSOPT/examples => examples}/predator/x1.pdf (100%) rename {PSOPT/examples => examples}/predator/x1x2.pdf (100%) rename {PSOPT/examples => examples}/predator/x2.pdf (100%) rename {PSOPT/examples => examples}/predator/x3.pdf (100%) create mode 100644 examples/rayleigh/CMakeList.txt rename {PSOPT/examples => examples}/rayleigh/Makefile (100%) rename {PSOPT/examples => examples}/rayleigh/Makefile.vc (100%) rename {PSOPT/examples => examples}/rayleigh/error_message.txt (100%) rename {PSOPT/examples => examples}/rayleigh/hartl.txt (100%) rename {PSOPT/examples => examples}/rayleigh/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/rayleigh/psopt_solution_hartl.txt (100%) rename {PSOPT/examples => examples}/rayleigh/psopt_solution_rayleigh.txt (100%) rename {PSOPT/examples => examples}/rayleigh/rayleigh.cxx (100%) rename {PSOPT/examples => examples}/rayleigh/rayleigh.txt (100%) rename {PSOPT/examples => examples}/rayleigh/rayleigh_control.pdf (100%) rename {PSOPT/examples => examples}/rayleigh/rayleigh_costates.pdf (100%) rename {PSOPT/examples => examples}/rayleigh/rayleigh_mu.pdf (100%) rename {PSOPT/examples => examples}/rayleigh/rayleigh_states.pdf (100%) create mode 100644 examples/reorientation/CMakeList.txt rename {PSOPT/examples => examples}/reorientation/Makefile (100%) rename {PSOPT/examples => examples}/reorientation/Makefile.vc (100%) rename {PSOPT/examples => examples}/reorientation/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/reorientation/psopt_solution_reorientation.txt (100%) rename {PSOPT/examples => examples}/reorientation/reorientation.cxx (100%) rename {PSOPT/examples => examples}/reorientation/reorientation.txt (100%) rename {PSOPT/examples => examples}/reorientation/reorientation_q.pdf (100%) rename {PSOPT/examples => examples}/reorientation/reorientation_u.pdf (100%) create mode 100644 examples/shutt/CMakeList.txt rename {PSOPT/examples => examples}/shutt/Makefile (100%) rename {PSOPT/examples => examples}/shutt/Makefile.vc (100%) rename {PSOPT/examples => examples}/shutt/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/shutt/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/shutt/psopt_solution_shuttle.txt (100%) rename {PSOPT/examples => examples}/shutt/shutt_alpha.pdf (100%) rename {PSOPT/examples => examples}/shutt/shutt_alt.pdf (100%) rename {PSOPT/examples => examples}/shutt/shutt_azi.pdf (100%) rename {PSOPT/examples => examples}/shutt/shutt_beta.pdf (100%) rename {PSOPT/examples => examples}/shutt/shutt_fpa.pdf (100%) rename {PSOPT/examples => examples}/shutt/shutt_lat.pdf (100%) rename {PSOPT/examples => examples}/shutt/shutt_lon.pdf (100%) rename {PSOPT/examples => examples}/shutt/shutt_vel.pdf (100%) rename {PSOPT/examples => examples}/shutt/shuttle.txt (100%) rename {PSOPT/examples => examples}/shutt/shuttle_reentry1.cxx (100%) create mode 100644 examples/sing5/CMakeList.txt rename {PSOPT/examples => examples}/sing5/Makefile (100%) rename {PSOPT/examples => examples}/sing5/Makefile.vc (100%) rename {PSOPT/examples => examples}/sing5/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/sing5/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/sing5/psopt_solution_sing5.txt (100%) rename {PSOPT/examples => examples}/sing5/psopt_solution_summary.txt (100%) rename {PSOPT/examples => examples}/sing5/sing5.txt (100%) rename {PSOPT/examples => examples}/sing5/sing5_control.pdf (100%) rename {PSOPT/examples => examples}/sing5/sing5_states.pdf (100%) rename {PSOPT/examples => examples}/sing5/singular5.cxx (100%) create mode 100644 examples/stc1/CMakeList.txt rename {PSOPT/examples => examples}/stc1/Makefile (100%) rename {PSOPT/examples => examples}/stc1/Makefile.vc (100%) rename {PSOPT/examples => examples}/stc1/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/stc1/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/stc1/psopt_solution_stc1.txt (100%) rename {PSOPT/examples => examples}/stc1/stc1.cxx (100%) rename {PSOPT/examples => examples}/stc1/stc1.txt (100%) rename {PSOPT/examples => examples}/stc1/stc1_control.pdf (100%) rename {PSOPT/examples => examples}/stc1/stc1_states.pdf (100%) create mode 100644 examples/steps/CMakeList.txt rename {PSOPT/examples => examples}/steps/Makefile (100%) rename {PSOPT/examples => examples}/steps/Makefile.vc (100%) rename {PSOPT/examples => examples}/steps/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/steps/error_message.txt (100%) rename {PSOPT/examples => examples}/steps/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/steps/psopt_solution_steps.txt (100%) rename {PSOPT/examples => examples}/steps/steps.cxx (100%) rename {PSOPT/examples => examples}/steps/steps.txt (100%) rename {PSOPT/examples => examples}/steps/steps_control.pdf (100%) rename {PSOPT/examples => examples}/steps/steps_state.pdf (100%) create mode 100644 examples/twoburn/CMakeList.txt rename {PSOPT/examples => examples}/twoburn/Makefile (100%) rename {PSOPT/examples => examples}/twoburn/Makefile.vc (100%) rename {PSOPT/examples => examples}/twoburn/mesh_statistics.tex (100%) rename {PSOPT/examples => examples}/twoburn/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/twoburn/phi2.pdf (100%) rename {PSOPT/examples => examples}/twoburn/phi4.pdf (100%) rename {PSOPT/examples => examples}/twoburn/psopt_solution_summary.txt (100%) rename {PSOPT/examples => examples}/twoburn/psopt_solution_twoburn.txt (100%) rename {PSOPT/examples => examples}/twoburn/theta2.pdf (100%) rename {PSOPT/examples => examples}/twoburn/theta4.pdf (100%) rename {PSOPT/examples => examples}/twoburn/trajectory.pdf (100%) rename {PSOPT/examples => examples}/twoburn/twoburn.cxx (100%) rename {PSOPT/examples => examples}/twoburn/twoburn.txt (100%) create mode 100644 examples/twolink/CMakeList.txt rename {PSOPT/examples => examples}/twolink/Makefile (100%) rename {PSOPT/examples => examples}/twolink/Makefile.vc (100%) rename {PSOPT/examples => examples}/twolink/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/twolink/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/twolink/psopt_solution_twolink.txt (100%) rename {PSOPT/examples => examples}/twolink/twolink.txt (100%) rename {PSOPT/examples => examples}/twolink/twolinkarm.cxx (100%) rename {PSOPT/examples => examples}/twolink/twolinkarm_controls.pdf (100%) rename {PSOPT/examples => examples}/twolink/twolinkarm_states.pdf (100%) create mode 100644 examples/twophro/CMakeList.txt rename {PSOPT/examples => examples}/twophro/Makefile (100%) rename {PSOPT/examples => examples}/twophro/Makefile.vc (100%) rename {PSOPT/examples => examples}/twophro/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/twophro/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/twophro/psopt_solution_twophro.txt (100%) rename {PSOPT/examples => examples}/twophro/twophase_robot.cxx (100%) rename {PSOPT/examples => examples}/twophro/twophro.txt (100%) rename {PSOPT/examples => examples}/twophro/twophro_controls.pdf (100%) rename {PSOPT/examples => examples}/twophro/twophro_states.pdf (100%) create mode 100644 examples/twophsc/CMakeList.txt rename {PSOPT/examples => examples}/twophsc/Makefile (100%) rename {PSOPT/examples => examples}/twophsc/Makefile.vc (100%) rename {PSOPT/examples => examples}/twophsc/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/twophsc/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/twophsc/psopt_solution_twophsc.txt (100%) rename {PSOPT/examples => examples}/twophsc/twophase_schwartz.cxx (100%) rename {PSOPT/examples => examples}/twophsc/twophsc.txt (100%) rename {PSOPT/examples => examples}/twophsc/twophsc_control.pdf (100%) rename {PSOPT/examples => examples}/twophsc/twophsc_states.pdf (100%) create mode 100644 examples/user/CMakeList.txt rename {PSOPT/examples => examples}/user/Makefile (100%) rename {PSOPT/examples => examples}/user/Makefile.vc (100%) rename {PSOPT/examples => examples}/user/user.cxx (100%) create mode 100644 examples/zpm/CMakeList.txt rename {PSOPT/examples => examples}/zpm/Makefile (100%) rename {PSOPT/examples => examples}/zpm/Makefile.vc (100%) rename {PSOPT/examples => examples}/zpm/constraint_summary.txt (100%) rename {PSOPT/examples => examples}/zpm/mesh_statistics.txt (100%) rename {PSOPT/examples => examples}/zpm/psopt_solution_summary.txt (100%) rename {PSOPT/examples => examples}/zpm/psopt_solution_zpm.txt (100%) rename {PSOPT/examples => examples}/zpm/zpm.cxx (100%) rename {PSOPT/examples => examples}/zpm/zpm.txt (100%) rename {PSOPT/examples => examples}/zpm/zpm_controls.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_h1.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_h2.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_h3.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_hnorm.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_omega1.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_omega2.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_omega3.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_phi.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_psi.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_theta.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_u1.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_u2.pdf (100%) rename {PSOPT/examples => examples}/zpm/zpm_u3.pdf (100%) rename {PSOPT/src => src}/IPOPT_interface.cxx (100%) rename {PSOPT/src => src}/NLP_bounds.cxx (100%) rename {PSOPT/src => src}/NLP_constraints.cxx (100%) rename {PSOPT/src => src}/NLP_guess.cxx (100%) rename {PSOPT/src => src}/NLP_interface.cxx (100%) rename {PSOPT/src => src}/NLP_objective.cxx (100%) rename {PSOPT/src => src}/SNOPT_interface.cxx (100%) rename {PSOPT/src => src}/derivatives.cxx (100%) rename {PSOPT/src => src}/evaluate.cxx (100%) rename {PSOPT/src => src}/get_numbers.cxx (100%) rename {PSOPT/src => src}/get_variables.cxx (100%) rename {PSOPT/src => src}/integrate.cxx (100%) rename {PSOPT/src => src}/interpolation.cxx (100%) rename {PSOPT/src => src}/ipopt_psoc.h (100%) rename {PSOPT/src => src}/ipopt_psopt.h (100%) rename {PSOPT/src => src}/mesh.cxx (100%) rename {PSOPT/src => src}/parameter_estimation.cxx (100%) rename {PSOPT/src => src}/phases.cxx (100%) rename {PSOPT/src => src}/plot.cxx (100%) rename {PSOPT/src => src}/print.cxx (100%) rename {PSOPT/src => src}/propagate.cxx (100%) rename {PSOPT/src => src}/pseudospectral.cxx (100%) rename {PSOPT/src => src}/psopt.cxx (100%) rename {PSOPT/src => src}/psopt.h (96%) rename {PSOPT/src => src}/scaling.cxx (100%) rename {PSOPT/src => src}/setup.cxx (100%) rename {PSOPT/src => src}/solution.cxx (100%) rename {PSOPT/src => src}/trajectories.cxx (100%) rename {PSOPT/src => src}/user_functions.cxx (100%) rename {PSOPT/src => src}/util.cxx (100%) rename {PSOPT/src => src}/validate.cxx (100%) rename {PSOPT/src => src}/workspace.cxx (100%) diff --git a/.gitignore b/.gitignore index 9aff1f9b..fb1b54b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +build/ # Compiled Object files *.slo *.lo diff --git a/PSOPT/CMakeLists-adolc.txt.in b/CMakeLists-adolc.txt.in similarity index 100% rename from PSOPT/CMakeLists-adolc.txt.in rename to CMakeLists-adolc.txt.in diff --git a/CMakeLists.txt b/CMakeLists.txt index ce2a7e22..3a1ecfb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,38 @@ cmake_minimum_required (VERSION 3.10) -project(PSOPT_ROOT) +project(PSOPT VERSION 4.0.1 LANGUAGES CXX) -option(BUILD_EXAMPLES "Build examples for dmatrix and PSOPT" OFF) -option(BUILD_DOCS "Build documentation for dmatrix and PSOPT" OFF) +find_package(Eigen3 REQUIRED NO_MODULE) +find_package(PkgConfig REQUIRED) +pkg_check_modules(adolc adolc) +pkg_check_modules(ipopt REQUIRED ipopt) -add_subdirectory(dmatrix/) -add_subdirectory(PSOPT/) +if(NOT TARGET ${adolc}) + message(STATUS "ADOL-C will be downloaded and added to the project...") + # Download and unpack adolc at configure time + configure_file(CMakeLists-adolc.txt.in adolc-download/CMakeLists.txt) + execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/adolc-download ) + if(result) + message(FATAL_ERROR "CMake step for adolc failed: ${result}") + endif() + execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/adolc-download ) + if(result) + message(FATAL_ERROR "Build step for adolc failed: ${result}") + endif() + + add_library(adolc SHARED IMPORTED) + target_include_directories(adolc INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/adolc-build/include/) + set_target_properties(adolc PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/adolc-build/lib64) + + set(CMAKE_CXX_FLAGS "-std=c++11") +endif() + +file(GLOB SRC src/*.cxx) +file(GLOB HEADER "src/*.h") + +add_library(${PROJECT_NAME} ${SRC} ${HEADER}) +target_include_directories(${PROJECT_NAME} PUBLIC src/ PRIVATE ${ipopt_INCLUDE_DIRS}) +target_link_libraries(${PROJECT_NAME} PUBLIC adolc ${ipopt_LIBRARIES} PRIVATE Eigen3::Eigen) diff --git a/Makefile b/Makefile deleted file mode 100644 index 219fedd8..00000000 --- a/Makefile +++ /dev/null @@ -1,199 +0,0 @@ -SHELL = /bin/sh -USERHOME = ~ -F2CINC = $(F2CINCLUDE) -F2CLIB = $(F2CLIBRARY) -DMATRIXDIR=./dmatrix -CXSPARSE=./SuiteSparse/CXSparse -LUSOL=./lusol/csrc - -prefix = $(USERHOME)/Ipopt-3.12.12 -# Directory with header files -IPOPTINCDIR = ${prefix}/include/coin -# Directory with libipopt.a -IPOPTLIBDIR = ${exec_prefix}/lib -exec_prefix = ${prefix} - -PSOPTDIR = ./PSOPT - -PSOPTSRCDIR = $(PSOPTDIR)/src -EXAMPLESDIR = $(PSOPTDIR)/examples -CXSPARSE_LIBS = $(CXSPARSE)/Lib/libcxsparse.a -LUSOL_LIBS = $(LUSOL)/liblusol.a -SPARSE_LIBS = $(CXSPARSE_LIBS) $(LUSOL_LIBS) -ldl -ADOLC_LIBS = -ladolc -PSOPT_LIBS = $(PSOPTDIR)/lib/libpsopt.a -DMATRIX_LIBS = $(DMATRIXDIR)/lib/libdmatrix.a - - -$(CXSPARSE_LIBS): -# (cp UFconfig.h $(CXSPARSE)/Include;cd $(CXSPARSE)/Lib; $(MAKE)) - (cd $(CXSPARSE);cd ..;$(MAKE)) - -$(LUSOL_LIBS): - (cp Makefile.lusol $(LUSOL)/Makefile; cd $(LUSOL); $(MAKE)) - -$(DMATRIX_LIBS): $(DMATRIXDIR)/src/dmatrixv.cxx $(DMATRIXDIR)/include/dmatrixv.h - (cd $(DMATRIXDIR)/lib; $(MAKE)) - - -dmatrix_examples: - (cd $(DMATRIXDIR)/examples; $(MAKE) all) - -$(PSOPT_LIBS): - (cd $(PSOPTDIR)/lib; $(MAKE)) - -bioreactor: - (cd $(EXAMPLESDIR)/$@; make $@) - -brac1: - (cd $(EXAMPLESDIR)/$@; make $@) - - -shutt: - (cd $(EXAMPLESDIR)/$@; make $@) - - -manutec: - (cd $(EXAMPLESDIR)/$@; make $@) - -missile: - (cd $(EXAMPLESDIR)/$@; make $@) - -moon: - (cd $(EXAMPLESDIR)/$@; make $@) - -stc1: - (cd $(EXAMPLESDIR)/$@; make $@) - - -brymr: - (cd $(EXAMPLESDIR)/$@; make $@) - -twoburn: - (cd $(EXAMPLESDIR)/$@; make $@) - -twolink: - (cd $(EXAMPLESDIR)/$@; make $@) - -twophsc: - (cd $(EXAMPLESDIR)/$@; make $@) - -twophro: - (cd $(EXAMPLESDIR)/$@; make $@) - -hyper: - (cd $(EXAMPLESDIR)/$@; make $@) - - -launch: - (cd $(EXAMPLESDIR)/$@; make $@) - -lambert: - (cd $(EXAMPLESDIR)/$@; make $@) - -bryden: - (cd $(EXAMPLESDIR)/$@; make $@) - -delay1: - (cd $(EXAMPLESDIR)/$@; make $@) - -goddard: - (cd $(EXAMPLESDIR)/$@; make $@) - -steps: - (cd $(EXAMPLESDIR)/$@; make $@) - -sing5: - (cd $(EXAMPLESDIR)/$@; make $@) - -climb: - (cd $(EXAMPLESDIR)/$@; make $@) - -cracking: - (cd $(EXAMPLESDIR)/$@; make $@) - -isop: - (cd $(EXAMPLESDIR)/$@; make $@) - -catmix: - (cd $(EXAMPLESDIR)/$@; make $@) - -chain: - (cd $(EXAMPLESDIR)/$@; make $@) - -obstacle: - (cd $(EXAMPLESDIR)/$@; make $@) - -crane: - (cd $(EXAMPLESDIR)/$@; make $@) - -ipc: - (cd $(EXAMPLESDIR)/$@; make $@) - -alpine: - (cd $(EXAMPLESDIR)/$@; make $@) - -lts: - (cd $(EXAMPLESDIR)/$@; make $@) - -user: - (cd $(EXAMPLESDIR)/$@; make $@) - -coulomb: - (cd $(EXAMPLESDIR)/$@; make $@) - -lowthr: - (cd $(EXAMPLESDIR)/$@; make $@) - -heat: - (cd $(EXAMPLESDIR)/$@; make $@) - -zpm: - (cd $(EXAMPLESDIR)/$@; make $@) - -glider: - (cd $(EXAMPLESDIR)/$@; make $@) - -notorious: - (cd $(EXAMPLESDIR)/$@; make $@) - -reorientation: - (cd $(EXAMPLESDIR)/$@; make $@) - -mpec: - (cd $(EXAMPLESDIR)/$@; make $@) - -dae_i3: - (cd $(EXAMPLESDIR)/$@; make $@) - -breakwell: - (cd $(EXAMPLESDIR)/$@; make $@) - -rayleigh: - (cd $(EXAMPLESDIR)/$@; make $@) - -test: launch - (cd $(EXAMPLESDIR)/launch; ./launch) - - -all: $(CXSPARSE_LIBS) $(DMATRIX_LIBS) $(LUSOL_LIBS) $(PSOPT_LIBS) dmatrix_examples bioreactor brac1 shutt manutec missile moon stc1 sing5 steps brymr twoburn twolink twophsc twophro hyper launch lambert bryden delay1 goddard sing5 climb cracking isop catmix chain obstacle crane ipc alpine lts user coulomb lowthr heat zpm glider notorious reorientation mpec dae_i3 breakwell rayleigh test - - -clean: - - (cd $(DMATRIXDIR)/lib; $(MAKE) clean) - (cd $(CXSPARSE)/Lib; $(MAKE) clean) - (cd $(LUSOL); $(MAKE) clean) - (cd $(DMATRIXDIR)/examples; $(MAKE) clean) - (cd $(PSOPTDIR)/lib; $(MAKE) clean) - - -distclean: - - (cd $(DMATRIXDIR)/lib; $(MAKE) distclean) - (cd $(CXSPARSE)/Lib; $(MAKE) distclean) - (cd $(LUSOL); $(MAKE) clean) - (cd $(DMATRIXDIR)/examples; $(MAKE) distclean) - (cd $(PSOPTDIR)/lib; $(MAKE) distclean) - - diff --git a/Makefile.cxsparse.vc b/Makefile.cxsparse.vc deleted file mode 100644 index 99d9b1d0..00000000 --- a/Makefile.cxsparse.vc +++ /dev/null @@ -1,92 +0,0 @@ -# Modify the "-O" optimization option for best performance (-O3 on Linux): -CC = cl -# CFLAGS = /O2 /DCS_LONG /c /DNCOMPLEX -CFLAGS = /O2 /c /DNCOMPLEX -I = /I..\Include - -AR = lib - - -all: libcxsparse.lib - -CS_SOURCE = cs_add.c cs_amd.c cs_chol.c cs_cholsol.c cs_counts.c cs_cumsum.c \ - cs_droptol.c cs_dropzeros.c cs_dupl.c cs_entry.c \ - cs_etree.c cs_fkeep.c cs_gaxpy.c cs_happly.c cs_house.c cs_ipvec.c \ - cs_lsolve.c cs_ltsolve.c cs_lu.c cs_lusol.c cs_util.c cs_multiply.c \ - cs_permute.c cs_pinv.c cs_post.c cs_pvec.c cs_qr.c cs_qrsol.c \ - cs_scatter.c cs_schol.c cs_sqr.c cs_symperm.c cs_tdfs.c cs_malloc.c \ - cs_transpose.c cs_compress.c cs_usolve.c cs_utsolve.c cs_scc.c \ - cs_maxtrans.c cs_dmperm.c cs_updown.c cs_print.c cs_norm.c cs_load.c \ - cs_dfs.c cs_reach.c cs_spsolve.c cs_leaf.c cs_ereach.c cs_randperm.c - - - -CS_DI_OBJ = cs_add.obj cs_amd.obj cs_chol.obj cs_cholsol.obj cs_counts.obj \ - cs_cumsum.obj cs_droptol.obj cs_dropzeros.obj cs_dupl.obj \ - cs_entry.obj cs_etree.obj cs_fkeep.obj cs_gaxpy.obj cs_happly.obj \ - cs_house.obj cs_ipvec.obj cs_lsolve.obj cs_ltsolve.obj cs_lu.obj \ - cs_lusol.obj cs_util.obj cs_multiply.obj cs_permute.obj cs_pinv.obj \ - cs_post.obj cs_pvec.obj cs_qr.obj cs_qrsol.obj cs_scatter.obj \ - cs_schol.obj cs_sqr.obj cs_symperm.obj cs_tdfs.obj cs_malloc.obj \ - cs_transpose.obj cs_compress.obj cs_usolve.obj cs_utsolve.obj \ - cs_scc.obj cs_maxtrans.obj cs_dmperm.obj cs_updown.obj cs_print.obj \ - cs_norm.obj cs_load.obj cs_dfs.obj cs_reach.obj cs_spsolve.obj \ - cs_leaf.obj cs_ereach.obj cs_randperm.obj - -CS_DL_OBJ = cs_add_dl.obj cs_amd_dl.obj cs_chol_dl.obj cs_cholsol_dl.obj cs_counts_dl.obj \ - cs_cumsum_dl.obj cs_droptol_dl.obj cs_dropzeros_dl.obj cs_dupl_dl.obj \ - cs_entry_dl.obj cs_etree_dl.obj cs_fkeep_dl.obj cs_gaxpy_dl.obj cs_happly_dl.obj \ - cs_house_dl.obj cs_ipvec_dl.obj cs_lsolve_dl.obj cs_ltsolve_dl.obj cs_lu_dl.obj \ - cs_lusol_dl.obj cs_util_dl.obj cs_multiply_dl.obj cs_permute_dl.obj cs_pinv_dl.obj \ - cs_post_dl.obj cs_pvec_dl.obj cs_qr_dl.obj cs_qrsol_dl.obj cs_scatter_dl.obj \ - cs_schol_dl.obj cs_sqr_dl.obj cs_symperm_dl.obj cs_tdfs_dl.obj cs_malloc_dl.obj \ - cs_transpose_dl.obj cs_compress_dl.obj cs_usolve_dl.obj cs_utsolve_dl.obj \ - cs_scc_dl.obj cs_maxtrans_dl.obj cs_dmperm_dl.obj cs_updown_dl.obj cs_print_dl.obj \ - cs_norm_dl.obj cs_load_dl.obj cs_dfs_dl.obj cs_reach_dl.obj cs_spsolve_dl.obj \ - cs_leaf_dl.obj cs_ereach_dl.obj cs_randperm_dl.obj - -CS_CI_OBJ = cs_add_ci.obj cs_amd_ci.obj cs_chol_ci.obj cs_cholsol_ci.obj cs_counts_ci.obj \ - cs_cumsum_ci.obj cs_droptol_ci.obj cs_dropzeros_ci.obj cs_dupl_ci.obj \ - cs_entry_ci.obj cs_etree_ci.obj cs_fkeep_ci.obj cs_gaxpy_ci.obj cs_happly_ci.obj \ - cs_house_ci.obj cs_ipvec_ci.obj cs_lsolve_ci.obj cs_ltsolve_ci.obj cs_lu_ci.obj \ - cs_lusol_ci.obj cs_util_ci.obj cs_multiply_ci.obj cs_permute_ci.obj cs_pinv_ci.obj \ - cs_post_ci.obj cs_pvec_ci.obj cs_qr_ci.obj cs_qrsol_ci.obj cs_scatter_ci.obj \ - cs_schol_ci.obj cs_sqr_ci.obj cs_symperm_ci.obj cs_tdfs_ci.obj cs_malloc_ci.obj \ - cs_transpose_ci.obj cs_compress_ci.obj cs_usolve_ci.obj cs_utsolve_ci.obj \ - cs_scc_ci.obj cs_maxtrans_ci.obj cs_dmperm_ci.obj cs_updown_ci.obj cs_print_ci.obj \ - cs_norm_ci.obj cs_load_ci.obj cs_dfs_ci.obj cs_reach_ci.obj cs_spsolve_ci.obj \ - cs_leaf_ci.obj cs_ereach_ci.obj cs_randperm_ci.obj - -CS_CL_OBJ = cs_add_cl.obj cs_amd_cl.obj cs_chol_cl.obj cs_cholsol_cl.obj cs_counts_cl.obj \ - cs_cumsum_cl.obj cs_droptol_cl.obj cs_dropzeros_cl.obj cs_dupl_cl.obj \ - cs_entry_cl.obj cs_etree_cl.obj cs_fkeep_cl.obj cs_gaxpy_cl.obj cs_happly_cl.obj \ - cs_house_cl.obj cs_ipvec_cl.obj cs_lsolve_cl.obj cs_ltsolve_cl.obj cs_lu_cl.obj \ - cs_lusol_cl.obj cs_util_cl.obj cs_multiply_cl.obj cs_permute_cl.obj cs_pinv_cl.obj \ - cs_post_cl.obj cs_pvec_cl.obj cs_qr_cl.obj cs_qrsol_cl.obj cs_scatter_cl.obj \ - cs_schol_cl.obj cs_sqr_cl.obj cs_symperm_cl.obj cs_tdfs_cl.obj cs_malloc_cl.obj \ - cs_transpose_cl.obj cs_compress_cl.obj cs_usolve_cl.obj cs_utsolve_cl.obj \ - cs_scc_cl.obj cs_maxtrans_cl.obj cs_dmperm_cl.obj cs_updown_cl.obj cs_print_cl.obj \ - cs_norm_cl.obj cs_load_cl.obj cs_dfs_cl.obj cs_reach_cl.obj cs_spsolve_cl.obj \ - cs_leaf_cl.obj cs_ereach_cl.obj cs_randperm_cl.obj - -CS = $(CS_DI_OBJ) - -# $(CS): Makefile.vc *.c - - -.c.obj: - $(CC) -c $(CFLAGS) $(I) %s /Fo$*.obj - - -libcxsparse.lib: $(CS) - $(AR) -out:libcxsparse.lib $(CS_DI_OBJ) - copy libcxsparse.lib ..\lib - - -clean: - del *.obj - -purge: distclean - -distclean: clean - del *.lib diff --git a/Makefile.ipopt b/Makefile.ipopt deleted file mode 100644 index 2eadc8bc..00000000 --- a/Makefile.ipopt +++ /dev/null @@ -1,199 +0,0 @@ -SHELL = /bin/sh -USERHOME = ~ -F2CINC = $(F2CINCLUDE) -F2CLIB = $(F2CLIBRARY) -DMATRIXDIR=./dmatrix -CXSPARSE=./SuiteSparse/CXSparse -LUSOL=./lusol/csrc - -prefix = $(USERHOME)/Ipopt-3.12.3 -# Directory with header files -IPOPTINCDIR = ${prefix}/include/coin -# Directory with libipopt.a -IPOPTLIBDIR = ${exec_prefix}/lib -exec_prefix = ${prefix} - -PSOPTDIR = ./PSOPT - -PSOPTSRCDIR = $(PSOPTDIR)/src -EXAMPLESDIR = $(PSOPTDIR)/examples -CXSPARSE_LIBS = $(CXSPARSE)/Lib/libcxsparse.a -LUSOL_LIBS = $(LUSOL)/liblusol.a -SPARSE_LIBS = $(CXSPARSE_LIBS) $(LUSOL_LIBS) -ldl -ADOLC_LIBS = -ladolc -PSOPT_LIBS = $(PSOPTDIR)/lib/libpsopt.a -DMATRIX_LIBS = $(DMATRIXDIR)/lib/libdmatrix.a - - -$(CXSPARSE_LIBS): -# (cp UFconfig.h $(CXSPARSE)/Include;cd $(CXSPARSE)/Lib; $(MAKE)) - (cd $(CXSPARSE);cd ..;$(MAKE)) - -$(LUSOL_LIBS): - (cp Makefile.lusol $(LUSOL)/Makefile; cd $(LUSOL); $(MAKE)) - -$(DMATRIX_LIBS): $(DMATRIXDIR)/src/dmatrixv.cxx $(DMATRIXDIR)/include/dmatrixv.h - (cd $(DMATRIXDIR)/lib; $(MAKE)) - - -dmatrix_examples: - (cd $(DMATRIXDIR)/examples; $(MAKE) all) - -$(PSOPT_LIBS): - (cd $(PSOPTDIR)/lib; $(MAKE)) - -bioreactor: - (cd $(EXAMPLESDIR)/$@; make $@) - -brac1: - (cd $(EXAMPLESDIR)/$@; make $@) - - -shutt: - (cd $(EXAMPLESDIR)/$@; make $@) - - -manutec: - (cd $(EXAMPLESDIR)/$@; make $@) - -missile: - (cd $(EXAMPLESDIR)/$@; make $@) - -moon: - (cd $(EXAMPLESDIR)/$@; make $@) - -stc1: - (cd $(EXAMPLESDIR)/$@; make $@) - - -brymr: - (cd $(EXAMPLESDIR)/$@; make $@) - -twoburn: - (cd $(EXAMPLESDIR)/$@; make $@) - -twolink: - (cd $(EXAMPLESDIR)/$@; make $@) - -twophsc: - (cd $(EXAMPLESDIR)/$@; make $@) - -twophro: - (cd $(EXAMPLESDIR)/$@; make $@) - -hyper: - (cd $(EXAMPLESDIR)/$@; make $@) - - -launch: - (cd $(EXAMPLESDIR)/$@; make $@) - -lambert: - (cd $(EXAMPLESDIR)/$@; make $@) - -bryden: - (cd $(EXAMPLESDIR)/$@; make $@) - -delay1: - (cd $(EXAMPLESDIR)/$@; make $@) - -goddard: - (cd $(EXAMPLESDIR)/$@; make $@) - -steps: - (cd $(EXAMPLESDIR)/$@; make $@) - -sing5: - (cd $(EXAMPLESDIR)/$@; make $@) - -climb: - (cd $(EXAMPLESDIR)/$@; make $@) - -cracking: - (cd $(EXAMPLESDIR)/$@; make $@) - -isop: - (cd $(EXAMPLESDIR)/$@; make $@) - -catmix: - (cd $(EXAMPLESDIR)/$@; make $@) - -chain: - (cd $(EXAMPLESDIR)/$@; make $@) - -obstacle: - (cd $(EXAMPLESDIR)/$@; make $@) - -crane: - (cd $(EXAMPLESDIR)/$@; make $@) - -ipc: - (cd $(EXAMPLESDIR)/$@; make $@) - -alpine: - (cd $(EXAMPLESDIR)/$@; make $@) - -lts: - (cd $(EXAMPLESDIR)/$@; make $@) - -user: - (cd $(EXAMPLESDIR)/$@; make $@) - -coulomb: - (cd $(EXAMPLESDIR)/$@; make $@) - -lowthr: - (cd $(EXAMPLESDIR)/$@; make $@) - -heat: - (cd $(EXAMPLESDIR)/$@; make $@) - -zpm: - (cd $(EXAMPLESDIR)/$@; make $@) - -glider: - (cd $(EXAMPLESDIR)/$@; make $@) - -notorious: - (cd $(EXAMPLESDIR)/$@; make $@) - -reorientation: - (cd $(EXAMPLESDIR)/$@; make $@) - -mpec: - (cd $(EXAMPLESDIR)/$@; make $@) - -dae_i3: - (cd $(EXAMPLESDIR)/$@; make $@) - -breakwell: - (cd $(EXAMPLESDIR)/$@; make $@) - -rayleigh: - (cd $(EXAMPLESDIR)/$@; make $@) - -test: launch - (cd $(EXAMPLESDIR)/launch; ./launch) - - -all: $(CXSPARSE_LIBS) $(DMATRIX_LIBS) $(LUSOL_LIBS) $(PSOPT_LIBS) dmatrix_examples bioreactor brac1 shutt manutec missile moon stc1 sing5 steps brymr twoburn twolink twophsc twophro hyper launch lambert bryden delay1 goddard sing5 climb cracking isop catmix chain obstacle crane ipc alpine lts user coulomb lowthr heat zpm glider notorious reorientation mpec dae_i3 breakwell rayleigh test - - -clean: - - (cd $(DMATRIXDIR)/lib; $(MAKE) clean) - (cd $(CXSPARSE)/Lib; $(MAKE) clean) - (cd $(LUSOL); $(MAKE) clean) - (cd $(DMATRIXDIR)/examples; $(MAKE) clean) - (cd $(PSOPTDIR)/lib; $(MAKE) clean) - - -distclean: - - (cd $(DMATRIXDIR)/lib; $(MAKE) distclean) - (cd $(CXSPARSE)/Lib; $(MAKE) distclean) - (cd $(LUSOL); $(MAKE) clean) - (cd $(DMATRIXDIR)/examples; $(MAKE) distclean) - (cd $(PSOPTDIR)/lib; $(MAKE) distclean) - - diff --git a/Makefile.lusol b/Makefile.lusol deleted file mode 100644 index 2d01d736..00000000 --- a/Makefile.lusol +++ /dev/null @@ -1,33 +0,0 @@ -# Modify the "-O" optimization option for best performance (-O3 on Linux): -CC = gcc -CFLAGS = -DYZHANG -DNDEBUG -Wall -fexceptions -pthread -ansi -fPIC -O3 -I = -I. - -AR = ar cr -RANLIB = ranlib - -all: liblusol.a - -LUSOL_SOURCE = lusol.c mmio.c commonlib.c lusolio.c hbio.c myblas.c -LUSOL_OBJ = lusol.o mmio.o commonlib.o lusolio.o hbio.o myblas.o -LUSOL_LIB_OBJ = lusol.o mmio.o commonlib.o lusolio.o hbio.o myblas.o - -LUSOL_LIB = liblusol.a - - -.c.o: %.c - $(CC) $(CFLAGS) $(I) -c $< -o $@ - -$(LUSOL_LIB): $(LUSOL_LIB_OBJ) - $(AR) $(LUSOL_LIB) $(LUSOL_LIB_OBJ) - $(RANLIB) $(LUSOL_LIB) - cp liblusol.a .. - - -clean: - rm -f *.o - -purge: distclean - -distclean: - rm -f *.a diff --git a/Makefile.lusol.vc b/Makefile.lusol.vc deleted file mode 100644 index 022beebc..00000000 --- a/Makefile.lusol.vc +++ /dev/null @@ -1,31 +0,0 @@ -# Modify the "-O" optimization option for best performance (-O3 on Linux): -CC = CL -CFLAGS = -DYZHANG -DNDEBUG -fPIC -O2 -DWIN32 -I = -I. - -AR = lib - - -all: liblusol.lib - -LUSOL_SOURCE = lusol.c mmio.c commonlib.c lusolio.c hbio.c myblas.c -LUSOL_OBJ = lusol.obj mmio.obj commonlib.obj lusolio.obj hbio.obj myblas.obj -LUSOL_LIB_OBJ = lusol.obj mmio.obj commonlib.obj lusolio.obj hbio.obj myblas.obj - -LUSOL_LIB = liblusol.lib - - -.c.o: - $(CC) $(CFLAGS) $(I) -c $< -o $@ - -$(LUSOL_LIB): $(LUSOL_LIB_OBJ) - $(AR) -out:$(LUSOL_LIB) $(LUSOL_LIB_OBJ) - copy liblusol.lib .. - - -clean: - del *.obj - -distclean: - del *.lib - del ..\*.lib diff --git a/Makefile.vc b/Makefile.vc deleted file mode 100755 index 4af02350..00000000 --- a/Makefile.vc +++ /dev/null @@ -1,533 +0,0 @@ -# PSOPT Makefile - -all: libcxsparse.lib liblusol.lib libdmatrix.lib libpsopt.lib dmatrix_examples launch shutt \ -moon stc1 brymr twolink twophsc twophro hyper bryden delay1 goddard sing5 climb cracking \ -isop catmix chain obstacle crane ipc alpine lts user coulomb heat lambert bioreactor lowthr \ -manutec missile steps twoburn notorious glider reorientation mpec zpm - -libcxsparse.lib: - copy UFconfig.h CXSparse\Include - copy Makefile.cxsparse.vc CXSparse\Source\Makefile.vc - cd CXSparse\Source - $(MAKE) -f Makefile.vc - cd ..\.. - -liblusol.lib: -# cscript update_myblas_h.vbs - copy Makefile.lusol.vc lusol\csrc\Makefile.vc - cd lusol\csrc - $(MAKE) -f Makefile.vc - cd ..\.. - -libdmatrix.lib: - cd dmatrix\lib - $(MAKE) -f Makefile.vc - cd ..\.. - -libpsopt.lib: - cd PSOPT\lib - $(MAKE) -f Makefile.vc - cd ..\.. - -dmatrix_examples: - cd dmatrix\examples - $(MAKE) -f Makefile.vc all - cd ..\.. - -launch: - cd PSOPT\examples\launch - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -brac1: - cd PSOPT\examples\brac1 - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -shutt: - cd PSOPT\examples\shutt - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -moon: - cd PSOPT\examples\moon - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -stc1: - cd PSOPT\examples\stc1 - $(MAKE) -f Makefile.vc all - cd ..\..\.. - - -brymr: - cd PSOPT\examples\brymr - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -twolink: - cd PSOPT\examples\twolink - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -twophsc: - cd PSOPT\examples\twophsc - $(MAKE) -f Makefile.vc all - cd ..\..\.. - - -twophro: - cd PSOPT\examples\twophro - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -hyper: - cd PSOPT\examples\hyper - $(MAKE) -f Makefile.vc all - cd ..\..\.. - - -bryden: - cd PSOPT\examples\bryden - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -delay1: - cd PSOPT\examples\delay1 - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -goddard: - cd PSOPT\examples\goddard - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -sing5: - cd PSOPT\examples\sing5 - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -climb: - cd PSOPT\examples\climb - $(MAKE) -f Makefile.vc - cd ..\..\.. - -cracking: - cd PSOPT\examples\cracking - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -isop: - cd PSOPT\examples\isop - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -crane: - cd PSOPT\examples\crane - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -ipc: - cd PSOPT\examples\ipc - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -catmix: - cd PSOPT\examples\catmix - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -chain: - cd PSOPT\examples\chain - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -obstacle: - cd PSOPT\examples\obstacle - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -alpine: - cd PSOPT\examples\alpine - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -lts: - cd PSOPT\examples\lts - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -user: - cd PSOPT\examples\user - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -coulomb: - cd PSOPT\examples\coulomb - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -heat: - cd PSOPT\examples\heat - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -lambert: - cd PSOPT\examples\lambert - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -bioreactor: - cd PSOPT\examples\bioreactor - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -lowthr: - cd PSOPT\examples\lowthr - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -manutec: - cd PSOPT\examples\manutec - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -missile: - cd PSOPT\examples\missile - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -steps: - cd PSOPT\examples\steps - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -twoburn: - cd PSOPT\examples\twoburn - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -zpm: - cd PSOPT\examples\zpm - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -glider: - cd PSOPT\examples\glider - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -notorious: - cd PSOPT\examples\notorious - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -reorientation: - cd PSOPT\examples\reorientation - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -mpec: - cd PSOPT\examples\mpec - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -dae_i3: - cd PSOPT\examples\dae_i3 - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -breakwell: - cd PSOPT\examples\breakwell - $(MAKE) -f Makefile.vc all - cd ..\..\.. - -rayleigh: - cd PSOPT\examples\rayleigh - $(MAKE) -f Makefile.vc all - cd ..\..\.. - - -clean: - cd CXSparse\Source - $(MAKE) -f Makefile.vc clean - cd ..\.. - cd lusol\csrc - $(MAKE) -f Makefile.vc clean - cd .. - cd dmatrix\lib - $(MAKE) -f Makefile.vc clean - cd ..\.. - cd PSOPT\src - del *.obj - cd ..\.. - cd dmatrix\examples - $(MAKE) -f Makefile.vc clean - cd ..\.. - cd PSOPT\examples\launch - del *.obj - cd ..\..\.. - cd PSOPT\examples\brac1 - del *.obj - cd ..\..\.. - cd PSOPT\examples\shutt - del *.obj - cd ..\..\.. - cd PSOPT\examples\moon - del *.obj - cd ..\..\.. - cd PSOPT\examples\stc1 - del *.obj - cd ..\..\.. - cd PSOPT\examples\brymr - del *.obj - cd ..\..\.. - cd PSOPT\examples\twolink - del *.obj - cd ..\..\.. - cd PSOPT\examples\twophsc - del *.obj - cd ..\..\.. - cd PSOPT\examples\twophro - del *.obj - cd ..\..\.. - cd PSOPT\examples\hyper - del *.obj - cd ..\..\.. - cd PSOPT\examples\mphdr - del *.obj - cd ..\..\.. - cd PSOPT\examples\param - del *.obj - cd ..\..\.. - cd PSOPT\examples\bryden - del *.obj - cd ..\..\.. - cd PSOPT\examples\delay1 - del *.obj - cd ..\..\.. - cd PSOPT\examples\goddard - del *.obj - cd ..\..\.. - cd PSOPT\examples\sing5 - del *.obj - cd ..\..\.. - cd PSOPT\examples\climb - del *.obj - cd ..\..\.. - cd PSOPT\examples\cracking - del *.obj - cd ..\..\.. - cd PSOPT\examples\isop - del *.obj - cd ..\..\.. - cd PSOPT\examples\crane - del *.obj - cd ..\..\.. - cd PSOPT\examples\ipc - del *.obj - cd ..\..\.. - cd PSOPT\examples\catmix - del *.obj - cd ..\..\.. - cd PSOPT\examples\chain - del *.obj - cd ..\..\.. - cd PSOPT\examples\obstacle - del *.obj - cd ..\..\.. - cd PSOPT\examples\alpine - del *.obj - cd ..\..\.. - cd PSOPT\examples\lts - del *.obj - cd ..\..\.. - cd PSOPT\examples\user - del *.obj - cd ..\..\.. - cd PSOPT\examples\coulomb - del *.obj - cd ..\..\.. - cd PSOPT\examples\heat - del *.obj - cd ..\..\.. - cd PSOPT\examples\lambert - del *.obj - cd ..\..\.. - cd PSOPT\examples\bioreactor - del *.obj - cd ..\..\.. - cd PSOPT\examples\lowthr - del *.obj - cd ..\..\.. - cd PSOPT\examples\manutec - del *.obj - cd ..\..\.. - cd PSOPT\examples\missile - del *.obj - cd ..\..\.. - cd PSOPT\examples\steps - del *.obj - cd ..\..\.. - cd PSOPT\examples\twoburn - del *.obj - cd ..\..\.. - cd PSOPT\examples\zpm - del *.obj - cd ..\..\.. - cd PSOPT\examples\glider - del *.obj - cd ..\..\.. - cd PSOPT\examples\notorious - del *.obj - cd ..\..\.. - cd PSOPT\examples\reorientation - del *.obj - cd ..\..\.. - cd PSOPT\examples\mpec - del *.obj - cd ..\..\.. - cd PSOPT\examples\dae_i3 - del *.obj - cd ..\..\.. - - -distclean: - cd CXSparse\Source - $(MAKE) -f Makefile.vc distclean - cd ..\.. - cd lusol\csrc - $(MAKE) -f Makefile.vc distclean - cd .. - cd dmatrix\lib - $(MAKE) -f Makefile.vc distclean - cd ..\.. - cd PSOPT\lib - del *.lib - cd ..\.. - cd dmatrix\examples - $(MAKE) -f Makefile.vc distclean - cd ..\.. - cd PSOPT\examples\launch - del *.exe - cd ..\..\.. - cd PSOPT\examples\brac1 - del *.exe - cd ..\..\.. - cd PSOPT\examples\shutt - del *.exe - cd ..\..\.. - cd PSOPT\examples\moon - del *.exe - cd ..\..\.. - cd PSOPT\examples\stc1 - del *.exe - cd ..\..\.. - cd PSOPT\examples\brymr - del *.exe - cd ..\..\.. - cd PSOPT\examples\twolink - del *.exe - cd ..\..\.. - cd PSOPT\examples\twophsc - del *.exe - cd ..\..\.. - cd PSOPT\examples\twophro - del *.exe - cd ..\..\.. - cd PSOPT\examples\hyper - del *.exe - cd ..\..\.. - cd PSOPT\examples\bryden - del *.exe - cd ..\..\.. - cd PSOPT\examples\delay1 - del *.exe - cd ..\..\.. - cd PSOPT\examples\goddard - del *.exe - cd ..\..\.. - cd PSOPT\examples\sing5 - del *.exe - cd ..\..\.. - cd PSOPT\examples\climb - del *.exe - cd ..\..\.. - cd PSOPT\examples\cracking - del *.exe - cd ..\..\.. - cd PSOPT\examples\isop - del *.exe - cd ..\..\.. - cd PSOPT\examples\crane - del *.exe - cd ..\..\.. - cd PSOPT\examples\ipc - del *.exe - cd ..\..\.. - cd PSOPT\examples\catmix - del *.exe - cd ..\..\.. - cd PSOPT\examples\chain - del *.exe - cd ..\..\.. - cd PSOPT\examples\obstacle - del *.exe - cd ..\..\.. - cd PSOPT\examples\alpine - del *.exe - cd ..\..\.. - cd PSOPT\examples\lts - del *.exe - cd ..\..\.. - cd PSOPT\examples\user - del *.exe - cd ..\..\.. - cd PSOPT\examples\coulomb - del *.exe - cd ..\..\.. - cd PSOPT\examples\heat - del *.exe - cd ..\..\.. - cd PSOPT\examples\lambert - del *.exe - cd ..\..\.. - cd PSOPT\examples\bioreactor - del *.exe - cd ..\..\.. - cd PSOPT\examples\lowthr - del *.exe - cd ..\..\.. - cd PSOPT\examples\manutec - del *.exe - cd ..\..\.. - cd PSOPT\examples\missile - del *.exe - cd ..\..\.. - cd PSOPT\examples\steps - del *.exe - cd ..\..\.. - cd PSOPT\examples\twoburn - del *.exe - cd ..\..\.. - cd PSOPT\examples\zpm - del *.exe - cd ..\..\.. - cd PSOPT\examples\glider - del *.exe - cd ..\..\.. - cd PSOPT\examples\notorious - del *.exe - cd ..\..\.. - cd PSOPT\examples\reorientation - del *.exe - cd ..\..\.. - cd PSOPT\examples\mpec - del *.exe - cd ..\..\.. - cd PSOPT\examples\dae_i3 - del *.exe - cd ..\..\.. - - - diff --git a/PSOPT/CMakeLists.txt b/PSOPT/CMakeLists.txt deleted file mode 100644 index 3f4d4821..00000000 --- a/PSOPT/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(PSOPT VERSION 4.0.1 LANGUAGES CXX) - -find_package(PkgConfig REQUIRED) -pkg_check_modules(adolc adolc) -pkg_check_modules(ipopt REQUIRED ipopt) - -if(NOT TARGET ${adolc}) - message(STATUS "ADOL-C will be downloaded and added to the project...") - # Download and unpack adolc at configure time - configure_file(CMakeLists-adolc.txt.in adolc-download/CMakeLists.txt) - execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/adolc-download ) - if(result) - message(FATAL_ERROR "CMake step for adolc failed: ${result}") - endif() - execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/adolc-download ) - if(result) - message(FATAL_ERROR "Build step for adolc failed: ${result}") - endif() - - add_library(adolc SHARED IMPORTED) - target_include_directories(adolc INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/adolc-build/include/) - set_target_properties(adolc PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/adolc-build/lib64) - - set(CMAKE_CXX_FLAGS "-std=c++11") -endif() - -file(GLOB SRC src/*.cxx) -file(GLOB HEADER "src/*.h") - -add_library(${PROJECT_NAME} ${SRC} ${HEADER}) -add_dependencies(${PROJECT_NAME} dmatrix) -target_include_directories(${PROJECT_NAME} PUBLIC src/ PRIVATE ${ipopt_INCLUDE_DIRS}) -target_link_libraries(${PROJECT_NAME} PUBLIC adolc ${ipopt_LIBRARIES} PRIVATE dmatrix) diff --git a/PSOPT/lib/Makefile b/PSOPT/lib/Makefile deleted file mode 100644 index 635fb527..00000000 --- a/PSOPT/lib/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -#Usage: make -#add ../lib to LD_LIBRARY_PATH - -SHELL = /bin/sh - -USERHOME = /home/$(shell whoami) - -F2CINC = $(F2CINCLUDE) -F2CLIB = $(F2CLIBRARY) - -DMATRIXDIR=../../dmatrix -CPPEXAMPLESDIR = $(SNOPTDIR)/cppexamples -CXSPARSE=../../SuiteSparse/CXSparse -LUSOL=../../lusol/csrc - -prefix = $(USERHOME)/Ipopt-3.12.12 -# Directory with header files -IPOPTINCDIR = -I${prefix}/Ipopt/src/Interfaces -I${prefix}/Ipopt/src/Common -I${prefix}/Ipopt/src/LinAlg -# Directory with libipopt.a -IPOPTLIBDIR = ${exec_prefix}/lib -exec_prefix = ${prefix} - - -PSOPTSRCDIR = ../src - - -CXX = /usr/bin/g++ -CC = /usr/bin/gcc -CXXFLAGS = -O0 -g -I$(USERHOME)/adolc_base/include -I$(DMATRIXDIR)/include -I$(SNOPTDIR)/cppexamples -I$(PSOPTSRCDIR) -DLAPACK -DUNIX -DSPARSE_MATRIX -DUSE_IPOPT -I$(CXSPARSE)/Include -I$(CXSPARSE)/../SuiteSparse_config -I$(LUSOL) $(IPOPTINCDIR) -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wimplicit -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -fPIC -DHAVE_MALLOC -std=c++11 - -CFLAGS = -O0 -fPIC - - -PSOPTLIB = libpsopt.a - -$(PSOPTLIB): $(PSOPTLIB)($(PSOPTSRCDIR)/psopt.o $(PSOPTSRCDIR)/plot.o $(PSOPTSRCDIR)/util.o $(PSOPTSRCDIR)/pseudospectral.o $(PSOPTSRCDIR)/propagate.o $(PSOPTSRCDIR)/print.o $(PSOPTSRCDIR)/validate.o $(PSOPTSRCDIR)/scaling.o $(PSOPTSRCDIR)/interpolation.o $(PSOPTSRCDIR)/NLP_objective.o $(PSOPTSRCDIR)/NLP_constraints.o $(PSOPTSRCDIR)/mesh.o $(PSOPTSRCDIR)/evaluate.o $(PSOPTSRCDIR)/workspace.o $(PSOPTSRCDIR)/get_numbers.o $(PSOPTSRCDIR)/get_variables.o $(PSOPTSRCDIR)/setup.o $(PSOPTSRCDIR)/solution.o $(PSOPTSRCDIR)/NLP_guess.o $(PSOPTSRCDIR)/NLP_bounds.o $(PSOPTSRCDIR)/NLP_interface.o $(PSOPTSRCDIR)/IPOPT_interface.o $(PSOPTSRCDIR)/derivatives.o $(PSOPTSRCDIR)/trajectories.o $(PSOPTSRCDIR)/SNOPT_interface.o $(PSOPTSRCDIR)/user_functions.o $(PSOPTSRCDIR)/integrate.o $(PSOPTSRCDIR)/phases.o $(PSOPTSRCDIR)/parameter_estimation.o) - - -clean: - rm -f *.o - -distclean: - rm -f *.a - - -$(PSOPTSRCDIR)/%.o : $(PSOPTSRCDIR)/%.cxx - $(CXX) -c $(CXXFLAGS) $< -o $@ - -$(DMATRIXDIR)/src/%.o : $(DMATRIXDIR)/src/%.cxx - $(CXX) -c $(CXXFLAGS) $< -o $@ - diff --git a/PSOPT/lib/Makefile.vc b/PSOPT/lib/Makefile.vc deleted file mode 100755 index f2cfcdb2..00000000 --- a/PSOPT/lib/Makefile.vc +++ /dev/null @@ -1,60 +0,0 @@ -CXX = cl - -CC = cl - -AR = lib - -CFLAGS = -DWIN32 -DLAPACK -DSPARSE_MATRIX -DUSE_IPOPT -D_CRT_ERRNO_DEFINED - -BASE = ..\.. - -DMATRIX = $(BASE)\dmatrix - -LUSOL = $(BASE)\lusol\csrc - -CXSPARSE = $(BASE)\CXSparse - -ADOLC = C:\ADOL-C-2.1.12\ADOL-C\ - -IPOPT = C:\Ipopt-3.9.3 - -include ..\..\MicrosoftVisualStudio.inc - -PSOPT = $(BASE)\PSOPT - -INCLUDE = -I$(PSOPT)\src -I$(DMATRIX)\include -I$(BASE)\CXSparse\Include -I$(LUSOL) -I$(IPOPT)\include\coin -I$(IPOPT)\Ipopt\src\Interfaces -I$(IPOPT)\Ipopt\src\Common -I$(IPOPT)\BuildTools\headers -I$(IPOPT)\Ipopt\src\LinAlg -I$(ADOLC) -I$(ADOLC)\adolc -I$(ADOLC)\adolc\drivers -I$(ADOLC)\adolc\sparse -I$(VCINCLUDE) -I$(VCSDK) - - -all: libpsopt.lib - -SRC = $(PSOPT)\src\psopt.cxx \ - - -OBJ = $(PSOPT)\src\psopt.obj \ - - -.cxx.obj: - $(CXX) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - -.c.obj: - $(CC) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - -$(PSOPT)\src\psopt.obj: $(PSOPT)\src\psopt.cxx - $(CXX) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - -$(DMATRIX)\src\dmatrixv.obj: $(DMATRIX)\src\dmatrixv.cxx - $(CXX) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - -libpsopt.lib: $(OBJ) - $(AR) -out:libpsopt.lib $(OBJ) - - -clean: - del ..\src\*.obj - -distclean: - del *.lib - - - - diff --git a/dmatrix/CMakeLists-lusol.txt.in b/dmatrix/CMakeLists-lusol.txt.in deleted file mode 100644 index fc9fe51d..00000000 --- a/dmatrix/CMakeLists-lusol.txt.in +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required(VERSION 2.8.2) - -project(lusol-download NONE) - -include(ExternalProject) -ExternalProject_Add(lusol - URL http://www.stanford.edu/group/SOL/software/lusol/lusol.zip - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/lusol-src" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) \ No newline at end of file diff --git a/dmatrix/CMakeLists-suitesparse.txt.in b/dmatrix/CMakeLists-suitesparse.txt.in deleted file mode 100644 index 71a4bab3..00000000 --- a/dmatrix/CMakeLists-suitesparse.txt.in +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required(VERSION 2.8.2) - -project(SuiteSparse-download NONE) - -include(ExternalProject) -ExternalProject_Add(SuiteSparse - GIT_REPOSITORY https://github.com/DrTimothyAldenDavis/SuiteSparse.git - GIT_TAG master - BUILD_IN_SOURCE ON - SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) \ No newline at end of file diff --git a/dmatrix/CMakeLists.txt b/dmatrix/CMakeLists.txt deleted file mode 100644 index a570b819..00000000 --- a/dmatrix/CMakeLists.txt +++ /dev/null @@ -1,72 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(dmatrix LANGUAGES CXX) - -file(GLOB SRC src/*.cxx) -file(GLOB HEADER include/*.h) - -# Download and unpack SuiteSparse at configure time - -configure_file(CMakeLists-SuiteSparse.txt.in SuiteSparse-download/CMakeLists.txt) -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-download ) - -if(result) - message(FATAL_ERROR "CMake step for SuiteSparse failed: ${result}") -endif() - -execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-download ) - -if(result) - message(FATAL_ERROR "Build step for SuiteSparse failed: ${result}") -endif() - -execute_process(COMMAND make -j4 - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src/) - -if(result) - message(FATAL_ERROR "Install step for SuiteSparse failed: ${result}") -endif() - - -add_library(SuiteSparse STATIC IMPORTED) -target_include_directories(SuiteSparse INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src/include/ ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src/include/) -set_target_properties(SuiteSparse PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/SuiteSparse-src/lib) - -# --- download and unpack lusol -configure_file(CMakeLists-lusol.txt.in lusol-download/CMakeLists.txt) -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lusol-download ) - -if(result) - message(FATAL_ERROR "CMake step for lusol failed: ${result}") -endif() - -execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lusol-download ) - -if(result) - message(FATAL_ERROR "Build step for lusol failed: ${result}") -endif() - -file(GLOB LUSOL_SRC ${CMAKE_CURRENT_BINARY_DIR}/lusol-src/csrc/*.c) -list(REMOVE_ITEM LUSOL_SRC ${CMAKE_CURRENT_BINARY_DIR}/lusol-src/csrc/LU1LOT.c) -file(GLOB LUSOL_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/lusol-src/csrc/*.h) -add_library(lusol ${LUSOL_SRC} ${LUSOL_HEADERS}) -target_include_directories(lusol PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/lusol-src/csrc/) -# --- - -add_library(${PROJECT_NAME} ${SRC} ${HEADER}) -target_include_directories(${PROJECT_NAME} PUBLIC include/ PRIVATE ${SuiteSparse_INCLUDE_DIRS}) -target_link_libraries(${PROJECT_NAME} PRIVATE SuiteSparse lusol) - -set(${PROJECT_NAME} ${PROJECT_NAME} CACHE INTERNAL "${PROJECT_NAME} library target.") - -if(${BUILD_EXAMPLES}) - add_subdirectory(examples/) -endif() diff --git a/dmatrix/LICENSE.txt b/dmatrix/LICENSE.txt deleted file mode 100644 index 469441c4..00000000 --- a/dmatrix/LICENSE.txt +++ /dev/null @@ -1,460 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - diff --git a/dmatrix/README b/dmatrix/README deleted file mode 100644 index 72ece995..00000000 --- a/dmatrix/README +++ /dev/null @@ -1,31 +0,0 @@ - -This is the DMatrix library, a software tool for computational linear algebra. - -Full documentation can be found in ./doc/html/index.html - -Copyright (C) 2009 Victor M. Becerra - - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA, -or visit http://www.gnu.org/licenses/ - -Author: Dr. Victor M. Becerra - University of Reading - School of Systems Engineering - P.O. Box 225, Reading RG6 6AY - United Kingdom - e-mail: v.m.becerra@reading.ac.uk - - diff --git a/dmatrix/doc/DMatrix_Class_Reference.pdf b/dmatrix/doc/DMatrix_Class_Reference.pdf deleted file mode 100644 index d12080c26b643ffdb1b9a527fd90bed29ff52763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760126 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%0A`o-cg0{p0gu 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 z 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æ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⊀`O$3aJHmOd0hyU%h{IN2;T;d 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�-(%A}kZgmD^u0u$8Gk;!cyV$~r9@czxAOF8@wO%`fE}S5%gOeeF^@Ry}y|jA$=d>f-a&+p!#5R4p<^ zE6@cw4n5iHI*B z->%@vPp5*4w=&qZQlY9-%WUygZMbvOtu|sN?%DG3>P>5i zznt`&24%-fg@X4c76HOBqbXBV;gxeR`>8%9UJPjX_O5*x?3Br6zS8 zXQw?P5g7?;A<7X7p7#_qy&{Gh?jXgnQoj=0#IUZOB|)H z3c*H0^WejaY}QPsAkOpI?Zj_k23rhqU}bnekME&_%Sl*JMxDMiqJmTG4%w&5d(ubl zeeIrBJ5=E2liafmd4Cu!lUQ+uw?W?VJ(cNl)FwWMDfp6^T!73l-PqOm*V(wlS0bkY z4$REEgQ4Ib1)||kw;jRpH$lLY2GUXw^nNuIUD!Y9^w! zZg~5!*FssmcyeVPFDF>Qgc!1p(1FckvhRE+qB6by+5qv4k9>f40;4W>^QFir{+AluSD#dkXz~v* z9}Y@AC)97D!J)}CnZFiu6=LPZ1j`y`11y55Zhv>hBQCHLkIUuH)6ACbjBe`Io6Ux^ zJZnai^kI&I76NIwgLneg+{4Z?S>>X$d|V1xL1{AD8*+%^ZG?o(hwk52TH%>=PA3)D##zawqs^VeR8eu z4}$U0(1Qv`V`oCFT`Hk`USQbMH0W4~ufo8!H0^c)aA*kUwOf@7U$U|7p-?~Wz<-}F zD|j6B@-PQq`VDGIpKEMYGr&quiYlK|_3$~td;)bp;HB9d6YdOSTcMP1D;+65ro-mA*_*Qf6q3 zeliqIZg&?hg$ z=uO#JDw(X`rg8B#VcPDj<332GM=xl5L0Q|Bj(m5J5Hl+K9KUcEb0?3jzmnWQ-n{N} z>;5oP(l=3gSMbTI@B2s`9EMHJ*;l#+f8#@#)jHUN1($sDcv=+TF)9!XmGDz#1I z7-K25X1S63E3{eh0Hd&d+6YE73uY=Dp{s(R{D}Ll6@D6KX z4vJjHXT4N*<@&v|-~y?W@s(CwiW-&l|g`!NUUcL4S;X=FKR|#HJiz?$Ag` zmdONHs-qk6Br1z|pALQd@y;Uv0%wp!1O$w>cxPDQRI8NkIeY6OM1SyuwM_Qq^F-~*T# zWoB$J8gKc?_`I2T98X9}&!R-^nQ2FT|6X2QWTXR+_~yTvxU!xrDl%LIuxt57s}MWQ2!Qhsn3$E#ju!);MzjrK>2 zm`-;Y03UQnx|!_)3x0|b$j=eO&jZX5y?Dr*;O_!!b25M;51z$W^~z0j^L`M(S53hstXbpu9e z%hc*jMAV$qvB=nxHTqXGur`HI|I&dE)|*)uB5FYdHVYhr0zn2Q?A7=v;TkHKd3`qf zF_Q0I^?`=X4)-~JmR4P5a24Csbke!wQP-r9xht-e*f~uKx4NbrJ(Yt&BV~g{|M~D6 zK801-W5%<*pT}S|SGzwTqH~^B1t$LsG=Y}woGs-jl-)32Z3K! z&pHhC>-5dcFInG@)A+(w@2pk`ntK#m?{lOYq3v0}p4c#=}Y~isJXIo|8kycNy zK>;s+UGe@8I}|X=E&JADN&F|#ctYWo?9{V3l;^OZLv;D%y zE3vgD>NXc%$*rspn1~RkFjji1mUp0Dv;(keu-|on#xH&Xi5*1Yv;*Jxj_BCY#=@dnx0_LNiI{Yj4h;Bp4Q0{f8!}^9v_o^4d z+dX(es(e!&wnOqSjqiDeQ@{Ap>W-WZQ*Pgw3V$o(ewqqon`tgV+LFV-eP5>}UU;uV zjBqFH-wdudlHnY3xcm&ZUsR*&RF6p!+ByEqol#ak<^B`xU%3Ju{1Q*f6Q{Lhb_t8*l`cU)P_X3N7Qr z1v+#>*}hsl&rinMO}u4eW0RBFyw!jef2StkNJmg=atKITUf9ZAwT%Meee@*_Q(tmv zP*jyH{v;z^u$vB!py-|~Ut5IYeGjar)1Mh%EGEX(AIGZ*hUOHK%sd<3Xx)i4mqwXe zi(t1BQ`eEUyU)vu45iA*&#`_6!&||;Z{B<)Q+d!=YbpBM$u6z;B*KQ;!uSa4xgzdm zgk!$P;H=#;z+9#q7o*{m@2O_a(ZG92e&kW<+q`fEO3uWL8z=K1$K~ZGwNT`*6IHiR z``r6JG(Hi{EbzQ_ir+bi`)_3x!V9hLDL%!=o(L;({JPxcpv6>JuHC38(5dX;TlXT3}rp|3X!SC!R| zQ)~PH@_IJt3_86PzuyjvS^6D~>}Xg%|Ga9pYXD!5B=jbN$;%VZQ}RV%XXKV(q(8%d zijR&Z87vpsr=@Zx+!f#nxwt{X_<}9@Ijv=R4E;3d7GL*s*e_>1o8JYcB}Nac7F*CoRs@=>x7ys(y<3l(-6qpgET}$ZH^3zVD{Uc^i>6PGKHQF)RkAIt)v(I7iHpmNFoM9A3Jz%lOjQ0#C|~{Vf~BZyK98E`rQN zlk+V4Gl9sEj?kY?5|LoeXQA|d$CBorD;Y2AmU}!#?I#y(XS+noO0^di{TBWp!}|?W zYZLgN!LdqUqX|@SmEbbjXVf2v5-4P(k0{^;i0)sUbUlJh(7rHDckqQ%9_Xq?yd`I| zfS^AAKI}dq1;|~@zkoH)q*C?e&ys5N!hr?$$o+PT<=qtAcXe&4*5jK#T6fUSiBjj7 z%Q2#Gyf(%y5?d50PnW_Qm)q9D3S2uN?VxQIyCK8&&^mdCOQY{xmu!AxVTV5Qg@Czk zi#iZGL#j3K)Q|I8#M)Ry*t>1=)G>fr7qMOn+P!8njKI1lDm>{l<(b!oDpL-wlP$BlZ(<5>VJ}Q%SQZ5toyohJiybCvwto{4MA6%*VveYVXkE+0D_y*HFGZPmw z&tBY5n5n!*W!Y7KUud__S0VtMrekp-4*d}eEMeKs`(n0z_=4(Kxan2tr~@Z|Ta<}2 zJ8Zktw-TGsZRzbR7i7Ki^XpB)qfNI$oLe#OU5-i;&-rs=mx3XA~&Lu$voQG9~X>! z!-yYw^}k54f|s=4$lj$F!MC4JqTOjytz)G6M_0F#2Wlq=w%D8@Gms*o;JnMM&|`V0 zdD$*Bd*s4eH&2ND1W(I+Z}V;{mPGk{q;w-ISCG*7XbBIjy&U52XZzWSrcR!T9ExzD z!&LiK72T8CJeD{zRSh+hud$*csYs_?$>3$wHj`mbFxpya2^tdRkXb<1l zr?{vzZO`&!xl7|xeJxb*4bh4A#Ho-eQ3ijX%XVbAkz<>uxU5jXt4L!^jYXM+wq+dI z)YZglQMjQsr~vNM^**eA2E7aoPy5F_<n4ePnG?jUUeq@ebR9&!D9E1fJHpo#Nd!@)gNDEV23v9< z$B?$%c=@dG9U?UcoK63%d)BzeV{Z5ngl`LNC*GJA>-Q2XYLPiwy`sxc`_~9?XXlXM zNx!y;tEp8T(p?kQH)&WMsZz1Tr`ZT)h_U_YW5f{@*0&e^SZo~8_2BJs1uaF9DFQXc zoOP0&vdqs*xkI|Vn=LP@Yn}UOl=#xgO;T8f<85{h0rF1nuB}At-r_AC3Y;mrC5~cz zEFe@sb296)Y%_v|vv-lFKia5IdXQ@A=FRb{APfB98rPJssFRH4l(mq%V-VqoRWtXM z-CzBE$pW~JPC)bSAI5)cP%Gu{3iVhh^O%38~mIPj3mbhNy9r;2AD zilK@;RJ(6Nf0?&egY2d}PeQC`JbLkK2P%d(q9|n6Q}e%QunMXbspjdiI7?>nX+9qb zR4B6y?rBf#GG5%b51xgtj(;}kbbT;gPN|NWZ1R@cLt$wX9Nz>B^0kK{=v-I0w>#bn zXL_Us^R$&QxO4%~SPqFRdoqksaEVRSgvzQdoY81fdrFcjM~?`|rvCc?dZie3pU|IH zzkN)o+RJ{48wD?WTSD8cYtu2lS7kET9`5{IVBgcR#eV93W4MguFiW%F>bx;my8lqDBIvbTwd>>f4M!=d1++kWI>3KW*CY);j)`?YLGvEjmz#mMl5GI6( zcO+$J9HV2sXGuKj;AFlx_3&j2Nu( z!K32jsPCijR;;PB<7=8Y1b^4GNAMD*qlTX^B?L93-Oosk=mjyp6(SFms~_Uv+RvBE z%BkwaYE4q`HkWTKjCQe_wkF2{Z8#GpgQ!xZ1cwnKy-?CGL6>}DC_^GkHe;irwF;Rq zio~P=M5i0Zwy#2u3T|+Pgt~t4Zc3}>PRXHg80B=Itb@aoT04!)VMOcO5>T70oET$N zPEizjgl@1hQIbf1M7zAMh);$s>^2S6l5$DC!)e7|M(gXEaEQSNV>FuBgAh?apu9Y$8tDR>Tu4zqFnOotSJs)!WpIy>9;^jBJqTgxYkXLH zrDyA~8KDu@7shtQ26X<&!1dcX1UQme7Fba{c)>H|YnZ50!@Spt!DMt9TtQmJV* zEPaX7>_w5O($t0iA=RrhUVdgqM^05WE^ccj^j9;~JW$HEU5_-vh|&eBXGV8%D$ds> z=XPgLxQmD6clDsK9V|A*#6o^lul8ehLRD>cgR%b?H^Qv?3 zoY$y{Yp#)WMaKwQO*>%F_hf9eYlISxyUEBezq(OLWt&vJX>gYt0q)xtPn;N#eMF%C zGX1GE8Qj1S^&`YcL=bz9kv4IvMS~LKz=*;VJ79d?vp#X!+`JaW$x$VS=rPlXUM_$> zSfdLpWQq9ESD5Q{5$d@y%j`kz>zN{~8&qRSXu~De3VZe(KD~g$oIZN=;>!eYkdqYF z-Av!T!%vEm%I0v|Exvcu5J}lTopx3Pt=u{~4$LTzYKRo_=PFWnhHY17vdgqJpfEqf zpQVjoK_{GlfQ%_%O_nvSup1$7Gg-RYFsg_{H zXXkvQ=?n^!a;xbwI>Z;*$2^Czb~MH~mOa@Ruq4=hmye}-DV)u?$`X{%HYxjFCkFM= zy7PGlsZ_ukWsBbJiCNQuD#_6DfIw&*~T1Pvdrq_ho>)#=fpnL<5pAD;z7u zEHco@i2*s!w{$WiXnKLCQe*jyEL9uviyLVtWJZBhmr69y3MO@{@Y5|q+<@gxguwgA zA&CD6UDc2pv{hxg{DRP9iNWKkm;AXXY1yjz{V8fCm_0r&tfY6I0@kXs<`ed7+iv%s zz2v-f|9ZI0kTb{eFgOhP0vTdh#&gh9CqdM@C{lqHsqW_m2D1kdK=r;+2mMMgKo zViz_{tjnqJ<3uhCaGogT>MxD3CrJDY{^Dk@sM5Pu-0SL3A5|kFMuv%5!X=axHhti`4?gCj-5konh;@8}3dlM`W%ka7hr;TyOTBf+sx|qR;s!90=K8b*zL_3bO_6u}=Q&-`g~; zHDpuTUB!d7e56kZ{*M|bi3crR$4ex(Jw(ey18^`;q8%;&5W@SQJT>%nv-%r8P|H|okYA3Fd7+Cts}Y{tPbE1^f`$&;XR%Mnd6ni@V#y`80B|n z(X%Q9A%wpUBpM$b8Z2N#!t?shZLVJaedf>Ekr4S-;YS~9wL4cZ_o7W^o}V+*TSDcbiC^AmN}bwof9)K&9aDz z#YlKI?;gHXHJso~bkCiMbA1?kHJ^ZT{u_uDOq$CrD0$gJmAxf))NOr3rmgPD^fA+X z9p^~|xyuoZx#WSd&@P9c4WM9Cz$BSz9HF$R%){+jw~mwp^Jr|%%{3wR_+vzTwLbLPaV{AV^`?H zB!^J7gFN5Dg97A+do?Q0AO_NW7@qm}?0Y3k;YMgHH28qn&^2mf&S+7-@%&! zxfSUJ%j8!X_38Ge3J)*uYt&CRhDun>$&H275)(V&dcNtO)W)FokPze} z{;*?m__frcrr%cf#H(wsWQvTno9oO;_Ilo;4i+f}1U0d|_s5MaJ_ix5&JCcKqOHOM z@Dc|;koWmCA%z$$#nP*QIE%N9i8E0vf$M> z0~m+{(OLx#Iz^ot^-Ycm<%AtuUdMpla~2-i6zJPx1xz5IwJ=u-<$`sCd&HfD6`9gF z6#M;B(0^YhjL>Ld;%^re+iVlu7X-HYQ6Ew7`#u8FBh^1CjtrOUfq!I~oPu*p67N|V z^?HJ=eyXHbhmbj$juV(vhYl_sgDeegkyzJe@(QAPv)OyX#E zea4}vOd5*V9G(=hv1$sb{xvh-##ogTiG^j;OS)IaAM{^p|4<}ZkQU*Lbd54s!lANl zVDt*N;U&n4FZ>-UOoaDy;8Y&lKa~mVB$dEMalM$UX6G_~a|;DWn6Z2c-hxL#HM|#pwjM(-)>)x)9T|w6GuAKlo_GWJOLeU2a#wH}Z(}du7Vv0O zmkhO9#P-=kIKhK1U6|yM;r$2UE)Bm7T z+qqYk_S6H93s*9AGpd4_vK}m)!|l-&o9?o(jL?Sbu%d}5M7Ih0uhsZp@%2vi>Jd0k z;Bh-0vMr%sl)2QIkpo*<`jw|no@vl`Fd_`;LdoCf7`r*8Oi9FaBBGf<1u{7USD3sK zR%cf-qIw@Y#OeB*CH@G55cK29=TRJMa>H7$9U#LTkF>bDkVqq5W|guZt_B9~&cB_1 z%d?{mKNBL{NDblgXn#Vt_wB5+mRGl2Oi0altXsRVU`xDxFHSno$10NuQz-p?sdn3>_XU@27 z#pnDSz7=I|p_3Mf&Godg+X(qfmugJ@1Oj$=5-dEI`zR;}S;wNTQ1Wa#)mO#@tC?Yj z<4!g=ZAESld;|SV$a;9gx~!u8Src%E>+!cao&hFV@M9{RVQp$57ud{`A7 zMJU{X8}%dVH^r-gKD)T;>GCQ|#!CA1_v)Tl05C>OT+^;cj_Z*P18;k0mJ5yV^Tu@o za=~3?$MK22zm3lAE_^39TMg%vx&{i|)UT0Dz|~bI91ohH#9aE+*HS+zb(eE)m-`XT zO?hBwXG`Vd)s0fF8dlw-^|vooB{P`ao8V~^tJ$&?E23ylBGySVeI+|QyJfKdds#Sr zOI3E$m5X8Nca_%2$bgR+quRAqX4Qvbhv1GkcxXhYcDI2)36oKUzM6>Sg;m3Ey}>Xp z-rBJ_2Q&6mRQeoN;qR6E0$A5F7JapcIe~cENdhgc8rs2)%oh~tzSUmloeWBYQ&{Yl z$BES(=0Ds7%0m*n?7^^nabL}ag+QGbY*4S-Qav8u*|VUKC!@t+bD)MxPBq8>{pg2s%cq3gP9yZ;zA<7|DnL^tbp<%UeDoH{%pag?a zITq6IS^U30TcM7=Q-_2e!#6&8F*RUW2H8k5L>pvr7yZK{%Raa7r(E4Gdj2oY&IJCd zsq5pfnUD<0>~BaRbm6;cVw9TN@IKN%|XJPRRYE<$7;BAJIIV;* z!u#F(oO92#@3}ob@B4iGJNKNu_Zs%vzrEJlYoEMt`TdvHyXVSz(+@uWprtR~{q*X- zZ@;)=*VAsAQCMrU+20Hr(dN*hJvukP;NW}qyX?|ue%bluox6^Fe~(=T9ddNHNsk=$ z_sC7JxbKCx&zbb#ZQqVPuQc_PqbBDYH~w_`qR;-i?YjxvKGtLWJwtCgx^YqQ$79c5 z{NSk%jr-%C&sSvTUf2BeG1GTWfrxA^72M=##y$5tJVdaUi(y*Aml zZ&&l{H@E+(c#3w+1y2sV%W5%l$b#?kV_U4~czCys-Z3xBb$xfcGbWuo>#cXn6D}Tk zM z{lxoMmHR$BZFr~eo_>Amt-F1A)$F6^pK!o}HmC2m@{PUE*nIGc8S6g1{M7!|HMhO6 z=k+(VZ+6V0p{MV^SHmqIY<$t6f3&_2p4GMG^1kcuz4-W@4*O&4wU_rfY~^L&H>~%K z@#a4Bx)l!U)b{$OkDq_o>=yXj{_Fwote$e=>}dzi z{J+gx?Rd?vOG}vohws5x>)-AOdJ8_tG zX}^`Rwr*`?V@1pK^tbXT{Yfigm^aXDp@y_1Yji1{%_PGn+ zIrg3#cHPfjbbQ-wf4+PB($sPL-8JfW`=?L8*{bzLTc31K^Yi=e{n=G*uGr|Li;f?5 z$UUphU%$@}*=8HzkpE=>5=Qc}LvT;g{1U zpZCv?x2=EnzSEYU`O~wvt@v&5wjWKJar)m!PsiWbIsefY2P|4JuII{bU3&Ka)VOJ_ zop$QJ`F~El{oIXSy6%I+=RNlQI>Q$X{i{ify*pgF(J>zmzxSZGwrF_ug%&O5{N8%% znZ2hR`_<%&W}Vx%$wgmuUfy@qIjau4$l7Vs-CjKMttZZIz5hj9wm;$Spa0sY>oG0o z^ctzWepLgJ-wAbo*_N{ci7DSIzFx`1QE0&wb#&8$NjSxeMNI z_2$>R?S5GEKX!kw`_TSxzqNXu9eyvpa>L9sT1|c9v7x5kw)e&pkNS4-dsk~$KKb=| zZ;qHayVq;;Hf}P+o_owO$FA45pmvr%XNeA^An2W{8vn}b^~ zb+)_ufzC7kJZ$v-jjx_}QnT*obm_Qu=M`tQ*=FT{8_YZG_ul;ZlzqSa<+c_-ZT582 zU3UBYuK$~}!{%H4F?Q*;A5NXT`6Y#=OBcRicD{1t1C_q>idRfqwo6lO-0Vkk(^o&+ zZq$1x-TU)XR@XTlc6qYn_rFZJT0i!@?@oNT&-KUl?y&RY&x~4oXt#a49)IA`haS|d z<8G%m-KgnrTRppAoy&WUDL!!VDLZW6a^{O0mAWmv`TGsmT6)d$O)qac_u(t9w*Nfz z?UN7ubo$UKgJ0|L!!PST-E_0*$85Fhli!whKmNWYxeM}3<{WhUf;+C+Z|}ybvzHs6 zn*Ex;b@M4RU;pLuGx~hG>yo?XKC|2&H{q!}JN|aok*m(>mTz<2#M1J04?ef^N7l^i z{$t&EMTY@*y*TogRr{{kY_CV>bbRZ)Psc4-f6K{Sr+(e``^$dlx7*?gm!AI6JA3SMs^V zwR&uDoAbZB@8jRrIx4gD^Ya>K%^rWsi)S>YCPmEpFWI z=Dzxs2V8sRovRozOu<1tN)lc>EflIbba{y^9~ui+g6WUv*4#EF4^eY6Bn&` z@5=1O<0pT*VD0=L_Z>a-@f9aOx>{>7?n!6aYy00ZsLiN;FMRaUsJCvLG-Cgo%By}F zaQ^R;T5mTj*JS9_z4tw<<=;PdKYGa0Gu!pL_wP*>Ea^7WI_ao$PB`%E3HGZUb~*E< zqyIYfoCzn*d3eFye;l>6$s4nV40!DE(*5H;*ePpmoxS4QO|M;X2=C;KmF8f>La&2{qnkV&;EPPu2YZS_4pCr zp1swI{v#f|{N2f~{B-+;w~TmT?vq{rm^~r4aMg#SHXd;8-5oYKdR4pUPx$?)kGed* zamzMsAO7yOhDW>XvD2;Fy!P(2#eM#BXWJWZ-RI3k&yG2DT!$|=UpV-HlQ-{i+}h85 zw({}(ZKIyLbk#%lyTf+b;Li4!-)BF6(XY2WyX%${);;UvPoKGM@>VaryxETbG;|ts z;sdJ}zIf@v#?O|Y^5Mnz?0-d@!?sxR;g~a6Bo1L=PEr;dzJ8hV}(ToY(x|OSj$mttFq1 zUT34L9^ZU}FZ#T>xH9mHgIC@rd}9ivuN&_fGw{Yyhpm6Z{1F$-ZMJm3Pj?%=%iu{TocrDhuNBw6DmVIv zj~+St%Io%BJ^J7&k4$;{t~;KXwtlZ&53StRT5CG4^T1Q@edL)g-}mUheR0(C>7B;) z_~VJ!_TT)%Z)a{c<&r}uyuRMvL(jYX&r<)rvp-$j-+IL8x$~-Z7dJls?8=`eJo`wC zvA@0Y$f)FaG_`)m!ZP z$?&B+3~%@ASKD^mYu8`DX?s;}TDMU@-1*>5_qD$2kwGV2de08;_U-k?76Y$rzo>l9 zh`&F0;mMm${O#9IHXb{v#h3klYjWqXYpwNoJ^Xq%(dfor_qC5V3 z_g?qfoicX+3;G^-(XdAr_4{$JCBs)7ox6O_@a}~X`)ynL{l{BP?lxlA8(?q&b^;e{?wf3WU-H(q_@b!Rro zT)*wYhmY^D{xLag$?|bqjs5nr{<~jkzyHajr+%=i_f{|DujxOfMcdQv>QdS6t($&s zvh|%a#y`;V!2NFf^XZ*B{B`FWSI*J;J$PYG>%Do;e%rlo{JDJX_P2~5efLeD-2B{E z8^65nq{$D@$ZdVfQ=k0MFn7cY7r%LS%ZZ2YJ9UriN50+u^Es>U9eeKqSAYA%$6Fr# z$J*UCob`AQZT-o|-v8!VbFb8H%-lNom9K|B|L2TP=5}d*-u|sde!TTx^IxC6cc1S* zSntD5uim*q)0Zz>{_4S9*6%m%vG*<=b8Cms?&<#Q#3?Pi9DU-b{=ckq^>I%xylCEM z_M%UF4s8AAu_wQD{wM4IGWV$sTJ3pU^OlF-yx`?wpPcpJCr`}XcM^F<+y684yX6Pm z`PjXWTy?^}dyU+n*V*UH+3@kzV=p@6hkWDEBd)w}-+h{H^*~`F87be|qJD-Dj=7VM6JLTNYin_`b#cwTVCNS2|@y zdB&=?U+psWv_GG^cx&_2Cti8=z&D$Id+y=g|NQSGo6ULY>3%+n)^1-U3~vm`ME>3H{aT} z?@bq;`{&$OrgzoeAMu=aW%oIYKJT~Fg45p~^VMJH&A!u~vhle0TYNBP&WLuWkJ|tI z!qCMFfBx?g_usnz%qQNv?ATjg?|1n{#-v^+?D&5x2fuXG)1wB=8@~1A6JMM0TdU&p zC-1ZUJ6krn-kf?z^MQ9H$2U1= z|0&`2bOQ}cDG%vLvHxus0TmpaOSCR-7@fxwU~p0I`?k%-qo+| zwR4jZhwi?^xr=B2wb|{@H{0{&mg^M1U9j=~?>u~3yQMG8AN9q=hxfQ;&|b~1-o3Hi zq-NtknN(^#>wu}7_qck?2R3WrwAk_Ro%(%WKKrV{-#pay=*F|R?s@6ZZ+5-!=5y~~ zy2q&P*IjGYFZb{H*6D*cuk10c^{;I%ThX`K{ns~4&vrZcq~8}@*Zim4tno*6d+NAK z*_kz=IQ_87Spz=Pw%U2%&ik}@Ab;W)3ums?{?^K`H$Aa$^P_LMxzn>RzP|9Gu1{^3 zSv6_efJayFylJbQPCWLhT`zj$+*>F2dH25Ke}9<#2J4gO|GGVQ+|UCzC{I}R@W#i# z(c{3I^$G8Ncj>7oe!c9d3wrH$R?mwU+B0_lVbSm1THXHAHsADldD(LhJ=^WrUOW7= zWv3C(SX90=FF1Tvk7M3`=87K=T|BgS#U}kMJKJ{Pb9a97;M*(nM!&CK+WW!clqQaord%uxafraA9`t3*Iu0)|L!>L zg!9(E>f@%jZL@y+_N`Z5(fX9L@`F1cdFmOj{P4;hD?Wdw@0p4{%&CwBVg*b$F^ z_}csq16v+>!KL>vUwmQv!(X{}v#sBoH|wB>Z=NyffuH*SzJAZOW}oxYW@k5yYuBUY zKW{z%hAk~+iLoR6<0oT{izRLbK#kn>^c4NlXm{F=fTr=+iciP-M2mJ>Ejn1($M3bo_~M+ zapQH{Y&XAY-z`2_&||H|ul7Fv>_OT#y+&Q|)JfLv$E;lP>}TaozdZQ$hflls$lJEJ zr##=}i{gkK=WhD!po^UTH!th8=k=F#KJToP=I#A(zneE{)2ejfPmd3~@aHo+9{1_P ze++(k(dNhX9oPMmHpgFa%Ea48-*D9C2i>#DgjUn0+}pTl{tfqkbkL>kZyPxCkh2fI ze*Q(TFZs63jHZL`KI|>y?)&w2E8jT6ns@v1A2(Qg#r98cvf+gne!0)ky>BtPK0V^} z8B5LFGpDv%>&h1fo_0>xzwZ9z`3^5V)qDOSO?UkKpm{s~JiB<@{tcu1ztDf1a}Qjn z!*AQa^-cGSCU0=@nPbK;`Fzp&-BvWY;($Y5-C%CH>$_X-(&N#kZ%=8sqtE2==QZ5^ z)B7V=uK!wb?2-ds@6_?_1*LJ1Zt_sum1k~PnEB@Gum1echBvQMUOoJuGd9{KGvwSa zUTd~q^M&6mI{V8F=e+jf&jY&cyw1AEEb9Boy-!|tO0zfmbzE`PX2<=x`pWG(4&G<> z(L1kd@!U@roHVuE^6yrMp7`4OkI#Jf>n$I+`TI9Myz$TLPCfmDLw9=R^uzDE^LO*r zOOIV}&a|J`{qWr@j(KD4Bd0&#`^9&k&-UNtv^!Uw*yiyIo8J7_mMfooaoG4fHXQ%U zoo5~N_3g`BH2$^mxKlc`yQ}$C9lw6%%^#*rT6f-tTR;D&J>&Nen%wm3#qXcF?9>Z4 zdGU^odJo>ENxNnKe(H z<8S@Gz#Jzusyz9xO>BdkFIFHbg#J!u5#vgzwUCwxNVomt{C6@;qmVbd1BUs_JyzX zT|NJc=|!#9 zeSOn!H@baU@wizdPdM#^FIznKz;DAhe5x|P{Z?nsYI^mQr4R1ac6rZ(w%q68N00dU z$NTQyDRWTk51%^vhmS7VaB|l!jdS;Z=Eot6o?iOI^b7R^A3yr9+s6&Nq1ETZR~>#( zZuGTdmVa>3d3!w3WY!~#SK4aJ|1_<0W+W7=9u3$Zn|W_6~|9$PBP-2r86h~_o1s>bhu!~4_m)> z^U8j!e;ahqm&YwU;;a46A9m{MKFxARwk+R$u=e>b3l}vV{Q259eAKP~wTGTLe|Xd1 zC(W8Uy7Nx6Up;zpmkx)Xu;r@TcfRGo=DWq$;LkXrYoQ^@{2A?|xLL z0euw3bhht?{nlWW*V&t@95jFxH0MGETJ(SkbSpVfjoTF!_T)Y(U)kWQb*^00ml zq7YBDq>f3omVZ}L=YJ}wQ*7s!rU_Njku`MO;yFXx4Q_WrJ4MNydew47m7F!Ii1Y93 z;K-sk(KYYh8IVah72E!2!>QDl1%X_Sdc5-r2f1Z`&M1#``PVpRM7zcl zMwZL%DkDaZWJsr$-ReNHPLQmv6CV&&{1Q%(Lv>+2F=WQ<(e8a2cF2% zNq)_wflWGgY$y*ejVPShMAHmAA-97^3~yv!j4m{uesZ~?otVK)hy(MZ%Ho%Xc6|mM zeAt2g_U_!XXE%-FQ{thRV2*Rb!tO=RZ{vWv74bw0YsA)Wd#q9fD;%Ekv|Mg|0R)d6J$ zKf(jjGLHT~52#149-X=$!hre=P>)E|8;h_gJRmJY<*(|9G+|C7Bhu~UWUD8%PW?I^ z(q({WXM2tqe&{}4#j?2cbho>Z^bD+IReGAvNULMZxCOD=`BNQxR^V|4j$GAKJTT z_fD!2dn;Lj(TQo2GHUPLv{7pr{ePc1U5+^LkpBH+%WuzeX^4u=iD^`Oz?zsdM>I)Q zjNHGNSZTHQ5)4jEvdDNH&_Gp@HBW_78En}9yCT=aH}OGB@C4%m;~5#W&cCXI&UgYz z8+6VQltoqfu>9ciC?L*=(U@~g&0%6KZDj5mp455_DX~!JvT}Ae`zZb~!Mpy^ii4@oUgY{-aZQbk2wmlY5Ptff= zYfAn{I?v{kW?)Sz&t~PE0X1kIlO0>mj0O#y?e^(v)DaD=)RIl%&UJL;-%_q;a&G6k zX1WCHn#TfN*S()~Z-AI+Ij%_OhA#NCrfiqrH)-eUx^8$()|my8PTeqFZPyJcO$at@ zS1)uUtLR)|&1$nf)_IjGZ>s4=&XurkN`}(8sky?}O-bbu5z0*kXj;?GP1994-LyQ) zO;6^!>C#E(jw^iK%q1zeBtrRjY`0vv(7-fz6;8KY3&;~+3oOeMgq2OqbKR1R`j?&i z+_qe*8g$#6Si0?^E}rNfcWifD5w_dXKK#4RZFlz2gG6&k*p{YR{E_oSopmjIgPwIK zU!?Qw|72dJ{HofXHT)iYnP)w#s%Jgh&P?;v!Et32>D-Yfa!o0ZcJA92-SMZI@|-lyM>H52 zcaOv$o?&Axb7z>5vD}GZWZV@d+Ig zzmB+elD=GWyYrJS+_}OZuHFjqdrD|zq&(xD){!x8 zFQ30YWE0rUWibDhVvmVX$Tvzy@6nAzDZUI2lu)xle(r9Y&j5NlQ6WcLA)nofxIrA-QWUMohAR2ZCldB`E7etgvKp@ zkGCxWksP-rb-D&mT)bLs+Z9H*ZH4sQx$m|em0r$kF5G~iEH*e7u*wEZk2WRYrZ;j| zU_KjM?aR3s%hSK=zuYa#K3Z4UwRC-K1r!gH71>fmzzc-;A6cq-|!#5I{dOZ|h=J?D*8dcu&JH@8*Xj^Zho+r9?}f%`r)ztgD1JugIv z2Kgk$65mrOnu}WA>abl7yWqrEAQy&*HADU$Z#*!)E`YD{JKDJ8?lAqv6C-zjk2hWw zrsLxBnvHvOxuW&x2-xC8v76+wldCSBjtjSIHtv}o*|<+fxbftibzG-~&>P2z8s->V zoUmnf#~HS2j{H5!7RPn?xQ(X?)Nyw;9?v~E9}=khd%W?gKpig52(P8Fk-Hmbzj2R_ z5L@K$@x}vzW}}N~yz#I=eLBL8i{E372Uy67VWD{A5rKMigd0}~G+Tv6-bSgGwnVUz zlfXuf0vkC2Hga4)N6p4POX8|x0@S%4qZnJ@#vJnFV{XJ`PAyj^N7w)nQ#9l1wGxN(I*1L)+$pi^w*{zB?C?$Qxz zTmg!l02DbfP!w-GBG3fra}=n^2~d&ax@v2&#b4#!k$ZH6MlOGkX^Xofm)a6TOtF#s zfWm9sr6b(9Vul95$n!tc9C>7hCSZ~ym%-S`1DNE*U{Y-45uD_Bbc9B(06z&;&ekBpQqH zJb*_|93DlGisOL^cgN^>bc9E)n4tj-a#CTCVW{rh=lZ2PVA66QIcbJvQ^VCC^hqQ8wZ+^63aSt`KMdin6JoC>sGqJ{_UP6`&{^ zfTCL=7*HG>)b3r+(=(_G}>3IYc`E-OESIp1=6lGIEQ8ogKd^$pn zD?m{;07cnUP~>@U{YjJnMX~6M#EM=tR%%NsD9T1akxxfxy{X0X2q^OD z2sf?}XaI_`F>g_968S5tt1SsolvRMDYygU~sh}tu0Y%vaC~|*~P5%HCWn*5U*vKQG z$Q@^Rlbcn5A}{PF1)2(qvJp_^(-Gpi0u*HfP?SvtMOohk}N)kr%hUR8V9`K#@;J zXygh{ksW{{I~5e!5m4mQ5pG-|(7;nDHJ|)e~~HN2qZHD6#@jWTk>4FJsT=xkpF1 zafLtwP-LZoA}iu4^63aSt`KMdimX&nWJN%cPe-V61t_utP-LZgimV7I^63aSo;0~u z0E(L=B1R8)Ms}?A7jcfu2x&D~gvS~u9w<3z>9b=J76T?Qawmq@9LQX)V z*kJ(a7qtRtWW}ISwCxBovJ&nhOM#5602x^^WE5*#%)%;95_v_IB8280PLMo_d5a=# zn-N^(jxy|8bbpU2et?V27%qyn9g$@sfMzPPip&5OdFM5%uqf7cSe8B&fexC|l@uK} zmt(nn?9^b!P*Jq)2q1J69p9VPEE+U z6N5srwj;7k#LP@ZB9R#&Av1=AqHRZjkm*qo;)wzXnSpo6i~*ro+YwnNoI|F>Nilv0 zILM6Qpjg`x8=C+{rXpZw2B64{fud;J5!aAA%7`o#XvYlDj+usb%!p^m9c8p_g^dlc zkC}#j%n0`J&NGHkn)`c<-vRdVPD0k0I}yK-Pen*i6xhcM{6c0L_Az~EDY1`FMYwGt z>)5yh>|>^3A2Wh|%mnsve~+~tU>`FL`d}t8ul?F*vF?L)V2cq7y`Dcz^CBu#fwDbj}+A_Az3PAYY^9 zF54@);J2N?KJM@FwyS#*BMti)5$xkr5#osg`xt>6$VkIJM#Kx`QxR@kA!7-`tY zJ2UI^B!PWmwJzkI+X%3ak%oPYh!4o8A~bFV_AvtN;~hJ#q2G~YA)ktH+lqM^U>_q5 z`*>%2eV%w!gxXeMA0xm%UWtzy_TfCZyS4Yuc}3@C1p62XzmFk*kGCDn%QWo6QFpgv zciai=hU8^>ep^tk6<64ia?g`@A0;)*hf#p zK6(WEc-2lq7}@FD&rA3B7*7K1qo-jXuds|~Pkbsu<5plFJ-|MC8urm6*vF?L+;$TC=mGZ8 zW05eQ3v#{GBiP5MBHXq@mI3ym)<}weN3f4iMW}5B_VKDS30tM7`F->V_VK9*x1F@H zZrwYHPbkomGVTcW(LE|cZ7Z-3rC;0z8Fw1?(Ic5bJ{94%6|xMl59Mvr#_bU$?I5Ko zDndL_U>}M=Re6%;_t7KR$EPCPwnCNx_VEf{ z)!<3Q??ZhmIigV83hbi?*hf$E`{)tu<5LlCTQM&K?4zgoee?+S(LE|cZ7Z;k9{7Fq zH0+~C{60Pv;kFg?GQd818urm6*vF?L+_plNf!~M1W+^%t!9G3}p|%w!Xld9-i(nrLNl6mJZ7XCMU>_|F z`)CpD<5Ll8TY-JF!0)4_VIM7meS9jyZ7XCM_xuVIOLC zg>^9D_i=xZ&Uvr2nAGny?4w0uUOpA!aVumQU>_=8r|5SC`}kCZ+E!p6ExHkNbO!-vRc~(y)&f!9G3}p>Zp)k6SEU;&1A>rSLm~ zeS9jyZ7XCMU>_~b@1sSqk55IYZ3Xtx0_;OQ*_3fdu#ZD#GJd$TGk_S{nAz zBG|{LBGk45`%rth%9Awg;}tpd_9U7|MYwInybQ1pHTG)rBm#YWB7&yn&oOQX$R`c> zL~xH!L8#&6QW>D0G|&^lJl^O-%_b!n0G>3w6M;M4*n?&jU?=eN)POn?+<2o6wUiW9 zfNWyG#$QIlqYxwC>OYaZ20} z9c=(^V%WxSR<`7gHfTxy8f&R)GGj<4su*D)<0ETVFMMn!^}^${uNIM1(&S_e+&nR) zM0*bl z*`qKZN}1~8TkaU>i8LF*JPF7ne~n5!06a0g6Kysu@kEA?0_+5So*2~eo0Y=!MjOyA ze~k_>KsGU8L-5RVCb_O$kD;yreSGE$(BDOQ0@Tcqc~T&r0Pw`{P9i3xfHVQ3i2<6} zc*FAdnc|M!S4BB?{~!L)LnBvUo)F}TdhWd5B&QM)BKaW7^$@=CKlQFT@D_HFRvra6 ziTz`8Vg|@2y5I1-5RHa|S&5N~AEN`U;u%jvz35w*y9x9nevGzKjaYdLh2Kh5#iY9W z0M`|hH&7`hAD((r3hNhQ50AQ6ewet%sdbkT#eMoT=0`T}$qf;**M`=`6Y?iFmPfYL z_H2;rPw+(NN$ioaCzX(eFnDWde$=QgJ@btthn%*jxZ*+1i|F$~`3&3HGVV8WWeS;$ zRmv7jt(+&)O*m4klxPokm?UZ-Ra1uy8`2mXXQZDsXfIYoSxCy~y3d91$Z1i}*pZIp7QqF&0I1*4EJX@yd$0Bv4%qXcbw-XVxo$X0M2l(Jc~WK)K}qB~}xkktw% zU)ruANq$)0eo!FTK-B$uDiANK#3bgO_ZND|mw{Wm7NdIkRY&OJ%+^9kmP%Ctob* zD-I{%Dn;W+NnNvKIN0%dE5mi7%;j2681-)DmYRPm=PGY7)Hd`!_jmIGw{>K^Tyly$g zf~Hl-HFq4LTwd*<6hYVJa$L~$I*kfiLWeqnF6OiXlQ}PR9SzTx?0hMc&swHlv2!Md zPV*{-C750;l$?wW>ujsc5i*Fk@+J7pk>8?~5e&$=Tb=lqY$@|vL5IgVtw=3_BD#^M ztY#sPQ89DU7PzZw;!7;2mC^I0w`kci&b+*nx9q&3>1E9*SbT|vlq*;A%YsqVwL*q8 zc`d6~oV<-S$l8^Rna^Ps7_H%=^u(7&9y7siwG3mjbYd4Bt!!iN44Z@K89Ae+=}!@K zT`tE2t<~!^Cg|`=t~TB9hfHLR8croGQ_ho|k*8{Ixk&97YPn_Q9I38gq2+2&UNiHB zQrRjQoEO5n7l@mPg#d$&F{oIsil~{6LKLyVmW6I;cEQdT3TB4dn%N4AfhEkScl0>H zbWUm;W#$$6^LokB3w9~zUow%_oS&0Oi3D%Xf1~xOt zZCSRNw@Q@tEf)%9D{q!Tfd#1|HH>~G%c~{3MEz}mlx9^(<^f=^?&dQ{P>$Az*%AB0 zSg;~2>6waA!0=|ZGP(wEG${T-R!U zl(R)GU!>@7hGQ~$aRCli!C+~(7_wYxT_0^?v{spl9<0f1dWsorh=zjlk(oF08MZ`H z&`P9_jUrLMXgL)tPwXL^VZka^%wh)gS(f_}R7B$S+Jdgnuh{BkkaY$#SH_YTLBuc}%%RluEauuS7j?6ocbHCaoZU{*vdU~cjI6K)UWu;+ z)18856thl+%3C?zDl$L7f~HYMT`D=TMsrP_(iU)i6!r8l^z5gK8hQl~1L(8X6f=|v z6h=R%M%|=jme~dtp_R>rR&*)r=b3dh1x%x9gVus^2joJ~jF? zhMmtNf{d^QdQOQbj9doS6*IEH<#HhOEEU{YV+xopKvhmSX}lA62^9f{m>IjA!3Z!1 zaPSn_EIAZv%UDK1N6@IH9Bpku*XMGaMfEz33A(;#jNMhqC=*t#R6w((4C_#ioetzU z8vZM}OLWuK5)8m)!Rd8?Te-qkSTEyMW4YAIRw0`$XT)xQWoij0zDPIEKp-b_|~*6I|N5q5f&8HLW6lPJ7yUZ zfRu8XOvPkp;N)`{VB7}Mz2lwRiqpwfgsh4R%MoijgynMCN*2gZRqHIUPS`x}_(F=H z>vB29qPm^N1YO@V#_8Nb7Vv1o9x z%qaXH$RUp()XED%t7n&K2`392E;F_As99cPjxym2Mj79lz_H#T?F7@sj)?tLwqO_W zmpJT(3oM`|+_tvU{q`dp3+x?ZPIK}(v`*Jy^X;o-Acg#cl;1)RjD zu_FeR2?7Mu-7tBA>3oUDw}Pvrlw&jO6pGwFgZ5i^%ko9(YH^3wkoW0&THWqf5oGHa)%?$@xCa2Cc%i^Id z~8)OT(Dq~@b5{$XQ>9~sEZ)Ph~!WGUo&H(@t zWMEd|^2r;SN?y2K{o9P=qh%wND`IIJJk%w&2>Bw2-PF+#vG)=7$G^Ze{v~IQ3q=zJ zvp5BYDxw&CS0O1GrF2J|t0(BXT>f7>jS0HGXAGYpvLs%>`ZwM3#FyXHLfnfQ z!@yVOr})y1@F%~-+)x;kC`1_?Q7F+HN9Uaq;N2+Z1OoPoj>!{Sf$1HCA* zFcA;IKgZ@;x;=2PDe1Hc)>KTKD;7uucQFoJzGeX6KwP&{MG_InDCDir<+z~hbs7_N zeb1N(77{z+%oC14LK7MASdId^#hh?%dh4Zf)nkPed#b$2mW*;_4u0fZK3CE5_)hGy zF2&_$=p~p=h}JUnGE+rBSOI@=ZJFgy10ztBwE8tAFD)`B*BB#^Da^c@N9p^ba&K&TiY?U(r zfNUjK&J=S+HYH`d2$qvZzs`)V&*lHM)0m(||LJQq#y6vt%EBvEaZ2oam{-hgjR^__`p?~&X;22T_PfaBNK~Q!8($yT+U`opjvm;QwBAVi&kNYpf3Tufx%!nu>l9n z0u9By^eP_51&t{X!C@PBi4A@x3`GbWhYx;s;A2j@UDcaGTN9uQ2#~?GjT0?Tyi$1f za%FB-LDcl=m9RU1VKXOKsF$pUW{pQwur0 z)0m*^d&cl-;F%|q0T~5?P`K&|_A)JTc;`u+5Dakh3lj_w@c>+4c#j=mXbInMo-h!w z3WSEcTQI=QdP#hVE6gFkpCOj!K{yz#1)B)_cKB_i1st7H|8 zib#AQip74%GDzf*sGHfYv?2woK=9Zu6>#kobyPBM6Fp>Sh%v!^E(EQ1WD>@}RuLet zfYUSNv@^3wS0G|VR0Sv~1nuUwB}Pj^L#4pRne7GhpX?<<0)T%JS)sa{z#@!Dj5bBk zb-5fDbiGbvg0AlwBY@84rb2!OY-d>}{6@tqHz0+u_Fmt>mQ-SRK7$4_w4)O$HNgDHh5C{!FX~lg!NKu_R(ftHBttP_(I#$DyVZ zm%u$%V6#+WlSF{DoOhK=Z3`;QON#C09E<`N1+tYSie1c=^1>zOEf>lqN*Jq*iBpUy z04X;FQ?eF$4i0|X62(TOa=BO}MbLG*920ciPGf?u?-}DBAmW4NQjuH!w0vG>5a9b| z>w)R6RD`&^%jDvk&V(-HVRw#6T_!artK$sClUc0bJw;N|j4IdYtgzg$SYTy@g=@S( zbQ&wb(v3@0%n|R_utc92NvsA7HBg_>5grTzW@29qNHYX5V!2S7?yQJs;I_vR#D<+! zg4H%-0kMDs_yh%{!ab+5B3XyUh=P*r9$8x`mr7(bkJ}Ju3$DS6Sfac-VzmWbpUZJU z*XuMU==z>9zz>lO9dAc2hldH%Xp`pyKw%wasTFG%sc=dL5U49)!3a7Ns3lc|sy%oz zxCxF8E7>DrUb@cygt&@?J91pLjsvwowq2Pd7v>mdkqsT*GWn%4z(AstO(4~*0L8dU z)?)K7_H-l&IysTqBfd1%qb)f|6ekcDiQ+fp_6)Vzg!CX_Kc$ z?h;O3{vh)V;H|UCBPB27H}|U+gxRi8{)BBUdky^d z6ptf;&fuCcv0))pq!Ki7hYEL^5CRdAX@|`jmJN#!S^`l^1MHnZjI75orX?yjG4D4;-nS z{2#eUc=1@<$&bshvnpssMj`rikCrC-#9EQ&M4TQ^9C>mmGU;ZR{c?^x3#lUBjhnRv zU7yP_L9^9M?=&Xp`kpazWAJ{OdF&DH5t6pb6&9{?sZ!37tDF%GAbCg0I<`@)&_r%@ zlE+XE9EDl-rTIz@bT>j zc`1@p$gYz?f*-Yv4i+QgMiMG*2oAYH)f7S3<#Jrm^*W6ST8zBTj4m*3D;lv000(MH zu8CO4$l_on!)gmM+yfg4))lyv7>8DtEs=r2#UD&c3Nwby2R;nBy1VCX5?>O30(q54 z8!|GaSc1BVP~-7n!zQwdBog|l`kt{I)(Z;A)*{WC8|CmOVhi9S)n5~IYsTPzT!BwoY*jsPpJP#sO7Pw!H@#Fv;E zyg)=@Nnd9}0z^YcOL#Ji zwZ^B&CRoH9N%kiEXUKW!p65$2Kp?KNL9(-5!Q-Igz9_LvEfBe6@)ShK5M!zmS02u? zVJ2!udLD3}4}t6mn@kT5h=@MD8(89f;_xKbm%s;0Ivy?pqGZwIgw^vEt4!*j0Audq z+QgS^@QE-M@Q||QMgv7UJJy?vA#?2f1zrapDo2Z-7fYoPK*_TYE3r>Q+QdP)4i7sh zM(emPr4&Ke<#J5WxG~Z@jS0HGXAH)&0Vd2VGeB`Uljh5UWaLVKZCf5y@viqwu#Ox# zLXrqmz-Ju)1+m5!aTrn37x}{g@7B@8mlgcX8FE-~xspa{an7S4I<#0gu@Pb)%^;La z7l(FooC+bKxI|VrSuI+b&vK6SXx#p(oyG)R-!qnH z9+O_qE{9A`V$lSxOg!~KCA|NYin~ctno;7j01~!3B>j_@f*k{v{+%U zQX=jqPKPj6WU^I?pzCruCg{4I#spp8Ggfej%aWbJ*%kwEk;nBxE-3a7mxYDv12Vkp zLlR6U>On*kQ4`U@1Xr;4Sz;XM2}aHmE(py%!I1cp$PcS4UJipjG|;aCyKOue~Yjf90FVc9ar^VlVTH`$AcM1J=D^vNzFeMZ;ka$L~$I*kdszGsXr zv@H&gvCDA^wpkKrmLv**7Q0){LI^>t#f6O}Q(D9_$a^L4ip{r3?KTiL+gu5Zyo;LR ztRvEt0o3EZAW4{bBS$`%@T&HVuFvI|ph?V4?=&Xp`kpaDeWX!x_y)90t_f+@I-??ygJ=*aO>D2c zJCYL&z;QutCHNZ0Crcf>QXrJb!~)z9sN_qWU#i(vG2^QJm zv>abDgVbMg{uptQ5>z0m95**}rNH(s%RxzinH+76FF6g&*$kvbewxWCBqLv@DO`;p zESV7G6|79qY2u6rsuqCu<%$h+GU9+K(GVa82@qnmZfLZ&pzCuvF6erlMg=VsuhLOB zK0Sm~&`RVTk^`F~PlWRaq{E4LA=nl&yvt7#4B*aQGHe8fB`t_OG>0jR7T#~p-jW3E zGC<9A8^5JRk}qdC*~j8CEdZx89KB^TZ^(T#8OKUN1Ix+KW|bx=O?Ctu9hMH_C}Pl@ zd=^aClt!QEH<{c93o~JJ)@lI|fPgrl$c)63%9p@AWuJt*Nr>UFE;Q!yS-j;Ul%7Rd zIP&P7{gik;MbLG*92a!GPGf?u?->L6f-&&*h=gupP(*h)$5zJuO-u+xELi8(@JR?- z;D6kRG1eRqTJG{ z&t4TtT_W!b`EZJr)sHl63^rad2@2ub2U~;Yi>p72K|HcG*olV3VYr zmxTRGY;znDwiok?134fi@*ap0uu_XnQbz5L#>lwh&_WSXNu^|)L{JyS=b#GyBJ#P=bP?NAG64S)F5E0E zD}kc$9gvPho())=U9p65_#$e2$>Pq=l$z;a8i!C2$w)*C2yUPPLb(X6sJ|peRwmCM z?=0bDW;Y?Fia6^`W;!!es)!PGlh2JqpTG;2N}SHilhmnKxY7l=lffibcklA%xcvd; z3rC&9)Mqz^5eEv2qlF?d1;X9sLeg1#M%U+ZT+sD8jS0HGXRMTGhruqG!&8I>m{b{x zPO!~n9W)5LN(8JvH(Vkb$-bLRFXB!)4kQ^xd|RBrz*|kx3*j*F?wC%nj_4C}q?kiX z0L?j8T~bfU0@X=F;5;niBATcaG&M&^8p5?sT!NV_d^1c_Qo(?8>;UM~yFxM1r^q^B zZRK>IsIWp@jol$}RgR{x))&Q=&bx*<`6b>%a(h{1*c%A)KyO?_nZa-D?Mu9?T2lmF zm&5CN$Z;9#z3BET#2)M!#EXu=5O4zUkp z_H!yvY_jmt;LXHsOUwdsk&dhS5;qCT%Mhu(fe|AhOAA+Q+BN%*18in{WMbLG*91}ElCcV>`pzC|a7&STF#Oa8`k;{sE zkvw1Yy}*8j14D9lsaINNlkkurB%-t8pg6!iODcs}y7Q#|3D&8>SebM_k?<+}7Y^BJ zSZy+RSvPTJuu&6xckjaIxQd8yMh<0Xi8jRfCpPRHmd4t%H6pI;nr>wb3P&6v7c!AJ z*Gsw-0d#IYV}T%>6qqFs6B_CzstjPmwV-1vI9MwdiZZ#fm=X5lL`LM^yfC~@#rM6WpdhI6q%V1g7y67<}9M(Xqdw%oP`4kD3-f(x7p z0hV#94x_+Aqvza^p?Y3outaGYk++KHmF$BesRSBXuQ;$P0%R-C4pkaHj?cA^ch{B%W*;1>og|l`kpa1DMSWL{08icfK(z6miQBUMKCv! z010o@#!!Sqbb@|G+#DRv5ZS(X5pXJ#Fv<1+2C(`njUm8*vN$Di;sTePLpnWaS?r|= zpn(_!j%ACc{1RU++cz?ONo)a6fvPY?qBcbZ7%sh3?C4crR>a~;X)O-l=Sjb(Y8WZ# z?94>g2&c2fXuaDh<5ol%4(v52Ksd6@ja+0~;YH1GkrHXjz*xS-7h6Zrb-5f9blpy4 zf)*;8zDAQGVUZ8S2~aXDaXk>31eI{L01hkmNzyQ>&s$XBHi37MwwuTQNmvID0x>+? zp*hm8AMb2u-B`yo&0o1~(Qa6=HKBsxTdL1c5etDbUCi%*@ilw`AEcu7Sk$%OpV zoWMrH*DiyNoO)CWnr$PHk5qj!lfnEPB@ufvwp)4HlhseW`?3>)&Y9#)GN~&V6Kdsg zZbR%V38QhUn{f+4yL8rGqw8}yF6erlMg=V`XB|P~u$Bv?Ndla(o+1SdyiL&#ykuh4 zBl@6b9h)ekjRwljL2AOmoRG8gI@m~90@vuP4KS$e zF}vJSsR^cYjFGeUz%Jn>CmfB_l?-i4m2u(*O%V%?sk8++J87Hq+ajCWWM77~wH%3{ zYz{g4B@hLWT&W^#^+g~zkIR#}Kt7{Z!c$9-mQ5)H3qiZFwiH3v<#Jrm^*W6Sx~6CB zpphd-jO>~pUK&~+$w;Zl7NRly;~-fo2t-S{H9Th={l*!McLcXsfs>7-Cy26{k z27%fw5H@A7IO9qlE`B|67K|JLt4P*YfyEfm71rEZ4HboRhT=4NQP@Q~@kD6O!IMG3 z8ctHmhSY0wm;-xy%KERniHTI@0~<2DR6Y$3k(1$yQ9c+{J}p1&7A9hZM`hM+rFMT`|_s`sDoJvM8*|6$Xhdhx`b_ zy?0_1sGK|Qn_`Nyinuhmk3?tvzD{Ryir$kA%yIQ{Ul!#d?(W9r*5BVp-%ULHI2hp>=DPd!rLn>HcAH`JFtz z2;3LnCC5wG?s$1EHeMmoxOsP5l-@nxqv$@OUvd+?3E@71n>fQfRdOG}O-yK*!6Nnu zd=E=TFeDNw6LZ*Yl&;-0+f?LY*%2GhyWySv2f}7rj$NnS1P4Dhz|B>LP zcN@0)*@q35c66{bo%c^~Q19oBqmi}TTgH6Frl4wGm2s7l}wCjyTA{6r7 z!!HSLRugAr|I+UWunE5<*x@-b6ATtzyW_Qt_;|&PQjS*^WyQxC?nH2t^zrZ`!A&Y; zgdYiRQj<3PNN|%}{_rEg4t!?fQDVTNZ*Rc4_<#j(lmliYRO$%#VGG^ld}XLxQHu?~ zNth~G!G^TM@LPhL)nf^g=K|_;hE%qd7%yGB!{x20g^($X>fs7zQivH!O8aws9(uV5yQr|=`e zOvksdnfdWm&CE5@DsrfjvR?c$?;b8fhxl>eGr{1$Lk2q%tdgDI87=_iG}+` zGfAln>w`$o;5z8=!YzU!cof2`r6_D|kYB1Cu;|-mFt5c1Tyu$Y;3g|;WGFBS5FcS3 z++zB095Q0~UJ}fDcd|FM4xTbd4v2XQ6+C93Y%{!OgU6yb{8&nUi=l)Xj<0%=i<GLYU2_A^xr~HdXUpZ9z;LQW+vGwAF;F)~188_+-de zBQpgb2aVOBgVzQ7y}9iTf`@{iQ7U*S*cny-wz|A&!!um|=Z1I~n`~`)h(r~Z)c;D3 zq)LW-Jw}IMN-a8gpH2w{Mj6Lr=%aLX;xQCb9X;_F8YvGGe@q*GZ7zSfhTxIAc!bSX z@Us|Ch@2Q8a}juLY8Z#V%M6-C&i;w};2|pKZ5hMep>oyQ(!sl^9FFfeb*LOMYw=V~ z31bNn5(8@P>A3_UjUz`F8-+<5I%HHMdSm$O)~LuYgD4%rG0}|3i_TD-Rvt;Aek^sj z2%(c@j6V*O;R_`8EkRL25ENJ_kyy*&IB`0TQrpyApr{uT3M#R3wPl+QR-yIG? zQloMIiO@f%4ye*VjS1=O@j<3L=6?B+rSd2d+u^Xk$3xku_roBvfXX%p*NAwLpG~DT zqSLqsNu4W`Y^j%Jo5^h0C`SaZ|HoEi(?rNuEsyFzsbERCi=;r#3sKn@UvH5D0L0#? zg(qq$3C2|?M|3pgZxdC;wOgdfG%V!QgTaj)MD8hV$%#Apsc+1qpORQXfmB#SAO+vL z$cPk))Eq0C)Ghq$(zofiB)fgx; zsyh^*7w30~qllwJ~SW=19e$8l$L@=E@>6 z75zSoq8d2@Bkmxg0G#2Ym;-kskk06cstZCGepoNsCm~m8q);>JTO?JIbT*PeIR7mQ z2a%p3zm%pUV%I{vs!le4Fm;=Z2}$r@J=cmut3rwx3-`Gw4aR)~RAJJo;7RxzJEW7w z3A4zm7RQCe;G=fW|B_R*dP$V|gVGE)XBcFQk>^S}1eFbmFv>4Ii0v^Y zdrWSr2+5Zy)GaRkAyURMC09sMl^P-Z$)|}Xt02MUpZf!oknANU53yLL4%1NtOUZxW zASWk;2qDSQNMNQAg2y9oq7>J-&6pGfgKJ2^Z!*t8V)CKM!h`4>;S4I5V6!;>&oK>- zV#r}eNH2{TT^L&S#v~aKv1*Z@2|^ID5_QKY)k&2&wi={@5rGmhZj7v`B7?*tLWwm% zbqVs9C~3l}BJ%5rM-g(+MCBlz*(^L9G!R(_hqy{BhZdR5-VYc83K(&cH%qY;tO21A z?t0H8 z5FiIjDOfHkiJ1E8r&N~_X+xxP6UwCU3+HyIG$RhkVb}<2$xkDqt$r#lSfR23;X#dB zC!)+4jvNYLQ3#31pWJ7Xau+tF)lZA`#1TA7nu*ecT(5&Iwlfs;6;qeP0J2xL)F@L5 zc%Vc$N5Dz!rbZ6OunCcp7!19lP8R#@h)o$X+_yDu0$OsWRmWAIk-jwDHe;d^e5xTT z`M$h?jx&$sby3!w{6w45BOG!iUP}E{Qa6}r6p{8fYSNUrqvuPqsKwW&nY=ZI1FUi3abs<50 zN3iT#kql`&6&fn4m@f z>4N5-0wTK12P|DKFRnl2pfVRnh$J@3eMtv{AEAk|j+l%%Da>(Ij`52VtgJ<3)Uyi^ zr@ck?6yl0t1)p`SHJri0bxQgTH4aFTreGBqhqG4&TnMiBB085nhEYnBAU}Bq1hP40 zj~OI~l7W<2`Y3KDw;BE^$mnQEZ=xa~S6Q%5W97Nvf>K!&7$^G_afzT9?yJbk;g6Oj zhuZ0sf9J?OHJ2%OM~)OLHR)#DAeoUU+uiBc7Ib|s#{^xs)0m*ev`7~;C9=dtHsocH zrA0j@3bIj6q=GAqYJ6<7q`0EC*JC>AkQ{>JvX=};mdKM9^PhA*ASU%oxR5}88MUAO zm$+&%RT)lSQuRb5jYjOtI57|N%B*PeOQoP06`Dkphf9g5jxI{SfKE96Ls|=E&ZM~9 zGsgZ#%NG|lqPaAKbL(W!J7fT|E0M623LF%G6=myCOXZ9f<+Q|o0^-IyiLt2uP6H+} z6o9iR+>DCIFKY|BK9^&HuG?u$(1OqDg670bfioep3Y@5nX<}6=q(^yPQ3cVKTRT6f z9i1a&)QHkeq(G7p$UdAB_Oh4=Ik)1lu{7OL4DU0YLK3X60`=G&8AeA)kRfTG9yvBl z=~%%!-)kT3lk%A)_@hePkib@sGO!9cnqdJWDd zS%q4U9OffeOxhnmUK8z;3kg{y$nYdji5iDgL|_vQHXyl7EUctUpdxZLT#gC4 zZl^Ip3q?y8G+RP(Q6ePcvEUFVWo9{uPu)Gz=c(@Kic7ghGZl!kQeK>;3)4wa3h+P2 zyE%r+CQbyT(e%iS9#MrR5gREVvn+A)jeIN$G68x>wG@YPSVNeF)OjL(NVMnQ`sj+n z`;gP*l&oRpA<0NwKuDzoQLl_m5!I|P8S=x(lJ9>=QZ^NdxEm)=j_I_O5Lxz zLZ$BeAL90*PB`UMIhoIufGoSDsZ*{OGp&&kE2&ors=$pRPK6=>6oeuvl7DhDNtrBd zJaEh;Y2vD0)^LwN1WYQWoT%7BB_fNweacHvS&tJORHbtz99ccQp|a9&(4EYC3Pq4r z%~4h^=n>}!DfI@tld9&Y1w>Q>PlCwxC5wv>#q}Fx+mcdB@}4MPBknXp!gB3MPEwyu zb@>|=aNRCr0v7s}n4+T#fuq(EF7)d5Kl%%l`@yYI(O=jG`QhT&FTid#l=Mnj;@D5f z9Gy`7loey}aQwv;=iF^~O%}+pOBTd?jz^T_(xBo){6l0?4KyakL`(xY`x_zE&saa! zr9h<7=0#|QH>wpN1;dhW&_^|&M*RkSVYkstH4CHh@L(x}~+jwuEB?;*E4hc~sS4RXo-zL2P|x z5{+W=s!5hgA`muto+&hl1+`iOPTd4;RO`qn-#}l;&`aqAiF)9nKA#{-&8K*rP0oWg zViW2TY~)mP0&S^gL@Fs1zUpdtP1ORrQmvV-YynjXqFt&MpxaArsLLbhQL`u>!IOK? zHDQsk(J2Cy>8rIZvC&o*(5-EYc|qt%ZEMU6LPx4@Pz8geCpUS3O2usYQu2o;qRW@u zf2BJSc{AzV+11UX6$ z(MC*(lz~9S6p)G4X=axEX^|URTLom+blNNtMe&VP7NH~60}CoCSU)zE;7142jq1Z0&8h+7V*agox6(2+D_CrSr+c?9)X zB z*X0o8C^y8{8yU&$$JgBdA+sy;tjWs&qu;-zRAj~g-PW3H?_GM-EQ)VDWGr-zScHy{Zj~~AbcC3A$_wZSk*(S<2p-plRAyV@ zgCZ3?r2)jqMF!%9bR~jAkfY=feypex$rPbA;gE1}5hPC;9y(Gz*RGPVaBz`Vk zQY~SoYylmi)=)|d(9I<;Yr-NykD5jCjfbgB9ZMi0Bq(&GHYnx=p(C}8wJ8o}RFBrG z7$Dp>+yGje0m2PM>T${oLX564uct(U93_WvWyO?8%!@TqBH`nrGGWT_gpSlU=5R>p zNNr=z3qnWIjGZWbWTzQBapyKySBOE@W09ao&7%0mL!L}qBNhoANwcKF(x&NuP_QcH1$3lZ zep)rpgySZgX6#IKBwHJ}nr($2N^urj*%|bxSrmtj=9=MZQ-m$a`>V|W;pC#~P|6GF z2vyQjUO-2vdzSKo(2+D_DEv@fJ(7CU404nVqKTLe39VQY9TGk+4iuyeU#Li$Ar(HZ z>OFHRu?ja-wG6)U1)(BowvHiqb7gzOAziRZt#YM_lZ4L?- z7nS)_UJx3R1}a5C1MdcLwft=%Mc35Tp^-Xmf2Ii((jDu9@{LE2czi=Bzf`3MUuGYg2}Y zj#TTes3a_$T+}JA)q+fW%+)q!mP`|@WywgylevQKJg=ugf|vw<+$Lh|5%P#DP-C9M zfug7ZaY7E}xdc@oB4fa>E z#b{As-{5t`NA05oH3*Hzo_P)4W;*jYK_!!zV{)F1gSSyfV$O-j%o!dh(s6_D7*mL# zIGC5!J!%R^O2;?K)h2}>kv=^=4jxN6_;+pwkEI-}I8(%#LvbZROqiNvVX{DC&|H`t z-j2yfl?D-fD+S?KCk-A;LHLDsg2z%2j+X=+*c z3%znNYI+z_Ko6d;sJ_XnPBrO~=~!F|AEQSmVNtX@{#Xo=3wh&@g(RxrEEu`aWo{{n zzb#ql&Nd}MVoV`|;*e1$_SYszN+L07g|CW3+Hr#*>mqtr%!c|D^ca3QtSUV+E2@fa zg2zIcIZY>*OTnvdnOzZgz~fGOwu$FM=UTN%#c-gU3=5 ziD@X4i#WSilOQps5J7P`W~;zP(5a9_E-`~-J`$(nV+4tTbH+XXRLqGg$f!0gGmf~~ zFaEYLD~g({)$fFpDxilssvO4G8n@1dTi-XtLYd&g-7oQhOF<;y zp_o7a-`ctM*mY#*`8$6_e=)2UxR@FM;ZZvZP=Jm0s}@6kW@3HSfB)o^6l5> zdF!0LS@k}m!i}6~JQ& zXWU~S2E`;UW8ciE>U`bw;8Y*-^icNnb;Jqs{GOdohV%({AGV>-KR2CRSZYzM%Q~dG zJ)CG8^bqP!wZf*U44G~Z&Dp=rjpv2r!W+KJo2k!Dgu(37Pze8^D$hsODi88uMu^>VQ5-5sNi$c7}53n>!mx2 z2p~M-QG>|V?GZ2gw`1Y^R*i^xUWhCVW6_=$)JAOlj=1IMQReH}iHwzRDJ>pH0>670 zW93f?yPx*|RMEO6gCV%JG<%9>fBw416S|)(g{=?M{d4m;g{p5)9c*hcWVSsHW`~ZY z-=4DCq2tW=l}>&y#jfk#jhOSB6K^^?SR>GUN8EDrs7>_jM8?v$C>X(rIwo~Zhp4uv z-EIA4#IIWR8bRVzjav`akkfcUBGAKm%BWQd2cx8*@*gQLtEd3rUwc`lA;RV5Ua2eYkMZJ9* zM-HFXWg3FnZOfmdZZ?nSK06Nvv)>SfQx9|QbMqLo9r@}t;<5BwZPk6qW9eJ+OoTKK zIn{>5X9TqPX&gnoq514YMga8QT{HG^H=muzSo*EN*M=jb*lXAAz_IjOS>GKRGQGd+ zxkE#yZ(H7s97c`1A%`8^kO-LjhA1@o@GYRd!?E;z(?`*6USV3dDS^jSI4LnCA{fxx z(nw%H>%7J30`%FdK7xt&p|xl-9*KBvL(<<~5O_loQHKgqHR1?gKx@RKCO1#It#gj( z#kaK*k-W$U8W@f?WWFE@^Bo?CXQz=vzlVG6^B61NT4k!@P};3$H&(uhLR=YqTeA!B zoUm{>4Fpf^|TZlYIPM%fc9gBA2 z{zvl|;j=r67EOjV<=Kghm2X8iv9UZh(5pFCzL|HTU~vMRm8hTIQ;7U;fBNp@w;%uQ zhrG5!X^PW{TmOEBh`y8Zzw7Djz{WfkLt)9xp|VCw$CgrWu~rp zGn|JUDMm|S7?SmQJoJg`WK=JrMo!vpT4MLhj_|}4bwz0ZivDhS)bR~&_5I%N4 zY6)!ub+@H(+0)Y#b!#XMhH;CR6nTM+vW8^DP>$&JY0T1h8q3eGxHkT0JFbn-x@{Z( z*WZ5g-_ZB z|6(zz8vDef+f)zC8|iN@uim`nXy3fMd3<|^WM6~JIC^kr5r&RW$AurKGsln9A>hY0 z0Y3+%0rAB9E!An+V_tvb@i(f`@c1~@9eIZq(pEFz`8!J1zI%AfgQOJ6xuhl@51{d| z&t2**NkSTeyk@X1=K0`Js%~4%^ULx;PF4|qj9Je2ew_ht=2GOD0*3^JQV8$e19f(J z$Bu^>muXw+ano#d}Ed2?Z#a-qtBC1989%QgRgY!!ujBZ=;vkwi( zc4W>n9x{@InRNz`6!t!EI=;DlgKvn#a82b_o+*4o>EV>qtUcgm)i)HSrJiq|>U_hK z?NkJ!KJ8oT&pj~hn!ymJdIo2ylF^+6Nq%fAem1@U+0NBTF@1gyILVY7=Vfp5H?gxGkEjBRNwN%HScV^W&YVSc-xo2>$2hK3Jn|v0sfo$jMtYHHYv0P{HiyycDW$&r- z)br5{wiQ1=Ukt(AR{R`n0%SW^Cs)q%r|3_3D0DotgAr~elOw347x(NTqW^6v&(aEz z?TVh252(AY=&7gNz3~e@y86uB=swTye1mVhROhFAfNWcQ_C*01S_)DvRg@iR7* zRXyr+y9Q@BF^JEbvc0>`Ejw?@Ig?O*j;Clo-{|yC-DQk zjTpxH?8AJ|Lp_@%`O`L?Q;yGk4joW+F7Bi-rqr5gTO}1ykA}3Z)!7-z0Jf`f4&iyV zS+MyrhW&Fx8ivNBv9>AVRC=oy>Fn#Fw=+4QKIeIn&iX2U+D84SWGTJ+%`-{KBVBH} z#k>W7utu9;d$S3)JpOwg(K(0+Idj`c+sV8X|3PXQ=F=KcR-xBulV&#yKK*Yia#p8- zZ2NeUAphfC8_5m_$A~b(V$-*Sg7ttl;q+z`PAT|!UZQjOKN9%1jVFQd=LR$)JU1+_X{7u57@csEun^bp@Yx}9U+0wxqX5DwX=_S}?LyG=yJ#7;{J1x*X zw(&i0oVZ%!4MbNmF?GFd^(NF&`useGb5IM~&bA-V+dr=sS0Mg`I*I9}yWXU+n@t+K z*`%?}#X;BG@JzQMUAHNo17d)T9XRR`L&Tq{ z7W2OQ!Fp_x6wgMVcVLsG&aN4Rfpee$KgKT2!+TyW{$;}S?cmz9XY$Dh8 zPAZU%i=NEA^Wc85F#Tr~vki1h6y^PMQ>7}$Aj&)%(!`8=Jo`)OY7BepS7e*E}j1~Zoa#pj=2JiY&h zKfVAolhUs-zh1oj;x&(?fB(Nn|UY_1-1kJeU zrzU^<{Wni9|NDlf&wlmt>u*1P_r(AI z;iotMhe{^=`r^aW>yP~HZ(e`>^bZ&R^6kezUi^^}fB5k9?&62nZ~uwm{_5r5fB62J zpWZ%w`0R&o-tpP5d9m;EH!#kZfBp1t|MLBZZ+`sjS1(SOFgkzv`s35ZXJ7u8>q~5# z_g5rxUf$i_{-?{Uzr4KsOTJ?&KljPkA720P!_zkxFTZ;I-H%VKz}LU~hu?hl(|6y! zdHw$V(}#=CzW(F4KVI;^(|G>##s7Hv@FQJcAhsg56Lj}$YQt{BH{bsA6Ey;_ zUcLPC>CLyV-~a03pMH4#@sB?~y}tP8bL+eD#^JP;|H>-7xMY*BFJJIvD*q8*aY=%9 ze4+0y&M*S8*v$NQ@%{{>^m$b98AdU5`27mY-y=TE-|?GA;|i7<_MDFSJMdj*-)9)V zM`f^vg;Ojr(ru!C&oKNuJhQgK`1_EN=kEdw1z%uTYL4(l16{tmyc|B+g57z1_xHV~ zjBliYRa>43Q6HG+3Pu6w2&;2j@QwGGXBfXn7EQsZ&A+z2#E}ptJ%0zj;c=Q_oDAM0 zS-%5DiQ$6rAX;3Qb6fC@x4vgs+D7^=*r>R-z#ciFp6^X$*5x~{Lo~*MjYrWJ7_Vza z51C<%k4H*YSZ+d?>--(CyGX_h?2*>BM?i?$uJ3qnA%=vdEm4J$#upgxHbp&|Vc@%p zWnzXg7A%VmyXJ|=6-F6r2ED?-H{K;)@m-HXbOjqVAZHli9uJW!XBdx}GwKz_)gLK8 z^LN08RyxDLH=dWCVc;7<;xjC5BNG;kcQIBN!6cVa9OmzWFSdpm2EKdK9AfZ|Z8OHcf{zEgqTFo zy8HAoG?Te4_=ZtyhJlYaq=b*16KsT?%x%FpN(Id@@Uet$>pjOJP<_yHWVshUUI7)p zk#IGC$9(Z`uHO-vaocw~OKRSTLRxJRL2v;J->6tJ_Y1yPzN@G`)fRlb4kvt~Yv3cy zWc`k|yh>wO(~@gS>O}3Y@m)0y1K%s3KceyK&RpNYfU92sm(8QVH;Mz#{RS5E!VCl7 zL-&hgb>uV5-_aIIzP1H+=lyupolfkBc?DJ5ydU@44{~Gs>;|7@f!l|J{dmxR+~eD> ze!(Xi#@u*tR`Y#~J8@o@+|=0VXBhbIV%DEw(H3HuZdmh1@QsM3`8)94#sWXXz&B!7 z3U(cT%nSpc_&)d!XcPYZYD*tTc8w3WP>ltABbH+Bm$t)e*07lSW>|7=5B7sN)b%^? zA!r-cJOz9sBXaJ8@rf^h??C3i<94lmfR869R~Yzs&U=M{?>;u{xnE!-QF4ZXPkfrn zY{L#Pf0wr1FR;hH``{Cw2H!~ZD}20V*5l&})|&Dm{DgK_;?&n_(lof`8)94h`&)MsP7E;h6ShFw(JN# zVjb3g8Q;iUpWA|OxbS8eZAHfeYds2l1oEwYfDeIkh0*pt9-!)Dq)pDSp=@|R z2qA2Iklk8m@ZC3z@g3;8591ZQc`T^x<7JE)20op8@DWs^v5;~j*r@!y;(J5@T))eU zq~_B2Xawt0 zdxYjPLMZ3Cf$u=qR)cDX;Rv2v$WF%hBt$PVR2>IIfj+N?u!Dm|# zQISoDlKR{-A^09-mx3FKrvMW@MLKPs2R`2gUYOMyU=q}MdAu3L2-p1}(z(_p=0u$r ztcl{6k72-CzuTS%_-@1l2;OWxlq~5{C#=RdynQnae7udg_6tn*KS&*F-TEEtH$tTf z-@Wb(Au)Z=!N*gt!iPk(!Wavdbip25Z-n(=*jvA2eAm4$G3B}sMB7?>@Qo_>^W4BU zp7EYx;4^*U#p<>}fp1iEp4);ChQ5v&d~BUyBTjH`i)bRSg7BFqBZ2f9 zfKNOWe7AisIaUYs1>39UdoNuVd^h6f9Mh&H^f6w-n&+0xg_c3U_sX;c8%5D^@C|2W z;Tw50GYotOXYKk`-%IfEa`w8;jE~E|!h)~wIc;wfPB!-oj0f*m7^)gp+7$*q-Vt75 zX=@(9!t{Pzy+Sct+k)@XwCPkCsKz%6z|1gIT?FXHcgKseD~$0;SA&!w$gba^ibJ$l z7=qp?nKSpBwm#!g-GJJX;|_GFVKsBz}~7YV;&jt^W0*+Z&`{g&4=cLk^b5* z35=<%bHnt1outdT5Aew*leTT^1BNwYZ3{ll1AKSQw`eQdQeZ7JfDgmt+6VYB1g|jK zKAI;JEmgD~*OPpt;2Tkv^BN%LpsjTugxnMl0N*G?F}DSu^eFK0I=Jx3J~UiowMXEC zF}Q8(;`AY33`7lM?%Ec72qr5mZTp-8yG?ZGJU8%-x4C8*`0OvcB2~TGg704ZgOzH# z@*S?@J_l)Q{(;TB)-)`kv!@mk$Vh z2f7BXF|8jpP8dKC1f7>jFNU)@nNfwde2XV+07!u!KUi zO&WZ4ZT{SFiWsfD~MCS$e(LNyXIsS^aeKtTwP|P|H936t8uw%?vzoV`FgTN$ja5S2> zgO7Y?;nR2YVR{8O_jw^6q~?*fmhT}Eb;b$ZLcm|g!uX^!flsk1f%P2(AKHQN$&XE2 zoef|Zwbr)a8)5wO8Df0WYY9D~`Pvp3R*w~iu?{Qz3IpGPt>r;+M&N@It!=?K9(}Fx z9qc8B)>?b;5v(SB;Z^nEBAS@C=6RT8>TH0|@k4}0 zwT=ir9OLU)fDx^>!oW8&A?JAz;6T3Y`dz}qyuZ|)_Iz(m?-7!!U+~#q0jy<#Xe9D~ zAQ86C3BGIVoP@j9zL5ugpwFNX)|~+#qMg=Yyy!Qt75EP9v8Vbm^LOAInGpq(9Rz%j z@|Rt6{OZnt&;G5eN9jxvhgzm)e@B*Njb&8sEtq@`;2ZDH%-?|zGlka5@g!%oS+B()5So`R~$K_wwit&xqt$9ts_toj=<* zSksQ>1m8#qoY$G;fKg&}hB03pP3t^pJBq)}-vyRzycq_*1AE;i&dT*W+TsQ`to2&( zjcnbyk2}s)+iAdO8wK}L`+)!cxj!%H!5?^=M;Q^)rWip;N#2nI~qEVFRY@zqYv3435=4DFZep9BW(}% zh-jB}EZ`gUm*=^G55l&7M`k1;iiUM=AC^AZy}^fcp|&{I3~PD?z6bFm#2op1@DZ3^ z;Wwx?rH~91VeOakjZ*jX8Zck`LxHty3vm`L!5BuC;@SuJ6uTN&(;V=Pk}UIBz&D<; zn_;xQmA?l+Q`^J92SZxN63e>$zqFNq0db>gG58#hMD|hNOU8HKvMsRjG|oJaP?z2} z#wWi^+P3ZoOn&Gk5m@`sV2l_+g^!51 z6-HZboMGZ0ggrDJXTFNb0^canH?IpY<-S72<#!3bzB6en{~Ho@+m^s*|3dDd?gx2A zwa)Y*nU%|-+&(;f81}SQ1eOXW9~$`XTJHwmcz&tY%06bq=Z+--pW|r`{4UJxvF~MI zE$`kS=Clop@o8O14^O`l2XV2ei3R&pmW?Pbu(UWX+}{w>;?2M}vo zYYINu4jG^Go$<7_EIhp0y9~Def?BoA&@yTnqT* zI|iR@w6t{&5wMn7d832?e2vesOmI;7{DHNO4L;Fb#z!XP+6Uuv{2wssgNR5iD|1+I zo-{t<9%`Mj=wCK%!a0a$yS4@2c!PJQIkZ*mATZfuQJCb*0-yZ4X>0o*#+Ewc;KPET z@rka1??5Nv!Lz!TXi?l&;Uhq7g@JEWSgJKp?mv}4K)JSMzT@$dYKxg{{f<5;&a%S5 z=XhK2wVX}c@tSJ&fm2=h6dTI;UbP(wd?;aS+rXM9L!A+2*YCjRTs%x)wxM8-sI{k@ z9b85DM0W`+BU^v{E){T^CxcJtfbqdZ-B$KBEQh@=;B$QyLi}5gXDs5=z!2xxe!+*} zxxz56;lx;BX)ApuA-(k-_{acR+k(%vazb|NJNmG_i4;%ErwE1BFKxZQ$#boeim)s6MDhz18*0&NUUEi_0@;ifXJX$~BBgUtiPPBDBBl5P}Zp%Op z^mA%~=Q24)k+2v(71P@!G8G3~Ur)U&n`B zQgdT`vU$)}x*xDxpBGHk7l7#o=9H;8PqU_#7Wg-4D@cM8c+% zsl_f{i+Nl&sMJkqnG4BBu~t}udQD0AQS3A@@f6slGk*!G*$5U` z5V~JzSf3$`*IsABxVtS@hCZjii+@wmeQ-vb1|F#FT6Oi0AM78wIX-JQ9dw<58rf?-Lmyo=3Eb^jaiz z$!l0GS~epZ$u-oNZrdaHPC7O)`^>W~g_{0Fh1Gmff8EDp>+GQhq7g|& z={|^-7meU05zz=VKhX%%Q(BHdvXv|_$};s`fJ(OAESiDOA2CI>1{8n6`C021S5eXhmZk`|*oh($)UjtqC*!NmFYzTr}8T{l%e+vf^QH7bB%(CK+tm&6f`cU#{%{sniG z?AfHx$j5@mRrePyUb+S*H^qqDVh7e(@Hx~TVa&1rH)Z{_N0^|RS76U+8&9GbB}ec+ zPTPI>4sEj63g4a1ALdSt8T(}4ty|co_K0$-ItQq$T9*gM-{Zx0Tk>Z#KH@FZFZLJB z4cS6tMz&}^Ncy1W%a)7RlIbQ|hfD6DEmnnEXD+7b225V}4SSP#9tu+XAfZC?9j9cM zcp2fHl5NqjyI+P!a#fER^IGp)$}RajgjTiX)vkt7+e_aOQr`Q9jZCx&mrakE5@5=2 z1O@}?ej&yhOBP1oxkd^Vokd@;ZYXw@h+f&ukw7H#6Mi6_i4a547sLqB7bI5E7b+r1 zK1fZ#zBAa(Bp)R9yzd8HC{7Rwz4O3{;&zQoLalu6QIoYFTtV$QYM#bS%5u|0D0ch1 zDUzT%2>>uY^!{S=)t(>7*?4AsS8>NT&B0A99#87Ocq3Y^&L4Iz$)~82l26%6-RZ=r z_qq^gF8P4yi1zPO@@zb-zR3KDo$@c>f>gh#*rIh<4i)!Gl$*{yl@oOCllq`F#Z}b% zhJ`}s9=nwIDq$4uui!wch6^P=6hoS_AL6U1=i;kzx%N5b%80L$wIjZIk7Y&sMmSRQ z3aFayOhQ=t&cM!fXYf$z&S2%2Tue*J#kuAh%RSt&?h)P@pL=48`flA59@cWiJt|n! zoQNPg2M7F!Qze>BI-=yskS6uac!{Q-%gJ>G*wTQbq2T4&BzFUOM9&o_mqpA74IOjVVQ}W3XS1OqcvAtuw5a1kZMR=^wE+%fB zU1XJ}?UZ-yv7~gM&og#@wWSzb(zI1l3TyE~)(1W5HZkV+Pr6^EY7Z`q~y>B}HHxW?hm+QSEmmDaAws!vNU$*z_JB z{K)gg_*!i_&5n^nL>Hf?rlR;qN=<65h_Tjr!657JNVs3;fr4nhk7^*^&Av(QL}ZXo z0?ccG0YT$~l4~s3pIg==L&E2o_}He2tene!D=4O6G=!|4}B01fbgQc~H9BAJNg*|{Z zePMjK*4FW5%uOd_3hF*E@JOb{k}DfLFamDZJ}{6`Xrf?*-Sl}$NM*}#FnIAYVDjey zQ{5S01n8{&0#iLLjwD2)zjJI}j&92Wz@&!)Q>-a4>70~1lx#Lio!0sR8;>W>dNMHO z;sHa-?0MkJsZ+v`l7(( zJ4uDwmO+5Q^w#+TlP(SnBYb_wQnf835^M885>+J=@*R(h6+TqrJ};d6@s9g)S81#L z#opBOV2|V%2Sy;z+Ap-&Zzo}=X}N^9%AcX_5kAE|L?iCC0;ZfoV5;#;xctG}5)Y4k z{rG-(dH=iL03 z$4S3bjSpb2n!b>>s9HXwoMp`o`HE=gb-oxFWzT`p%I?U1=uIDBmMy3opgm%0O>gS6fX)4L9zRwAhP-;!NT9+bx_-bei099?eTP|J`ym! zcLz-QQNXZJcE8v$`+guQi%(Pkpmng6z-~JTFp6t-9~|d8FMOx>Q>Ye%3$xo2_|V z8cz0hEMLkIgOw?NChV2g)4=rWg_SO}0qxg6bmDRyJMkzHjKNa@A67ArRx3|2@9aN19K(e2LPd*?fONGL9e87|s0nEBu5_@ZIe5brSR7uO@ z2~APIC^SuXNsg2(kGrCMO7tPw2bk)EkTy#tmYy%6Ogck|Fa8eavDzN=i{GGl9;!1- z(`|_#*Zm;p+c3qggHLhXz%bT#A2>A)lZ~5?lyeJA@k78YQ)9~29pto#M&NpCUv$#S zMVq+3vSlEJHDBOf`mE8m?|$CTYaN@rpf}C9TduuLeqP)9xLe8tN6t~Lh`h7c`wKn5 zNLzc9Fw2&yQ}(FOA1}~)tw{0|K70hd=XmlD+7dO}V|k_geM~n#SJ%@;98ye#RVy#`^^eNHKf zCEgA76A#7f(zzoDAXwdcEa+Cf=ctIX4-pR1cOm9t*<*#PtDY)0TG@PoDV7Aa(e_<9K+B1!l9Ja@SLF}o9x1LKzYCJ~y7nod)_Ed% zDym~m**Cq#1k5@P)?L{mAseFigrr*n@8XBa!O zt_$V4R4WYgJraI@hmWt$K}wIA9-vI>Zebv*{h$xkLk`S+AhWuyeSEkaI_3_1^7{oQ znF~*h>{m$q(iecqHjISsH6;*PYemf|%>#R<)(Ty%c-bf`DcS@}Df$9QR9;M~Oo-+r zm8{1{UV`{O79PbA5Jx8aGb^Ptj%h?P4S5Ng8!sp{KgThv`i{WFLowIcmcdgvx*w$A z>we(T6i-PQeDf{Lb>c^f`|th06)ig)QH+ukN$r!}jF*l&1}%}7UQ;CZK125i?tO-U z>HKkx#Al%P9lJ%p%3}sbfrg?7MA7Dr zumIsps+-mY{-!;8q~~6Hj*#187_IL(eOl+_gf!itBDwB9Y(erGFzLEjMr88^*7jnO zgv}etF=<~p--$OOVIl>ub3=%=ZH|(+ty`ruvt&%9Khd1zX7s+1o1ybemat?l$f?(v zBi?i<;ZnVqMDvS=F*W&c$;OtPm=N$<7lI>{Ck)K-O%K=@bq)^VL9k|fe^IV9w*wl6 zwOD+CoDk7J@;^lXQj)yyD*iIJ#m1;LfYJ0lg0dg9wM~@>dfiJZNJ?ga`blOWD#&AI z<1{`@X@*&bdqAJ=d(O>o8yP`!sKx930A|`weuelx*}9$QK>2&+-9_^8nZz;f@hPWk zl!~bDxLL}504A9WnCu&LAbTv|DIOS4rE1hhBW_yE_=tR6*DrM&TbAPO2I*i};gomB zcdGZmevquN_CXkwY@2yDP4^saMl=HVxnvczLD`03gNipJio5gZ^Sqk)CDBbf_j&)L z`6?2UWEDJ%q7h^Z$tHM^b3tGfmZV;*WQ7Rk_%I?qb!QUZq%mXuGfa6bghr9E+x_yH zU>q2Y51qJaEFoD3ZS}54!mr#fVp#JJo=TByhS|*XC6`v?LqOF$oLe6YlxQNBNS|ly zw!&w7B7p{~34<0zNttz>ff3=f!V-ce`3irY_7XAC>lbFW;^VGLSHnFm+KEG0bpujv zsr4CLsfwSBySrsa41!eduCY)WxA{WKMztJ~H<6mpfKP93VCchC$crtPwS*`Uk+|-v_4nl0@7!Ee57K1dw+5*@4Lh3PABCz;s@KDZT`l z{OqCPtw#al(_R;@V9}hcRO_L@loJe0d=TT6;{JiDHX1MvZ;u6MhhehE(pELffT5H$ zKIA{c^qvh$1%b_KD_i&o1J$`Aq+BrcTAgPcASKHa?8BmVzXZZ-%-Gk8#?n@GG;vER zCI;rFymw%#rwUAQMtLTrec;eZ+l*4uSZ9dj`r6A>dTAb?u$HFTWQWRsj-n=656wk+ z4#-GQtaVLs9&rf^21o8aCrn1ZB7#tqXAMmC`4fTGwrli3#dNUFC^_p`fFV5!CR=H; zaax~Fn1}8vEK27pE}%YZ1Z4JFfls^wgQ{dvU<{_md_cnp8WSB#i3PVc4I>b$b=ZU* zw#*Mqu|mKUD+J7OJXn0&zCpmYatnY-w*n^J3Yc^&VA8FCNw)$f-3qI%bgMi=**S5* z3wRz(U|j<&$jV6vrW|srH;mAItpRGXVU|0|zLeaFx6Jb;*01M*%Ry^(@a{u0>vgyC{zA`<8>71grxhFs(Fxmfr;l&j`*Kr^pLi!OAnw|$? zJbh=-NTeTeG}_LOvac8nc1^w~V73b&VYUq~J1)H^M&G7kSa-!g*i4^s#2oDhMFF)R z{+C=*9gMKj%tKaK`vzyG>9v?@j z){48Ocqt-HWs8LOC`XKY?ph29lc}{&<*}A`vALn?t>Yt%QE#52hoWV#-^DW5dMGgU z0l88>HZaGaaVtgFFma1tViXj=M35C7ClW$-GbSQ_i3BV=5-FK2NAMJ<sfS zrQ1`c|A|pu$V=u7`bRS%Pt)Jg^!W&?FES7rtA&3Xj zy^Kw;#++x7y}tLpX53+ z2F!nnVCncZ0@X~%<31|BMZc!mJO}RaB@4CYMm(_kO$>A2E!ergi>0vfA-VUtB5X-I zJ8Ft(4w|3n0U|@ogb~q24=AZE+a^2SvNxt1y{k%|!@*jicJ~^vlhT<|!&z&JO452t z%y4~=u&%Yw3zL!RHxZsgC`GL^uC|U1NYx(sNw6u1?_+xqjYXx?nlcpm*$EGmUQ4>Y z^g+_{J4Tc7art{5d2m}W0=^qY^%KJsi!_LqyPF;gh8`BB`an#ZGkcX$jXzvQ`??t{`Nx?5Bx5WOeM zM*M>aG>ru+Bszq;ue+Lh&Aooaf{6~n89NRoRsqFyAj?ZPCHm^1Egt3CBdpJE%QE*m z^D=_gD&mXgk%B?p2dakpMLBKyLQb%BA#P0T@jQE@nl%K-9qcc}UGsqO3Wk$FV}@b& z`GalwJM=Qm4LwimLj7l*Kg8XFVT_Q!HlDVY*MP}ii}_i;7`}5{OP)2VyGmR6dIRgb z08F+jU~JsF=a{_}Q%UfFVk&{jrW*5juV0=(Zr($`1bBA87)NUD=>sc;zSCQDe5d&0 zVX9Xj_-up^^Pl=9*01O@LMKVaJr-oRI)C(gur7HRrQ14Rjf6t^w}2^k9T$P>egKp0 zHP0vaxesM(p2yr29}7O&ZGowV1~7z%nj6==?`pmn%4S6C|8H=P8gT8_Y!YYt3x0`bNp zIdvbX_8K#}rGjBQ)V{e!D1sSb9qL2;lJCSX^MXgmUSjZI^$Q=d0WHJv9bPJZhn6T9 z9XBi$9}0%V>b-;v^>>LY@c8teCYCvNuKIv$b<8_ie0nz$7{Xb%#TePN1P4v)8uTms zF1LuAE_{jy;XB1u0rUAoA?%#_ROIkjNCxdQ1eX!bL7{1xflwF4c_jR$?FYbAubISQ zm}Ad31=t#P;G4K6yh&rmEU&htGHOjp8`F8=xdfe41o9pqgh*!`0;4ldl(g0~M54z> zwMeaL!gHFxVH$BC&S{8MrDb^}R@rV+t4Vvrfo}bc@02H!46&w@xWL)W+BYn@y3>$s z&zGaC`C^08+Q&fIeUQ}E`-|_>bK_q2o*&ekOMSSOsgs%8`ZO@T3k6K|7~vlziu9NX zV(GJ+x4--RVfymA9Gyv$u!IjYNXhrq759Rx%zJ+*q{BK%&Ogw_c zFjZ%RV=7rbIiC8CcRhN~$!2dq9pl3itUmMxC103#*;7#@nrls z(r0+L*=Gn5sqZ;d=%6jepqd-hKr#b9rK7Q^-#k~|Yf8N;_Yoq|{o;{t`hxVLbAb0v ze1TA1&kaVSu@IQnXNY4Z8bPfq$=O_mwkbf0RkHzlC3_tTtn}_gJb7K5N5yv-&U&qI zkv6TnC6B7lDJ25D9~cyS&+)aj{gfy{>mNMTBRw?F0cm{1D{Cy=^X`|^tUHajM>-;= zVdJwufHA9fWvV!|jTYvi7?#1J`n=#P>iAB+qjFj8N1nAbOnyW{kH}2uwvjv=#@l3Xays{uGb3Dr)|yjE4v;r%M5VAwm%adrdl+>FbCCI5o#d% zhxV)cfuBkI4Qk*1OZwopst?7M@f{Ac{th*&_l+n#(O9gfT6?Sqx^FT2^xZ-gYX2pb zRP>e~FvTYVgDUozA-jF9l5Q$koZ#ISf!u3gzLip}V{KLGUoQ ze~=q!`hs~wIs`RR+TTqqo#K7iA>{$lhh;}pQ`reAVbF28^r8AWz?35f42%1^_V7#9 zbV~Ic=^CV=NuI>NrMrMHP-hovDq4b{PUjxaj`oN;7}^i2bcp|A7S&kdAFTN@Hwv|_ zYmoTjj>$?Kvh;3PxA-}}JL4lpq|ZHdIy@HC6paO8rFjZoV(IbBw&P1MT$3o$bHfiI z7=m`+U&2AWzldB-HyDX%JKi$U5^kz!!~;b%v@TpD^?}&g^Z>t_Xg0MhM6Awd8v&zM}WsUX2;a-dp+Th$4KLvdT{?Ba3IJttdNyf$Uy`yRzF z*=LCDmF|K$*6V^Btj{ED-+l1BQ0p^Df3jJUg)5t7o?uiTETG2x=vc|5j?{OFsnp%) z?M&$;SmtzBk-}sj0@iewK1jw}_XwEs+JMPl2A^^6AsR``qKRZ`{sByNo`9*&6EN)? zFx8Jh=@A{rp(!54JXE6=d?Q}^`m6zy{}-5O2{6go1ZS&0Ixxx4z!WQf17&JGg}I^pX-#F%2A}vZFxl{cDIbD< z71zhE$yNnSbvc3Yigb++Y)v;XJIdb;O!;cSVBW%~*k8VruZU<1<=8Pkj&I?^^Vu|; zw(`*f6aP&_hxQ|(&P|69C!0r+a>0X7H5PoS&1aID(X=VKj7?85`6_0S@yQPXKII1h zLm<*v6k9>R(&DHE@06pHobQ(Z7>ndEQg4XrsCCAtsWX|xtm3Qm z>pB=n=$-2p%X;q{d`t1!(UMy>114P@m~?Sq(#2ElzvD%Lk@4K~MU?8Z8~Mr12qI2p^%fjgJ76j%R>dDqfz3dea-2YC8Z! zK&>%D)^yeq(9q`vpJwZ;$U#&w2ZZ(0NRg6HP*OlgAFSBW;$+XED@lf4*^q3;45Ui~7- zYTqJw_PTHYTi;Lh4awuVTs=1qTkAr&G^N7=Q|<^b>4U(O=ZXhNHZokA=8doq-BtX* zI?o8Lo<}%vofihvF&*(n=}a=11AKZPkvUIN{cTvcn3oVcC`d2Q0IAYrZR#%0~M zQecF=cOM8Gz0L{q(06QkuN5Zb_Rla61nugB3gaJ`F9BT-9^#h2QC9HJRan~3HYeW3=TcvQ+fHO;~A?7cjw zJx2LX@laF}@r8r;lQAZmCK3fNnvFNA?Suq9z?AD8zy`&;@#{*KPrje#n@2{3&+;=N zmEyIWf{r6g{(jpSljEs#keY0L?#W?0_)fWac<5!n2btoUfyvi_)TvxI@NsE+4Gv_u zlwEB)PWqc@~ztr&~^IFW#5`@;Mu83YMVGH~8D(OA$CwWc^(nkT13Pv1+-?V{OO zsw68%q)}U(RO%Oy#+Rb*wa!V0(AuL$bz97dvPI&;l}!t2NHDmdYye2(lDQ%h_FCb? z6;B2xy32bavV-8Q5FN+sBKnM4rhSX5)_0XtrG3LyuJZz{bpx)Ta#0X-l*uXjC5yAMzX8KjO4biUqaZ8cpfnEJf5x*&m&$y zvH&pgJdS~QBdlBJ3T)!j#7sy&AZDUtPFPdroQ0~1*5RX8_zchdh^{4;MD)OK&trP9odHQy{5N4x zEtg;}Irz>paL8%X&cuT>y(b<-@+ofxNJfGbi~bQV&@n8WdesQXO*r_@{=qz<)%(G+ zw7n#ye0IL@?&1aReh9JOH^s@0WxnqW4n6mQQ*Qlk^s%kgxsL(cWZN0G^)bV?J|@`C z_h;DF?+n|{&>F)I1PVZ;f!8~?3asKXL9(yd} z{N2Gkb{ac>cd#Ej?VP_m*pHpoP2cTwa)ur3$FAqi-yQ77PS@t|4)$Z$nda{f_G714 z(|0>|j53U-bOl z!G7$vx%s<;{n+(|`MZPt*!B47yWLkb!w&XimmTNt4)$Z0*XHjI_G8!c=I;*nW0%9` z@4O$BR5;VbPv3o#i)Wbk<5LXe{#~f_iVyRj^%Sy+Wy{41ELn;QzdH|jzwrS4@!L9o zf;~!BrjCf@#DjOH(8N`T3Yg*@aab!CfGieV=qpbFrkniFuqE zSHEbK$l|VI=#i57itj1C#v)nBI{9ru+q9 zvV$Zou<0`}(>i>CP22fSd<&RjqWMU?2bf}dfhnd4XMk#$0)x}k`XvlrF#O$pb}0qd zx*w5mdS5aT%*|I}3i9UxlYg2Z0P`b&+H*iHtKgss`)aQrkw}=5010tA^a6S8yIf;Omb5t z3ozpLW2YKV%ih2~*^IVxkL|yGB8h~R%*Bv*Tfx?rkSEO-_l))&AA#;_%#MAxxYFW1 z*zdI;*y<0yGu=pCQ}scPyI?8cROcY&%?y*T0~fgObV~lT92?tz(*tb(?!)gcg{+Al z@SLm8BrI7pHqY(!nIx(}cRz2K_g#p2S8ISW)aRa*R>^flno6F;F2CDp_A>;dZW;ks zZCw{Dx_M}xpw&8)T;IGAleBmv5t<$ElL|OqX9%j+FUj0}UMTtF?+D7$cglC6U&V_8 z)4Mk*!z>Wka|dh-P~_AkHq^8PCh-xptfb^H0n&wuhiFFybL#g89ffB5*XAD-U52+zN}eDN25 L@w>nK>c#&Br%f7Y diff --git a/dmatrix/doc/html/annotated.html b/dmatrix/doc/html/annotated.html deleted file mode 100644 index d2b73b2f..00000000 --- a/dmatrix/doc/html/annotated.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

Class List

-
-
-
Here are the classes, structs, unions and interfaces with brief descriptions:
- - - - - - - - - - - - - - -
alist
cilist
cllist
complex
DMatrixDMatrix class
doublecomplex
ErrorHandlerErrorHandler class
icilist
InitializeDMatrixClassInitializeDMatrixClass class
inlist
Multitype
Namelist
olist
Vardesc
-
- - - diff --git a/dmatrix/doc/html/bc_s.png b/dmatrix/doc/html/bc_s.png deleted file mode 100644 index e4018628b5b45cb4301037485a29d7d74ac22138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmV;W0$TlvP)X?0Pv5h+5!wElpi=&YL!gfY!djl#UDdPKy97F|A-deTa@qo3BWh1YQIvzmHR^g zFjV4I6pLB7_*vEZk^%p7c7Bh>0`4r^X#gpJE_Vz9fSHKqclcZaV^k3gX%h+1`u||O zZ+BY?7(R=ayr^kXE=E0Dw=$Ud3VJ?9^Cz@hP?388Cw5>9TloOJ>^KczCgj zns2=|0!a|)Yq3{hjL{xyy7|Tk0N}Pe+g9PUTL!4{#;eUhrNd@!_T<>Vu+35c)h>sq ztgb?(6W3oFLz#%?OMEV@{j#4LuDvjVGZ~6hpQT8li5b0yjvK8c4efl+vSz5)P6 zle78)00_Iv5)&E~hnOdcd}L}i+MU>k+Q8#@KjqJJN`gRj(~)RmNrck9ht@LelPtVO zwp(J;k!T=gC#%o(13-^E+g@aqc()pf{+j|0w)AH*Mq$54UjLv#jV$RYpz3Vjg$$=u z>yjfBQOhL=^@+#4#$l|{~}HZ-?1Yy{lI*$N}*YDC`<{+;>_#gMXZdz4NI00000 LNkvXXu0mjfx86dR diff --git a/dmatrix/doc/html/classDMatrix-members.html b/dmatrix/doc/html/classDMatrix-members.html deleted file mode 100644 index eb12af2b..00000000 --- a/dmatrix/doc/html/classDMatrix-members.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

DMatrix Member List

-
-
-This is the complete list of members for DMatrix, including all inherited members. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
aDMatrix [protected]
Abs(const DMatrix &A)DMatrix [friend]
Allocate(long size)DMatrix [protected]
AllocateAuxArr(void)DMatrix [static]
allocatedDMatrix [protected]
any(const DMatrix &A)DMatrix [friend]
asizeDMatrix [protected]
assign(long rows, long columns, double a11,...)DMatrix
AssignmentToColonReference(const DMatrix &A)DMatrix [protected]
AssignmentToColonReference(double arg)DMatrix [protected]
atypeDMatrix [protected]
auxFlagDMatrix [protected]
auxIndxDMatrix [protected, static]
auxPrDMatrix [protected, static]
ChkAuxArrays()DMatrix [protected, static]
Chol(const DMatrix &A)DMatrix [friend]
CholeskyDecomp(DMatrix &A, int n, DMatrix &pM)DMatrix [friend]
CholeskyRoot(const DMatrix &A)DMatrix [friend]
CholeskySolution(const DMatrix &A, int n, const DMatrix &pM, const DMatrix &bM, DMatrix &xM)DMatrix [friend]
CholFSolve(const DMatrix &Achol, const DMatrix &b)DMatrix [friend]
CholSolve(const DMatrix &A, const DMatrix &b)DMatrix [friend]
colIndxDMatrix [protected]
colMult(long c, double x)DMatrix
colon(double i1, double increment, double i2)DMatrix [friend]
colon(int i1, int increment, int i2)DMatrix [friend]
colon(int i1, int i2)DMatrix [friend]
colon(double i1, double i2)DMatrix [friend]
colon(void)DMatrix [friend]
Column(long icol) const DMatrix
compMat(const DMatrix &m2, char op) const DMatrix [protected]
cond(const DMatrix &A)DMatrix [friend]
cos(const DMatrix &A)DMatrix [friend]
cosh(const DMatrix &A)DMatrix [friend]
cov(const DMatrix &A, int ntype=0)DMatrix [friend]
cov(DMatrix &X, DMatrix &Y, int ntype=0)DMatrix [friend]
cross(const DMatrix &x, const DMatrix &y)DMatrix [friend]
crossProduct(const DMatrix &x, const DMatrix &y)DMatrix [friend]
DeAllocate()DMatrix [protected]
DeAllocateAuxArr(void)DMatrix [static]
DecrementAuxIndx()DMatrix [inline, protected, static]
det(const DMatrix &A)DMatrix [friend]
diag(const DMatrix &dd)DMatrix
diag(const DMatrix &A)DMatrix [friend]
dimAuxDMatrix [protected, static]
DMatrix(void)DMatrix
DMatrix(long Initn, long Initm)DMatrix
DMatrix(long vDim, double *v, long Initn, long Initm)DMatrix
DMatrix(long Initn)DMatrix
DMatrix(long Initn, long Initm, double a11,...)DMatrix
DMatrix(const DMatrix &A)DMatrix
dot(const DMatrix &x, const DMatrix &y)DMatrix [friend]
dotProduct(const DMatrix &x, const DMatrix &y)DMatrix [friend]
eig(const DMatrix &A, DMatrix *V=NULL)DMatrix [friend]
elem(long i, long j)DMatrix [inline]
elem(long i, long j) const DMatrix [inline]
elemDivision(const DMatrix &A, const DMatrix &B)DMatrix [friend]
element(long i, long j)DMatrix
elemProduct(const DMatrix &A, const DMatrix &B)DMatrix [friend]
enorm(const DMatrix &A)DMatrix [friend]
error_message(const char *input_text)DMatrix [friend]
errorFlagDMatrix [protected, static]
exp(const DMatrix &A)DMatrix [friend]
expm(const DMatrix &A)DMatrix [friend]
eye(long n)DMatrix [friend]
eye(long n, long m)DMatrix [friend]
FillWithZeros(void)DMatrix
find(DMatrix &I, DMatrix &J) const DMatrix
find(int *I, int *J) const DMatrix
find(const DMatrix &A)DMatrix [friend]
Fnorm(const DMatrix &A)DMatrix [friend]
Fprint(FILE *filex)DMatrix
geta()DMatrix [inline]
getatype()DMatrix [inline]
GetAuxFlag()DMatrix [inline, protected]
GetAuxIndx()DMatrix [inline, protected, static]
GetAuxPr(void)DMatrix [inline, static]
GetConstPr() const DMatrix [inline]
GetDimAux()DMatrix [inline, protected, static]
GetEPS()DMatrix [inline, static]
GetInitFlag()DMatrix [inline, protected, static]
getm()DMatrix [inline]
getm() const DMatrix [inline]
GetMemberFlag()DMatrix [inline, protected, static]
GetMType()DMatrix [inline, protected]
getn()DMatrix [inline]
getn() const DMatrix [inline]
GetNoAuxArr()DMatrix [inline, protected, static]
GetNoCols()DMatrix [inline]
GetNoCols() const DMatrix [inline]
GetNoRows()DMatrix [inline]
GetNoRows() const DMatrix [inline]
GetPr()DMatrix [inline]
GetReferencedDMatrixPointer()DMatrix [inline, protected]
GetStartTicks(void)DMatrix [inline, protected, static]
GetTempPr(int i)DMatrix [protected, static]
identity(long n)DMatrix [friend]
identity(long n, long m)DMatrix [friend]
IncrementAuxIndx()DMatrix [inline, protected, static]
InfNorm(const DMatrix &A)DMatrix [friend]
initFlagDMatrix [protected, static]
input_matrix()DMatrix
inv(const DMatrix &A)DMatrix [friend]
isEmpty()DMatrix [inline]
isSymmetric(const DMatrix &A)DMatrix [friend]
isThereError(void)DMatrix [inline, static]
isVector() const DMatrix [inline]
kronProduct(const DMatrix &A, const DMatrix &B)DMatrix [friend]
length(const DMatrix &A)DMatrix [friend]
linspace(double X1, double X2, long N)DMatrix [friend]
Load(const char *FileName)DMatrix
log(const DMatrix &A)DMatrix [friend]
LQ(const DMatrix &A, DMatrix *Q)DMatrix [friend]
LSMNSolve(const DMatrix &A, const DMatrix &B)DMatrix [friend]
LU(const DMatrix &A)DMatrix [friend]
LUFSolve(const DMatrix &ALU, const DMatrix &b)DMatrix [friend]
LUSolve(const DMatrix &A, const DMatrix &b)DMatrix [friend]
mDMatrix [protected]
MACH_EPSDMatrix [protected, static]
MatrixSign(const DMatrix &A)DMatrix [friend]
Max(const DMatrix &A, int *rindx=NULL, int *cindx=NULL)DMatrix [friend]
MaxAbs(const DMatrix &A, int *rindx=NULL, int *cindx=NULL)DMatrix [friend]
mean(const DMatrix &A)DMatrix [friend]
memberFlagDMatrix [protected, static]
MemCpyArray(double *aptr)DMatrix
Min(const DMatrix &A, int *rindx=NULL, int *cindx=NULL)DMatrix [friend]
MinAbs(const DMatrix &A, int *rindx=NULL, int *cindx=NULL)DMatrix [friend]
mpow(int p)DMatrix
mpow(DMatrix &A, int p)DMatrix [friend]
mtDMatrix [protected]
mtypeDMatrix [protected]
nDMatrix [protected]
noAuxArrDMatrix [protected, static]
norm(const DMatrix &A)DMatrix [friend]
null(const DMatrix &A)DMatrix [friend]
ones(long n, long m)DMatrix [friend]
operator!=(double val) const DMatrix
operator!=(const DMatrix &val) const DMatrix
operator%(const DMatrix &rval) const DMatrix
operator&(const DMatrix B) const DMatrix
operator&&(const DMatrix &B) const DMatrix
operator()(long row, long col)DMatrix
operator()(long row, const char *end)DMatrix
operator()(const char *end, long col)DMatrix
operator()(long row, long col) const DMatrix
operator()(long row, const char *end) const DMatrix
operator()(const char *end, long col) const DMatrix
operator()(long index)DMatrix
operator()(const char *end)DMatrix
operator()(long k) const DMatrix
operator()(const char *end) const DMatrix
operator()(const DMatrix &RowIndx, const DMatrix &ColIndx)DMatrix
operator()(const DMatrix &RowIndx)DMatrix
operator()(const DMatrix &RowIndx, long col)DMatrix
operator()(long row, const DMatrix &ColIndx)DMatrix
operator()(const DMatrix &RowIndx, const char *end)DMatrix
operator()(const char *end, const DMatrix &ColIndx)DMatrix
operator*(const DMatrix &rval) const DMatrix
operator*(double Arg) const DMatrix
operator*(double r, const DMatrix &A)DMatrix [friend]
operator*=(const DMatrix &rval)DMatrix
operator*=(double Arg)DMatrix
operator+(const DMatrix &rval) const DMatrix
operator+(double x) const DMatrix
operator+=(const DMatrix &rval)DMatrix
operator-(const DMatrix &rval) const DMatrix
operator-(double x) const DMatrix
operator-(const DMatrix &A)DMatrix [friend]
operator-=(const DMatrix &rval)DMatrix
operator/(double Arg) const DMatrix
operator/(const DMatrix &rval) const DMatrix
operator/=(double Arg)DMatrix
operator<(double val) const DMatrix
operator<(const DMatrix &val) const DMatrix
operator<=(double val) const DMatrix
operator<=(const DMatrix &val) const DMatrix
operator=(const DMatrix &rval)DMatrix
operator=(double val)DMatrix
operator=(const char *str)DMatrix
operator==(double val) const DMatrix
operator==(const DMatrix &val) const DMatrix
operator>(double val) const DMatrix
operator>(const DMatrix &val) const DMatrix
operator>=(double val) const DMatrix
operator>=(const DMatrix &val) const DMatrix
operator^(double x)DMatrix
operator|(const DMatrix B) const DMatrix
operator||(const DMatrix &B) const DMatrix
orth(const DMatrix &A)DMatrix [friend]
pinv(const DMatrix &A)DMatrix [friend]
Print(const char *text) const DMatrix
print_levelDMatrix [protected, static]
PrintInfo(const char *text) const DMatrix
PrintLevel() (defined in DMatrix)DMatrix [static]
prod(const DMatrix &A)DMatrix [friend]
Product(const DMatrix &A, const DMatrix &B)DMatrix [friend]
ProductT(const DMatrix &A, const DMatrix &B)DMatrix [friend]
QR(const DMatrix &A)DMatrix [friend]
QRFSolve(const DMatrix &A, const DMatrix &b)DMatrix [friend]
QRSolve(const DMatrix &A, const DMatrix &b)DMatrix [friend]
randn(long n, long m)DMatrix [friend]
random_gaussian(void)DMatrix [static]
random_uniform(void)DMatrix [static]
randu(long n, long m)DMatrix [friend]
rank(const DMatrix &A)DMatrix [friend]
rcond(const DMatrix &A)DMatrix [friend]
Read(FILE *filex)DMatrix
reshape(DMatrix &A, long N, long M)DMatrix [friend]
Resize(long nnrow, long nncol)DMatrix
RiseErrorFlag()DMatrix [inline, protected, static]
Row(long irow) const DMatrix
rowIndxDMatrix [protected]
rowMult(long r, double x)DMatrix
Save(const char *FileName)DMatrix
schur(const DMatrix &A, DMatrix *U=NULL)DMatrix [friend]
seedDMatrix [protected, static]
SetAuxFlag(int arg)DMatrix [inline, protected]
SetAuxIndx(int i)DMatrix [inline, protected, static]
SetColIndexPointer(const DMatrix *arg)DMatrix [inline, protected]
SetColumn(const DMatrix &Col, int icol)DMatrix
SetDimAux(long dd)DMatrix [inline, protected, static]
SetInitFlag(int arg)DMatrix [inline, protected, static]
SetMemberFlag(int arg)DMatrix [inline, protected, static]
SetMType(int arg)DMatrix [protected]
SetNoAuxArr(int nn)DMatrix [inline, protected, static]
SetPrintLevel(int plevel)DMatrix [static]
SetReferencedDMatrixPointer(DMatrix *arg)DMatrix [inline, protected]
SetRow(const DMatrix &Row, int irow)DMatrix
SetRowIndexPointer(const DMatrix *arg)DMatrix [inline, protected]
SetStartTicks(clock_t st)DMatrix [inline, protected, static]
SetSubMatrix(long row, long col, const DMatrix &A)DMatrix
sin(const DMatrix &A)DMatrix [friend]
sinh(const DMatrix &A)DMatrix [friend]
sort(DMatrix &x, int indx[]=NULL)DMatrix [friend]
sort(DMatrix &x, DMatrix &indx)DMatrix [friend]
Sqrt(const DMatrix &A)DMatrix [friend]
start_clockDMatrix [protected, static]
start_timeDMatrix [protected, static]
Std(const DMatrix &A, int ntype=0)DMatrix [friend]
streamDMatrix [protected, static]
sub_matrix(long r1, long r2, long c1, long c2) const DMatrix
sum(const DMatrix &A)DMatrix [friend]
SVD(const DMatrix &A, DMatrix *U=NULL, DMatrix *V=NULL)DMatrix [friend]
SVDSolve(const DMatrix &A, const DMatrix &B)DMatrix [friend]
SwapColumns(int i, int j)DMatrix
SwapRows(int i, int j)DMatrix
tan(const DMatrix &A)DMatrix [friend]
tanh(const DMatrix &A)DMatrix [friend]
tic(void)DMatrix [friend]
toc()DMatrix [friend]
TProduct(const DMatrix &A, const DMatrix &B)DMatrix [friend]
TProductT(const DMatrix &A, const DMatrix &B)DMatrix [friend]
tra(const DMatrix &A)DMatrix [friend]
trace(const DMatrix &A)DMatrix [friend]
Transpose(void)DMatrix
triu(const DMatrix &A)DMatrix [friend]
var(DMatrix &A, int ntype=0)DMatrix [friend]
vec(const DMatrix &A)DMatrix [friend]
zeros(long n, long m)DMatrix [friend]
~DMatrix()DMatrix
- - - diff --git a/dmatrix/doc/html/classDMatrix.html b/dmatrix/doc/html/classDMatrix.html deleted file mode 100644 index c074ced8..00000000 --- a/dmatrix/doc/html/classDMatrix.html +++ /dev/null @@ -1,7012 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: DMatrix Class Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
- -
- -

DMatrix class. -More...

- -

#include <dmatrixv.h>

- -

List of all members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

void input_matrix ()
 Allows the user to enter the elements of a matrix using command line prompts.
void Print (const char *text) const
 Prints the elements of a DMatrix object.
void PrintInfo (const char *text) const
 Prints information about a DMatrix object.
void Read (FILE *filex)
 Reads the elements of a matrix from a file.
void Save (const char *FileName)
 Saves the elements of a matrix to a file.
void Load (const char *FileName)
 Reads the elements of a matrix from a file.
void Fprint (FILE *filex)
 Prints the elements of a matrix elements matrix to a file.
void FillWithZeros (void)
 Assigns a zero value to each element of a matrix.
void SwapRows (int i, int j)
 Swaps two rows of a matrix.
void SwapColumns (int i, int j)
 Swaps two columns of a matrix.
void Transpose (void)
 Transposes a matrix.
void diag (const DMatrix &dd)
 Assigns values to the diagonal elements of a matrix, while all off-diagonal elements are set to zero.
void SetColumn (const DMatrix &Col, int icol)
 Assigns values to a column of a matrix, while other columns are left untouched.
void SetRow (const DMatrix &Row, int irow)
 Assigns values to a row of a matrix, while other columns are left untouched.
void colMult (long c, double x)
 Multiples the elements of a specified column of a matrix by a constant scalar value.
void rowMult (long r, double x)
 Multiples the elements of a specified row of a matrix by a constant scalar value.
DMatrixfind (DMatrix &I, DMatrix &J) const
 Finds non-zero values of a matrix.
DMatrixfind (int *I, int *J) const
 Finds non-zero values of a matrix.
DMatrixsub_matrix (long r1, long r2, long c1, long c2) const
 Extracts a specified sub-matrix from a matrix.
void SetSubMatrix (long row, long col, const DMatrix &A)
 Assigns the elements of a matrix object to a section of the calling object.
long getn ()
 Gets the number of rows from the calling object.
long getm ()
 Gets the number of columns from the calling object.
long getn () const
 Gets the number of rows from the calling object.
long getm () const
 Gets the number of columns from the calling object.
long GetNoRows ()
 Gets the number of rows from the calling object.
long GetNoRows () const
 Gets the number of rows from the calling object.
long GetNoCols ()
 Gets the number of columns from the calling object.
long GetNoCols () const
 Gets the number of columns from the calling object.
double * GetPr ()
 Gets the pointer to the array where the elements of the matrix are stored.
double * GetConstPr () const
 Gets a pointer to the array where the elements of the matrix are stored (for const objects)
double * geta ()
 Gets a pointer to the array where the elements of the matrix are stored.
int getatype ()
 Gets the type of element storage of a matrix.
int isEmpty ()
 Check if a matrix object is empty, if other words this method checks if the calling object has zero elements.
int isVector () const
 Check if a matrix object contains a row or column vector.
double element (long i, long j)
 Returns the value of a specified element of a matrix.
double & elem (long i, long j)
 Returns a reference to the specified element of a matrix.
double elem (long i, long j) const
 Returns the value of a specified element of a matrix.
DMatrixColumn (long icol) const
 Returns a DMatrix object containing a speficied column of the calling object.
DMatrixRow (long irow) const
 Returns a DMatrix object containing a speficied row of the calling object.
DMatrixmpow (int p)
 Computes and returns the integer power of a matrix.
DMatrix (void)
 Default constructor. Creates an empty matrix.
 DMatrix (long Initn, long Initm)
 Constructor with dimensions. Creates a matrix with allocated storage given specified numbers of rows and columns.
 DMatrix (long vDim, double *v, long Initn, long Initm)
 Constructor with dimensions using pre-allocated storage.
 DMatrix (long Initn)
 Constructor with a single dimension, creates a column vector.
 DMatrix (long Initn, long Initm, double a11,...)
 Constructor using a variable list of element values.
 DMatrix (const DMatrix &A)
 Copy constructor. Creates a new DMatrix object with the same dimensions and element values as a given DMatrix object.
~DMatrix ()
 Destructor. Destroys a previously created DMatrix object and frees any allocated memory.
void Resize (long nnrow, long nncol)
 Changes the number of rows and columns of an existing matrix. Allocates new memory if necessary. If the calling object uses preallocated memory and the requested size would exceed that memory, an error is thrown.
void assign (long rows, long columns, double a11,...)
 Assigns values to the elements of an existing DMatrix object using a variable list of values. Resizes the matrix if necessary.
void MemCpyArray (double *aptr)
 Copies values to the elements of a DMatrix object from an existing array. The number of elements of the DMatrix object is assumed to be the number of values to be copied.
DMatrixoperator+ (const DMatrix &rval) const
 Matrix addition operator. The sizes of the matrices being added should be the same, otherwise an error is thrown.
DMatrixoperator+= (const DMatrix &rval)
 Matrix addition and substitution operator. The sizes of the matrices being added should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation.
DMatrixoperator+ (double x) const
 Adds a scalar real value to each element of the matrix. .
DMatrixoperator-= (const DMatrix &rval)
 Matrix subtraction and substitution operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation.
DMatrixoperator- (const DMatrix &rval) const
 Matrix subtraction operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown.
DMatrixoperator- (double x) const
 Subtracts a scalar real value from each element of the matrix. .
DMatrixoperator* (const DMatrix &rval) const
 Matrix product operator. Returns the result of the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown.
DMatrixoperator*= (const DMatrix &rval)
 Matrix product operator with substitution. Computes the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown. The calling object is modified to store the results of the operation.
DMatrixoperator* (double Arg) const
 Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value) and replaces the left hand side object with the result of the operation.
DMatrixoperator*= (double Arg)
 Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value), and modifies the calling object to store the result of the operation.
DMatrixoperator/ (double Arg) const
 Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value).
DMatrixoperator/ (const DMatrix &rval) const
 Computes the right division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the left object by the inverse of the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The right hand side object must be a square matrix.
DMatrixoperator% (const DMatrix &rval) const
 Computes the left division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the inverse of the left object by the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The left hand side object must be a square matrix.
DMatrixoperator/= (double Arg)
 Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value) and modifies the left hand side object with the result of the operation.
DMatrixoperator= (const DMatrix &rval)
 Matrix assignment. The size of the left hand side object is modified if necessary, and the values of all real elements of the right hand side object and copied to the left hand side object.
DMatrixoperator= (double val)
 Matrix assignment to a scalar. The size of the left hand side object is modified to one row by one column if necessary, and the value of the right hand side argument is copied to the single element of the matrix. If the calling object is a "colon reference" matrix, then the right hand side value is copied to each element of the referenced array elements.
DMatrixoperator= (const char *str)
 Matrix assignment to a constant matrix defined as a character string using the bracket notation used in Matlab and Octave. The size of the left hand side object is modified if necessary. For example, the identity matrix of size two by two would be entered as "[1.0 0.0;0.0 1.0]".
DMatrixoperator|| (const DMatrix &B) const
 Concatenates two matrices side by side. The dimensions number of rows of the matrices involved must be the same, otherwise an error is thrown. The number of columns of the resulting matrix is the addition of the number of columns of both matrices involved.
DMatrixoperator&& (const DMatrix &B) const
 Stacks the right hand side matrix below the left hand side matrix. The dimensions number of columns of the matrices involved must be the same, otherwise an error is thrown. The number of rows of the resulting matrix is the addition of the number of rows of both matrices involved.
DMatrixoperator^ (double x)
 Elementwise power operator. Returns a DMatrix object with the same dimensions of the calling object and each of its elements is computed as the corresponding element of the calling object to the power of the right hand side argument. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A^x).
DMatrixoperator& (const DMatrix B) const
 Elementwise product operator. Returns a DMatrix object with the same dimensions of the calling objects and each of its elements is computed as the product of the corresponding elements of the calling object and the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A&B).
DMatrixoperator| (const DMatrix B) const
 Elementwise division operator. Returns a DMatrix object with the same dimensions of the calling objects and each of its elements is computed as the of the corresponding element of the calling object by the corresponding element of the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the / operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A|B).
double & operator() (long row, long col)
 Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row and column indices. Indices start from 1.
double & operator() (long row, const char *end)
 Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of zero or negative indices. The matrix is resized if necessary.
double & operator() (const char *end, long col)
 Matrix indexing. Returns a reference to the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation.
double operator() (long row, long col) const
 Matrix indexing. Returns the value of the matrix element located at the position indicated by the row and column indices. Indices start from 1. An error in thrown in case of a range violation.
double operator() (long row, const char *end) const
 Matrix indexing. Returns the value of the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of a range violation.
double operator() (const char *end, long col) const
 Matrix indexing. Returns the value of the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation.
double & operator() (long index)
 Single index matrix indexing. Returns a reference to the matrix element located at the linear position indicated by the index, assuming column major storage. The indexs start from 1. The matrix is resized if necessary. An error is thrown in case of zero or negative indices.
double & operator() (const char *end)
 Access to last linear element. Returns a reference to the last linear matrix element, assuming column major storage.
double operator() (long k) const
 Single index matrix indexing. Returns the value of the matrix element located at the linear position indicated by the index, assuming column major storage. The index starts from 1. An error is thrown in case of range error.
double operator() (const char *end) const
 Access to last linear element. Returns the value of the last linear matrix element, assuming column major storage.
DMatrixoperator> (double val) const
 Checks if each element of the DMatrix object on the left hand side is greater than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.
DMatrixoperator< (double val) const
 Checks if each element of the DMatrix object on the left hand side is lower than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.
DMatrixoperator>= (double val) const
 Checks if each element of the DMatrix object on the left hand side is greater or equal than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.
DMatrixoperator<= (double val) const
 Checks if each element of the DMatrix object on the left hand side is lower or equal than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.
DMatrixoperator== (double val) const
 Checks if each element of the DMatrix object on the left hand side is equal to the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.
DMatrixoperator!= (double val) const
 Checks if each element of the DMatrix object on the left hand side is different from the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.
DMatrixoperator> (const DMatrix &val) const
 Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.
DMatrixoperator< (const DMatrix &val) const
 Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.
DMatrixoperator>= (const DMatrix &val) const
 Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater or equal than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.
DMatrixoperator<= (const DMatrix &val) const
 Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower or equal than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.
DMatrixoperator== (const DMatrix &val) const
 Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is equal to the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.
DMatrixoperator!= (const DMatrix &val) const
 Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is different from the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.
DMatrixoperator() (const DMatrix &RowIndx, const DMatrix &ColIndx)
 Submatrix extraction and referencing using arrays of indices.
DMatrixoperator() (const DMatrix &RowIndx)
 Linear sub-vector extraction and referencing using an array of indices assuming column-major storage.
DMatrixoperator() (const DMatrix &RowIndx, long col)
 Sub-vector extraction and referencing using an array of row indices for a given column.
DMatrixoperator() (long row, const DMatrix &ColIndx)
 Sub-vector extraction and referencing using an array of column indices for a given row.
DMatrixoperator() (const DMatrix &RowIndx, const char *end)
 Sub-vector extraction and referencing using an array of row indices for the last column of a matrix.
DMatrixoperator() (const char *end, const DMatrix &ColIndx)
 Sub-vector extraction and referencing using an array of column indices for the last column of a matrix.

-Static Public Member Functions

static void AllocateAuxArr (void)
 Allocates the array of auxiliary (temporary) objects used by the class.
static void DeAllocateAuxArr (void)
 De-allocates the array of auxiliary (temporary) objects previously allocated by AllocateAuxArr()
static double random_uniform (void)
 Returns a pseudo-random uniformly distributed number in the range [0,1].
static double random_gaussian (void)
 Returns a pseudo-random Gaussian distributed number with zero mean and unit variance.
static DMatrix ** GetAuxPr (void)
 Gets a pointer to the array of auxiliary objects.
static int isThereError (void)
 Checks if the error flag has been raised. If so, a 1 is returned, 0 otherwise.
static void SetPrintLevel (int plevel)
 Sets the print level.
-static int PrintLevel ()
-static double GetEPS ()
 This function returns the machine numerical precision.

-Protected Member Functions

-void SetAuxFlag (int arg)
 Sets the value of auxFlag.
-int GetAuxFlag ()
 Gets the value of auxFlag.
void Allocate (long size)
 Allocate memory to store matrix elements.
void DeAllocate ()
 De-allocate memory previously allocated with DMatrix::Allocate().
DMatrixcompMat (const DMatrix &m2, char op) const
 Elementwise comparison of matrix elements.
void SetReferencedDMatrixPointer (DMatrix *arg)
 Sets the value of the referenced matrix pointer.
DMatrixGetReferencedDMatrixPointer ()
 Gets the value of the referenced matrix pointer.
void SetRowIndexPointer (const DMatrix *arg)
 Sets the row index pointer.
void SetColIndexPointer (const DMatrix *arg)
 Sets the column index pointer.
void SetMType (int arg)
 Sets the type of matrix.
int GetMType ()
 Gets the type of matrix.
DMatrixAssignmentToColonReference (const DMatrix &A)
 Assigns a matrix to the values pointed to by a colon reference matrix.
DMatrixAssignmentToColonReference (double arg)
 Assigns a double value to each value pointed to by a colon reference matrix.

-Static Protected Member Functions

-static DMatrixGetTempPr (int i)
 returns pointer to the i-th temporary object
-static int GetMemberFlag ()
 Gets the memberFlag value from the object.
-static void SetMemberFlag (int arg)
 Sets the memberFlag value.
-static void ChkAuxArrays ()
 Checks the auxiliary objects.
-static int GetNoAuxArr ()
 Gets the number of temporary objects.
-static long GetDimAux ()
 Gets the dimensions of the array of temporary objects.
-static int GetInitFlag ()
 Gets the value of initFlag.
-static void SetInitFlag (int arg)
 Sets the value of initFlag.
-static int GetAuxIndx ()
 Gets the current index of temporary objects.
-static int IncrementAuxIndx ()
 Increments the index of temporary objects.
-static int DecrementAuxIndx ()
 Decrements the index of temporary objects.
-static void SetAuxIndx (int i)
 Sets the index of temporary objects.
-static void SetDimAux (long dd)
 Sets the dimension of each object in the array of temporary objects.
-static void SetNoAuxArr (int nn)
 Sets the number of auxiliary objects.
-static void RiseErrorFlag ()
 Sets the errorFlag member to true.
-static clock_t GetStartTicks (void)
 Gets the value of start_clock member.
-static void SetStartTicks (clock_t st)
 Sets the value of start_clock member.

-Protected Attributes

-double * a
 Array of doubles to store matrix elements using column major storage.
-long n
 Number of matrix rows.
-long m
 Number of matrix columns.
-long asize
 Number of allocated elements in a.
int atype
int mtype
-int auxFlag
 Flag to indicate auxiliary (temporary) matrix flag = 1 if temporary matrix, 0 otherwise.
-int allocated
 Flag to indicate that element storage has been allocated.
-DMatrixmt
 Referenced matrix pointer.
-const DMatrixrowIndx
 Row indices.
-const DMatrixcolIndx
 Column indices.

-Static Protected Attributes

-static DMatrixauxPr
 Array of Temporary matrices.
-static int noAuxArr
 Number of auxiliary matrices.
-static long dimAux
 Dimension of auxiliary arrays.
-static int auxIndx
 Index of used auxiliary matrices.
-static int memberFlag
 Member function flag to control resetting of auxIndx.
-static int initFlag
 Flag to indicate aux arrays allocation.
-static const double MACH_EPS
 Machine precision constant.
-static int errorFlag
 Flag to indicate error condition.
-static int print_level
 Print level flag, 1: output sent to sderr, 0: no output sent.
-static long seed []
 current state of each stream
-static int stream
 stream index for pseudo-ramdon number generator
-static time_t start_time
 variable to store start time after tic() call.
-static clock_t start_clock
 clock_t variable

-Friends

void CholeskyDecomp (DMatrix &A, int n, DMatrix &pM)
 Cholesky decomposition of a matrix.
void CholeskySolution (const DMatrix &A, int n, const DMatrix &pM, const DMatrix &bM, DMatrix &xM)
 Cholesky solution using the Cholesky decomposition of a matrix.
DMatrixoperator- (const DMatrix &A)
 Matrix unary minus operator. Returns an object of the same dimensions as A but with changed element signs.
DMatrixcolon (double i1, double increment, double i2)
 This function generates a DMatrix object with a vector starting from a given value, with given increments and ending in a given value.
DMatrixcolon (int i1, int increment, int i2)
 This function generates DMatrix object with a vector starting from a given value, with given increments and ending in a given value.
DMatrixcolon (int i1, int i2)
 This function generates DMatrix object with a vector starting from a given value, with unit increments, and ending in a given value.
DMatrixcolon (double i1, double i2)
 This function generates DMatrix object with a vector starting from a given value, with unit increments, and ending in a given value.
DMatrixcolon (void)
 This function generates a special DMatrix object with one row and one column which is understood by the indexing functions that take a DMatrix object as an argument to mean "all rows" or "all columns".
int any (const DMatrix &A)
 This function returns a 1 if any alement of DMatrix object that is passed as argument is non-zero, otherwise it returns a zero.
DMatrixmpow (DMatrix &A, int p)
 This function calculates the integer matrix power.
DMatrixoperator* (double r, const DMatrix &A)
 This function multiplies a real number by a matrix.
DMatrixtra (const DMatrix &A)
 This function returns the transpose of a given matrix.
DMatrixinv (const DMatrix &A)
 This function returns the inverse of a given square matrix. If the argument is not a square matrix an error is thrown.
DMatrixpinv (const DMatrix &A)
 This function returns the pseudo-inverse of a given rectangular matrix.
DMatrixidentity (long n)
 This function returns the identity matrix with a given number of rows and columns.
DMatrixidentity (long n, long m)
 This function returns a truncated identity matrix with specified numbers of rows and columns.
DMatrixeye (long n)
 This function returns the identity matrix with a given number of rows and columns.
DMatrixeye (long n, long m)
 This function returns a truncated identity matrix with specified numbers of rows and columns.
DMatrixzeros (long n, long m)
 This function returns a matrix full of zeros with specified numbers of rows and columns.
DMatrixones (long n, long m)
 This function returns a matrix full of ones with specified numbers of rows and columns.
DMatrixexpm (const DMatrix &A)
 This function returns the exponential matrix of a given square matrix.
DMatrixsin (const DMatrix &A)
 This function returns a matrix with the sine of each element of the input matrix.
DMatrixcos (const DMatrix &A)
 This function returns a matrix with the cosine of each element of the input matrix.
DMatrixtan (const DMatrix &A)
 This function returns a matrix with the tangent of each element of the input matrix.
DMatrixexp (const DMatrix &A)
 This function returns a matrix with the natural exponential of each element of the input matrix.
DMatrixsinh (const DMatrix &A)
 This function returns a matrix with the hyperbolic sine of each element of the input matrix.
DMatrixcosh (const DMatrix &A)
 This function returns a matrix with the hyperbolic cosine of each element of the input matrix.
DMatrixtanh (const DMatrix &A)
 This function returns a matrix with the hyperbolic tangent of each element of the input matrix.
DMatrixlog (const DMatrix &A)
 This function returns a matrix with the natural logarithm of each element of the input matrix.
DMatrixdiag (const DMatrix &A)
 if A is a matrix this function extracts a column vector with the diagonal values of A. If A is a vector this function returns a matrix having the elements of A in the diagonal
DMatrixTProduct (const DMatrix &A, const DMatrix &B)
 This function returns the product of the first matrix transposed times the second matrix. The number of rows of both matrices must be the same, otherwise an error is thrown.
DMatrixProductT (const DMatrix &A, const DMatrix &B)
 This function returns the product of the first matrix times the second matrix transposed. The number of columns of both matrices must be the same, otherwise an error is thrown.
DMatrixTProductT (const DMatrix &A, const DMatrix &B)
 This function returns the product of the first matrix transposed times the second matrix transposed. The number of rows of the first matrix must be the same as the number of columns of the second matrix, otherwise an error is thrown.
DMatrixProduct (const DMatrix &A, const DMatrix &B)
 This function calculates the product of two matrices. The number of columns of the first matrix must be the same as the number of rows of the second matrix, otherwise an error is thrown.
DMatrixLUSolve (const DMatrix &A, const DMatrix &b)
 Solves the system of equations $ A x = b $ using LU factorisation.
DMatrixLUFSolve (const DMatrix &ALU, const DMatrix &b)
 Solves the system of equations $ A x = b $ using LU factorisation using a previously found LU factors.
DMatrixCholSolve (const DMatrix &A, const DMatrix &b)
 Solves the system of equations $ A x = b $ using Cholesky factorisation.
DMatrixCholFSolve (const DMatrix &Achol, const DMatrix &b)
 Solves the system of equations $ A x = b $ using Cholesky factorisation. The function uses a previously found Cholesky factorisation.
DMatrixChol (const DMatrix &A)
 Returns the Cholesky factorisation of a matrix A, which must be a positive definite symmetric matrix.
DMatrixCholeskyRoot (const DMatrix &A)
 Returns the Cholesky root R of a given matrix A, such that A=R'R. A must be a positive definite symmetric matrix.
DMatrixQRSolve (const DMatrix &A, const DMatrix &b)
 Solves the system of equations $ A x = b $ using QR factorisation. The number of rows of matrix A must be greater or equal than the number of columns.
DMatrixQRFSolve (const DMatrix &A, const DMatrix &b)
 Solves the system of equations $ A x = b $ using QR factorisation. The function uses a previously found QR factorisation.
DMatrixQR (const DMatrix &A)
 Returns the QR factorisation of a matrix A. The number of rows of matrix A must be greater or equal than the number of columns.
DMatrixLSMNSolve (const DMatrix &A, const DMatrix &B)
 This function solves overdetermined or underdetermined real linear systems $ A x = B $ using a QR or LQ factorization of A. It is assumed that matrix A has full rank. The function uses the LAPACK routine dgels.
DMatrixLQ (const DMatrix &A, DMatrix *Q)
 Returns the LQ factorisation of a matrix A. The function uses the LAPACK routine dgelqf_().
DMatrixLU (const DMatrix &A)
 Returns the LU factorisation of a matrix A.
DMatrixSVD (const DMatrix &A, DMatrix *U=NULL, DMatrix *V=NULL)
 Returns the singular value decomposition of a matrix $ A = U' diag(s) V $, where vector s contains the singular values of A. The function uses the LAPACK routine dgesvd_().
DMatrixorth (const DMatrix &A)
 This function returns Q, the orthonormal basis for the range of a matrix A, such that $ Q Q' = I $. The number of columns of Q is the rank of A.
DMatrixnull (const DMatrix &A)
 This function returns Z, the orthonormal basis for the null space of a matrix A, such that $ Z Z' = I $ and $ A Z=0 $. The number of columns of Z is the nullity of A.
DMatrixSVDSolve (const DMatrix &A, const DMatrix &B)
 This function uses the LAPACK routine dgelss_() to compute the minimum norm solution to a real linear least squares problem: Minimize $ || B - A x ||_2 $ using the singular value decomposition (SVD) of A. A is a rectangular matrix which may be rank-deficient.
DMatrixschur (const DMatrix &A, DMatrix *U=NULL)
 This function computes and returns the Schur decomposition of a matrix A, such that $ A=Q'U Q $, where U is an upper triangular matrix and Q is a unitary matrix. This function uses the LAPACK routine dgees_()
DMatrixeig (const DMatrix &A, DMatrix *V=NULL)
 This function computes the eigenvalues and (optionally) the eigenvectors of a matrix A. This function uses the LAPACK routines dsyev_() and dgeev_.
double enorm (const DMatrix &A)
 This function computes and return the Euclidean norm of a matrix A, which is the square root of the sum of its squared elements.
double norm (const DMatrix &A)
 This function computes 2-norm of matrix A, which is computed as the maximum singular value of A.
double InfNorm (const DMatrix &A)
 This function computes infinity norm of matrix A, which is computed as the maximum absolute value row sum.
double Fnorm (const DMatrix &A)
 This function computes Frobenius norm of matrix A.
DMatrixAbs (const DMatrix &A)
 This function computes and returns the element-wise absolute value of matrix A.
double Max (const DMatrix &A, int *rindx=NULL, int *cindx=NULL)
 This function finds and returns the element of matrix A with maximum value. It also returns the indices of such element. If more than one element has the same maximum value, the indices of the first element found when searching column by column is returned.
double MaxAbs (const DMatrix &A, int *rindx=NULL, int *cindx=NULL)
 This function finds and returns the element of matrix A with maximum absolute value. It also returns the indices of such element. If more than one element has the same maximum absolute value, the indices of the first element found when searching column by column is returned.
double Min (const DMatrix &A, int *rindx=NULL, int *cindx=NULL)
 This function finds and returns the element of matrix A with minimum value. It also returns the indices of such element. If more than one element has the same minimum value, the indices of the first element found when searching column by column is returned.
double MinAbs (const DMatrix &A, int *rindx=NULL, int *cindx=NULL)
 This function finds and returns the element of matrix A with minimum absolute value. It also returns the indices of such element. If more than one element has the same minimum absolute value, the indices of the first element found when searching column by column is returned.
void sort (DMatrix &x, int indx[]=NULL)
 This function sorts the input vector x in ascending order. Optionally, it also returns an integer array of sorted indices. If the input object is not a vector, then an error is thrown.
void sort (DMatrix &x, DMatrix &indx)
 This function sorts the input vector x in ascending order. It also returns a DMatrix object with the sorted indices. If the input object is not a vector, then an error is thrown.
double dotProduct (const DMatrix &x, const DMatrix &y)
 This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown.
double dot (const DMatrix &x, const DMatrix &y)
 This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown.
DMatrixcrossProduct (const DMatrix &x, const DMatrix &y)
 This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown.
DMatrixcross (const DMatrix &x, const DMatrix &y)
 This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown.
int isSymmetric (const DMatrix &A)
 This function checks if the input matrix is symmetric. If the input matrix is not square, an error is thrown.
double cond (const DMatrix &A)
 This function calculates the 2-norm condition number of a matrix, which is the ratio of the maximum singular value to the minimum singular value of the matrix. A large condition number indicates a nearly singular matrix. If the input matrix is not square, an error is thrown.
double rcond (const DMatrix &A)
 This function estimates the 1-norm reciprocal condition number of a matrix. The function uses the LAPACK function dgecon. if A is well conditioned, then rcond(A) is near 1. If A is badly conditioned, then rcond(A) is close to the machine numerical precision (very small). If the input matrix is not square, an error is thrown.
int rank (const DMatrix &A)
 This function returns an estimate of the rank of a matrix, which is the number of linearly independent rows or columns.
double det (const DMatrix &A)
 This function returns the determinant of a square matrix. If the input matrix is not square, an error is thrown.
double trace (const DMatrix &A)
 This function returns the trace of a square matrix. If the input matrix is not square, an error is thrown.
DMatrixmean (const DMatrix &A)
 This function returns a row vector with the mean values of the columns of matrix A.
DMatrixStd (const DMatrix &A, int ntype=0)
 This function returns a row vector with the standard deviation of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-1), where n is the number of rows of A. Otherwise, the result is normalised with n.
DMatrixcov (const DMatrix &A, int ntype=0)
 Computes the covariance matrix of a data matrix where the N rows correspond to samples and the M columns are variables. The result is returned as an M x M matrix. If ntype=0 (default) then the result is normalised with N-1. Otherwise, if ntype=1, the result is normalised with N.
DMatrixcov (DMatrix &X, DMatrix &Y, int ntype=0)
 Computes the covariance matrix of two vectors X and Y of dimension N. The result is returned as an 1 x 1 DMatrix object. If ntype=0 (default) then the result is normalised with N-1. Otherwise, if ntype=1, the result is normalised with N.
DMatrixvar (DMatrix &A, int ntype=0)
 This function returns a row vector with the variance of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-1), where n is the number of rows of A. Otherwise, the result is normalised with n.
DMatrixsum (const DMatrix &A)
 This function returns a row vector with the sum of the elements of each column of matrix A.
DMatrixprod (const DMatrix &A)
 This function returns a row vector with the product of the elements of each column of matrix A.
DMatrixelemProduct (const DMatrix &A, const DMatrix &B)
 This function computes and returns the element-wise product of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown.
DMatrixelemDivision (const DMatrix &A, const DMatrix &B)
 This function computes and returns the element-wise division of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. The dimensions of the returned object are the same as the dimensions of the factors.
DMatrixkronProduct (const DMatrix &A, const DMatrix &B)
 This function computes and returns the Kronecker product of two matrices. The row (column) dimension of the returned object is the product of the row (column) dimensions of both factors.
DMatrixvec (const DMatrix &A)
 This function returns a column vector made by stacking the columns of a matrix one below the other from left to right.
DMatrixMatrixSign (const DMatrix &A)
 This function returns a DMatrix object with the same dimensions as the input matrix such that each of its elements is 1 is the corresponding value of the input matrix is positive, -1 if the corresponding value of the input matrix is negative, and 0 if the corresponding value of the input matrix is 0.
DMatrixfind (const DMatrix &A)
 This function returns a column vector with the linear indices of the non-zero elements of the input matrix A. The linear index is 1 for element (1,1) of the input matrix A, and length(A) for the (nrows,ncols) element of the input matrix A.
DMatrixrandu (long n, long m)
 This function returns an nxm matrix where each element is a uniform pseudo-random number in the range (0,1).
DMatrixrandn (long n, long m)
 This function returns an nxm matrix where each element is a Gaussian pseudo-random number in the range with zero mean and variance 1.
DMatrixlinspace (double X1, double X2, long N)
 This function returns a linearly spaced vector with N points between the values X1 and X2.
void error_message (const char *input_text)
 This function prints an error message and throws an exception to be handled by the ErrorHandler class.
-void tic (void)
 This function, which is to be used in conjunction with function toc(), starts counting elapsed CPU time.
double toc ()
 This function, which is to be used in conjunction with function tic(), stops counting CPU time, and it prints and returns the elapsed time in seconds since the function tic() was called.
DMatrixSqrt (const DMatrix &A)
 This function computes the square root of each element of the input matrix A, and it returns a DMatrix object with the same dimensions as the input matrix. If any element of the input matrix is negative, an error is thrown.
DMatrixtriu (const DMatrix &A)
 This function extracts and return the triangular upper part of the input matrix A. The returned object has the same dimensions as the input object.
DMatrixreshape (DMatrix &A, long N, long M)
 This function returns the N-by-M matrix whose elements are taken columnwise from the input matrix A. An error is thrown if A does not have N*M elements.
long length (const DMatrix &A)
 This function returns the number of elements of a matrix A.
-

Detailed Description

-

DMatrix class.

-

A C++ class for dense and real matrix and vector computations with interfaces to a number of LAPACK functions

-

Constructor & Destructor Documentation

- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix::DMatrix (long Initn,
long Initm 
)
-
-
- -

Constructor with dimensions. Creates a matrix with allocated storage given specified numbers of rows and columns.

-
Parameters:
- - - -
Initn,:number of rows
Initm,:number of columns
-
-
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix::DMatrix (long vDim,
double * v,
long Initn,
long Initm 
)
-
-
- -

Constructor with dimensions using pre-allocated storage.

-
Parameters:
- - - - - -
vDim,:Allocated length of array v
v,:double array to be used as storage by the DMatrix object
Initn,:number of rows
Initm,:number of columns
-
-
- -
-
- -
-
- - - - - - - - -
DMatrix::DMatrix (long Initn)
-
-
- -

Constructor with a single dimension, creates a column vector.

-
Parameters:
- - -
Initn,:number of rows
-
-
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix::DMatrix (long Initn,
long Initm,
double a11,
 ... 
)
-
-
- -

Constructor using a variable list of element values.

-
Parameters:
- - - - -
Initn,:number of rows
Initm,:number of columns
a11,:first element of list doubles, values are entered column by column
-
-
- -
-
- -
-
- - - - - - - - -
DMatrix::DMatrix (const DMatrixA)
-
-
- -

Copy constructor. Creates a new DMatrix object with the same dimensions and element values as a given DMatrix object.

-
Parameters:
- - -
A,:DMatrix object to be copied
-
-
- -
-
-

Member Function Documentation

- -
-
- - - - - - - - -
void DMatrix::Allocate (long size) [protected]
-
-
- -

Allocate memory to store matrix elements.

-
Parameters:
- - -
sizenumber of double elements to allocate
-
-
-
Returns:
void
-
See also:
DeAllocate()
- -
-
- -
-
- - - - - - - - -
static void DMatrix::AllocateAuxArr (void ) [static]
-
-
- -

Allocates the array of auxiliary (temporary) objects used by the class.

-

Allocates a DMatrix array of size N_TEMP_OBJECTS. Each element is allocated a storage of size D_TEMP_OBJECTS. These two macros are given default values but may be changed by the user at compilation time. The purpose of the array of temporary objects is to to store the intermediate objects resulting from single lines of code that call various operators and functions returning DMatrix objects. A simple example is as follows. Consider the C++ statement D= A*B + C; where A,B C and D are DMatrix objects. This statement involves two temporary objects: one to store the result of A*B, and another one to store the result of (A*B)+C;

-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DMatrix::assign (long rows,
long columns,
double a11,
 ... 
)
-
-
- -

Assigns values to the elements of an existing DMatrix object using a variable list of values. Resizes the matrix if necessary.

-
Parameters:
- - - - -
rows,:number of rows
columns,:number of columns
a11,:first element of the list of double arguments.
-
-
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::AssignmentToColonReference (const DMatrixA) [protected]
-
-
- -

Assigns a matrix to the values pointed to by a colon reference matrix.

-
Parameters:
- - -
ADMatrix object
-
-
-
Returns:
reference to DMatrix object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::AssignmentToColonReference (double arg) [protected]
-
-
- -

Assigns a double value to each value pointed to by a colon reference matrix.

-
Parameters:
- - -
argis a double value to be assigned.
-
-
-
Returns:
reference to DMatrix object
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void DMatrix::colMult (long c,
double x 
)
-
-
- -

Multiples the elements of a specified column of a matrix by a constant scalar value.

-
Parameters:
- - - -
c,:index to the column that is to be changed
x,:scalar value
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::Column (long icol) const
-
-
- -

Returns a DMatrix object containing a speficied column of the calling object.

-
Parameters:
- - -
icol,:column index (starting from 1)
-
-
-
Returns:
DMatrix object with the specified column
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::compMat (const DMatrixm2,
char op 
) const [protected]
-
-
- -

Elementwise comparison of matrix elements.

-
Parameters:
- - - -
m2DMatrix object to be compared with the calling object.
op(char) indicates type of operator. Use 1 for >, 2 for >=,. 3 for <, 4 for <=, 5 for ==, 6 for != comparisons
-
-
-
Returns:
A reference to a DMatrix object such that its elements are 1 if the comparison is true, 0 otherwise.
- -
-
- -
-
- - - - - - - -
void DMatrix::DeAllocate () [protected]
-
-
- -

De-allocate memory previously allocated with DMatrix::Allocate().

-
Returns:
void
-
See also:
Allocate()
- -
-
- -
-
- - - - - - - - -
static void DMatrix::DeAllocateAuxArr (void ) [static]
-
-
- -

De-allocates the array of auxiliary (temporary) objects previously allocated by AllocateAuxArr()

-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::diag (const DMatrixdd)
-
-
- -

Assigns values to the diagonal elements of a matrix, while all off-diagonal elements are set to zero.

-

The dimensions of dd should be consistant with the dimensions of the calling object

-
Parameters:
- - -
dd,:reference to constant DMatrix object which should contain a vector with the desired diagonal elements
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double DMatrix::elem (long i,
long j 
) const [inline]
-
-
- -

Returns the value of a specified element of a matrix.

-
Parameters:
- - - -
i,:row index (starting from 1)
j,:column index (starting from 1)
-
-
-
Returns:
double value
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double& DMatrix::elem (long i,
long j 
) [inline]
-
-
- -

Returns a reference to the specified element of a matrix.

-
Parameters:
- - - -
i,:row index (starting from 1)
j,:column index (starting from 1)
-
-
-
Returns:
double reference
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double DMatrix::element (long i,
long j 
)
-
-
- -

Returns the value of a specified element of a matrix.

-
Parameters:
- - - -
i,:row index (starting from 1)
j,:column index (starting from 1)
-
-
-
Returns:
double value
- -
-
- -
-
- - - - - - - - -
void DMatrix::FillWithZeros (void )
-
-
- -

Assigns a zero value to each element of a matrix.

-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::find (DMatrixI,
DMatrixJ 
) const
-
-
- -

Finds non-zero values of a matrix.

-
Parameters:
- - - -
I,:DMatrix object with the row index of each non-zero element
J,:DMatrix object with the column index of each non-zero element
-
-
-
Returns:
DMatrix object with the same dimensions as the calling object, and with elements which are 0 if the corresponding element of the calling object is 0, 1 otherwise.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::find (int * I,
int * J 
) const
-
-
- -

Finds non-zero values of a matrix.

-
Parameters:
- - - -
I,:C++ double array with the row index of each non-zero element
J,:C++ double array with the column index of each non-zero element
-
-
-
Returns:
DMatrix object with the same dimensions as the calling object, and with elements which are 0 if the corresponding element of the calling object is 0, 1 otherwise.
- -
-
- -
-
- - - - - - - - -
void DMatrix::Fprint (FILE * filex)
-
-
- -

Prints the elements of a matrix elements matrix to a file.

-
Parameters:
- - -
filexis a pointer to a file already opened using "fopen()".
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - -
double* DMatrix::geta () [inline]
-
-
- -

Gets a pointer to the array where the elements of the matrix are stored.

-
Returns:
double pointer
- -
-
- -
-
- - - - - - - -
int DMatrix::getatype () [inline]
-
-
- -

Gets the type of element storage of a matrix.

-
Returns:
int value: 0 if the array is allocated, 1 if the storage is done using a previously declared array of doubles.
- -
-
- -
-
- - - - - - - - -
static DMatrix** DMatrix::GetAuxPr (void ) [inline, static]
-
-
- -

Gets a pointer to the array of auxiliary objects.

-
Returns:
DMatrix** pointer
- -
-
- -
-
- - - - - - - -
double* DMatrix::GetConstPr () const [inline]
-
-
- -

Gets a pointer to the array where the elements of the matrix are stored (for const objects)

-
Returns:
double pointer
- -
-
- -
-
- - - - - - - -
long DMatrix::getm () [inline]
-
-
- -

Gets the number of columns from the calling object.

-
Returns:
long value with the number of columns
- -
-
- -
-
- - - - - - - -
long DMatrix::getm () const [inline]
-
-
- -

Gets the number of columns from the calling object.

-
Returns:
long value with the number of columns
- -
-
- -
-
- - - - - - - -
int DMatrix::GetMType () [inline, protected]
-
-
- -

Gets the type of matrix.

-
Returns:
int value
- -
-
- -
-
- - - - - - - -
long DMatrix::getn () [inline]
-
-
- -

Gets the number of rows from the calling object.

-
Returns:
long value with the number of rows.
- -
-
- -
-
- - - - - - - -
long DMatrix::getn () const [inline]
-
-
- -

Gets the number of rows from the calling object.

-
Returns:
long value with the number of rows.
- -
-
- -
-
- - - - - - - -
long DMatrix::GetNoCols () [inline]
-
-
- -

Gets the number of columns from the calling object.

-
Returns:
long value with the number of columns
- -
-
- -
-
- - - - - - - -
long DMatrix::GetNoCols () const [inline]
-
-
- -

Gets the number of columns from the calling object.

-
Returns:
long value with the number of columns
- -
-
- -
-
- - - - - - - -
long DMatrix::GetNoRows () const [inline]
-
-
- -

Gets the number of rows from the calling object.

-
Returns:
long value with the number of rows.
- -
-
- -
-
- - - - - - - -
long DMatrix::GetNoRows () [inline]
-
-
- -

Gets the number of rows from the calling object.

-
Returns:
long value with the number of rows.
- -
-
- -
-
- - - - - - - -
double* DMatrix::GetPr () [inline]
-
-
- -

Gets the pointer to the array where the elements of the matrix are stored.

-
Returns:
double pointer
- -
-
- -
-
- - - - - - - -
DMatrix* DMatrix::GetReferencedDMatrixPointer () [inline, protected]
-
-
- -

Gets the value of the referenced matrix pointer.

-
Returns:
pointer to DMatrix object
- -
-
- -
-
- - - - - - - -
void DMatrix::input_matrix ()
-
-
- -

Allows the user to enter the elements of a matrix using command line prompts.

-
Returns:
void
- -
-
- -
-
- - - - - - - -
int DMatrix::isEmpty () [inline]
-
-
- -

Check if a matrix object is empty, if other words this method checks if the calling object has zero elements.

-
Returns:
int value: 0 if calling object is not empty, 1 otherwise
- -
-
- -
-
- - - - - - - - -
static int DMatrix::isThereError (void ) [inline, static]
-
-
- -

Checks if the error flag has been raised. If so, a 1 is returned, 0 otherwise.

-
Returns:
int value
- -
-
- -
-
- - - - - - - -
int DMatrix::isVector () const [inline]
-
-
- -

Check if a matrix object contains a row or column vector.

-
Returns:
int value: 1 if calling object is a vector, 0 otherwise
- -
-
- -
-
- - - - - - - - -
void DMatrix::Load (const char * FileName)
-
-
- -

Reads the elements of a matrix from a file.

-

The calling object should have the appropriate number of rows and columns.

-
Parameters:
- - -
FileNameis a string with the file name where the matrix elements are stored.
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::MemCpyArray (double * aptr)
-
-
- -

Copies values to the elements of a DMatrix object from an existing array. The number of elements of the DMatrix object is assumed to be the number of values to be copied.

-
Parameters:
- - -
aptr,:pointer to the start of the array of doubles to be copied.
-
-
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::mpow (int p)
-
-
- -

Computes and returns the integer power of a matrix.

-
Parameters:
- - -
p,:integer value, starting from 0
-
-
-
Returns:
DMatrix object with the result of the calculation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator!= (double val) const
-
-
- -

Checks if each element of the DMatrix object on the left hand side is different from the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.

-
Parameters:
- - -
val,:right hand side value
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator!= (const DMatrixval) const
-
-
- -

Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is different from the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.

-
Parameters:
- - -
val,:val: right hand side object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator% (const DMatrixrval) const
-
-
- -

Computes the left division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the inverse of the left object by the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The left hand side object must be a square matrix.

-
Parameters:
- - -
rval,:DMatrix object at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator& (const DMatrix B) const
-
-
- -

Elementwise product operator. Returns a DMatrix object with the same dimensions of the calling objects and each of its elements is computed as the product of the corresponding elements of the calling object and the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A&B).

-
Parameters:
- - -
B,:DMatrix object at the right hand side of the operator
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator&& (const DMatrixB) const
-
-
- -

Stacks the right hand side matrix below the left hand side matrix. The dimensions number of columns of the matrices involved must be the same, otherwise an error is thrown. The number of rows of the resulting matrix is the addition of the number of rows of both matrices involved.

-
Parameters:
- - -
B,:DMatrix object at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::operator() (const DMatrixRowIndx,
long col 
)
-
-
- -

Sub-vector extraction and referencing using an array of row indices for a given column.

-
Parameters:
- - - -
RowIndxis a DMatrix array that contains row index values usually generated using the colon() function.
colis a column index
-
-
-
Returns:
Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double DMatrix::operator() (const char * end,
long col 
) const
-
-
- -

Matrix indexing. Returns the value of the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation.

-
Parameters:
- - - -
end,:Character string containing the word "end".
col,:Column index starting from 1.
-
-
-
Returns:
double value of the indexed matrix element.
- -
-
- -
-
- - - - - - - - -
double DMatrix::operator() (const char * end) const
-
-
- -

Access to last linear element. Returns the value of the last linear matrix element, assuming column major storage.

-
Parameters:
- - -
end,:Character string containing the word "end".
-
-
-
Returns:
value of the last matrix element.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::operator() (const char * end,
const DMatrixColIndx 
)
-
-
- -

Sub-vector extraction and referencing using an array of column indices for the last column of a matrix.

-
Parameters:
- - - -
endis a character string containing the word "end".
ColIndxis a DMatrix array that contains column index values usually generated using the colon() function.
-
-
-
Returns:
Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object
- -
-
- -
-
- - - - - - - - -
double& DMatrix::operator() (const char * end)
-
-
- -

Access to last linear element. Returns a reference to the last linear matrix element, assuming column major storage.

-
Parameters:
- - -
end,:Character string containing the word "end".
-
-
-
Returns:
reference to indexed matrix element.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::operator() (const DMatrixRowIndx,
const DMatrixColIndx 
)
-
-
- -

Submatrix extraction and referencing using arrays of indices.

-
Parameters:
- - - -
RowIndxis a DMatrix array that contains row index values usually generated using the colon() function.
ColIndxis a DMatrix array that contains column index values usually generated using the colon() function.
-
-
-
Returns:
Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object.
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator() (const DMatrixRowIndx)
-
-
- -

Linear sub-vector extraction and referencing using an array of indices assuming column-major storage.

-
Parameters:
- - -
RowIndxis a DMatrix array that contains row index values usually generated using the colon() function.
-
-
-
Returns:
Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double& DMatrix::operator() (long row,
long col 
)
-
-
- -

Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row and column indices. Indices start from 1.

-
Parameters:
- - - -
row,:Row index starting from 1.
col,:Column index starting from 1.
-
-
-
Returns:
Reference to the indexed matrix element.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double& DMatrix::operator() (long row,
const char * end 
)
-
-
- -

Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of zero or negative indices. The matrix is resized if necessary.

-
Parameters:
- - - -
row,:Row index starting from 1.
end,:Character string containing the word "end".
-
-
-
Returns:
Reference to the indexed matrix element.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double& DMatrix::operator() (const char * end,
long col 
)
-
-
- -

Matrix indexing. Returns a reference to the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation.

-
Parameters:
- - - -
end,:Character string containing the word "end".
col,:Column index starting from 1.
-
-
-
Returns:
Reference to the indexed matrix element.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::operator() (long row,
const DMatrixColIndx 
)
-
-
- -

Sub-vector extraction and referencing using an array of column indices for a given row.

-
Parameters:
- - - -
rowis a row index.
ColIndxis a DMatrix array that contains column index values usually generated using the colon() function.
-
-
-
Returns:
Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double DMatrix::operator() (long row,
const char * end 
) const
-
-
- -

Matrix indexing. Returns the value of the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of a range violation.

-
Parameters:
- - - -
row,:Row index starting from 1.
end,:Character string containing the word "end".
-
-
-
Returns:
double value of the indexed matrix element.
- -
-
- -
-
- - - - - - - - -
double& DMatrix::operator() (long index)
-
-
- -

Single index matrix indexing. Returns a reference to the matrix element located at the linear position indicated by the index, assuming column major storage. The indexs start from 1. The matrix is resized if necessary. An error is thrown in case of zero or negative indices.

-
Parameters:
- - -
index,:index value
-
-
-
Returns:
reference to indexed matrix element.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::operator() (const DMatrixRowIndx,
const char * end 
)
-
-
- -

Sub-vector extraction and referencing using an array of row indices for the last column of a matrix.

-
Parameters:
- - - -
RowIndxis a DMatrix array that contains row index values usually generated using the colon() function.
endis a character string containing the word "end".
-
-
-
Returns:
Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object
- -
-
- -
-
- - - - - - - - -
double DMatrix::operator() (long k) const
-
-
- -

Single index matrix indexing. Returns the value of the matrix element located at the linear position indicated by the index, assuming column major storage. The index starts from 1. An error is thrown in case of range error.

-
Parameters:
- - -
k,:index value
-
-
-
Returns:
Value of indexed matrix element.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double DMatrix::operator() (long row,
long col 
) const
-
-
- -

Matrix indexing. Returns the value of the matrix element located at the position indicated by the row and column indices. Indices start from 1. An error in thrown in case of a range violation.

-
Parameters:
- - - -
row,:Row index starting from 1.
col,:Column index starting from 1.
-
-
-
Returns:
double value of the indexed element.
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator* (const DMatrixrval) const
-
-
- -

Matrix product operator. Returns the result of the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown.

-
Parameters:
- - -
rval,:matrix located at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator* (double Arg) const
-
-
- -

Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value) and replaces the left hand side object with the result of the operation.

-
Parameters:
- - -
Arg,:double value that will multiply each element of the matrix.
-
-
-
Returns:
Reference the calling DMatrix object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator*= (double Arg)
-
-
- -

Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value), and modifies the calling object to store the result of the operation.

-
Parameters:
- - -
Arg,:double value that will multiply each element of the matrix.
-
-
-
Returns:
Reference to the calling DMatrix object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator*= (const DMatrixrval)
-
-
- -

Matrix product operator with substitution. Computes the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown. The calling object is modified to store the results of the operation.

-
Parameters:
- - -
rval,:matrix located at the right hand side of the operator.
-
-
-
Returns:
Reference to the calling DMatrix object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator+ (const DMatrixrval) const
-
-
- -

Matrix addition operator. The sizes of the matrices being added should be the same, otherwise an error is thrown.

-
Parameters:
- - -
rval,:matrix located at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator+ (double x) const
-
-
- -

Adds a scalar real value to each element of the matrix. .

-
Parameters:
- - -
x,:double value to be added
-
-
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator+= (const DMatrixrval)
-
-
- -

Matrix addition and substitution operator. The sizes of the matrices being added should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation.

-
Parameters:
- - -
rval,:matrix located right hand side of the operator.
-
-
-
Returns:
Reference to the calling object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator- (double x) const
-
-
- -

Subtracts a scalar real value from each element of the matrix. .

-
Parameters:
- - -
x,:double value to be subtracted
-
-
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator- (const DMatrixrval) const
-
-
- -

Matrix subtraction operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown.

-
Parameters:
- - -
rval,:matrix located at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator-= (const DMatrixrval)
-
-
- -

Matrix subtraction and substitution operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation.

-
Parameters:
- - -
rval,:matrix located right hand side of the operator.
-
-
-
Returns:
Reference to the calling object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator/ (const DMatrixrval) const
-
-
- -

Computes the right division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the left object by the inverse of the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The right hand side object must be a square matrix.

-
Parameters:
- - -
rval,:DMatrix object at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator/ (double Arg) const
-
-
- -

Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value).

-
Parameters:
- - -
Arg,:double value that will divide each element of the matrix.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator/= (double Arg)
-
-
- -

Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value) and modifies the left hand side object with the result of the operation.

-
Parameters:
- - -
Arg,:double value that will divide each element of the matrix.
-
-
-
Returns:
Reference to the calling object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator< (double val) const
-
-
- -

Checks if each element of the DMatrix object on the left hand side is lower than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.

-
Parameters:
- - -
val,:right hand side value
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator< (const DMatrixval) const
-
-
- -

Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.

-
Parameters:
- - -
val,:val: right hand side object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator<= (const DMatrixval) const
-
-
- -

Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower or equal than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.

-
Parameters:
- - -
val,:val: right hand side object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator<= (double val) const
-
-
- -

Checks if each element of the DMatrix object on the left hand side is lower or equal than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.

-
Parameters:
- - -
val,:right hand side value
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator= (const DMatrixrval)
-
-
- -

Matrix assignment. The size of the left hand side object is modified if necessary, and the values of all real elements of the right hand side object and copied to the left hand side object.

-
Parameters:
- - -
rval,:DMatrix object at the right hand side of the operator
-
-
-
Returns:
Reference to the calling object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator= (double val)
-
-
- -

Matrix assignment to a scalar. The size of the left hand side object is modified to one row by one column if necessary, and the value of the right hand side argument is copied to the single element of the matrix. If the calling object is a "colon reference" matrix, then the right hand side value is copied to each element of the referenced array elements.

-
Parameters:
- - -
val,:double value at the right hand side of the operator
-
-
-
Returns:
Reference to the calling object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator= (const char * str)
-
-
- -

Matrix assignment to a constant matrix defined as a character string using the bracket notation used in Matlab and Octave. The size of the left hand side object is modified if necessary. For example, the identity matrix of size two by two would be entered as "[1.0 0.0;0.0 1.0]".

-
Parameters:
- - -
str,:Character string containing the constant matrix defined using Matlab/Octave bracket notation.
-
-
-
Returns:
Reference to the calling object
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator== (const DMatrixval) const
-
-
- -

Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is equal to the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.

-
Parameters:
- - -
val,:val: right hand side object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator== (double val) const
-
-
- -

Checks if each element of the DMatrix object on the left hand side is equal to the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.

-
Parameters:
- - -
val,:right hand side value
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator> (const DMatrixval) const
-
-
- -

Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.

-
Parameters:
- - -
val,:val: right hand side object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator> (double val) const
-
-
- -

Checks if each element of the DMatrix object on the left hand side is greater than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.

-
Parameters:
- - -
val,:right hand side value
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator>= (double val) const
-
-
- -

Checks if each element of the DMatrix object on the left hand side is greater or equal than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise.

-
Parameters:
- - -
val,:right hand side value
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator>= (const DMatrixval) const
-
-
- -

Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater or equal than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown.

-
Parameters:
- - -
val,:val: right hand side object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator^ (double x)
-
-
- -

Elementwise power operator. Returns a DMatrix object with the same dimensions of the calling object and each of its elements is computed as the corresponding element of the calling object to the power of the right hand side argument. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A^x).

-
Parameters:
- - -
x,:double argument at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator| (const DMatrix B) const
-
-
- -

Elementwise division operator. Returns a DMatrix object with the same dimensions of the calling objects and each of its elements is computed as the of the corresponding element of the calling object by the corresponding element of the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the / operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A|B).

-
Parameters:
- - -
B,:DMatrix object at the right hand side of the operator
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::operator|| (const DMatrixB) const
-
-
- -

Concatenates two matrices side by side. The dimensions number of rows of the matrices involved must be the same, otherwise an error is thrown. The number of columns of the resulting matrix is the addition of the number of columns of both matrices involved.

-
Parameters:
- - -
B,:DMatrix object at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
void DMatrix::Print (const char * text) const
-
-
- -

Prints the elements of a DMatrix object.

-
Parameters:
- - -
textis a string that serves as a prompt for the matrix being entered.
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::PrintInfo (const char * text) const
-
-
- -

Prints information about a DMatrix object.

-
Parameters:
- - -
textis a a string that serves as a label for the matrix being printed.
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
static double DMatrix::random_gaussian (void ) [static]
-
-
- -

Returns a pseudo-random Gaussian distributed number with zero mean and unit variance.

-
Returns:
double Gaussian pseudo-random value
- -
-
- -
-
- - - - - - - - -
static double DMatrix::random_uniform (void ) [static]
-
-
- -

Returns a pseudo-random uniformly distributed number in the range [0,1].

-
Returns:
double pseudo-random value in the range [0,1]
- -
-
- -
-
- - - - - - - - -
void DMatrix::Read (FILE * filex)
-
-
- -

Reads the elements of a matrix from a file.

-

The file in question should contain the elements of the matrix row by row The elements should be separated by spaces and each row should be separated by a new line. The calling object should have the appropriate number of rows and columns.

-
Parameters:
- - -
filexpointer to a file already opened using "fopen()".
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void DMatrix::Resize (long nnrow,
long nncol 
)
-
-
- -

Changes the number of rows and columns of an existing matrix. Allocates new memory if necessary. If the calling object uses preallocated memory and the requested size would exceed that memory, an error is thrown.

-
Parameters:
- - - -
nnrow,:new number of rows
nncol,:new number of columns
-
-
- -
-
- -
-
- - - - - - - - -
DMatrix& DMatrix::Row (long irow) const
-
-
- -

Returns a DMatrix object containing a speficied row of the calling object.

-
Parameters:
- - -
irow,:row index (starting from 1)
-
-
-
Returns:
DMatrix object with the specified row
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void DMatrix::rowMult (long r,
double x 
)
-
-
- -

Multiples the elements of a specified row of a matrix by a constant scalar value.

-
Parameters:
- - - -
r,:index to the row that is to be changed
x,:scalar value
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::Save (const char * FileName)
-
-
- -

Saves the elements of a matrix to a file.

-
Parameters:
- - -
FileNameis a string with the desired file name
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::SetColIndexPointer (const DMatrixarg) [inline, protected]
-
-
- -

Sets the column index pointer.

-
Parameters:
- - -
argPointer to DMatrix object
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void DMatrix::SetColumn (const DMatrixCol,
int icol 
)
-
-
- -

Assigns values to a column of a matrix, while other columns are left untouched.

-
Parameters:
- - - -
Col,:reference to constant DMatrix object which should contain a vector with the desired column values
icol,:index to the column that is to be changed
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::SetMType (int arg) [protected]
-
-
- -

Sets the type of matrix.

-
Parameters:
- - -
arg(int) should be 0 for a normal matrix, or 1 for a colon reference matrix
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
static void DMatrix::SetPrintLevel (int plevel) [static]
-
-
- -

Sets the print level.

-
Parameters:
- - -
pleveldesired print level
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::SetReferencedDMatrixPointer (DMatrixarg) [inline, protected]
-
-
- -

Sets the value of the referenced matrix pointer.

-
Parameters:
- - -
argPointer to DMatrix object
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void DMatrix::SetRow (const DMatrixRow,
int irow 
)
-
-
- -

Assigns values to a row of a matrix, while other columns are left untouched.

-
Parameters:
- - - -
Row,:reference to constant DMatrix object which should contain a vector with the desired row values
irow,:index to the row that is to be changed
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::SetRowIndexPointer (const DMatrixarg) [inline, protected]
-
-
- -

Sets the row index pointer.

-
Parameters:
- - -
argPointer to DMatrix object
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
void DMatrix::SetSubMatrix (long row,
long col,
const DMatrixA 
)
-
-
- -

Assigns the elements of a matrix object to a section of the calling object.

-
Parameters:
- - - - -
row,:start of row range
col,:start of column range
A,:DMatrix object whose element values are to be copied into the calling object
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix& DMatrix::sub_matrix (long r1,
long r2,
long c1,
long c2 
) const
-
-
- -

Extracts a specified sub-matrix from a matrix.

-
Parameters:
- - - - - -
r1,:start of row range
r2,:end of row range
c1,:start of column range
c2,:end of column range
-
-
-
Returns:
DMatrix object with the specified sub-matrix
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void DMatrix::SwapColumns (int i,
int j 
)
-
-
- -

Swaps two columns of a matrix.

-
Parameters:
- - - -
i,:first column index
j,:second column index.
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void DMatrix::SwapRows (int i,
int j 
)
-
-
- -

Swaps two rows of a matrix.

-
Parameters:
- - - -
i,:first row index
j,:second row index.
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
void DMatrix::Transpose (void )
-
-
- -

Transposes a matrix.

-
Returns:
void
- -
-
-

Friends And Related Function Documentation

- -
-
- - - - - - - - -
DMatrix& Abs (const DMatrixA) [friend]
-
-
- -

This function computes and returns the element-wise absolute value of matrix A.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
a reference to a temporary DMatrix object with the result of the operation.
- -
-
- -
-
- - - - - - - - -
int any (const DMatrixA) [friend]
-
-
- -

This function returns a 1 if any alement of DMatrix object that is passed as argument is non-zero, otherwise it returns a zero.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
an integer value which is either 1 or 0.
- -
-
- -
-
- - - - - - - - -
DMatrix& Chol (const DMatrixA) [friend]
-
-
- -

Returns the Cholesky factorisation of a matrix A, which must be a positive definite symmetric matrix.

-
Parameters:
- - -
Ais a DMatrix object·
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
-
See also:
CholFSolve(), CholSolve()
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
void CholeskyDecomp (DMatrixA,
int n,
DMatrixpM 
) [friend]
-
-
- -

Cholesky decomposition of a matrix.

-
Parameters:
- - - - -
Ais a DMatrix object
nis the number of columns of the input matrix A.
pM(modified), is a DMatrix object which on output contains the Cholesky decomposition of input matrix a.
-
-
-
Returns:
void
-
See also:
CholeskySolution()
- -
-
- -
-
- - - - - - - - -
DMatrix& CholeskyRoot (const DMatrixA) [friend]
-
-
- -

Returns the Cholesky root R of a given matrix A, such that A=R'R. A must be a positive definite symmetric matrix.

-
Parameters:
- - -
Ais a DMatrix object·
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CholeskySolution (const DMatrixA,
int n,
const DMatrixpM,
const DMatrixbM,
DMatrixxM 
) [friend]
-
-
- -

Cholesky solution using the Cholesky decomposition of a matrix.

-
Parameters:
- - - - - - -
ADMatrix object
nis the number of columns of the input matrix A.
pMDMatrix object which on output contains the Cholesky decomposition of input matrix a.
bMDMatrix object with a vector of right-hand-side values
xM(modified) DMatrix object which on return contains the solution to the system of equations
-
-
-
Returns:
void
-
See also:
CholeskyDecomp()
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& CholFSolve (const DMatrixAchol,
const DMatrixb 
) [friend]
-
-
- -

Solves the system of equations $ A x = b $ using Cholesky factorisation. The function uses a previously found Cholesky factorisation.

-
Parameters:
- - - -
Acholis a DMatrix object resulting from a previous call to Chol().
bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation (the resulting vector x)
-
See also:
CholFSolve(), Chol()
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& CholSolve (const DMatrixA,
const DMatrixb 
) [friend]
-
-
- -

Solves the system of equations $ A x = b $ using Cholesky factorisation.

-
Parameters:
- - - -
Ais a DMatrix object
bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation (the resulting vector x)
-
See also:
CholFSolve(), Chol()
- -
-
- -
-
- - - - - - - - -
DMatrix& colon (void ) [friend]
-
-
- -

This function generates a special DMatrix object with one row and one column which is understood by the indexing functions that take a DMatrix object as an argument to mean "all rows" or "all columns".

-
Returns:
Reference to a temporary DMatrix object
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix& colon (double i1,
double increment,
double i2 
) [friend]
-
-
- -

This function generates a DMatrix object with a vector starting from a given value, with given increments and ending in a given value.

-
Parameters:
- - - - -
i1is the first value
incrementis the increment
i2is the last value
-
-
-
Returns:
Reference to a temporary DMatrix object
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix& colon (int i1,
int increment,
int i2 
) [friend]
-
-
- -

This function generates DMatrix object with a vector starting from a given value, with given increments and ending in a given value.

-
Parameters:
- - - - -
i1is the first value
incrementis the increment
i2is the last value
-
-
-
Returns:
Reference to a temporary DMatrix object
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& colon (int i1,
int i2 
) [friend]
-
-
- -

This function generates DMatrix object with a vector starting from a given value, with unit increments, and ending in a given value.

-
Parameters:
- - - -
i1is the first value
i2is the last value
-
-
-
Returns:
Reference to a temporary DMatrix object
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& colon (double i1,
double i2 
) [friend]
-
-
- -

This function generates DMatrix object with a vector starting from a given value, with unit increments, and ending in a given value.

-
Parameters:
- - - -
i1is the first value
i2is the last value
-
-
-
Returns:
Reference to a temporary DMatrix object
- -
-
- -
-
- - - - - - - - -
double cond (const DMatrixA) [friend]
-
-
- -

This function calculates the 2-norm condition number of a matrix, which is the ratio of the maximum singular value to the minimum singular value of the matrix. A large condition number indicates a nearly singular matrix. If the input matrix is not square, an error is thrown.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the 2-norm condition number
- -
-
- -
-
- - - - - - - - -
DMatrix& cos (const DMatrixA) [friend]
-
-
- -

This function returns a matrix with the cosine of each element of the input matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& cosh (const DMatrixA) [friend]
-
-
- -

This function returns a matrix with the hyperbolic cosine of each element of the input matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& cov (const DMatrixA,
int ntype = 0 
) [friend]
-
-
- -

Computes the covariance matrix of a data matrix where the N rows correspond to samples and the M columns are variables. The result is returned as an M x M matrix. If ntype=0 (default) then the result is normalised with N-1. Otherwise, if ntype=1, the result is normalised with N.

-
Parameters:
- - - -
Ais a DMatrix object.
ntypeis the type of normalization, 0 (default) or 1.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix& cov (DMatrixX,
DMatrixY,
int ntype = 0 
) [friend]
-
-
- -

Computes the covariance matrix of two vectors X and Y of dimension N. The result is returned as an 1 x 1 DMatrix object. If ntype=0 (default) then the result is normalised with N-1. Otherwise, if ntype=1, the result is normalised with N.

-
Parameters:
- - - - -
Xis a DMatrix object.
Yis a DMatrix object
ntypeis the type of normalization, 0 (default) or 1.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& cross (const DMatrixx,
const DMatrixy 
) [friend]
-
-
- -

This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown.

-
Parameters:
- - - -
xis a DMatrix object.
yis a DMatrix object
-
-
-
Returns:
the value of the cross product of x and y.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& crossProduct (const DMatrixx,
const DMatrixy 
) [friend]
-
-
- -

This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown.

-
Parameters:
- - - -
xis a DMatrix object.
yis a DMatrix object
-
-
-
Returns:
the value of the cross product of x and y.
- -
-
- -
-
- - - - - - - - -
double det (const DMatrixA) [friend]
-
-
- -

This function returns the determinant of a square matrix. If the input matrix is not square, an error is thrown.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the determinant of the matrix.
- -
-
- -
-
- - - - - - - - -
DMatrix& diag (const DMatrixA) [friend]
-
-
- -

if A is a matrix this function extracts a column vector with the diagonal values of A. If A is a vector this function returns a matrix having the elements of A in the diagonal

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double dot (const DMatrixx,
const DMatrixy 
) [friend]
-
-
- -

This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown.

-
Parameters:
- - - -
xis a DMatrix object.
yis a DMatrix object
-
-
-
Returns:
the value of the dot product of x and y.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
double dotProduct (const DMatrixx,
const DMatrixy 
) [friend]
-
-
- -

This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown.

-
Parameters:
- - - -
xis a DMatrix object.
yis a DMatrix object
-
-
-
Returns:
the value of the dot product of x and y.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& eig (const DMatrixA,
DMatrixV = NULL 
) [friend]
-
-
- -

This function computes the eigenvalues and (optionally) the eigenvectors of a matrix A. This function uses the LAPACK routines dsyev_() and dgeev_.

-
Parameters:
- - - -
Ais a DMatrix object.
Vis a pointer to a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the real part of the eigenvalues in the first column and the complex part of the eigenvalues in the second column.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& elemDivision (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function computes and returns the element-wise division of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. The dimensions of the returned object are the same as the dimensions of the factors.

-
Parameters:
- - - -
Ais a DMatrix object.
Bis a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& elemProduct (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function computes and returns the element-wise product of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown.

-
Parameters:
- - - -
Ais a DMatrix object.
Bis a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
double enorm (const DMatrixA) [friend]
-
-
- -

This function computes and return the Euclidean norm of a matrix A, which is the square root of the sum of its squared elements.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the value of the Euclidean norm.
- -
-
- -
-
- - - - - - - - -
void error_message (const char * input_text) [friend]
-
-
- -

This function prints an error message and throws an exception to be handled by the ErrorHandler class.

-
Parameters:
- - -
input_textis the error message
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
DMatrix& exp (const DMatrixA) [friend]
-
-
- -

This function returns a matrix with the natural exponential of each element of the input matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& expm (const DMatrixA) [friend]
-
-
- -

This function returns the exponential matrix of a given square matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& eye (long n) [friend]
-
-
- -

This function returns the identity matrix with a given number of rows and columns.

-
Parameters:
- - -
nis the desired number of rows and columns
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& eye (long n,
long m 
) [friend]
-
-
- -

This function returns a truncated identity matrix with specified numbers of rows and columns.

-
Parameters:
- - - -
nis the desired number of rows
mis the desired number of columns
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& find (const DMatrixA) [friend]
-
-
- -

This function returns a column vector with the linear indices of the non-zero elements of the input matrix A. The linear index is 1 for element (1,1) of the input matrix A, and length(A) for the (nrows,ncols) element of the input matrix A.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
double Fnorm (const DMatrixA) [friend]
-
-
- -

This function computes Frobenius norm of matrix A.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the value of the Frobenius norm
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& identity (long n,
long m 
) [friend]
-
-
- -

This function returns a truncated identity matrix with specified numbers of rows and columns.

-
Parameters:
- - - -
nis the desired number of rows
mis the desired number of columns
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& identity (long n) [friend]
-
-
- -

This function returns the identity matrix with a given number of rows and columns.

-
Parameters:
- - -
nis the desired number of rows and columns
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
double InfNorm (const DMatrixA) [friend]
-
-
- -

This function computes infinity norm of matrix A, which is computed as the maximum absolute value row sum.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the value of the infinity norm
- -
-
- -
-
- - - - - - - - -
DMatrix& inv (const DMatrixA) [friend]
-
-
- -

This function returns the inverse of a given square matrix. If the argument is not a square matrix an error is thrown.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
int isSymmetric (const DMatrixA) [friend]
-
-
- -

This function checks if the input matrix is symmetric. If the input matrix is not square, an error is thrown.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
1 if the input matrix is symmetric, 0 otherwise.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& kronProduct (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function computes and returns the Kronecker product of two matrices. The row (column) dimension of the returned object is the product of the row (column) dimensions of both factors.

-
Parameters:
- - - -
Ais a DMatrix object.
Bis a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
long length (const DMatrixA) [friend]
-
-
- -

This function returns the number of elements of a matrix A.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
the number of elements of the input matrix.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix& linspace (double X1,
double X2,
long N 
) [friend]
-
-
- -

This function returns a linearly spaced vector with N points between the values X1 and X2.

-
Parameters:
- - - - -
X1is a real number
X2is a real number
Nis the desired length of the returned vector
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& log (const DMatrixA) [friend]
-
-
- -

This function returns a matrix with the natural logarithm of each element of the input matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& LQ (const DMatrixA,
DMatrixQ 
) [friend]
-
-
- -

Returns the LQ factorisation of a matrix A. The function uses the LAPACK routine dgelqf_().

-
Parameters:
- - - -
Ais a DMatrix object·
Qis a pointer to a DMatrix object, which is modified on output to contain the Q factor of the decomposition.
-
-
-
Returns:
Reference to a temporary DMatrix object with the L factor of the decomposition.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& LSMNSolve (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function solves overdetermined or underdetermined real linear systems $ A x = B $ using a QR or LQ factorization of A. It is assumed that matrix A has full rank. The function uses the LAPACK routine dgels.

-
Parameters:
- - - -
Ais a DMatrix object
Bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation (the resulting vector x)
- -
-
- -
-
- - - - - - - - -
DMatrix& LU (const DMatrixA) [friend]
-
-
- -

Returns the LU factorisation of a matrix A.

-
Parameters:
- - -
Ais a DMatrix object·
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
-
See also:
LUFSolve(), LUSolve()
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& LUFSolve (const DMatrixALU,
const DMatrixb 
) [friend]
-
-
- -

Solves the system of equations $ A x = b $ using LU factorisation using a previously found LU factors.

-
Parameters:
- - - -
ALUis a DMatrix object resulting from a previous call to the LU() function
bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation (the resulting vector x)
-
See also:
LU(), LUSolve()
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& LUSolve (const DMatrixA,
const DMatrixb 
) [friend]
-
-
- -

Solves the system of equations $ A x = b $ using LU factorisation.

-
Parameters:
- - - -
Ais a DMatrix object
bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation (the resulting vector x)
-
See also:
LUFSolve(), LU()
- -
-
- -
-
- - - - - - - - -
DMatrix& MatrixSign (const DMatrixA) [friend]
-
-
- -

This function returns a DMatrix object with the same dimensions as the input matrix such that each of its elements is 1 is the corresponding value of the input matrix is positive, -1 if the corresponding value of the input matrix is negative, and 0 if the corresponding value of the input matrix is 0.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
double Max (const DMatrixA,
int * rindx = NULL,
int * cindx = NULL 
) [friend]
-
-
- -

This function finds and returns the element of matrix A with maximum value. It also returns the indices of such element. If more than one element has the same maximum value, the indices of the first element found when searching column by column is returned.

-
Parameters:
- - - - -
Ais a DMatrix object.
rindxis an optional pointer to an integer which is modified with the row index.
cindxis an optional pointer to an integer which is modified with the column index.
-
-
-
Returns:
the value of the element with maximum value.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
double MaxAbs (const DMatrixA,
int * rindx = NULL,
int * cindx = NULL 
) [friend]
-
-
- -

This function finds and returns the element of matrix A with maximum absolute value. It also returns the indices of such element. If more than one element has the same maximum absolute value, the indices of the first element found when searching column by column is returned.

-
Parameters:
- - - - -
Ais a DMatrix object.
rindxis a pointer to an integer which is modified with the row index.
cindxis a pointer to an integer which is modified with the column index.
-
-
-
Returns:
the absolute value of the element with maximum absolute value.
- -
-
- -
-
- - - - - - - - -
DMatrix& mean (const DMatrixA) [friend]
-
-
- -

This function returns a row vector with the mean values of the columns of matrix A.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
double Min (const DMatrixA,
int * rindx = NULL,
int * cindx = NULL 
) [friend]
-
-
- -

This function finds and returns the element of matrix A with minimum value. It also returns the indices of such element. If more than one element has the same minimum value, the indices of the first element found when searching column by column is returned.

-
Parameters:
- - - - -
Ais a DMatrix object.
rindxis a pointer to an integer which is modified with the row index.
cindxis a pointer to an integer which is modified with the column index.
-
-
-
Returns:
the absolute value of the element with minimum absolute value.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
double MinAbs (const DMatrixA,
int * rindx = NULL,
int * cindx = NULL 
) [friend]
-
-
- -

This function finds and returns the element of matrix A with minimum absolute value. It also returns the indices of such element. If more than one element has the same minimum absolute value, the indices of the first element found when searching column by column is returned.

-
Parameters:
- - - - -
Ais a DMatrix object.
rindxis a pointer to an integer which is modified with the row index.
cindxis a pointer to an integer which is modified with the column index.
-
-
-
Returns:
the absolute value of the element with minimum absolute value.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& mpow (DMatrixA,
int p 
) [friend]
-
-
- -

This function calculates the integer matrix power.

-
Parameters:
- - - -
Ais a DMatrix object.
pis an integer value which can be positive or negative
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
double norm (const DMatrixA) [friend]
-
-
- -

This function computes 2-norm of matrix A, which is computed as the maximum singular value of A.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the value of the 2-norm
- -
-
- -
-
- - - - - - - - -
DMatrix& null (const DMatrixA) [friend]
-
-
- -

This function returns Z, the orthonormal basis for the null space of a matrix A, such that $ Z Z' = I $ and $ A Z=0 $. The number of columns of Z is the nullity of A.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& ones (long n,
long m 
) [friend]
-
-
- -

This function returns a matrix full of ones with specified numbers of rows and columns.

-
Parameters:
- - - -
nis the desired number of rows
mis the desired number of columns
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& operator* (double r,
const DMatrixA 
) [friend]
-
-
- -

This function multiplies a real number by a matrix.

-
Parameters:
- - - -
ris a double value
Ais a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& operator- (const DMatrixA) [friend]
-
-
- -

Matrix unary minus operator. Returns an object of the same dimensions as A but with changed element signs.

-
Parameters:
- - -
A,:matrix located at the right hand side of the operator.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& orth (const DMatrixA) [friend]
-
-
- -

This function returns Q, the orthonormal basis for the range of a matrix A, such that $ Q Q' = I $. The number of columns of Q is the rank of A.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& pinv (const DMatrixA) [friend]
-
-
- -

This function returns the pseudo-inverse of a given rectangular matrix.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& prod (const DMatrixA) [friend]
-
-
- -

This function returns a row vector with the product of the elements of each column of matrix A.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& Product (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function calculates the product of two matrices. The number of columns of the first matrix must be the same as the number of rows of the second matrix, otherwise an error is thrown.

-
Parameters:
- - - -
Ais a DMatrix object
Bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& ProductT (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function returns the product of the first matrix times the second matrix transposed. The number of columns of both matrices must be the same, otherwise an error is thrown.

-
Parameters:
- - - -
Ais a DMatrix object
Bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& QR (const DMatrixA) [friend]
-
-
- -

Returns the QR factorisation of a matrix A. The number of rows of matrix A must be greater or equal than the number of columns.

-
Parameters:
- - -
Ais a DMatrix object·
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
-
See also:
QRFSolve(), QRSolve()
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& QRFSolve (const DMatrixA,
const DMatrixb 
) [friend]
-
-
- -

Solves the system of equations $ A x = b $ using QR factorisation. The function uses a previously found QR factorisation.

-
Parameters:
- - - -
Ais a DMatrix object.
bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation (the resulting vector x)
-
See also:
QRSolve(), QR()
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& QRSolve (const DMatrixA,
const DMatrixb 
) [friend]
-
-
- -

Solves the system of equations $ A x = b $ using QR factorisation. The number of rows of matrix A must be greater or equal than the number of columns.

-
Parameters:
- - - -
Ais a DMatrix object.
bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation (the resulting vector x)
-
See also:
QRFSolve(), QR()
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& randn (long n,
long m 
) [friend]
-
-
- -

This function returns an nxm matrix where each element is a Gaussian pseudo-random number in the range with zero mean and variance 1.

-
Parameters:
- - - -
nis the desired number of rows of the returned matrix
mis the desired number of columns of the returned matrix
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& randu (long n,
long m 
) [friend]
-
-
- -

This function returns an nxm matrix where each element is a uniform pseudo-random number in the range (0,1).

-
Parameters:
- - - -
nis the desired number of rows of the returned matrix
mis the desired number of columns of the returned matrix
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
int rank (const DMatrixA) [friend]
-
-
- -

This function returns an estimate of the rank of a matrix, which is the number of linearly independent rows or columns.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the rank estimate.
- -
-
- -
-
- - - - - - - - -
double rcond (const DMatrixA) [friend]
-
-
- -

This function estimates the 1-norm reciprocal condition number of a matrix. The function uses the LAPACK function dgecon. if A is well conditioned, then rcond(A) is near 1. If A is badly conditioned, then rcond(A) is close to the machine numerical precision (very small). If the input matrix is not square, an error is thrown.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the reciprocal condition number estimate
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix& reshape (DMatrixA,
long N,
long M 
) [friend]
-
-
- -

This function returns the N-by-M matrix whose elements are taken columnwise from the input matrix A. An error is thrown if A does not have N*M elements.

-
Parameters:
- - - - -
Ais a DMatrix object
Nis the desired number of rows of the reshaped matrix
Mis the desired number of columns of the reshaped matrix
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& schur (const DMatrixA,
DMatrixU = NULL 
) [friend]
-
-
- -

This function computes and returns the Schur decomposition of a matrix A, such that $ A=Q'U Q $, where U is an upper triangular matrix and Q is a unitary matrix. This function uses the LAPACK routine dgees_()

-
Parameters:
- - - -
Ais a DMatrix object.
Uis a pointer to a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the unitary matrix Q.
- -
-
- -
-
- - - - - - - - -
DMatrix& sin (const DMatrixA) [friend]
-
-
- -

This function returns a matrix with the sine of each element of the input matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& sinh (const DMatrixA) [friend]
-
-
- -

This function returns a matrix with the hyperbolic sine of each element of the input matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void sort (DMatrixx,
DMatrixindx 
) [friend]
-
-
- -

This function sorts the input vector x in ascending order. It also returns a DMatrix object with the sorted indices. If the input object is not a vector, then an error is thrown.

-
Parameters:
- - - -
xis a DMatrix object which upon input contains the unsorted vector and upon output contains the sorted vector.
indxis a DMatrix object which upon output contains the values of the sorted indices.
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
void sort (DMatrixx,
int indx[] = NULL 
) [friend]
-
-
- -

This function sorts the input vector x in ascending order. Optionally, it also returns an integer array of sorted indices. If the input object is not a vector, then an error is thrown.

-
Parameters:
- - - -
xis a DMatrix object which upon input contains the unsorted vector and upon output contains the sorted vector.
indxis a pointer to the first element of the array of sorted indices.
-
-
-
Returns:
void
- -
-
- -
-
- - - - - - - - -
DMatrix& Sqrt (const DMatrixA) [friend]
-
-
- -

This function computes the square root of each element of the input matrix A, and it returns a DMatrix object with the same dimensions as the input matrix. If any element of the input matrix is negative, an error is thrown.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& Std (const DMatrixA,
int ntype = 0 
) [friend]
-
-
- -

This function returns a row vector with the standard deviation of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-1), where n is the number of rows of A. Otherwise, the result is normalised with n.

-
Parameters:
- - - -
Ais a DMatrix object.
ntypeis the type of normalization, 0 (default) or 1.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& sum (const DMatrixA) [friend]
-
-
- -

This function returns a row vector with the sum of the elements of each column of matrix A.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
DMatrix& SVD (const DMatrixA,
DMatrixU = NULL,
DMatrixV = NULL 
) [friend]
-
-
- -

Returns the singular value decomposition of a matrix $ A = U' diag(s) V $, where vector s contains the singular values of A. The function uses the LAPACK routine dgesvd_().

-
Parameters:
- - - - -
Ais a DMatrix object·
Uis a pointer to a DMatrix object, which is modified on output to contain the U factor of the decomposition.
Vis a pointer to a DMatrix object, which is modified on output to contain the V factor of the decomposition.
-
-
-
Returns:
Reference to a temporary DMatrix object with a vector that contains the singular values of matrix A.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& SVDSolve (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function uses the LAPACK routine dgelss_() to compute the minimum norm solution to a real linear least squares problem: Minimize $ || B - A x ||_2 $ using the singular value decomposition (SVD) of A. A is a rectangular matrix which may be rank-deficient.

-
Parameters:
- - - -
Ais a DMatrix object.
Bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation (the resulting vector x)
-
See also:
SVD()
- -
-
- -
-
- - - - - - - - -
DMatrix& tan (const DMatrixA) [friend]
-
-
- -

This function returns a matrix with the tangent of each element of the input matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& tanh (const DMatrixA) [friend]
-
-
- -

This function returns a matrix with the hyperbolic tangent of each element of the input matrix.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - -
double toc () [friend]
-
-
- -

This function, which is to be used in conjunction with function tic(), stops counting CPU time, and it prints and returns the elapsed time in seconds since the function tic() was called.

-
Returns:
the elapsed time in seconds.
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& TProduct (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function returns the product of the first matrix transposed times the second matrix. The number of rows of both matrices must be the same, otherwise an error is thrown.

-
Parameters:
- - - -
Ais a DMatrix object
Bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& TProductT (const DMatrixA,
const DMatrixB 
) [friend]
-
-
- -

This function returns the product of the first matrix transposed times the second matrix transposed. The number of rows of the first matrix must be the same as the number of columns of the second matrix, otherwise an error is thrown.

-
Parameters:
- - - -
Ais a DMatrix object
Bis a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& tra (const DMatrixA) [friend]
-
-
- -

This function returns the transpose of a given matrix.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
double trace (const DMatrixA) [friend]
-
-
- -

This function returns the trace of a square matrix. If the input matrix is not square, an error is thrown.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
the trace of the matrix.
- -
-
- -
-
- - - - - - - - -
DMatrix& triu (const DMatrixA) [friend]
-
-
- -

This function extracts and return the triangular upper part of the input matrix A. The returned object has the same dimensions as the input object.

-
Parameters:
- - -
Ais a DMatrix object
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& var (DMatrixA,
int ntype = 0 
) [friend]
-
-
- -

This function returns a row vector with the variance of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-1), where n is the number of rows of A. Otherwise, the result is normalised with n.

-
Parameters:
- - - -
Ais a DMatrix object.
ntypeis the type of normalization, 0 (default) or 1.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - -
DMatrix& vec (const DMatrixA) [friend]
-
-
- -

This function returns a column vector made by stacking the columns of a matrix one below the other from left to right.

-
Parameters:
- - -
Ais a DMatrix object.
-
-
-
Returns:
a temporary DMatrix object with the result of the operation
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
DMatrix& zeros (long n,
long m 
) [friend]
-
-
- -

This function returns a matrix full of zeros with specified numbers of rows and columns.

-
Parameters:
- - - -
nis the desired number of rows
mis the desired number of columns
-
-
-
Returns:
Reference to a temporary DMatrix object with the result of the operation
- -
-
-

Member Data Documentation

- -
-
- - - - -
int DMatrix::atype [protected]
-
-
-

Flag to indicate type of allocation. type = 0 : allocated matrix type = 1 : non-allocated matrix, uses predefined array for storage

- -
-
- -
-
- - - - -
int DMatrix::mtype [protected]
-
-
-

Flag to indicate type of matrix mtype = 0 : normal matrix mtype = 1 : colon - reference matrix

- -
-
-
The documentation for this class was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/classErrorHandler-members.html b/dmatrix/doc/html/classErrorHandler-members.html deleted file mode 100644 index a2729432..00000000 --- a/dmatrix/doc/html/classErrorHandler-members.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

ErrorHandler Member List

-
-
-This is the complete list of members for ErrorHandler, including all inherited members. - - -
error_messageErrorHandler
ErrorHandler(const string m)ErrorHandler
- - - diff --git a/dmatrix/doc/html/classErrorHandler.html b/dmatrix/doc/html/classErrorHandler.html deleted file mode 100644 index 4b2ec948..00000000 --- a/dmatrix/doc/html/classErrorHandler.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: ErrorHandler Class Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

ErrorHandler Class Reference

-
-
- -

ErrorHandler class. -More...

- -

#include <dmatrixv.h>

- -

List of all members.

- - - - - - - -

-Public Member Functions

 ErrorHandler (const string m)
 A constructor which takes the error message as an argument and assigns it to error_message.

-Public Attributes

-string error_message
 A string of characters which contains the error message.
-

Detailed Description

-

ErrorHandler class.

-

This is a C++ class intended to handle error conditions.

-

Constructor & Destructor Documentation

- -
-
- - - - - - - - -
ErrorHandler::ErrorHandler (const string m)
-
-
- -

A constructor which takes the error message as an argument and assigns it to error_message.

-
Parameters:
- - -
mis the error message string.
-
-
-
See also:
function error_message().
- -
-
-
The documentation for this class was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/classInitializeDMatrixClass-members.html b/dmatrix/doc/html/classInitializeDMatrixClass-members.html deleted file mode 100644 index f16f32d8..00000000 --- a/dmatrix/doc/html/classInitializeDMatrixClass-members.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

InitializeDMatrixClass Member List

-
-
-This is the complete list of members for InitializeDMatrixClass, including all inherited members. - - -
InitializeDMatrixClass()InitializeDMatrixClass [inline]
~InitializeDMatrixClass()InitializeDMatrixClass [inline]
- - - diff --git a/dmatrix/doc/html/classInitializeDMatrixClass.html b/dmatrix/doc/html/classInitializeDMatrixClass.html deleted file mode 100644 index f72d5977..00000000 --- a/dmatrix/doc/html/classInitializeDMatrixClass.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: InitializeDMatrixClass Class Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

InitializeDMatrixClass Class Reference

-
-
- -

InitializeDMatrixClass class. -More...

- -

#include <dmatrixv.h>

- -

List of all members.

- - - - - - -

-Public Member Functions

InitializeDMatrixClass ()
 This is the default constructor which calls the function DMatrix::AllocateAuxArr().
~InitializeDMatrixClass ()
 This is the destructor which calls the function DMatrix::DeAllocateAuxArr().
-

Detailed Description

-

InitializeDMatrixClass class.

-

This is a dummy C++ class intended to initialise the temporary objects of the DMatrix class.

-

The documentation for this class was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/classes.html b/dmatrix/doc/html/classes.html deleted file mode 100644 index 4dda9f68..00000000 --- a/dmatrix/doc/html/classes.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Index - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

Class Index

-
-
-
A | C | D | E | I | M | N | O | V
- -
  A  
-
complex   ErrorHandler   
  M  
-
  O  
-
alist   
  D  
-
  I  
-
Multitype   olist   
  C  
-
DMatrix   icilist   
  N  
-
  V  
-
cilist   doublecomplex   InitializeDMatrixClass   Namelist   Vardesc   
cllist   
  E  
-
inlist   
A | C | D | E | I | M | N | O | V
-
- - - diff --git a/dmatrix/doc/html/closed.png b/dmatrix/doc/html/closed.png deleted file mode 100644 index b7d4bd9fef2272c74b94762c9e2496177017775e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VuAVNAAr*{o?>h22DDp4|bgj*t z)u^AqcA-V@guRYpb17F<&b?_~8HV>~XqWvB;^$!VVSTy0!eQcJp_yD7TIQA>7dijs YXf6~H5cs^Q6KEiVr>mdKI;Vst0NsWqGynhq diff --git a/dmatrix/doc/html/dmatrixv_8h_source.html b/dmatrix/doc/html/dmatrixv_8h_source.html deleted file mode 100644 index 5664d2c1..00000000 --- a/dmatrix/doc/html/dmatrixv_8h_source.html +++ /dev/null @@ -1,1168 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: dmatrixv.h Source File - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-

dmatrixv.h

-
-
-
00001 /************************************************************************************************
-00002  This file is part of the DMatrix library, a C++ tool for numerical linear algebra
-00003 
-00004 Copyright (C) 2009 Victor M. Becerra
-00005 
-00006 This library is free software; you can redistribute it and/or
-00007 modify it under the terms of the GNU Lesser General Public
-00008 License as published by the Free Software Foundation; either
-00009 version 2.1 of the License, or (at your option) any later version.
-00010 
-00011 This library is distributed in the hope that it will be useful,
-00012 but WITHOUT ANY WARRANTY; without even the implied warranty of
-00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-00014 Lesser General Public License for more details.
-00015 
-00016 You should have received a copy of the GNU Lesser General Public
-00017 License along with this library; if not, write to the Free Software
-00018 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA,
-00019 or visit http://www.gnu.org/licenses/
-00020 
-00021 Author:    Dr. Victor M. Becerra
-00022            University of Reading
-00023            School of Systems Engineering
-00024            P.O. Box 225, Reading RG6 6AY
-00025            United Kingdom
-00026            e-mail: v.m.becerra@ieee.org
-00027 
-00028 **********************************************************************************************/
-00029 
-00058 #ifndef  DMATRIX_H
-00059 #define  DMATRIX_H
-00060 
-00061 #ifndef bool
-00062 // typedef int bool;
-00063 #endif
-00064 
-00065 #ifndef N_TEMP_OBJECTS
-00066 #define N_TEMP_OBJECTS  (40)
-00067 #endif
-00068 
-00069 #ifndef D_TEMP_OBJECTS
-00070 #define D_TEMP_OBJECTS (1000000)
-00071 #endif
-00072 
-00073 #ifndef OUTPUT_STREAM
-00074 #define OUTPUT_STREAM stderr
-00075 #endif
-00076 
-00077 
-00078 #ifdef SPARSE_MATRIX
-00079 
-00080 #include "cs.h"
-00081 
-00082 #endif
-00083 
-00084 #ifdef UNIX
-00085 
-00086 
-00087 extern "C" {
-00088 
-00089 
-00090 #include <stdio.h>
-00091 #include <stdarg.h>
-00092 
-00093 
-00094 }
-00095 
-00096 
-00097 #else
-00098 
-00099 
-00100 #include <stdio.h>
-00101 #include <stdarg.h>
-00102 
-00103 #ifdef WIN32
-00104 #include <stdlib.h>
-00105 #include <malloc.h>
-00106 #endif
-00107 
-00108 #ifndef WIN32
-00109 #include <mem.h> static long start_clock;
-00110 #endif
-00111 
-00112 #endif
-00113 
-00114 
-00115 
-00116 
-00117 #ifndef MATLAB_MEX_FILE
-00118 
-00119 #define mxCalloc calloc
-00120 #define mxFree   free
-00121 
-00122 
-00123 #endif /* MATLAB_MEX_FILE */
-00124 
-00125 
-00126 #include <time.h>
-00127 
-00128 #ifndef true
-00129 #define true 1
-00130 #endif
-00131 
-00132 #ifndef false
-00133 #define false 0
-00134 #endif
-00135 
-00136 #include <string>
-00137 using std::string;
-00138 
-00139 
-00140 #define RAND_MODULUS    2147483647 /* DO NOT CHANGE THIS VALUE                  */
-00141 #define RAND_MULTIPLIER 48271      /* DO NOT CHANGE THIS VALUE                  */
-00142 #define RAND_CHECK      399268537  /* DO NOT CHANGE THIS VALUE                  */
-00143 #define RAND_STREAMS    256        /* # of streams, DO NOT CHANGE THIS VALUE    */
-00144 #define RAND_A256       22925      /* jump multiplier, DO NOT CHANGE THIS VALUE */
-00145 #define RAND_DEFAULT    123456789  /* initial seed, use 0 < RAND_DEFAULT < RAND_MODULUS  */
-00146 
-00147 
-00148 class DMatrix;
-00149 class SparseMatrix;
-00150 
-00152 
-00159 class DMatrix {         // define DMatrix class
-00160 
-00161 protected:
-00163    double *a;
-00165    long n;
-00167    long m;
-00169    long asize;
-00174    int atype;
-00179    int mtype;
-00181     int auxFlag;
-00183     int allocated;
-00185     DMatrix* mt;
-00187     const DMatrix* rowIndx;
-00189     const DMatrix* colIndx;
-00190 
-00191    // Protected static members
-00193    static DMatrix* auxPr;
-00195    static int      noAuxArr;
-00197    static long      dimAux;
-00199    static int      auxIndx;
-00201    static int      memberFlag;
-00203    static int      initFlag;
-00205    static const double   MACH_EPS;
-00207    static int      errorFlag;
-00209    static int      print_level;
-00210 
-00212    static long seed[];
-00214    static int  stream;
-00216    static time_t  start_time;
-00218    static clock_t start_clock;
-00220    static DMatrix*  GetTempPr(int i);
-00222    static int    GetMemberFlag() { return memberFlag; }
-00224    static void   SetMemberFlag(int arg) { memberFlag=arg; }
-00226    static void   ChkAuxArrays();
-00228    static int    GetNoAuxArr() { return noAuxArr; }
-00230    static long    GetDimAux() { return dimAux; }
-00232    static int    GetInitFlag() { return initFlag; }
-00234    static void   SetInitFlag(int arg) { initFlag = arg ; }
-00236    static int    GetAuxIndx()       { return auxIndx; }
-00238    static int    IncrementAuxIndx() {
-00239 #ifdef CHECK_AUX
-00240                 fprintf(stderr,"\nauxIndx=%d",auxIndx);
-00241 #endif
-00242                 return ++auxIndx; }
-00244    static int    DecrementAuxIndx() { return --auxIndx ; }
-00246    static void   SetAuxIndx( int i ) {  auxIndx = i; }
-00248    static void   SetDimAux( long dd ) { dimAux =  dd; }
-00250    static void   SetNoAuxArr( int nn ) { noAuxArr = nn ; }
-00252    static void   RiseErrorFlag()   { errorFlag = true; }
-00254    void   SetAuxFlag(int arg) { auxFlag = arg; }
-00256    int   GetAuxFlag() { return auxFlag; }
-00258    static clock_t GetStartTicks(void) { return start_clock; }
-00260    static void SetStartTicks(clock_t st) { start_clock=st; }
-00261 
-00262 #ifdef DECLARED_TEMPS
-00263 
-00264    static double axp[N_TEMP_OBJECTS][D_TEMP_OBJECTS];
-00265 
-00266 #endif
-00267 
-00268 
-00269 #define MC_EPSILON 2.221e-16
-00270 
-00272 
-00280    friend void CholeskyDecomp(DMatrix& A, int n, DMatrix& pM);
-00281 
-00283 
-00293    friend void CholeskySolution(const DMatrix& A, int n, const DMatrix& pM,
-00294                          const DMatrix& bM, DMatrix& xM);
-00295 
-00297 
-00303    void Allocate(long size);
-00304 
-00306 
-00311    void DeAllocate(); // De-allocate memory
-00312 
-00313 
-00315 
-00320    DMatrix& compMat( const DMatrix& m2, char op ) const;
-00321 
-00323 
-00327    void SetReferencedDMatrixPointer( DMatrix* arg ) { mt = arg; }
-00329 
-00332    DMatrix* GetReferencedDMatrixPointer() { return mt; }
-00334 
-00338    void SetRowIndexPointer(const  DMatrix* arg ) { rowIndx = arg; }
-00340 
-00344    void SetColIndexPointer(const  DMatrix* arg ) { colIndx = arg; }
-00346 
-00350    void SetMType( int arg );
-00352 
-00355    int GetMType()  { return mtype; }
-00357 
-00361    DMatrix& AssignmentToColonReference( const DMatrix& A );
-00363 
-00367    DMatrix& AssignmentToColonReference( double arg );
-00368 
-00369 public:
-00370 
-00371 
-00372 #ifdef SPARSE_MATRIX
-00373    friend class SparseMatrix;
-00374 #endif
-00375 
-00376    // Public methods
-00378 
-00389    static void   AllocateAuxArr( void );
-00391 
-00394    static void   DeAllocateAuxArr( void );
-00396 
-00399    static double random_uniform(void);
-00401 
-00404    static double random_gaussian(void);
-00406 
-00409    static DMatrix**  GetAuxPr(void)   { return &auxPr; }
-00411 
-00414    static int isThereError(void)      { return errorFlag; }
-00415 
-00416    // Input / Output functions
-00417 
-00419 
-00422    void input_matrix();
-00423 
-00425 
-00429    void Print(const char *text) const;
-00430 
-00432 
-00436    void PrintInfo(const char *text) const;
-00438 
-00445    void Read(FILE *filex);
-00447 
-00451    void Save( const char * FileName );
-00453 
-00458    void Load( const char * FileName );
-00459 
-00461 
-00465    void Fprint( FILE *filex );
-00466 
-00468 
-00472    static void SetPrintLevel( int plevel );
-00473 
-00474    static int PrintLevel();
-00475 
-00476    // Modifying member functions
-00478 
-00481    void FillWithZeros( void );
-00483 
-00488    void SwapRows( int i, int j );
-00490 
-00495    void SwapColumns( int i, int j );
-00497 
-00500    void Transpose(void);
-00502 
-00507    void diag( const DMatrix& dd );
-00509 
-00514    void SetColumn( const DMatrix& Col, int icol );
-00516 
-00521    void SetRow(    const DMatrix& Row, int irow );
-00523 
-00528    void colMult(long c, double x  );
-00530 
-00535    void rowMult(long r, double x  );
-00537 
-00542    DMatrix& find(DMatrix& I, DMatrix& J) const;
-00544 
-00549    DMatrix& find(int* I, int* J) const;
-00550 
-00551 
-00552    // Sub-matrix functions
-00554 
-00561    DMatrix& sub_matrix(long r1, long r2, long c1, long c2) const ;
-00563 
-00569    void SetSubMatrix(long row, long col, const DMatrix& A);
-00570 
-00571    // Interface functions
-00573 
-00576    long getn() {return n;}
-00578 
-00581    long getm() {return m;}
-00583 
-00586    long getn() const {return n;}
-00588 
-00591    long getm() const {return m;}
-00593 
-00596    long GetNoRows() { return n; }
-00598 
-00601    long GetNoRows() const  { return n; }
-00603 
-00606    long GetNoCols() { return m; }
-00608 
-00611    long GetNoCols() const { return m; }
-00613 
-00616    double *GetPr()    { return a; }
-00618 
-00621    double *GetConstPr() const { return a; }
-00623 
-00626    double* geta() {return a;}
-00628 
-00631    int getatype() { return atype; }
-00633 
-00636    int isEmpty() { if (n*m == 0) return 1; else return 0; }
-00637 
-00639 
-00642    int isVector() const { if (n==1 || m==1) return 1; else return 0; }
-00643 
-00644    // methods to access to matrix elements, columns and rows
-00646 
-00651    double element(long i, long j );
-00653 
-00658    double&   elem( long i, long j ) { return a[ (j-1)*n + i-1 ]; }
-00660 
-00665    double    elem( long i, long j ) const { return a[(j-1)*n+i-1]; }
-00667 
-00671    DMatrix& Column(long icol ) const;
-00673 
-00677    DMatrix& Row(long irow ) const;
-00678 
-00680 
-00684    DMatrix& mpow(int p);
-00685 
-00686 
-00687    // Constructors
-00688 
-00690    DMatrix(void); // Default constructor
-00692 
-00696    DMatrix( long Initn, long Initm);
-00698 
-00704    DMatrix( long vDim, double* v, long Initn, long Initm );
-00706 
-00709    DMatrix( long Initn); // Column vector constructor using memory allocation
-00711 
-00716    DMatrix(long Initn,long Initm,double a11,...);
-00718 
-00721    DMatrix( const DMatrix& A); // copy constructor
-00722 
-00723 
-00725    ~DMatrix();
-00726    // Resizing and assignment
-00728 
-00732    void Resize(long nnrow, long nncol );
-00734 
-00739    void assign(long rows,long columns,double a11,...); // Assignment using variable list
-00741 
-00744    void MemCpyArray(double * aptr );
-00745 
-00746    // Operators
-00748 
-00752    DMatrix& operator+ (const DMatrix& rval) const;
-00754 
-00758    DMatrix& operator += (const DMatrix &rval);
-00760 
-00763    DMatrix& operator+ (double x) const;
-00765 
-00769    DMatrix& operator -= (const DMatrix &rval);
-00771 
-00775    DMatrix& operator- (const DMatrix& rval) const;
-00777 
-00780    DMatrix& operator- (double x) const;
-00782 
-00786    friend DMatrix& operator- (const DMatrix& A);
-00788 
-00792    DMatrix& operator* (const DMatrix& rval) const;
-00794 
-00798    DMatrix& operator *= (const DMatrix &rval);
-00800 
-00804    DMatrix& operator* (double Arg) const;
-00806 
-00810    DMatrix& operator *= (double Arg);
-00812 
-00816    DMatrix& operator/ (double Arg) const;
-00818 
-00822    DMatrix& operator/ (const DMatrix& rval) const;
-00824 
-00828    DMatrix& operator% (const DMatrix& rval) const;
-00830 
-00834    DMatrix& operator /= (double Arg);
-00836 
-00840    DMatrix& operator= (const DMatrix& rval);
-00842 
-00846    DMatrix& operator = (double val);
-00848 
-00852    DMatrix& operator = (const char* str);
-00854 
-00858    DMatrix& operator ||(const DMatrix& B) const;
-00860 
-00864    DMatrix& operator &&(const DMatrix& B) const;
-00866 
-00870    DMatrix& operator^(double x);
-00872 
-00876    DMatrix& operator &(const DMatrix B) const;
-00878 
-00882    DMatrix& operator |(const DMatrix B) const;
-00884 
-00889    double& operator() (long row,long col);
-00891 
-00896    double& operator() (long row,const char* end);
-00898 
-00903    double& operator() (const char* end,long col);
-00905 
-00910    double operator() (long row,long col) const;
-00912 
-00917    double operator() (long row,const char* end) const;
-00919 
-00924    double operator() (const char* end,long col) const;
-00926 
-00930    double& operator() (long index );
-00932 
-00936    double& operator() (const char* end);
-00938 
-00942    double operator() (long k ) const;
-00944 
-00948    double operator() (const char* end) const;
-00950 
-00954    DMatrix& operator >  ( double val ) const ;
-00956 
-00960    DMatrix& operator <  ( double val ) const ;
-00962 
-00966    DMatrix& operator >= ( double val ) const ;
-00968 
-00972    DMatrix& operator <= ( double val ) const ;
-00974 
-00978    DMatrix& operator == ( double val ) const ;
-00980 
-00984    DMatrix& operator != ( double val ) const ;
-00986 
-00990    DMatrix& operator >  ( const DMatrix& val ) const ;
-00992 
-00996    DMatrix& operator <  ( const DMatrix& val ) const ;
-00998 
-01002    DMatrix& operator >= ( const DMatrix& val ) const ;
-01004 
-01008    DMatrix& operator <= ( const DMatrix& val ) const ;
-01010 
-01014    DMatrix& operator == ( const DMatrix& val ) const ;
-01016 
-01020    DMatrix& operator != ( const DMatrix& val ) const ;
-01021 
-01022    // Indexing functions
-01024 
-01029    DMatrix& operator() (const DMatrix& RowIndx, const DMatrix& ColIndx );
-01031 
-01035    DMatrix& operator() (const DMatrix& RowIndx );
-01037 
-01042    DMatrix& operator() (const DMatrix& RowIndx, long col );
-01044 
-01049    DMatrix& operator() (long row, const DMatrix& ColIndx);
-01051 
-01056    DMatrix& operator() (const DMatrix& RowIndx,const char* end );
-01058 
-01063    DMatrix& operator() (const char* end, const DMatrix& ColIndx);
-01064 
-01065    // Miscellaneous friend functions
-01067 
-01073    friend DMatrix& colon( double i1, double increment, double i2 );
-01075 
-01081    friend DMatrix& colon( int i1, int increment, int i2);
-01083 
-01088    friend DMatrix& colon( int i1, int i2 );
-01090 
-01095    friend DMatrix& colon( double i1, double i2);
-01097 
-01100    friend DMatrix& colon( void );
-01101 
-01102    // Miscellaneous friend functions
-01104 
-01108    friend int any( const DMatrix& A );
-01110 
-01115    friend DMatrix& mpow( DMatrix& A, int p );
-01117 
-01122    friend DMatrix& operator *(double r, const DMatrix& A);
-01124 
-01128    friend DMatrix& tra(const DMatrix& A);
-01130 
-01134    friend DMatrix& inv(const DMatrix& A);
-01136 
-01140    friend DMatrix& pinv(const DMatrix& A);
-01142 
-01146    friend DMatrix& identity(long n);
-01148 
-01153    friend DMatrix& identity(long n, long m);
-01155 
-01159    friend DMatrix& eye(long n);
-01161 
-01166    friend DMatrix& eye(long n,long m);
-01168 
-01173    friend DMatrix& zeros(long n, long m);
-01175 
-01180    friend DMatrix& ones(long n, long m);
-01182 
-01186    friend DMatrix& expm(const DMatrix& A);
-01188 
-01192    friend DMatrix& sin(const DMatrix& A);
-01194 
-01198    friend DMatrix& cos(const DMatrix& A);
-01200 
-01204    friend DMatrix& tan(const DMatrix& A);
-01206 
-01210    friend DMatrix& exp(const DMatrix& A);
-01212 
-01216    friend DMatrix& sinh(const DMatrix& A);
-01218 
-01222    friend DMatrix& cosh(const DMatrix& A);
-01224 
-01228    friend DMatrix& tanh(const DMatrix& A);
-01230 
-01234    friend DMatrix& log(const DMatrix& A);
-01236 
-01240    friend DMatrix& diag( const DMatrix& A );
-01242 
-01247    friend DMatrix& TProduct(const DMatrix& A,const DMatrix& B);
-01249 
-01254    friend DMatrix& ProductT(const DMatrix& A,const DMatrix& B);
-01256 
-01261    friend DMatrix& TProductT(const DMatrix& A,const DMatrix& B);
-01263 
-01268    friend DMatrix& Product(const DMatrix& A,const DMatrix& B);
-01270 
-01276    friend DMatrix& LUSolve(const DMatrix& A ,const DMatrix& b );
-01278 
-01284    friend DMatrix& LUFSolve(const DMatrix& ALU ,const DMatrix& b );
-01286 
-01292    friend DMatrix& CholSolve( const DMatrix& A, const DMatrix &b );
-01294 
-01300    friend DMatrix& CholFSolve( const DMatrix& Achol, const DMatrix &b );
-01302 
-01307    friend DMatrix& Chol( const DMatrix& A  );
-01309 
-01313    friend DMatrix& CholeskyRoot(const DMatrix& A );
-01315 
-01321    friend DMatrix& QRSolve( const DMatrix& A, const DMatrix &b );
-01323 
-01329    friend DMatrix& QRFSolve( const DMatrix& A, const DMatrix &b );
-01331 
-01336    friend DMatrix& QR( const DMatrix& A );
-01337 
-01339 
-01344    friend DMatrix& LSMNSolve( const DMatrix& A, const DMatrix& B );
-01345 
-01347 
-01352    friend DMatrix& LQ( const DMatrix& A, DMatrix* Q );
-01354 
-01359    friend DMatrix& LU( const DMatrix& A  );
-01361 
-01367    friend DMatrix& SVD( const DMatrix& A, DMatrix* U=NULL, DMatrix* V=NULL );
-01369 
-01373    friend DMatrix& orth( const DMatrix& A );
-01375 
-01379    friend DMatrix& null( const DMatrix& A );
-01381 
-01387    friend DMatrix& SVDSolve( const DMatrix& A, const DMatrix& B );
-01389 
-01394    friend DMatrix& schur(const DMatrix& A, DMatrix* U= NULL  );
-01396 
-01401    friend DMatrix& eig(const DMatrix& A, DMatrix* V= NULL  );
-01403 
-01407    friend double enorm(const DMatrix& A);
-01409 
-01413    friend double norm(const DMatrix& A);
-01415 
-01419    friend double InfNorm(const DMatrix& A);
-01421 
-01425    friend double Fnorm(  const DMatrix& A);
-01427 
-01431    friend DMatrix& Abs(const DMatrix& A);
-01433 
-01439    friend double Max(const DMatrix& A,int* rindx=NULL, int* cindx=NULL);
-01441 
-01447    friend double MaxAbs(const DMatrix& A, int* rindx=NULL, int* cindx=NULL);
-01449 
-01455    friend double Min(const DMatrix& A, int* rindx=NULL, int* cindx=NULL );
-01457 
-01463    friend double MinAbs(const DMatrix& A, int* rindx=NULL, int* cindx=NULL);
-01465 
-01470    friend void   sort( DMatrix& x, int indx[] = NULL);
-01472 
-01477    friend void   sort( DMatrix& x, DMatrix& indx);
-01479 
-01484    friend double dotProduct( const DMatrix& x, const DMatrix& y );
-01486 
-01491    friend double dot(const DMatrix& x, const DMatrix& y) { return dotProduct(x,y); }
-01493 
-01498    friend DMatrix& crossProduct(const DMatrix& x, const DMatrix& y);
-01500 
-01505    friend DMatrix& cross(const DMatrix& x, const DMatrix& y) { return crossProduct(x,y); }
-01507 
-01511    friend int isSymmetric( const DMatrix& A );
-01513 
-01517    friend double cond( const DMatrix& A );
-01519 
-01523    friend double rcond( const DMatrix& A );
-01525 
-01529    friend int rank( const DMatrix& A );
-01531 
-01535    friend double det(  const DMatrix& A );
-01537 
-01541    friend double trace( const DMatrix& A );
-01543 
-01547    friend DMatrix& mean( const DMatrix& A );
-01549 
-01554    friend DMatrix& Std(  const DMatrix& A, int ntype=0 );
-01556 
-01561    friend DMatrix& cov( const DMatrix& A, int ntype=0 );
-01563 
-01569    friend DMatrix& cov(DMatrix& X, DMatrix& Y, int ntype=0 );
-01571 
-01576    friend DMatrix& var(DMatrix& A, int ntype=0 );
-01578 
-01582    friend DMatrix& sum(  const DMatrix& A );
-01584 
-01588    friend DMatrix& prod(  const DMatrix& A );
-01590 
-01595    friend DMatrix& elemProduct( const DMatrix& A, const DMatrix& B );
-01597 
-01602    friend DMatrix& elemDivision( const DMatrix& A, const DMatrix& B);
-01604 
-01609    friend DMatrix& kronProduct( const DMatrix& A, const DMatrix& B );
-01611 
-01615    friend DMatrix& vec( const DMatrix& A );
-01617 
-01621    friend DMatrix& MatrixSign( const DMatrix& A );
-01623 
-01627    friend DMatrix&  find(const DMatrix& A);
-01629 
-01634    friend DMatrix& randu(long n, long m);
-01636 
-01641    friend DMatrix& randn(long n, long m);
-01643 
-01649    friend DMatrix& linspace(double X1, double X2, long N);
-01651    static double GetEPS() { return MC_EPSILON ; }
-01652 
-01654 
-01658    friend void error_message(const char *input_text);
-01660    friend void tic(void);
-01662 
-01665    friend double toc();
-01666 
-01667 #ifdef MATLAB_MEX_FILE
-01668    friend void mxArray2DMatrix( DMatrix& A, mxArray* mx );
-01669 
-01670    friend void DMatrix2mxArray( char* Name, mxArray* mx, DMatrix& A );
-01671 
-01672 #endif
-01673 
-01674 
-01678    friend DMatrix& Sqrt(const DMatrix& A);
-01680 
-01684    friend DMatrix& triu(const DMatrix& A);
-01686 
-01692    friend DMatrix& reshape(DMatrix& A, long N, long M);
-01694 
-01698    friend long length(const DMatrix& A);
-01699 
-01700 };
-01701 
-01702 
-01704 
-01708 class InitializeDMatrixClass{
-01709 
-01710     public:
-01712     InitializeDMatrixClass() { DMatrix::AllocateAuxArr(); }
-01714     ~InitializeDMatrixClass() { DMatrix::DeAllocateAuxArr(); }
-01715 
-01716 };
-01717 
-01718 
-01719 
-01720 /* inline utility functions and prototypes */
-01721 // Swap double
-01722 inline void Swap(double *x,double *y)
-01723 {double temp = *x; *x = *y; *y = temp;}
-01724 // Swap int
-01725 inline void Swap(int *x,int *y)
-01726 {int temp = *x; *x = *y; *y = temp;}
-01727 double MachEps(void);
-01728 double ArrayNorm( long n, double* x );
-01729 double factorial(long j);
-01730 /* Declaration of all friend functions of DMatrix class  */
-01731 void CholeskyDecomp(DMatrix& a, int n, DMatrix& pM);
-01732 void CholeskySolution(const DMatrix& a, int n, const DMatrix& pM,
-01733                          const DMatrix& bM, DMatrix& xM);
-01734 void Hessemberg(DMatrix& a );
-01735 DMatrix& operator- (const DMatrix& A);
-01736 DMatrix& colon( double i1, double increment, double i2 );
-01737 DMatrix& colon( int i1, int increment, int i2);
-01738 DMatrix& colon( int i1, int i2 );
-01739 DMatrix& colon( double i1, double i2);
-01740 DMatrix& colon( void );
-01741 int any( const DMatrix& val );
-01742 DMatrix& mpow( DMatrix& A, int p );
-01743 DMatrix& operator *(double Arg, const DMatrix& A);
-01744 DMatrix& tra(const DMatrix& A);
-01745 DMatrix& inv(const DMatrix& A);
-01746 DMatrix& pinv(const DMatrix& A);
-01747 DMatrix& identity(long n);
-01748 DMatrix& identity(long n, long m);
-01749 DMatrix& eye(long n);
-01750 DMatrix& eye(long n,long m);
-01751 DMatrix& zeros(long n, long m);
-01752 DMatrix& ones(long n, long m);
-01753 DMatrix& expm(const DMatrix& A);
-01754 DMatrix& sin(const DMatrix& A);
-01755 DMatrix& cos(const DMatrix& A);
-01756 DMatrix& tan(const DMatrix& A);
-01757 DMatrix& exp(const DMatrix& A);
-01758 DMatrix& log(const DMatrix& A);
-01759 DMatrix& diag( const DMatrix& A );
-01760 DMatrix& TProduct(const DMatrix& A,const DMatrix& B);
-01761 DMatrix& ProductT(const DMatrix& A,const DMatrix& B);
-01762 DMatrix& TProductT(const DMatrix& A,const DMatrix& B);
-01763 DMatrix& Product(const DMatrix& A,const DMatrix& B);
-01764 DMatrix& LUSolve(const DMatrix& A ,const DMatrix& b );
-01765 DMatrix& LUFSolve(const DMatrix& ALU ,const DMatrix& b );
-01766 DMatrix& CholSolve( const DMatrix& A, const DMatrix &b );
-01767 DMatrix& CholFSolve( const DMatrix& Achol, const DMatrix &b );
-01768 DMatrix& Chol( const DMatrix& A  );
-01769 DMatrix& CholeskyRoot(const DMatrix& A );
-01770 DMatrix& QRSolve( const DMatrix& A, const DMatrix &b );
-01771 DMatrix& QRFSolve( const DMatrix& A, const DMatrix &b );
-01772 DMatrix& QR( const DMatrix& A );
-01773 DMatrix& LQ( const DMatrix& A, DMatrix* Q );
-01774 DMatrix& LU( const DMatrix& A  );
-01775 DMatrix& SVD( const DMatrix& A, DMatrix* U, DMatrix* V );
-01776 DMatrix& orth( const DMatrix& A );
-01777 DMatrix& null( const DMatrix& A );
-01778 DMatrix& SVDSolve( const DMatrix& A, const DMatrix& B );
-01779 DMatrix& schur(const DMatrix& A, DMatrix* U  );
-01780 DMatrix& eig(const DMatrix& A, DMatrix* V  );
-01781 double enorm(const DMatrix& A);
-01782 double norm(const DMatrix& A);
-01783 DMatrix& Abs(const DMatrix& A);
-01784 double Max(const DMatrix& A,int* rindx, int* cindx);
-01785 double MaxAbs(const DMatrix& A, int* rindx, int* cindx);
-01786 double Min(const DMatrix& A, int* rindx, int* cindx );
-01787 double MinAbs(const DMatrix& A, int* rindx, int* cindx);
-01788 void   sort( DMatrix& A, int indx[]);
-01789 void   sort( DMatrix& A, DMatrix& indx);
-01790 double InfNorm(const DMatrix& A);
-01791 double Fnorm(  const DMatrix& A);
-01792 double dotProduct( const DMatrix& A, const DMatrix& B );
-01793 int isSymmetric( const DMatrix& A );
-01794 double cond( const DMatrix& A );
-01795 double rcond( const DMatrix& A );
-01796 int rank( const DMatrix& A );
-01797 double det(  const DMatrix& A );
-01798 double trace( const DMatrix& A );
-01799 DMatrix& mean( const DMatrix& A );
-01800 DMatrix& Std(  const DMatrix& A, int ntype );
-01801 DMatrix& cov( const DMatrix& A, int ntype );
-01802 DMatrix& cov(DMatrix& X, DMatrix& Y, int ntype );
-01803 DMatrix& var(DMatrix& A, int ntype);
-01804 DMatrix& sum(  const DMatrix& A );
-01805 DMatrix& prod(  const DMatrix& A );
-01806 DMatrix& elemProduct( const DMatrix& A, const DMatrix& B );
-01807 DMatrix& elemDivision( const DMatrix& A, const DMatrix& B);
-01808 DMatrix& kronProduct( const DMatrix& A, const DMatrix& B );
-01809 DMatrix& vec( const DMatrix& A );
-01810 DMatrix& MatrixSign( const DMatrix& A );
-01811 DMatrix&  find(const DMatrix& A);
-01812 DMatrix& randu(long n, long m);
-01813 DMatrix& randn(long n, long m);
-01814 DMatrix& linspace(double X1, double X2, long N);
-01815 DMatrix& LSMNSolve( const DMatrix& A, const DMatrix& B );
-01816 void error_message(const char *input_text);
-01817 void tic(void);
-01818 double toc();
-01819 #ifdef MATLAB_MEX_FILE
-01820 void mxArray2DMatrix( DMatrix& A, mxArray* mx );
-01821 void DMatrix2mxArray( const char* Name, mxArray* mx, DMatrix& A );
-01822 #endif
-01823 DMatrix& Sqrt(const DMatrix& A);
-01824 DMatrix& triu(const DMatrix& A);
-01825 DMatrix& reshape(DMatrix& A, long nn, long mm);
-01826 long length(const DMatrix& A);
-01827 void* my_calloc(size_t num, size_t size );
-01828 
-01829 
-01830 // ===========================================================
-01831 
-01832 
-01833 
-01834 #ifdef LAPACK
-01835 
-01836 
-01837 
-01838 extern "C" {
-01839 
-01840 #include "f2c.h"
-01841 
-01842 /* CLAPACK real matrix eigenvalues routine */
-01843 int dgeev_(char *jobvl, char *jobvr, integer *n, doublereal *
-01844         a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl,
-01845         integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work,
-01846         integer *lwork, integer *info);
-01847 
-01848 /* CLAPACK symmetric real matrix eigenvalues routine */
-01849 int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a,
-01850          integer *lda, doublereal *w, doublereal *work, integer *lwork,
-01851         integer *info);
-01852 
-01853 /* CLAPACK  real matrix singular value decomposition routine */
-01854 int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n,
-01855         doublereal *a, integer *lda, doublereal *s, doublereal *u, integer *
-01856         ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork,
-01857         integer *info);
-01858 
-01859 /* CLAPACK real matrix schur decomposition routine */
-01860 int dgees_(char *jobvs, char *sort, L_fp select, integer *n,
-01861         doublereal *a, integer *lda, integer *sdim, doublereal *wr,
-01862         doublereal *wi, doublereal *vs, integer *ldvs, doublereal *work,
-01863         integer *lwork, logical *bwork, integer *info);
-01864 
-01865 /* CLAPACK rectangular linear system solution routine */
-01866 int dgels_(char *trans, integer *m, integer *n, integer *
-01867         nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb,
-01868         doublereal *work, integer *lwork, integer *info);
-01869 
-01870 /* CLAPACK reciprocal condition number estimator      */
-01871 int dgecon_(char *norm, integer *n, doublereal *a, integer *
-01872         lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer *
-01873         iwork, integer *info);
-01874 
-01875 /* CLAPACK LU factorization routine */
-01876 int dgetrf_(integer *m, integer *n, doublereal *a, integer *
-01877         lda, integer *ipiv, integer *info);
-01878 
-01879 /* CLAPACK Minimum norm solution by using singular value decomp */
-01880 int dgelss_(integer *m, integer *n, integer *nrhs,
-01881         doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *
-01882         s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork,
-01883          integer *info);
-01884 
-01885   /* CLAPACK LQ factorization routine */
-01886 
-01887 int dgelqf_(integer *m, integer *n, doublereal *a, integer *
-01888         lda, doublereal *tau, doublereal *work, integer *lwork, integer *info);
-01889 
-01890 
-01891 
-01892 
-01893 } /* End of extern "C" block */
-01894 
-01895 #endif /* LAPACK */
-01896 
-01897 
-01898 // #define SPARSE
-01899 
-01900 #ifdef SPARSE_MATRIX
-01901 
-01902 
-01904 
-01908 class SparseMatrix {
-01909 protected:
-01911    double *a;
-01913    int n;
-01915    int m;
-01917    int asize;
-01919    int nz;
-01921    int *RowIndx;
-01923    int *ColIndx;
-01924 
-01925 public:
-01926 
-01927    // Interface functions
-01929 
-01932    int GetNoRows() const  { return n; }
-01934 
-01937    int GetNoCols() const { return m; }
-01939 
-01942    int GetNonZero() const {return nz;}
-01944 
-01947    DMatrix& GetRowIndxDMatrix();
-01949 
-01952    DMatrix& GetColIndxDMatrix();
-01954 
-01957    int* GetRowIndx_C_Array() const {return RowIndx;}
-01959 
-01962    int* GetColIndx_C_Array() const {return ColIndx;}
-01964 
-01967    double *GetPr()  const  { return a; }
-01969 
-01975    void InsertNonZero(int i, int j, double val);
-01977 
-01981    void Save(const char* fname) const;
-01983 
-01987    void SaveSparsityPattern(const char* fname) const;
-01989 
-01993    void Load(const char* fname);
-01995 
-01999    friend SparseMatrix& tra(const SparseMatrix& A);
-02001 
-02008    SparseMatrix& sub_matrix(int istart, int iend, int jstart, int jend) const;
-02010 
-02014    DMatrix& Column(int j) const;
-02016 
-02020    DMatrix& Row(int i) const;
-02022 
-02030    void set_sub_matrix(const SparseMatrix& B, int istart, int iend, int jstart, int jend);
-02031 
-02032    // Display functions
-02034 
-02038    void Print(const char* text);
-02039 
-02040    // Constructors
-02042    SparseMatrix(void); // Default constructor
-02044 
-02052    SparseMatrix(double* aa, int nn, int mm, int nnz, int* RowIndxArg, int* ColIndxArg); // Constructor using arrays
-02054 
-02057    SparseMatrix( const DMatrix& A ); // Constructor using DMatrix object
-02059 
-02062    SparseMatrix( const SparseMatrix& A); // copy constructor
-02064 
-02069    SparseMatrix( int nn, int mm, int nnz); // Constructor without element assigment
-02070 
-02071    // Destructor
-02073    ~SparseMatrix();
-02074 
-02075    // Other functions
-02077 
-02083    void Resize(int nnew, int mnew, int nznew);
-02085 
-02089    friend SparseMatrix& inv(SparseMatrix& A);
-02091 
-02094    void Transpose();
-02096 
-02101    friend SparseMatrix& Product(const SparseMatrix& A,const  SparseMatrix& B);
-02103 
-02108    friend SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B);
-02110 
-02115    friend SparseMatrix& ProductT(SparseMatrix& A, SparseMatrix& B);
-02117 
-02122    friend SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B);
-02124 
-02128    friend SparseMatrix& sparse(DMatrix& A);
-02130 
-02134    friend SparseMatrix& speye(int n);
-02136 
-02140    friend SparseMatrix& spones(const SparseMatrix& s);
-02142 
-02146    friend SparseMatrix& spconvert(DMatrix& A);
-02148 
-02152    friend DMatrix& full(const SparseMatrix& A);
-02154 
-02158    friend DMatrix& null( const SparseMatrix& A );
-02160 
-02166    friend DMatrix& SVD(const SparseMatrix& A, DMatrix* U=NULL, DMatrix* V=NULL );
-02168 
-02172    friend DMatrix& QR( const SparseMatrix& A );
-02174 
-02179    friend DMatrix& LQ( const SparseMatrix& A, DMatrix* Q );
-02181 
-02185    friend DMatrix& orth( const SparseMatrix& A );
-02187 
-02192    friend DMatrix& schur(const SparseMatrix& A, DMatrix* U= NULL  );
-02194 
-02199    friend DMatrix& eig(const SparseMatrix& A, DMatrix* V= NULL  );
-02201 
-02205    friend double enorm(const SparseMatrix& A);
-02207 
-02211    friend double norm(const SparseMatrix& A);
-02213 
-02217    friend SparseMatrix& Abs(const SparseMatrix& A);
-02219 
-02223    friend double cond( const SparseMatrix& A );
-02225 
-02229    friend double rcond( const SparseMatrix& A );
-02231 
-02235    friend int rank( const SparseMatrix& A );
-02237 
-02241    friend SparseMatrix& sprand(const SparseMatrix& S);
-02243 
-02249    friend SparseMatrix& sprand(int n, int m, double density);
-02251 
-02255    friend SparseMatrix& sprandn(const SparseMatrix& S);
-02257 
-02263    friend SparseMatrix& sprandn(int n, int m, double density);
-02264 
-02266 
-02269    void Compress();
-02270 
-02271    // Operators
-02273 
-02277    SparseMatrix& operator += (const SparseMatrix &rval);
-02279 
-02283    SparseMatrix& operator -= (const SparseMatrix &rval);
-02285 
-02289    SparseMatrix& operator *= (const SparseMatrix &rval);
-02291 
-02295    SparseMatrix& operator*= (double Arg);
-02297 
-02301    SparseMatrix& operator/= (double Arg);
-02303 
-02307    SparseMatrix& operator+ (const SparseMatrix& rval) const;
-02309 
-02313    SparseMatrix& operator - (const SparseMatrix& rval) const;
-02315 
-02319    SparseMatrix& operator* (const SparseMatrix& rval) const;
-02321 
-02325    SparseMatrix& operator* (DMatrix& rval) const;
-02327 
-02331    SparseMatrix& operator* (double Arg) const;
-02333 
-02338    friend SparseMatrix& operator *(double Arg, const SparseMatrix& A);
-02340 
-02344    SparseMatrix& operator/ (double Arg) const;
-02346 
-02350    SparseMatrix& operator/ (SparseMatrix& rval);
-02352 
-02356    SparseMatrix& operator= (const SparseMatrix& rval);
-02358 
-02362    SparseMatrix& operator^(double x) const;
-02364 
-02368    SparseMatrix& operator||(SparseMatrix& B) const;
-02370 
-02374    SparseMatrix& operator&&(SparseMatrix& B) const;
-02376 
-02381    double& operator() (int row,int col);
-02383 
-02388    double operator() (int row,int col) const;
-02390 
-02394    SparseMatrix& operator %(SparseMatrix& B);
-02396 
-02405    friend void SparseLUSolve(SparseMatrix& A, DMatrix& b, DMatrix& x, DMatrix& r, int argc, char *argv[]);
-02407 
-02414    friend void* SparseLUFactor(SparseMatrix& A, int argc, char *argv[]);
-02416 
-02427    friend void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& b, DMatrix& x, DMatrix& r,  int argc, char *argv[]);
-02429 
-02433    friend void sp_error_message(const char *error_text);
-02434 
-02435 
-02436 };
-02437 
-02438 // Declaration of all friend functions of SparseMatrix class
-02439 
-02440 void SparseLUSolve(SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc=1, char *argv[]=NULL);
-02441 
-02442 void* SparseLUFactor(SparseMatrix& A, int argc=1, char *argv[]=NULL);
-02443 
-02444 void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr,  int argc=1, char *argv[]=NULL);
-02445 
-02446 void sp_error_message(const char *error_text);
-02447 
-02448 SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B);
-02449 
-02450 SparseMatrix& ProductT(SparseMatrix& A, SparseMatrix& B);
-02451 
-02452 SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B);
-02453 
-02454 SparseMatrix& tra(const SparseMatrix& A);
-02455 SparseMatrix& inv(SparseMatrix& A);
-02456 SparseMatrix& Product(const SparseMatrix& A,const  SparseMatrix& B);
-02457 SparseMatrix& sparse(DMatrix& A);
-02458 SparseMatrix& speye(int n);
-02459 SparseMatrix& spones(const SparseMatrix& s);
-02460 SparseMatrix& spconvert(DMatrix& A);
-02461 DMatrix& full(const SparseMatrix& A);
-02462 DMatrix& null( const SparseMatrix& A );
-02463 DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V );
-02464 DMatrix& QR( const SparseMatrix& A );
-02465 DMatrix& LQ( const SparseMatrix& A, DMatrix* Q );
-02466 DMatrix& orth( const SparseMatrix& A );
-02467 DMatrix& schur(const SparseMatrix& A, DMatrix* U  );
-02468 DMatrix& eig(const SparseMatrix& A, DMatrix* V  );
-02469 double enorm(const SparseMatrix& A);
-02470 double norm(const SparseMatrix& A);
-02471 SparseMatrix& Abs(const SparseMatrix& A);
-02472 double cond( const SparseMatrix& A );
-02473 double rcond( const SparseMatrix& A );
-02474 int rank( const SparseMatrix& A );
-02475 SparseMatrix& sprand(const SparseMatrix& S);
-02476 SparseMatrix& sprand(int n, int m, double density);
-02477 SparseMatrix& sprandn(const SparseMatrix& S);
-02478 SparseMatrix& sprandn(int n, int m, double density);
-02479 SparseMatrix& operator *(double Arg, const SparseMatrix& A);
-02480 
-02481 
-02482 // ===========================================================
-02483 
-02484 
-02485 
-02486 
-02487 #endif /* SPARSE_MATRIX */
-02488 
-02489 
-02491 
-02494 class ErrorHandler
-02495 {
-02496     public:
-02498         string error_message;
-02500 
-02504         ErrorHandler(const string m);
-02505 };
-02506 
-02507 
-02508 
-02509 #endif /* DMATRIX_H */
-02510 
-02511 
-02512 
-
-
- - - diff --git a/dmatrix/doc/html/doxygen.css b/dmatrix/doc/html/doxygen.css deleted file mode 100644 index 101c7a56..00000000 --- a/dmatrix/doc/html/doxygen.css +++ /dev/null @@ -1,800 +0,0 @@ -/* The standard CSS for doxygen */ - -body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 12px; -} - -/* @group Heading Levels */ - -h1 { - font-size: 150%; -} - -h2 { - font-size: 120%; -} - -h3 { - font-size: 100%; -} - -dt { - font-weight: bold; -} - -div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; -} - -p.startli, p.startdd, p.starttd { - margin-top: 2px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - padding: 2px; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #3D578C; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #4665A2; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #ffffff; - border: 1px double #869DCA; -} - -.contents a.qindexHL:visited { - color: #ffffff; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code { - color: #4665A2; -} - -a.codeRef { - color: #4665A2; -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -.fragment { - font-family: monospace, fixed; - font-size: 105%; -} - -pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; -} - -div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background: white; - color: black; - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 10px; - margin-right: 10px; -} - -td.indexkey { - background-color: #EBEFF6; - font-weight: bold; - border: 1px solid #C4CFE5; - margin: 2px 0px 2px 0; - padding: 2px 10px; -} - -td.indexvalue { - background-color: #EBEFF6; - border: 1px solid #C4CFE5; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #EEF1F7; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -/* @end */ - -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A3B4D7; -} - -th.dirtab { - background: #EBEFF6; - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid #4A6AAA; -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #C4CFE5; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memTemplParams { - color: #4665A2; - white-space: nowrap; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtemplate { - font-size: 80%; - color: #4665A2; - font-weight: normal; - margin-left: 9px; -} - -.memnav { - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.memitem { - padding: 0; - margin-bottom: 10px; -} - -.memname { - white-space: nowrap; - font-weight: bold; - margin-left: 6px; -} - -.memproto { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 0px 6px 0px; - color: #253555; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 8px; - border-top-left-radius: 8px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 8px; - -moz-border-radius-topleft: 8px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 8px; - -webkit-border-top-left-radius: 8px; - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - -} - -.memdoc { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 2px 5px; - background-color: #FBFCFD; - border-top-width: 0; - /* opera specific markup */ - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 8px; - -moz-border-radius-bottomright: 8px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} - -.params, .retval, .exception, .tparams { - border-spacing: 6px 2px; -} - -.params .paramname, .retval .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir { - font-family: "courier new",courier,monospace; - vertical-align: top; -} - - - - -/* @end */ - -/* @group Directory (tree) */ - -/* for the tree view */ - -.ftvtree { - font-family: sans-serif; - margin: 0px; -} - -/* these are for tree view when used as main index */ - -.directory { - font-size: 9pt; - font-weight: bold; - margin: 5px; -} - -.directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -/* -The following two styles can be used to replace the root node title -with an image of your choice. Simply uncomment the next two styles, -specify the name of your image and be sure to set 'height' to the -proper pixel height of your image. -*/ - -/* -.directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); -} -.directory h3.swap span { - display: none; -} -*/ - -.directory > h3 { - margin-top: 0; -} - -.directory p { - margin: 0px; - white-space: nowrap; -} - -.directory div { - display: none; - margin: 0px; -} - -.directory img { - vertical-align: -30%; -} - -/* these are for tree view when not used as main index */ - -.directory-alt { - font-size: 100%; - font-weight: bold; -} - -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -.directory-alt > h3 { - margin-top: 0; -} - -.directory-alt p { - margin: 0px; - white-space: nowrap; -} - -.directory-alt div { - display: none; - margin: 0px; -} - -.directory-alt img { - vertical-align: -30%; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; -} - -address { - font-style: normal; - color: #2A3D61; -} - -table.doxtable { - border-collapse:collapse; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; -} - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - height:30px; - line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#364D7C; -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; -} - -.navpath li.navelem a:hover -{ - color:#6884BD; -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color:#364D7C; - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -div.ingroups -{ - font-size: 8pt; - padding-left: 5px; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - margin: 0px; - border-bottom: 1px solid #C4CFE5; -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -dl -{ - padding: 0 0 0 10px; -} - -dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug -{ - border-left:4px solid; - padding: 0 0 0 6px; -} - -dl.note -{ - border-color: #D0D000; -} - -dl.warning, dl.attention -{ - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant -{ - border-color: #00D000; -} - -dl.deprecated -{ - border-color: #505050; -} - -dl.todo -{ - border-color: #00C0E0; -} - -dl.test -{ - border-color: #3030E0; -} - -dl.bug -{ - border-color: #C08050; -} - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectname -{ - font: 300% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectbrief -{ - font: 120% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font: 50% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid #5373B4; -} - diff --git a/dmatrix/doc/html/doxygen.png b/dmatrix/doc/html/doxygen.png deleted file mode 100644 index 635ed52fce7057ac24df92ec7664088a881fa5d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3942 zcmV-s51H_ZP)95ENDh(OT9xpYZC{M(=rqI* z+1erNEr&9zRjUI-4rN=4BBz>P@ys*xOjGRjzVE*Fx_qvyt9d@B@BO*&@8Mq!nM{Tc z_WoM84-~xLreSL9@vgZ{m2dF}`u=^ZF3syQ-s2tnBwCI3ZFvSfI20Wbj236~Urq*8Kfw@RKKfRQTgE>}uUHK^ptamY=o)LU(xy55zNQ(`qZ znZ&$O075mrrInIXQgw4%GCbMD8Vn`3n3$EaRwtP1D{A!Gs=e!L%3;ayv@I{rAw{xw z^x^>EIWQM8ob3m}$(BaupDMV;Ed8w5|i(*e`7rU$TOc&1o7`|!LyN5jHI z7uWAR!v4c2xMp?}QmRYyf>i}tYGU(g=>DW&==J@GbhR z5@BNVY3O$`^D%gk4khm9XpFhuwzxUhi9T=Du4rpVuYRSMPHeDqo+4htnZRU@G9`0& z9~p)CsFl1|t*wjfoTo&%davN^3RfJUhQ{ZZIAcD77X^XsF_iR&ZMQ;p>K5*+*48)x z+=<>nh+6Uq85jOkg>{z>a;+V`s(I;I%*5s+R@9a^wNoZ03(g9-EcH%uHvX&yp7`D#`9Kw>DU3s zjD-VuW_A-K)unlS4O3f>_B%pPONUmI#oyL};Lglp3=04>0eBBEw$D1k-$WTsoi#K* z$7h`NcyRZsZ#w~6I<%~u!^xDofYrzF>zVIj2N>Ijs`mVR(Oy&*9f}<{JtQj8jJT!oEc!NQXBq5y|6ET*N?7ox*E6#{i- z@_DLD^IYTtg|Pg?A~!7@OCd8p^)kxK%VBM84docx$Z{MvO)iiqep@or-N}TEU8$%; zJih?#yJ9)V1s_`}c3XbY9V}nEKwNz8ILmR|v)(w|D@oVG;=i`+$*)!(xH{9#$2Za;pyZ1wgU#)mHl|&8%iwu%yncO z`T32Ib0$D}j`c}}5M@M#7oR&G=QwU!!Ja*P7|NJt1@lo=d{_dY-q_lmDcH7{BHncF zR@^PmcLC6EsN?6N{fV3o8}>?h9X_@;=&-p7%tms7$_{3w(anwek_k&<&)~c$Ar?S> zy9gKavndTmxqAbE?SMgcWhXPENdKdz7ntt55Y3Hs3jjc~uR-#$tR(1a_abv9`-QzG z^J0Fsbd&yruq%xAsxf3rc=T}$Zx|AD%x{Fd=? z{qhl3kG5w-PqVK9-Gru%7UIEw)bt$ZMF|Z6HpmO)F%@GNT8yT|#FuWPxv@@Ic={;6 zU7)e!XG|1dx=kU|&|)+m+$&|Yw92Fa;*MnegXcCf8XsHfqg_F5t)3Jt8)EkXKuY21 zqt%4}@R8hK*(_JO0*H+Pa)6Pp&K49rKNeQEYb*x9WY`!`Vh3|80YF%I`lxv9_!$hD zOh$>zWaRIW!);6`vA$Zp;5lnGyX^^N%YEjCeJMHPolKCE1ttIqK<$0w&LcE8)`_c2 z^H^qf6ACV0t7FLLCsu#mL&Mb8gE@rZE#k+1Nrrxw+{N0^#bN*~!qt2>S4e#jC$a$` ze4@{)$aTEYq_!#2|t@Fj3e?w-XVuG$Z}kAR?_kgJAlZIJ)0{eHw#fybNooA zp02jyYVc&w!}m#BVP>ef2|U^J(A-#O1R#A&><*?Y! zOwml{CnE+aU3JfKE@uzge(qMY{^6siuXFt;+mMbapU;Ppejl=L#>s2#SMBbfP9AFT znEVA=TBtZ6d-GfF>kOxylg>Ek%qTp*h2ze!^^hOsmKOEE6b;maQ>~R>3#z`Zawbik z88OTykU3_!Atg^+vnM=1n}?%<$dHzn)?k&T#RWwb+*y;XNQbYNHKo3wr~&}Qa$id; z6^D*K9RTQZUuQVg)g~P%!BIiv+cXllt)KEP9IN)1udQKf>p|~lXj7K<-9}0Q%i9+K zXaF7qXclE>sf)7)J4_M%V{;(sFT7HN$o0#_qU#Ah1D{ zon=JihPcgG5xHuvQwOXBkt3(iUdx{6Gn|aa>@C9Cqg%rPK(+REZ4>6t3z7m@Aj;0l zSHh&%cKSJ*+WOJGwe?Y7d(9RAy)&NVS6uj}1m@U}jXH3oVQT9E0A)$ZDRdK>;_i;+ z7vbEoI7$1XK6vNxT(_sJ(GM4s92e;gB&Q zDO;(Ve^%gPG&lWW1fUf_=9-Q1%&`s%aD^o`Q2u`WI9V>Qm#D5?SW<)Njmt@aR5@6( zL4cdTo+Jg@>Brm1^_gf%0Z?}1AppR3NdFE5uzdpBZz;{Thd6SI-$gb2}pFAww$*j(2=s{mdz2E;lBvVcrN@}i2bC`Q5Y_;BID^f0J+ACVhyQsLg0@`okIk+i=LJ=3yvI*oASj62 za3C{Pu_fQ+atw!zN{$Shr*_UV=|jp4#CqWeGE?Jb`pq!|5bDES&-Ix=-N>DpydHqW z+-{QS+i)d;uGS)M%Suw9khR}3N82j|S{a#&Tctme0s%mTy<1S|;@M-+S4#o@!qr;r z+w(n=;@43Y_n#dI0Gb(T0{G7k-KY8k`MPM_Bss$?)SK){KJMrwv!vz42_U_Za zX7lDqiU8ZvCAfGpAtfVC5bQrYa4C)M9G$S4D&VqpJ8)lm$t5FAAR%ywf>*~VaivC70RVFXISv4Lx&tk^Cf1)qQ|rxp z*8H>)cgoM;(eKxH14u~~@JopNr9@A z#-yXVG?$es;EPqsn-j?45^L52U=nT#0A^T3JY$&B3EH&%2UHdv3P=_3$!n76!34ks zz^2ii@sXAu8LKYMmG=_^*qtiiOFNlG3?QYtG%wrCZh|)vlj8vq3sw~f1b8;_TMB>z zPSyDQy_9bbXD*#sNRGMzfSAwUD}ASX;ZGQcGdE=9q~ORU{v$}=z2Bc8EOe2S&);jS zCZB8P`hPoV1NBk)TQP2z{q$NL-GLUc7%>&fecE^E{I5gs?8!qTK7VgR7Z?}-`YG|z zVN-NvOlQ+B;~J*69_Xd1n-0MLKTY6&*%rTi*0^HXniz8{bCMsVpSXqs(GGO)*_#Kz z9YBCQ_VRhtwhMfppMh@OdxjCN0mH`5hKZr>UoxMx`W~u^kD&bskplglOiRxQvep*2 z0mk+kMP>J)K`8X3`6Zq|X~5IQ-_rrOn+_WvU{1Gs{ow1-Eb;K(Z?p$@ugXpr^?PM( z(5Hv;$*X=QZaqG_4q)N1v9sO(Dsei!;%IcIztt6YUs{yj z^77e`UYa^%<-Ts+d*b=ihKt?0_sj!ePNO@K*PGmGD*v^;rRAkduikx~UNk=@{XKeV zp_ir(dTaGVWBr{_02Kg2Xmlsn|IvIIRYivbo|L{yx}yX5Bte@P6C>1KyqvYnT{boB#j-07*qoM6N<$f^XQQ A+yDRo diff --git a/dmatrix/doc/html/f2c_8h_source.html b/dmatrix/doc/html/f2c_8h_source.html deleted file mode 100644 index c5c66cad..00000000 --- a/dmatrix/doc/html/f2c_8h_source.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: f2c.h Source File - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-

f2c.h

-
-
-
00001 /* f2c.h  --  Standard Fortran to C header file */
-00002 
-00007 #ifndef F2C_INCLUDE
-00008 #define F2C_INCLUDE
-00009 
-00010 typedef long int integer;
-00011 typedef unsigned long int uinteger;
-00012 typedef char *address;
-00013 typedef short int shortint;
-00014 typedef float real;
-00015 typedef double doublereal;
-00016 typedef struct { real r, i; } complex;
-00017 typedef struct { doublereal r, i; } doublecomplex;
-00018 typedef long int logical;
-00019 typedef short int shortlogical;
-00020 typedef char logical1;
-00021 typedef char integer1;
-00022 #ifdef INTEGER_STAR_8   /* Adjust for integer*8. */
-00023 typedef long long longint;              /* system-dependent */
-00024 typedef unsigned long long ulongint;    /* system-dependent */
-00025 #define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b)))
-00026 #define qbit_set(a,b)   ((a) |  ((ulongint)1 << (b)))
-00027 #endif
-00028 
-00029 #define TRUE_ (1)
-00030 #define FALSE_ (0)
-00031 
-00032 /* Extern is for use with -E */
-00033 #ifndef Extern
-00034 #define Extern extern
-00035 #endif
-00036 
-00037 /* I/O stuff */
-00038 
-00039 #ifdef f2c_i2
-00040 /* for -i2 */
-00041 typedef short flag;
-00042 typedef short ftnlen;
-00043 typedef short ftnint;
-00044 #else
-00045 typedef long int flag;
-00046 typedef long int ftnlen;
-00047 typedef long int ftnint;
-00048 #endif
-00049 
-00050 /*external read, write*/
-00051 typedef struct
-00052 {       flag cierr;
-00053         ftnint ciunit;
-00054         flag ciend;
-00055         char *cifmt;
-00056         ftnint cirec;
-00057 } cilist;
-00058 
-00059 /*internal read, write*/
-00060 typedef struct
-00061 {       flag icierr;
-00062         char *iciunit;
-00063         flag iciend;
-00064         char *icifmt;
-00065         ftnint icirlen;
-00066         ftnint icirnum;
-00067 } icilist;
-00068 
-00069 /*open*/
-00070 typedef struct
-00071 {       flag oerr;
-00072         ftnint ounit;
-00073         char *ofnm;
-00074         ftnlen ofnmlen;
-00075         char *osta;
-00076         char *oacc;
-00077         char *ofm;
-00078         ftnint orl;
-00079         char *oblnk;
-00080 } olist;
-00081 
-00082 /*close*/
-00083 typedef struct
-00084 {       flag cerr;
-00085         ftnint cunit;
-00086         char *csta;
-00087 } cllist;
-00088 
-00089 /*rewind, backspace, endfile*/
-00090 typedef struct
-00091 {       flag aerr;
-00092         ftnint aunit;
-00093 } alist;
-00094 
-00095 /* inquire */
-00096 typedef struct
-00097 {       flag inerr;
-00098         ftnint inunit;
-00099         char *infile;
-00100         ftnlen infilen;
-00101         ftnint  *inex;  /*parameters in standard's order*/
-00102         ftnint  *inopen;
-00103         ftnint  *innum;
-00104         ftnint  *innamed;
-00105         char    *inname;
-00106         ftnlen  innamlen;
-00107         char    *inacc;
-00108         ftnlen  inacclen;
-00109         char    *inseq;
-00110         ftnlen  inseqlen;
-00111         char    *indir;
-00112         ftnlen  indirlen;
-00113         char    *infmt;
-00114         ftnlen  infmtlen;
-00115         char    *inform;
-00116         ftnint  informlen;
-00117         char    *inunf;
-00118         ftnlen  inunflen;
-00119         ftnint  *inrecl;
-00120         ftnint  *innrec;
-00121         char    *inblank;
-00122         ftnlen  inblanklen;
-00123 } inlist;
-00124 
-00125 #define VOID void
-00126 
-00127 union Multitype {       /* for multiple entry points */
-00128         integer1 g;
-00129         shortint h;
-00130         integer i;
-00131         /* longint j; */
-00132         real r;
-00133         doublereal d;
-00134         complex c;
-00135         doublecomplex z;
-00136         };
-00137 
-00138 typedef union Multitype Multitype;
-00139 
-00140 /*typedef long int Long;*/      /* No longer used; formerly in Namelist */
-00141 
-00142 struct Vardesc {        /* for Namelist */
-00143         char *name;
-00144         char *addr;
-00145         ftnlen *dims;
-00146         int  type;
-00147         };
-00148 typedef struct Vardesc Vardesc;
-00149 
-00150 struct Namelist {
-00151         char *name;
-00152         Vardesc **vars;
-00153         int nvars;
-00154         };
-00155 typedef struct Namelist Namelist;
-00156 
-00157 #define abs(x) ((x) >= 0 ? (x) : -(x))
-00158 #define dabs(x) (doublereal)abs(x)
-00159 #define min(a,b) ((a) <= (b) ? (a) : (b))
-00160 #define max(a,b) ((a) >= (b) ? (a) : (b))
-00161 #define dmin(a,b) (doublereal)min(a,b)
-00162 #define dmax(a,b) (doublereal)max(a,b)
-00163 #define bit_test(a,b)   ((a) >> (b) & 1)
-00164 #define bit_clear(a,b)  ((a) & ~((uinteger)1 << (b)))
-00165 #define bit_set(a,b)    ((a) |  ((uinteger)1 << (b)))
-00166 
-00167 /* procedure parameter types for -A and -C++ */
-00168 
-00169 #define F2C_proc_par_types 1
-00170 #ifdef __cplusplus
-00171 typedef int /* Unknown procedure type */ (*U_fp)(...);
-00172 typedef shortint (*J_fp)(...);
-00173 typedef integer (*I_fp)(...);
-00174 typedef real (*R_fp)(...);
-00175 typedef doublereal (*D_fp)(...), (*E_fp)(...);
-00176 typedef /* Complex */ VOID (*C_fp)(...);
-00177 typedef /* Double Complex */ VOID (*Z_fp)(...);
-00178 typedef logical (*L_fp)(...);
-00179 typedef shortlogical (*K_fp)(...);
-00180 typedef /* Character */ VOID (*H_fp)(...);
-00181 typedef /* Subroutine */ int (*S_fp)(...);
-00182 #else
-00183 typedef int /* Unknown procedure type */ (*U_fp)();
-00184 typedef shortint (*J_fp)();
-00185 typedef integer (*I_fp)();
-00186 typedef real (*R_fp)();
-00187 typedef doublereal (*D_fp)(), (*E_fp)();
-00188 typedef /* Complex */ VOID (*C_fp)();
-00189 typedef /* Double Complex */ VOID (*Z_fp)();
-00190 typedef logical (*L_fp)();
-00191 typedef shortlogical (*K_fp)();
-00192 typedef /* Character */ VOID (*H_fp)();
-00193 typedef /* Subroutine */ int (*S_fp)();
-00194 #endif
-00195 /* E_fp is for real functions when -R is not specified */
-00196 typedef VOID C_f;       /* complex function */
-00197 typedef VOID H_f;       /* character function */
-00198 typedef VOID Z_f;       /* double complex function */
-00199 typedef doublereal E_f; /* real function with -R not specified */
-00200 
-00201 /* undef any lower-case symbols that your C compiler predefines, e.g.: */
-00202 
-00203 #ifndef Skip_f2c_Undefs
-00204 #undef cray
-00205 #undef gcos
-00206 #undef mc68010
-00207 #undef mc68020
-00208 #undef mips
-00209 #undef pdp11
-00210 #undef sgi
-00211 #undef sparc
-00212 #undef sun
-00213 #undef sun2
-00214 #undef sun3
-00215 #undef sun4
-00216 #undef u370
-00217 #undef u3b
-00218 #undef u3b2
-00219 #undef u3b5
-00220 #undef unix
-00221 #undef vax
-00222 #endif
-00223 #endif
-
-
- - - diff --git a/dmatrix/doc/html/files.html b/dmatrix/doc/html/files.html deleted file mode 100644 index 94572438..00000000 --- a/dmatrix/doc/html/files.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: File List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

File List

-
-
-
Here is a list of all documented files with brief descriptions:
- - -
dmatrixv.h [code]
f2c.h [code]
-
- - - diff --git a/dmatrix/doc/html/form_0.png b/dmatrix/doc/html/form_0.png deleted file mode 100644 index c699b3afc97cd2624e39fcd99176616c9046e523..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmZ?wbhEHb)MMab_{_lY|Ns974<1~&aN)p#0~Hhgb5QG8X5`;3K9|$0s;aY z92^V`3=|X;1Ox;a7#I|PvM>TE1|1LqGJ}DoU*Lr2>b(}}!dv#UePTSA+@qmjlbp0n z`C!eF3o2I>UVfM&)9m+*Awffpjj?&bfv*gG%|*%#3VjSp4+ISaG+J6Jbe{P}G`Kw! z+Mz0w;rY^1QAb6;TR5SEnX6oknWLq(B~+NhMb$}!HH}$^(U?nJU6gU=teK+h>fvHs Z{C-CKT-q#boTep=9IO!~o1_F8tO2tTNe=)3 diff --git a/dmatrix/doc/html/form_1.png b/dmatrix/doc/html/form_1.png deleted file mode 100644 index c140608b69f3517f9ecb4eddf8e8c0fbe9fcf3b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmV*C zP(VOHFfcG6ARrJB5C8xGA^8LW00000EC2ui05Sj!000D?5XecZy*TS>!v0n;jH9Oo zj{&Zdkfet39NMe0YqCtplM#bPf-;a4aTUi6px9w(3IZ>PXe=uMVZz~?pt2P@69j!0SO78<1x^(M2#=7DVMzrO1%--m13m!^ qOe%L00i&d&7li^32o?$tSOg3Y3aJDJ2|$1b3Jz@xX@I~i5db?C8d6>W diff --git a/dmatrix/doc/html/form_2.png b/dmatrix/doc/html/form_2.png deleted file mode 100644 index f0f6623e607bdd2a77721d5ae17bdfcaf213c79d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmV<70UrKGNk%w1VPF6d0P_F<|NsBs;NZ~E(7?dJu&}V8prDYDkbr=IaBy&7U|>*C zP(VOHFfcG6ARrJB5C8xGA^8LW00000EC2ui0AK(R000F35XecZy*TU5yZ>M)j@m$S zM^Xhta2~E@oWN6%MDr-7@i3+bp)#;Z6rqCv6F^K7kH!rUa7ZtQ$BdLUDH7%q(G=|rw68Hm0Ja!P=?KCo3>Zj| zV1)+60uZBMq@4snah@^Q^1#FZSmE|55HcZ~gd&d$3DMG5p@4ytC|gxn00$F87Y7y) zNOORI09^8B)o_tOj;c(;5DbDP&(H-Zat17Ta0bN10t6CFs-VDTf&+RO2+$+IOAY}; zum)?hfYD7V3xC$QMz X$0raRDB!Y5zp0QjYlgeRLj(XjhLWu) diff --git a/dmatrix/doc/html/form_3.png b/dmatrix/doc/html/form_3.png deleted file mode 100644 index a1b5f50472d1df726d05446829b32725fb45ae07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287 zcmV+)0pR{eNk%w1VK)E}0P_F<|NsBs;NZ~E(7?dJu&}V8prDYDkbr=IaBy&7U|>*C zP(VOHFfcG6ARrJB5C8xGA^8LW00000EC2ui05<>-000Ec5XecZy*TU5yYIt*1%p5x z$)`>Sa~RD*2~1)nO&~qQN+pjNrje2a9wtBmIZ-SCfrhX05M2~f3K1aSQ3wyfYdRT( zFXo*C zP(VOHFfcG6ARrJB5C8xGA^8LW00000EC2ui05kv&000D?5XecZy*TU5yZ@IkfM0-| z=wza}=K64tQ@L9ir~jq5zXBSslKMi!Vv(V!>+ObJ0joD_x^8X(c6Xt@)Gpt@XW z3Jwgqcp13g?y==j$Xw->`zB!M`};@~0$5oOatB_95{P6yX(5UL0gM2Ha+4VW37edo qbrlRj6@#Ax4sxUtrg)7H1{VhkoU%Q#o3xDp1PKZXpSi#n5db^uX*C zP(VOHFfcG6ARrJB5C8xGA^8LW00000EC2ui051Rx000D=5XecZy*O(V>iD20j=^J4 z#d8?O(u|l=Btw>%6f&jo#T1f9$3hr15|k4lCFog%l7_N!05B95furf944{Apwqj@^ z#uLEBo6AplKIS7!E2vYzhb&g9l5?_ml o01BEE0i&d&7K}k$pAUxw3=dd(Zw)Vj69EbY2!OV|q7)GTJ1TuwumAu6 diff --git a/dmatrix/doc/html/form_6.png b/dmatrix/doc/html/form_6.png deleted file mode 100644 index 835bf11a8ffef775bb2dc50e5b52da3125bf723c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmV-F0l@x8Nk%w1VMG8B0P_F<|NsBs;NZ~E(7?dJu&}V8prDYDkbr=IaBy&7U|>*C zP(VOHFfcG6ARrJB5C8xGA^8LW00000EC2ui07L)~000E+5XecZy*TU5yZ<1SOk)@l zTR9XdIR(k1BuR6a)$jzGYP6D)L^mPqa1+Hb;{yVO00g7>KuQXN$DlX-af1|_B*0)< zZx8RlkXSXqfVC6)I1mU9Gx7##cz;p?4sdb+0(TZdLPTR)6$p@#kQW0CkPjmPJPCY+ zKLjiYdT>t@QWOuP0Gh0<7YVEk3KR|kB3%FlHv_Y`q<%?NI9R3&00djYW=%<3zNG^Q zn2-w#wjlvZW(E#vmIZGF*UV3*C zP(VOHFfcG6ARrJB5C8xGA^8LW00000EC2ui07L)~000F35XecZy*TU5yZ<0Igjg^L z)RBO~5O_~PQUa40N%H~^0R)T3LPl^nWD)`cVPGgYhlgP%DLhaT#p2hP5FV)=K+&B@ zHG)C|K^62UU%+81NiZnvDj4t3up3V^3}q7o4*_`+4hMK zDUoJa00TY%Ut$u28EXg)eI$mc01R7jpqu~*pc0-I2Lb_zyQ2fe#>Et|$yXH!cN33t zy9loqX@$cD2HV^QrDg>I1U?N&6b7{b1tSt}CX)gVqL&YO13}Rs1Aqhx3iA^JG%zp# z!8Zv9Y~0INAsB^VvOo|p@J|kgi5axjqC+KwE(aCtW;A$Ets{s43e3$IP|>8zmlPrZ F06S!Fd945d diff --git a/dmatrix/doc/html/formula.repository b/dmatrix/doc/html/formula.repository deleted file mode 100644 index 98bcfaeb..00000000 --- a/dmatrix/doc/html/formula.repository +++ /dev/null @@ -1,8 +0,0 @@ -\form#0:$ A x = b $ -\form#1:$ A x = B $ -\form#2:$ A = U' diag(s) V $ -\form#3:$ Q Q' = I $ -\form#4:$ Z Z' = I $ -\form#5:$ A Z=0 $ -\form#6:$ || B - A x ||_2 $ -\form#7:$ A=Q'U Q $ diff --git a/dmatrix/doc/html/functions.html b/dmatrix/doc/html/functions.html deleted file mode 100644 index 1c5c8f1f..00000000 --- a/dmatrix/doc/html/functions.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- a -

-
- - - diff --git a/dmatrix/doc/html/functions_0x63.html b/dmatrix/doc/html/functions_0x63.html deleted file mode 100644 index 715209d1..00000000 --- a/dmatrix/doc/html/functions_0x63.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- c -

-
- - - diff --git a/dmatrix/doc/html/functions_0x64.html b/dmatrix/doc/html/functions_0x64.html deleted file mode 100644 index b19b62f1..00000000 --- a/dmatrix/doc/html/functions_0x64.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- d -

-
- - - diff --git a/dmatrix/doc/html/functions_0x65.html b/dmatrix/doc/html/functions_0x65.html deleted file mode 100644 index abe44c26..00000000 --- a/dmatrix/doc/html/functions_0x65.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- e -

-
- - - diff --git a/dmatrix/doc/html/functions_0x66.html b/dmatrix/doc/html/functions_0x66.html deleted file mode 100644 index a396cdfc..00000000 --- a/dmatrix/doc/html/functions_0x66.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- f -

-
- - - diff --git a/dmatrix/doc/html/functions_0x67.html b/dmatrix/doc/html/functions_0x67.html deleted file mode 100644 index 1442f1db..00000000 --- a/dmatrix/doc/html/functions_0x67.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- g -

-
- - - diff --git a/dmatrix/doc/html/functions_0x69.html b/dmatrix/doc/html/functions_0x69.html deleted file mode 100644 index 04617ed5..00000000 --- a/dmatrix/doc/html/functions_0x69.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- i -

-
- - - diff --git a/dmatrix/doc/html/functions_0x6b.html b/dmatrix/doc/html/functions_0x6b.html deleted file mode 100644 index 5f312ea2..00000000 --- a/dmatrix/doc/html/functions_0x6b.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- k -

-
- - - diff --git a/dmatrix/doc/html/functions_0x6c.html b/dmatrix/doc/html/functions_0x6c.html deleted file mode 100644 index 9668edec..00000000 --- a/dmatrix/doc/html/functions_0x6c.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- l -

-
- - - diff --git a/dmatrix/doc/html/functions_0x6d.html b/dmatrix/doc/html/functions_0x6d.html deleted file mode 100644 index 90932c80..00000000 --- a/dmatrix/doc/html/functions_0x6d.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- m -

-
- - - diff --git a/dmatrix/doc/html/functions_0x6e.html b/dmatrix/doc/html/functions_0x6e.html deleted file mode 100644 index 6ef6aa94..00000000 --- a/dmatrix/doc/html/functions_0x6e.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- n -

-
- - - diff --git a/dmatrix/doc/html/functions_0x6f.html b/dmatrix/doc/html/functions_0x6f.html deleted file mode 100644 index ac0e8896..00000000 --- a/dmatrix/doc/html/functions_0x6f.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- o -

-
- - - diff --git a/dmatrix/doc/html/functions_0x70.html b/dmatrix/doc/html/functions_0x70.html deleted file mode 100644 index 2dcad421..00000000 --- a/dmatrix/doc/html/functions_0x70.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- p -

-
- - - diff --git a/dmatrix/doc/html/functions_0x71.html b/dmatrix/doc/html/functions_0x71.html deleted file mode 100644 index 0dc08341..00000000 --- a/dmatrix/doc/html/functions_0x71.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- q -

-
- - - diff --git a/dmatrix/doc/html/functions_0x72.html b/dmatrix/doc/html/functions_0x72.html deleted file mode 100644 index 6d6139e8..00000000 --- a/dmatrix/doc/html/functions_0x72.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- r -

-
- - - diff --git a/dmatrix/doc/html/functions_0x73.html b/dmatrix/doc/html/functions_0x73.html deleted file mode 100644 index 3f50f2a5..00000000 --- a/dmatrix/doc/html/functions_0x73.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- s -

-
- - - diff --git a/dmatrix/doc/html/functions_0x74.html b/dmatrix/doc/html/functions_0x74.html deleted file mode 100644 index 27191bcb..00000000 --- a/dmatrix/doc/html/functions_0x74.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- t -

-
- - - diff --git a/dmatrix/doc/html/functions_0x76.html b/dmatrix/doc/html/functions_0x76.html deleted file mode 100644 index cbb25b3a..00000000 --- a/dmatrix/doc/html/functions_0x76.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- v -

-
- - - diff --git a/dmatrix/doc/html/functions_0x7a.html b/dmatrix/doc/html/functions_0x7a.html deleted file mode 100644 index e3b7c51a..00000000 --- a/dmatrix/doc/html/functions_0x7a.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- z -

-
- - - diff --git a/dmatrix/doc/html/functions_0x7e.html b/dmatrix/doc/html/functions_0x7e.html deleted file mode 100644 index 4473ce55..00000000 --- a/dmatrix/doc/html/functions_0x7e.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- ~ -

-
- - - diff --git a/dmatrix/doc/html/functions_func.html b/dmatrix/doc/html/functions_func.html deleted file mode 100644 index 9ab9a41b..00000000 --- a/dmatrix/doc/html/functions_func.html +++ /dev/null @@ -1,433 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - Functions - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-  - -

- a -

- - -

- c -

- - -

- d -

- - -

- e -

- - -

- f -

- - -

- g -

- - -

- i -

- - -

- l -

- - -

- m -

- - -

- o -

- - -

- p -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- ~ -

-
- - - diff --git a/dmatrix/doc/html/functions_rela.html b/dmatrix/doc/html/functions_rela.html deleted file mode 100644 index 504cf039..00000000 --- a/dmatrix/doc/html/functions_rela.html +++ /dev/null @@ -1,409 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - Related Functions - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - - -
-
-  - -

- a -

- - -

- c -

- - -

- d -

- - -

- e -

- - -

- f -

- - -

- i -

- - -

- k -

- - -

- l -

- - -

- m -

- - -

- n -

- - -

- o -

- - -

- p -

- - -

- q -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- v -

- - -

- z -

-
- - - diff --git a/dmatrix/doc/html/functions_vars.html b/dmatrix/doc/html/functions_vars.html deleted file mode 100644 index 6861b55b..00000000 --- a/dmatrix/doc/html/functions_vars.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Class Members - Variables - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - - -
-
-
- - - diff --git a/dmatrix/doc/html/index.html b/dmatrix/doc/html/index.html deleted file mode 100644 index 54ec285c..00000000 --- a/dmatrix/doc/html/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: DMatrix and SparseMatrix classes - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- -
-
-
-

DMatrix and SparseMatrix classes

-
-
-

-Introduction

-

The author developed the main features of the DMatrix class between 1994 and 1999. The class makes extensive use of operator overloading in order to facilitate the implementation in C++ of complicated matrix expressions, and it has intefaces to a number of LAPACK routines. In 2008, the class has been tested with current compilers, its functionality was expanded, and the code was published under the GNU Lesser General Public License. The class at present is restricted to dense and real matrices. In 2008, the SparseMatrix class was added to the library to incorporate basic sparse matrix functionality. The SparseMatrix class offers interfaces to some functions available in the CXSparse and LUSOL libraries.

-

The library should compile without problems with the following C++ compilers: GNU C++ version 4.X and Microsoft Visual Studio 2005.

-

-License

-

This work is copyright (c) Victor M. Becerra (2009)

-

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

-

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA, or visit http://www.gnu.org/licenses/

-

Author: Dr. Victor M. Becerra, University of Reading, School of Systems Engineering, P.O. Box 225, Reading RG6 6AY, United Kingdom, e-mail: v.m.becerra@ieee.org.

-

-Installing the library

-

See the INSTALL file.

-

-Examples of use

-

See the source code in the examples directory.

-
- - - diff --git a/dmatrix/doc/html/nav_f.png b/dmatrix/doc/html/nav_f.png deleted file mode 100644 index 1b07a16207e67c95fe2ee17e7016e6d08ac7ac99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQfZzpjv*C{Z|{2YIT`Y>1X`Eg z-tTbne1`SITM8Q!Pb(<)UFZ(m>wMzvKZQqKM~~GcZ=A7j<~E6K62>ozFS=cD3)mf8 z9WX0+R&m(l9KUsLdTx4?9~({T__KA%`}olPJ^N;y|F^pHgs_K%!rj~{8>RwnWbkzL Kb6Mw<&;$VTdq1fF diff --git a/dmatrix/doc/html/nav_h.png b/dmatrix/doc/html/nav_h.png deleted file mode 100644 index 01f5fa6a596e36bd12c2d6ceff1b0169fda7e699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr8!2~3AUOE6t1`SUa$B+ufw|6&kG8phMJMJ~w va4>Y+bZ&9QY?(VEUPY_cGd9nQ`um^ZSUyYpAAuKhL7F^W{an^LB{Ts5DmojT diff --git a/dmatrix/doc/html/open.png b/dmatrix/doc/html/open.png deleted file mode 100644 index 7b35d2c2c389743089632fe24c3104f2173d97af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{Vww^AIAr*{o=Nbw!DDW^(zOibV zl!F8B0?t?i!vld4k#$~0_AX3zElaokn - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

Namelist Member List

-
-
-This is the complete list of members for Namelist, including all inherited members. - - - -
name (defined in Namelist)Namelist
nvars (defined in Namelist)Namelist
vars (defined in Namelist)Namelist
- - - diff --git a/dmatrix/doc/html/structNamelist.html b/dmatrix/doc/html/structNamelist.html deleted file mode 100644 index 07ec3c7b..00000000 --- a/dmatrix/doc/html/structNamelist.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Namelist Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

Namelist Struct Reference

-
-
- -

List of all members.

- - - - - -

-Public Attributes

-char * name
-Vardesc ** vars
-int nvars
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structVardesc-members.html b/dmatrix/doc/html/structVardesc-members.html deleted file mode 100644 index 64ea2f6b..00000000 --- a/dmatrix/doc/html/structVardesc-members.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

Vardesc Member List

-
-
-This is the complete list of members for Vardesc, including all inherited members. - - - - -
addr (defined in Vardesc)Vardesc
dims (defined in Vardesc)Vardesc
name (defined in Vardesc)Vardesc
type (defined in Vardesc)Vardesc
- - - diff --git a/dmatrix/doc/html/structVardesc.html b/dmatrix/doc/html/structVardesc.html deleted file mode 100644 index 2a297a89..00000000 --- a/dmatrix/doc/html/structVardesc.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Vardesc Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

Vardesc Struct Reference

-
-
- -

List of all members.

- - - - - - -

-Public Attributes

-char * name
-char * addr
-ftnlen * dims
-int type
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structalist-members.html b/dmatrix/doc/html/structalist-members.html deleted file mode 100644 index db19c927..00000000 --- a/dmatrix/doc/html/structalist-members.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

alist Member List

-
-
-This is the complete list of members for alist, including all inherited members. - - -
aerr (defined in alist)alist
aunit (defined in alist)alist
- - - diff --git a/dmatrix/doc/html/structalist.html b/dmatrix/doc/html/structalist.html deleted file mode 100644 index e4b6b469..00000000 --- a/dmatrix/doc/html/structalist.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: alist Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

alist Struct Reference

-
-
- -

List of all members.

- - - - -

-Public Attributes

-flag aerr
-ftnint aunit
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structcilist-members.html b/dmatrix/doc/html/structcilist-members.html deleted file mode 100644 index 07928164..00000000 --- a/dmatrix/doc/html/structcilist-members.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

cilist Member List

-
-
-This is the complete list of members for cilist, including all inherited members. - - - - - -
ciend (defined in cilist)cilist
cierr (defined in cilist)cilist
cifmt (defined in cilist)cilist
cirec (defined in cilist)cilist
ciunit (defined in cilist)cilist
- - - diff --git a/dmatrix/doc/html/structcilist.html b/dmatrix/doc/html/structcilist.html deleted file mode 100644 index 02f93946..00000000 --- a/dmatrix/doc/html/structcilist.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: cilist Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

cilist Struct Reference

-
-
- -

List of all members.

- - - - - - - -

-Public Attributes

-flag cierr
-ftnint ciunit
-flag ciend
-char * cifmt
-ftnint cirec
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structcllist-members.html b/dmatrix/doc/html/structcllist-members.html deleted file mode 100644 index c77fb68d..00000000 --- a/dmatrix/doc/html/structcllist-members.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

cllist Member List

-
-
-This is the complete list of members for cllist, including all inherited members. - - - -
cerr (defined in cllist)cllist
csta (defined in cllist)cllist
cunit (defined in cllist)cllist
- - - diff --git a/dmatrix/doc/html/structcllist.html b/dmatrix/doc/html/structcllist.html deleted file mode 100644 index 9c2dce1b..00000000 --- a/dmatrix/doc/html/structcllist.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: cllist Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

cllist Struct Reference

-
-
- -

List of all members.

- - - - - -

-Public Attributes

-flag cerr
-ftnint cunit
-char * csta
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structcomplex-members.html b/dmatrix/doc/html/structcomplex-members.html deleted file mode 100644 index 8b85e00a..00000000 --- a/dmatrix/doc/html/structcomplex-members.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

complex Member List

-
-
-This is the complete list of members for complex, including all inherited members. - - -
i (defined in complex)complex
r (defined in complex)complex
- - - diff --git a/dmatrix/doc/html/structcomplex.html b/dmatrix/doc/html/structcomplex.html deleted file mode 100644 index 3bf14bd9..00000000 --- a/dmatrix/doc/html/structcomplex.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: complex Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

complex Struct Reference

-
-
- -

List of all members.

- - - - -

-Public Attributes

-real r
-real i
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structdoublecomplex-members.html b/dmatrix/doc/html/structdoublecomplex-members.html deleted file mode 100644 index 5db1faa8..00000000 --- a/dmatrix/doc/html/structdoublecomplex-members.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

doublecomplex Member List

-
-
-This is the complete list of members for doublecomplex, including all inherited members. - - -
i (defined in doublecomplex)doublecomplex
r (defined in doublecomplex)doublecomplex
- - - diff --git a/dmatrix/doc/html/structdoublecomplex.html b/dmatrix/doc/html/structdoublecomplex.html deleted file mode 100644 index a1ecf2c0..00000000 --- a/dmatrix/doc/html/structdoublecomplex.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: doublecomplex Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

doublecomplex Struct Reference

-
-
- -

List of all members.

- - - - -

-Public Attributes

-doublereal r
-doublereal i
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structicilist-members.html b/dmatrix/doc/html/structicilist-members.html deleted file mode 100644 index 664412e7..00000000 --- a/dmatrix/doc/html/structicilist-members.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

icilist Member List

-
-
-This is the complete list of members for icilist, including all inherited members. - - - - - - -
iciend (defined in icilist)icilist
icierr (defined in icilist)icilist
icifmt (defined in icilist)icilist
icirlen (defined in icilist)icilist
icirnum (defined in icilist)icilist
iciunit (defined in icilist)icilist
- - - diff --git a/dmatrix/doc/html/structicilist.html b/dmatrix/doc/html/structicilist.html deleted file mode 100644 index 3a7e8d03..00000000 --- a/dmatrix/doc/html/structicilist.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: icilist Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

icilist Struct Reference

-
-
- -

List of all members.

- - - - - - - - -

-Public Attributes

-flag icierr
-char * iciunit
-flag iciend
-char * icifmt
-ftnint icirlen
-ftnint icirnum
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structinlist-members.html b/dmatrix/doc/html/structinlist-members.html deleted file mode 100644 index d6938aae..00000000 --- a/dmatrix/doc/html/structinlist-members.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

inlist Member List

-
-
-This is the complete list of members for inlist, including all inherited members. - - - - - - - - - - - - - - - - - - - - - - - - - - -
inacc (defined in inlist)inlist
inacclen (defined in inlist)inlist
inblank (defined in inlist)inlist
inblanklen (defined in inlist)inlist
indir (defined in inlist)inlist
indirlen (defined in inlist)inlist
inerr (defined in inlist)inlist
inex (defined in inlist)inlist
infile (defined in inlist)inlist
infilen (defined in inlist)inlist
infmt (defined in inlist)inlist
infmtlen (defined in inlist)inlist
inform (defined in inlist)inlist
informlen (defined in inlist)inlist
inname (defined in inlist)inlist
innamed (defined in inlist)inlist
innamlen (defined in inlist)inlist
innrec (defined in inlist)inlist
innum (defined in inlist)inlist
inopen (defined in inlist)inlist
inrecl (defined in inlist)inlist
inseq (defined in inlist)inlist
inseqlen (defined in inlist)inlist
inunf (defined in inlist)inlist
inunflen (defined in inlist)inlist
inunit (defined in inlist)inlist
- - - diff --git a/dmatrix/doc/html/structinlist.html b/dmatrix/doc/html/structinlist.html deleted file mode 100644 index bf7513da..00000000 --- a/dmatrix/doc/html/structinlist.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: inlist Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

inlist Struct Reference

-
-
- -

List of all members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Attributes

-flag inerr
-ftnint inunit
-char * infile
-ftnlen infilen
-ftnint * inex
-ftnint * inopen
-ftnint * innum
-ftnint * innamed
-char * inname
-ftnlen innamlen
-char * inacc
-ftnlen inacclen
-char * inseq
-ftnlen inseqlen
-char * indir
-ftnlen indirlen
-char * infmt
-ftnlen infmtlen
-char * inform
-ftnint informlen
-char * inunf
-ftnlen inunflen
-ftnint * inrecl
-ftnint * innrec
-char * inblank
-ftnlen inblanklen
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/structolist-members.html b/dmatrix/doc/html/structolist-members.html deleted file mode 100644 index ae2bd660..00000000 --- a/dmatrix/doc/html/structolist-members.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

olist Member List

-
-
-This is the complete list of members for olist, including all inherited members. - - - - - - - - - -
oacc (defined in olist)olist
oblnk (defined in olist)olist
oerr (defined in olist)olist
ofm (defined in olist)olist
ofnm (defined in olist)olist
ofnmlen (defined in olist)olist
orl (defined in olist)olist
osta (defined in olist)olist
ounit (defined in olist)olist
- - - diff --git a/dmatrix/doc/html/structolist.html b/dmatrix/doc/html/structolist.html deleted file mode 100644 index 83a0b7d7..00000000 --- a/dmatrix/doc/html/structolist.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: olist Struct Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

olist Struct Reference

-
-
- -

List of all members.

- - - - - - - - - - - -

-Public Attributes

-flag oerr
-ftnint ounit
-char * ofnm
-ftnlen ofnmlen
-char * osta
-char * oacc
-char * ofm
-ftnint orl
-char * oblnk
-
The documentation for this struct was generated from the following file: -
- - - diff --git a/dmatrix/doc/html/tab_a.png b/dmatrix/doc/html/tab_a.png deleted file mode 100644 index 2d99ef23fed78c7683f0b5aa803d937060d288c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qo)`sjv*C{Z|CmjY;X`^DSv)) z;hc^cTF;t%XWXdwWP5+kt?jQ5uhqKtjd^EY`^^-S;M%tFAj_l)EwVTK)E@1LSD0{e q?a6($SGQTzz1#QBzr0NMKf^0WCX-0bi?u-G89ZJ6T-G@yGywp8?ljB* diff --git a/dmatrix/doc/html/tab_b.gif b/dmatrix/doc/html/tab_b.gif deleted file mode 100644 index 0d623483ffdf5f9f96900108042a7ab0643fe2a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H diff --git a/dmatrix/doc/html/tab_b.png b/dmatrix/doc/html/tab_b.png deleted file mode 100644 index b2c3d2be3c7e518fbca6bb30f571882e72fc506d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qk9-Ajv*C{Z|~mbJ)|JfaM8Xd zIP7xAmLwau9@iXhZTrl-TjWj9jM#?{xt`6uU{<)jb9Suc^QnbhJ(o{ib8=j9u0_mE8M7kgF7f<7W7IEf=8(L_qx|g0H;V7iPxm&Q@G7p8W2Kx&iT|YUM=ITC zY<0Qbr;u&AtXD{o@41wH=7&d8=2Z_{M9Tsa=g*t*@A3H$UOlxZk7?f6RUWpx>Fc_L s#LQ{edY3MpIXkMeV^&YV=9fR%8Jv|Kya=#u06K}m)78&qol`;+0RKEt)&Kwi diff --git a/dmatrix/doc/html/tab_l.gif b/dmatrix/doc/html/tab_l.gif deleted file mode 100644 index 9b1e6337c9299a700401a2a78a2c6ffced475216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI diff --git a/dmatrix/doc/html/tab_r.gif b/dmatrix/doc/html/tab_r.gif deleted file mode 100644 index ce9dd9f533cb5486d6941844f442b59d4a9e9175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo diff --git a/dmatrix/doc/html/tab_s.png b/dmatrix/doc/html/tab_s.png deleted file mode 100644 index 978943ac807718de0e69e5a585a8f0a1e5999285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QZ1e?jv*C{Z|}b5Yzkm-c<7z3 zq^cq0=~}Z;b(!Zvb5Z%sTRFKGlz1=qOFg;myyu?$r`wZb^irPsN1a)6)TwB0r+)wb zPL25;=adu89?fTK`qDR>$D*)b_WOmdKI;Vst02j(hg8%>k diff --git a/dmatrix/doc/html/tabs.css b/dmatrix/doc/html/tabs.css deleted file mode 100644 index 21920562..00000000 --- a/dmatrix/doc/html/tabs.css +++ /dev/null @@ -1,59 +0,0 @@ -.tabs, .tabs2, .tabs3 { - background-image: url('tab_b.png'); - width: 100%; - z-index: 101; - font-size: 13px; -} - -.tabs2 { - font-size: 10px; -} -.tabs3 { - font-size: 9px; -} - -.tablist { - margin: 0; - padding: 0; - display: table; -} - -.tablist li { - float: left; - display: table-cell; - background-image: url('tab_b.png'); - line-height: 36px; - list-style: none; -} - -.tablist a { - display: block; - padding: 0 20px; - font-weight: bold; - background-image:url('tab_s.png'); - background-repeat:no-repeat; - background-position:right; - color: #283A5D; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; - outline: none; -} - -.tabs3 .tablist a { - padding: 0 10px; -} - -.tablist a:hover { - background-image: url('tab_h.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); - text-decoration: none; -} - -.tablist li.current a { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); -} diff --git a/dmatrix/doc/html/unionMultitype-members.html b/dmatrix/doc/html/unionMultitype-members.html deleted file mode 100644 index 64ad240d..00000000 --- a/dmatrix/doc/html/unionMultitype-members.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Member List - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
-
-

Multitype Member List

-
-
-This is the complete list of members for Multitype, including all inherited members. - - - - - - - -
c (defined in Multitype)Multitype
d (defined in Multitype)Multitype
g (defined in Multitype)Multitype
h (defined in Multitype)Multitype
i (defined in Multitype)Multitype
r (defined in Multitype)Multitype
z (defined in Multitype)Multitype
- - - diff --git a/dmatrix/doc/html/unionMultitype.html b/dmatrix/doc/html/unionMultitype.html deleted file mode 100644 index 58e4340d..00000000 --- a/dmatrix/doc/html/unionMultitype.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - -DMatrix and SparseMatrix C++ classes: Multitype Union Reference - - - - - -
-
- - - - - - -
-
DMatrix and SparseMatrix C++ classes
-
-
- - -
-
- -
-

Multitype Union Reference

-
-
- -

List of all members.

- - - - - - - - - -

-Public Attributes

-integer1 g
-shortint h
-integer i
-real r
-doublereal d
-complex c
-doublecomplex z
-
The documentation for this union was generated from the following file: -
- - - diff --git a/dmatrix/doc/latex/DMatrix_Class_Reference.pdf b/dmatrix/doc/latex/DMatrix_Class_Reference.pdf deleted file mode 100644 index d12080c26b643ffdb1b9a527fd90bed29ff52763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760126 zcmd3P1y~f__rE9xSg5F2h`t6G%f@Ue1`1-Klr1O%B1kBW-7Pi-uib?S76x`=VYjGQ z*qy&~@6PP(Faz#=8UNq^`#djh%+CGHx#ym`=bT&D&8baenS?U0dm;1Kb#s}G)F!-N zu(^YSjlHLhy-T=PxQ)G&jji7R-$79U5fYi5P4njF0b%~=B8tA)wzop9g8$XMrBbOA z`s0fJ_@X~i=uZUt6NLW6p+CK)6#P$L5Qbj)8-DDG-VD-TfPWl`-UgsQ#@*TvT^gdl z2mU#Gk4QV_5tMm6Z)AX9R8V-BM8`OdeTJVZ8ok1B@VA%>_}ef& z2<;z1$PLLZlMA8fh{nNp$Ae*7VNklq)(<9A{Bbk|XEc@2XzVlN+v7*W^Nnea|6nW_ zK_G(0Ogg@F0Qv+&WIkqp(hq%yCmr7qzlvw!tN#d}GK4Re3c+_qV_;syV}zo&nBy=E z3=BUPgAPwve{>b|37*zmq?P|^^>C(9F1UPJqd_nVj0}&!fx=QAvlqr1rzem6PYf;R zGPGQfqyGq^BSMKM7-NfK$IpwG83DrKErlQ_|8aCIV(^q;R>xC;rw|i^U5S{2d9FIe zpB93GODcunLcn9N%&Q}ZA)|PrHy8xw!(T8@0spGd@0j%2qLR$S$wRi#abvD<9Rukt)dm=Wn%_M`0#a@)L3ugw|Fih^z5!R zp51eqAX-6o$B&O?E&hW=KK6PHoIK+>J(tBGlM1prelEc=5fLyiVm4&$VK4Lro-$5QL2-`>|^Hb_6j{FS7Zviz}UKAy%S8_Zu%+3b_Nc)_0(g+3K7d9HW(_SNF<(& zEAoW>TC7DdFiZr010oRd6<5d!yPkQEm9JaKTi0CKChQ$zf@6t>3CTX8fmqAetK*Hz zm21Mz9X2U2o8c+-WvNNvCxNZSm0ZG}Qtq)3=ipJ}(JTDutf?m>@RwkGu0&D^DoYnV ztKw0yAZLv_H}oxQ&&gCI+$85pDPhkk*Z8ak#f;4Q)wz)ncv3(Kt_&0QrE<-LfxIN} zo?tAl3={UB@*XQ+k101d%eg{J*m255VQdSj=LM|myfeMZwlS_>eWbAb01A;`FDLB$hF6;p0qC_sCB`31|6&#@@mkApG zxdz0~iZvJ3()bnDocI+Msn}h>Z?Q3oEoTFF0SkQe2kTnw+2g0cvuL1y(IvXu>$Rht z$iYx>dJ*Z4Hi>ZJzHQl z!{o?4K9TpK;7DS*u=mjsjf#iCoWNSY^1OHN1Y7_GSKtbJA9$%?#>cac?G-%rSes(= zi6uRT!)~g}i98aDD|&@J5|;Jw^T)ERN91HsTnQ`eWZ)6-v+5Q;qB^_ubkmGJtA+kF zGeANjW+|?i6?Q@XD-t3Hh2qLzVF$%nB(Tw=WGO=AvQS(>DeSTk;83wRh};=?0E46? zxv)D!f&;M$+6XhiLn1EWha5bDR)O(&lz;`{QOXSP5OFS7R0_L01;az+^iW*UDeUwV z5D$qxOL4`kuwzs(JVefuk}F?@ou>lgA>n6WJVSmKcBTr5hlHP%TuChKa1{&>kyEDR z%41=ttblk(_*u!3%L-xttU!1aM6Q~WBcBz*u37={5b-ldJ}ZR1wgTcI;%AP0RtP(A z1;az+-zhorSt0D-6%Y>*KXc@>Lf9cI7#<=|OvRDU3Sm#IfOtswS;djh3SsxGfOtsw zS;djh3SrmG7(9A=M?vJ8sW|djA?%tFj!(j`Dz5w$cGrv^hAcbeovJ9{J*&9lwP22$0SF?WO~sX|1@qY&=3)#YuT903rUmob8nbgk zVB40_vk)l+=d?iB=L@dgYqEx{g zq~^J}gJ{=E!x5#_e|L=#h}=ksoFolLlu{x%NfgnZmWC@p3+5yZW4V*aNz!r!Xu+JM zVQ5Yak&v*cmMcYtJta3Z0^Y=9x1ZU3Gm6M7(sCuHuva8FAOg`2{lUBTcsoCwr9Y8Z zq~!`rVXp{3Fy79?1LEWWY?b3JMrOY~5Fx@>;l21=dGWfR8=xc+q*|^Z7512nLy58B z$G|hFBc6U%*~~7A$eYq~g{-hQ<$;F5`=gi`>|QiQl)IS8fVBNO)At8SHK|MdSi$xk6Fc1;R6}8wNd+EBb@y6=&TVtVg2kJS|rq3OhcY zXe>N^F}bKodL)^YBdnFe&R8zU_$^+bxPB6^87%0q?7<=zYZ127g_6iElSw(E zT`BCBMIv&sC>YxU%ZxvvA+ac+z>Bk3gncti6P%xl#~y^h<&we%A`N}Z=CLY?yfhiN zmPsk>rU~IO(7Cw*keI(R8ArS;gmdP0^JvEXD)QamzKHt&coWxr!S#?->U!#b2@Df}5$q|BvwFg(5ZHf+`+UIzGC z@fXbXI9(Qhj4x#wgN2Eg5<8~Bjr1~KN#H|L+tg2KJ}ZQCE;p7VJFd8NS=sty4gdo z@G`;cLU1(@Y^+fduGSOw5`|#mm7WV%F7sYV;0{vU+FYfuHz)+;PZ*3B=#+%3--NwH zKki)MSz#@6C4qwoqKM|ih96TJ?niqED*s%cSGAul> zZe*uQMc}r8nZc1DDq*iha6mL^tdEV6U{ek&7yJuW^Qj2D7Qn<2GAd!G1&@VI0K;KO zL<_ebRwe9>;9;4(|)4*e4LK-|0LDK^mhGWpHg#8JFVTk51 zU#Egw3JXX$l13%$THxu!#5JHRkuA=xcvT4-<9HbCdf->sP;^3%j)%rZ2Y!VY5`L9S zDXYjVcdkSdHr<6V8NHf_Onh$ftV-C%$8fM}!H1!?1!3 zzv4t6@KrkbhUQDR1ko$j*HsbO`P}+hm9U|YN5xTH)}2rh+3ws5S(UKyZZHgbBm;62 z8Q|PPSe38^j>p2TlL6(3%xiA>t4i3u79NH~0dmVwRl+7T4x8eIn#&qe5n0dN+ESIU z^^ErVKlkiEMRlp{82cR@aSyp3sOumYT?j=N4wFg^hT2{67$v$ZF@-V5)_!c08|mS>%#Z z*kr6itVe3Omc4N zq*~Y{4@JXZWq@gIKu98MoLd&D7PiLm6Y8WNyJ(0EYi_lpTG+5Q7$#3b64}{GjzOgs zwzDxIu`I_Th|Q8w6WQ5HuHX^2v$4t&vR2eY#x}PWQ7vq28Y;og9!UJNCWTQ=LB8!__L#P(ExbawczVKMsGGWDyj<_tB5*gs!nnAU&0dCCr zh<(`t95s;@&Mg#F3tQp3$3(;Awta{!Zf;SaTG-;ov}SD|*7j8snb_O{K((-mjmKh* zO*S7-O=M?t>-^NhcD5TLpTSt@tx$AQO=MH6xH3oBrvAgw2#FWV!$d|jx3EtmY(%@G z5j^xGXow7EZq=Sf*kIO;fQB)`0MZZ{%-mW%jj+MYj-S5)q#-h*xfOaEVI!KANLV6b zU!7IY8X}vTTaBj?wyA{%jAkd7$bRM)-D!mF=Uf90WXB@1q`9?q8evNskA)p9Ec0|E zH5ia2dc>`x(+Hc+ctD*RL+pz)8?b)CvWfNbG(@H|w{T7)Y&u7x0r9iqQL!*$TY+ha zEM#txoJQC}#slUu>@-9cGPev)BWxiX41-C^P9Kq7%q?`&2;0SYECcmuFcuN3aLgW! zuw9(bSjN|BL23eLlT9OR9D5?l4Mu-3gR)yd8X}XJTbQO1Hi_|A*sx#~u!hJQ=9Zpm zgsovrKFs87a9cxU2y^SoG{S~3ewwa`a!xEW5ZS=oqA`uI4QwzB8VkS0e2C5OTtN*D zkzLHK7t;va#dyAQ`GOiE^H;+$T{ObxufZ_rG1;h_hRDk0)_iG%tz0}7rXd^Q)DRiC z+=4ERuz~A^9^?-u8Ou3DMlZLZOCxOb8Z$nE$eM&2B5Rmi(4`T!hB2*mik*E{BFmRs zt)&sRd<}*{kCZENsv$CUxz$=)VN;hK5bHVCF47Viz1*TKt+3IH7dc*ntk%{N*|yxO zDy^_>tCJ;|eEO-<64|lb+9<8C9jmKNLc?IT!0V9p?6vvYu?9)RoSlBHumy`FKiKBN z(U?3=3&NZ7tgDY-iJR%GC9sv1+)Q7su&K<#6{>U564=X1ZqBb(*j&c+!#poMUY<6P ze#SUTKr3t`W1j{y1Xka8zOb6ZbI4ljY;2AF7KeeEX~SBQU7`l=H{v_yDi8Dq-x}}v z;a8X^@hj{Syp41HgK`3PT49UaSvV(3g- z{iI?BVM&`eZH#t?)RJ5W)@p@)q5sOgtX9c;FF`+7oXkh9u%m=o0n>(MEc^;{5T*z- z3!aE>dD5P_>OU-*y!R{gkHYc!w8DN^JA@BUDSiNUHu1W_O9p?zYER4^Si|8<*k{An zVR48#IX@Bc#|!=gLGtw*S(@aMA;KObD--bJ{aqQ7wH$>|=0JUA4mgEoLn&bMRxZ9Eo2Um;r{ut_zoqSt(k86_&S8%{~xUt_yq8oe(z6 zLfC%5s_B0-LwQDV*azZd?rMcyb4=a;$rI%5|FciP$v@Ewd;MMYQ-W2fKYEMjg*5>f z#`$XkJg@jdFRdEYy?fZ$w+V{!HfYMMWugi;4i4t_9RtDwqXyW>v>F@Tf97y~NK`-s z{4T^dD!?hgFWf)Cym@o;$f$?_-%#_oo8xCX4lL|gYW(Z(4I{k#{brv#n_#_hv(1Oh zJ(DN8uT8ZXc%#dOk@v1PT75tL^3Yn3hR(2fIl8a=g(AbJ9Q)#2qWd-vdy9Lcy<2W* zc;Qgn=e1t-RW3NV#`Al8mBfbwW-eO1aMza1n6JNsRaF<>u=cq2IBa)9hmw8&)x?%` zJJuxAt%0v|zaP$F5lNl)6c0~c^FHhG-t*H-Pg8asd1zFH*B|HCAMW`BeO8gwqI2by<#w}@~*&wwbKUhqUtZEWnl0^*`?32>MNZES;Ylqm4rF&5wBdfCJL;Dg&vjToyF>7LkIU92?rPc& z+#1*R)xpZQxcA?X>P&z)5(1{N6@Wb)!$DeA?)C7#C|t+7n`)0m{GsriH^Ch;&D8B?t)41x@Q}LEY(nAwLlb%)I$Fu=Yu`x+P6rN8 zb~|zo>|M=q2&HqZ~ZFuzZZMM$)t+b<*71Z zz?pJEn!UHjZA|fs_o*m5sI(tjT!nDHo{d!-OPIjH|y~=%$$46?|`a-ojE(^b$ zQe8 zj$6Br+h%!gcVw-1wo|X!n~hZ7{kNXU)}HQLV;5cM>EG~8@Sw9VGTSPq|Mqri{W_~p zSEo<)S3j=U$ZCjVA=mKdBT9si{~A^^>Um_=l1?vu+k{&vmYDV*(RTaQ=$z7hUwvKJ zsoIXFtNeG*deU^;5X|@8%lzGXOId7^g>RBwS)B0W) zc0?%7$dANZPM7rtcj_0#6J>G*C|$7;%mQe|4*ZU25#8=uvWZ<~!;ykxE1wOFqg zqwXIJi?O$UHsI{5ZRe`)Sm||l-lg3yADURV9+y5=`n`1j$BQBYo?Kmj?{$qL+NZbE zdTx9dem9_Fkx2W0;%~j4wEXZSv!t0bY7M%*Y~ts~i%u5#^x9_m5gW(SLFFcPP;?$E z^G>T#v}VwkR#UD#z4>wF{mWo|kCvXD@C_t5{RBE`)5rnyoy{C=6OSo6KjlGkN zt=|COL15m{{+pp9M$aVaoTUbZ+LR6SJdh|9 z)E|K9+zmruh)+ZYCRa)n;OE2nff5xgN@!vsk*odyOy@-y0z)f99AFId10LXgI93%( zRbVY3-ct(WVtAiFkMtS$2DaIMU6Ks%Q(C!11M*s?MiU5YQYw?E)cNy16TdU0m!bJ4 zim;&6Qi&Yovs|hIVWG64)LNKFVb*5|#^*02AH|tQJ;9V3sCWe-CWrJ=*m0p$VDxL0 z`7)S-FD#f1Mlq+7QbBb(1;`-83a$dBR7#{W*&mScnG9(Vk!hx&B%t8*z$m#ys}SaW zMv8%k!2OgAc}#rCPsy|rtr8{^5J}ZC8%iOSXjJk)kc=-a#FzXaLZsOQNs7|S72q|4J1kei94P@AEKs#957Eypoz?{eIq*bO z01P~hQi8Hx;gk@NvPh~(nSy%vCc;^_gIN&`4FHVR|~fpsRQ04Hb!g+>lK zJ`Vu`_;Nwyi4p)QqFP`;sz43EzKk9uNMlNyhb$2QDL_f_G=!d#lvV?8$*nDih)NGqs3B#Z#a+_DBh@|~;yYy>bMkBN?Qi&G4fAGt6AVH>Uy@DZZwG6)izk@Q8w_g@qi1dLA~mz}nU&LKvE6 zOtPDplMOzw5==(9QU!q*fC?gADK}mK=~5gxAVt(O^s}?PF!IvnnMZC12;@(6mSnEVIH<&=QFuxe81Rt&L0$ zc9GP0SxL75^Pgmp2sXFCzoiytZJQ$x7~^^a;gwv-Er-MnN@1VNxuy$ zpR?2{@WK421Gd&IJ)+dsrzJ{+DJ?Ulb>{C#|618*&cieR6rS6w^@!xK#pNWLE4xGD zT4xknTFkA7XUtshZq1f-{Up1-eTHn=_*zb5*VwoQ)m%F}VoH}x%RRLZiRQQKNN5(zUbw-Yi%b^%52}`a{AmR)z9t-nyrqu4GSx`=gmL6>VA#> zcSen{e{N=fY4LDl=&)jCzkL1a5Y~QK#TQG?S4q4uaqzDvpI-T09j9s)GdVGIfJ@N! zliof9zl4ox-@@%cl`}i)t(e_-+JhxuR^0m%p*TBZ<%O1S+EQ~8Q<8RD@4IsR!Q}UC z6_?{Dz8H~}bS|z%JC|qYR;(X=eQ@u`69*0*f5x}uXR7qVQX`t2T;$iG$H2kU{MPn( zF=BYz&J_bfQ=P~$0)~N9kH%Ud8PNu^H09+&ocK4wVJ);Z1B12!|jVb8j-jF` z*g0hSH?7lAn*(RPyRM8czPNWlhu4?i9$j4VW|*gqr_1=fBS zwhJB7%DZf4YPHO#j|ZCVUv=EaV@H^qqDAoC3eS5|b5_hhkhp)Rzf5@uO~ik4{-;6L)dgm6wG_U8@uHa*5J%ywAO~ z?;F=V+_lek!UXr7GlGx*9{6PQ!nhUvORqOgDR%9%ro-;?P94TyPAptuMuYml8&)py zG4}M8dw$b@L~SuUw`#zVtTn+gEr!%7obFcaYIfVB-}+8i(KT{MlP_*jho{%>>OOOY z*E?ya#D~Y`Y<1f>Q*L+W>G#n1!ImpZg@vC!9Wmp^2GgVO%-_yC)a}grH``-Ue$3x& zmAQN*d|Xm3!#>_ft)01{vD3A0;>^SALQ%&!zk z{NYcS9ZsAojX%*zKlnMaFVH7A9~!@4?o2Uvh8-pP8s^S8hZkSW+?ir_IB~Wv{))M? zlEJKG?u^r5(KR?<6u)5ZtYk3bq)_}7b7zPM>tKMA(7nJpnCKdu_lRFGm{kmBoZyJR zV(zSBFoQo!--o#~E}=sgs~OA?e%4)s)9~8^t4B_w1? zVRMVbM&f%xco~RGN)_y6p^O7L*zl;RPo)LxSW93e@!cT2Mny&m#u8eya;*x2L^dh_ ztEG%L-Ra)DhV#u7sfb_{>*pInzF=ZPOb~oF$XrvYz@p1*mqft9pu6#MP>L5!*P}!m za}YLANYNgS+(v~q<`e|93%v)W)+V-3FLLOC+vD zMhUh%(3M50fUv8afR_Bw8&g;$CSSr#LzWB7IJlCqtDpiYD$66&g}*fckygGR#MB;% zh*Akl8+Z}~5t8vR<5Ji-CJ0*74T?E4j`W+jGmf%^6ezGxqr^$OO5;Nva(?s;n<65k zR73kdFe$)Ahl2z(klO^IXsPkRR=Sh1AuXA@F)?Qx;?`&jk^!lf!DbWzDfya*DfVgAwXVg$CM-u^=gw4`qA|f$pNr0V%%b zQ9^`61;#nrL_r59DHTe{Y%@NXN%vpopcG&8C{g4Zd>93wltFYuDMw*p0$TC|aM*1S zd4)@*C|eO`90K|v+m*ncN|KE!zUF}txY*K?f*eNFA5{)X8cNt#p`bPaP8l#dm`V4I z=FB*9F~p@Mg-l=Afkd>Ff!#(ytX-ud;7k6t4^z7-q9CHcn$(~;A!Lwf!Q!G|YZCk* z<7vs)JWL&@m?)Ki4)0gUfiEE+4cL^`ERWJ&>bJ;q1a>HgS;ONXh#6?3{}$i+b}4;UO^Xi$*tr^ze- zP{8G(+h%i6im!MmFnm!NfF7j`!Ux7%>2xz~4oLC!jzWt(9KZ-G1}I9wzgmJ_UAp%+ z2c-B8k3s_u4&?bGlxSxKEFswcF+T7@cj)Gz6kqKqAVD2Aj8WE$7D5^d4P-5<2$l}t z-(l*cMO-=xCHObsjiG3P3{rO$5aNJyJB^m-bdPWjDaH496exkn03_^AlI-)*J;XU6 z#SgS86u^xTY15Mub|+<80#fqT4pZhX=7h_^zX4}Yj}q-p5(Kg6ZsmrwWa{3e1Au-1qTOQ2t7&&aR3(>y?E%R=Ny#c>mB6iP!PmoP@?Fi zf*^=R_e|%Y6kqY6bTK8$%%W#p4j~STAc#fxSm&S=U-QTzUksf!sYi**qKwW8g(u`Y zJa|JyT%!%AJ3$ajj}l6x;DBo5`I4`C@NSLBC{e~31hMoeprE^ zS>rO;q9BN3(XHz_DA5j~xF}KH7;4R{rzHeA;FJlYXPj<&&p|1^?m>BDs6!`%5*2EK z#cn)Ge&GqzTSP>@M5TRNl$j1R1TP%2-5`8G5XPc==W}Q&zV1PJV_Fo(Vo<7JBbOkI zMR(ojpcG&C$WTERgt1VvzZAC2WJ*Z5CJ1BE{rWj5#rJw-kk=?h6;TXIl*~*J#-cm@ zb5M#OY=i9xaB~nX!IOk~b<%V<`cME4N<)vrh;%pmHW2KCbT(bigi*~-px)Aut(XQl zGT6Sr|NXh!Nlub?WKtW;39mmk+&%8?fc^JsF5InHUnB70pt1sOWJX$t* zQlhrW#KUjbW{e;DKxfs1~|JZaf-ZdBOSz>FHL%q(mVhCP{9d};9urPl2391$9(ksmoS$S-bE!$W4# zrj~`|J*LelRIJ4P!`0dsyA!v3PTwl^i@%U1s$(S+7PwcAYhCO?LYUiu)wieZle9^# zQQOqguVQeImCZN!dERX3)8+9;Y1G7M|6)BV*KTb6Pj=Fy!Ut^LwLe=l*k;$ee;a1j z@83J1`Oez=cU=B<&~45Lw=*%BJKKalPCb;?Ic<|_>5i#oJ1blU-ODaobmqgC?>+`> zX*eXau}P8Y(442!25RoYjStpsd;WfZ*Rlh;oNM^D`sU#BlS7)UcxO7Wc7s|mp7tr; z_NL?NOdoP;zt83m8{*HeOh}e`Z47SgYrn2a$m7(yLuzGS>3*$uw)?fNb3)_WU5j^b z>T`4Z!{3)ms<(NsE`EEQ|Ip1#HdP#%&~^Wy@}*jwYv;9Z>h%{_j>n(szqY-i^rS=n zt?g&KD&AlJ_Icuym8O%-19uM|Qhd?ZBA0wetqPvoDRfp?uMI!n?he_im@+HSc1_=b z$1eCN14_MLTW4D0)%P2{M>e|CetesOtKSs+{rzc!RBP|@SBeJT3|_cu+UQPW22?$N z&}Zn`(p`h97MpcthRwa1PzC9<4jlL~tqEP1=@pBf!E_wG{T-z|;b z#!p^4;rD=zeaqdf6>&A;_JZ^7FMXff?f!Ijto^6P6{Rt9J4;QUbDI*56@5`OHl=4Z zdrg^l-PVm9I%!YL6VJ@gZ~j@Jb(sBP+58i4Uk<0P?6JJp;#iLtS0}HYbic)nX}jvQ zPV(Ql=gNf19!+bUN=^Hc@cH)VI#J=3W7;TgH1v;{nD%K=%_yIvQ%*VT=v_IddgCpZ zE;YS5>%gVS3H62yiLh=oXV9%-U0Q4(U2$xs#;uRODt_m-|J#fwk7gXoj{b3?eIwr$ zO`{$rgr)6mB;S_tk6lh&i2##@$&!N^)yh3f$lerUwyC36xP$4PzV1=yGkaQ@-Bo4; zH*?;4I;h^dqV3IIc*f0o>wIAT;DD0fqROpJbe|cwYvHcn=L)OIvCA55 z$a0>!YRLPwS!2ic3zV0<`41nv7JyLuZ+nw)Ah1K(ia&MC}#|}c)~B3{4~063Vfyi6_fc!w@!gL8Izwz zH&202kpGVEL$^SJyc{&4;2&|q`zYB%=A!^F+Egd zOb-N}M80=%ddm;-EyLMr2Yl34IJo!h}Bhgd+}0B&|e7$t3i_ zgrn?g6=6ajeJqk8N-^6V(IrDFI-ySvekcVxgfyX#K0%3tQoLvm!Qd5a6>TE zhl^I?kdQ=_(WmAoR$v=W+%=B6gF#{vi;^&-k3M6HLrd{h59$=A1b)=h63I=1ls@`& zDh^8Vb&nGDoq|}XTxSuHX7tf#TX8^&uX7&msKsGQ9{>`sh>II3UH>JJ5g-3IKsA zp&CO9B~qj*eOg{3xh_;Ft`3J98%T2pVTtw&p_mr>(-P(MX?b}Sx;UoDD4{q+j_hA3 zSCm5BRzaB4r{(4J$#9TWWRze_LJ=~iB?aw{6off_TAs&)vTMbTYM|OB6d6J-*Kke% zVNM@dlDT_E>EhGk5>pPVu61 zK1}hIj~vWNCF=DEi6H3kTGF&W=#jvODZcta?blVXe}PsG6y1OtBFpQ8O&K1{ztEOR z4mBbW{snOala9I;5+?RR&j&tC@imYfibT|~&xDGEkkphDX7<5`79Xbgt`F+HtOkon zj%u1v=$bIK4>lC}Fva(MP!l^fD(^-D3Ac~zn7g%;AoG6cAsUk`;c^(LWdL5>^|7k?FQv`u#fwv>^}VwWss20hbO-B0e45YoeK+HiSQBS^}&7?AEfxIhe_*0 ziN>(sOqkXOO^JCRMeNVQME+q1Ue}+6cE@EzS$)u~fDcl9wZkO!p>7?}Fo-Ot52_9L z7!8HFaVdR}N+`q4Gf;E8|B&FvoCA+@aG3-@)Xm)J1ixO;-Og$PoNzbnMhWGYVfV`v zYu)iy-<`cnk870`P%cP5J8aYMC2Iz|c)ZyPO@Cx=Q>?W~6$_^c)y<`o(;rJqTU5VW^q)pD$0IARWzVUcJ!kM6-w1h} ztje$|%L05YmR&tU&9xf+EM(AElQD7e?@bTQv^6`BJfcaFakJf)eM>Jjt$5`k1A;Rx zz3Qzwx@%2>RqFFevQl<+Ted9Ms$No)*)zve{^=#k6`SaC&3Vnn^Cta{9J{q*!ItNH zM-<;(een2+zS4dczrLGZv75MNO464zQRCd!Sq+SQ*ZAM8+WQu-bv|&a!MZooI_-R# zFu!}Oa_QYivuD3{trpYw;`zSu)w-tkjotprGwoNUh_%D#IWDQRutu`wnP$#EO8ec*czH$2;Htaw`38?A~Ec*M7u@Oustw^MS87svf+#DzNt#r{DE!zbRfW zxpCmwaU;KEmhQ9Z?ZAVPfzgEv$5$(!(CXxoiYso}HTcJ=hgZzOWeZ0BIBRDi4S9Re zZt9nqVAo#jSM6`9{AGXj)6w2-!?W(VoB9>bqS~vvxHTVQ^J+r4L*KN3!NvT-{SLXC zezQ58Fw&v*$?&_KYR;Jc{&LWzwJi?#t*n;4R?%$el45b%=WDMdMmJ5{@}k$_(%pug zxKr`bclF-imDX>IXkveQ;p1m^?`>DqNS_{kIiSbfnt^*atZ=&J*)%0^<|VV)RwLI8 zTsmUp<@zfni<=A{)1+1RS)J^jEjPW>{ZM1GN-^vFMs}0UO|p1&&|&}7$-M(J=nm9AN z)W?}OzU-&U+U~s8Nc%bF*DG67RJbxxC_!ho6)x4bCs(y965FJC(|g0ql-%I6wd#?WZ^@l=a$-u1J)Kf)-wZ4B20!b) zO5NMD!fVt1(>|?O-Sqa^-8**-2)gjp)f$N>O)OkDq!1C+g#uptUKkBw;nD4e< zSI16lZ?WfFLcbm*W>vSfZq=rmbD!tE=U?o7BE5ut-Nx_gE$)3!Rk{Aht%H-43x^yT zIPdT`r|{w9FI1SaB=c?e?BwU?&aDWMpHF(V>y*=;`1CLJ8Z^9fAo{~o_ej~f6&o&f zne%n0bhYK@sZQBR=EI99kDnDdrVzv*Uxo5A>vYF|86E@)zeAQmL3-sui&Jz5B>V8K z&;sVNQRAEI<4!CQpp%aVKMX+{tj`0CWx0<4(r( zxP#Pq`sYlKJ17@rK4I?6^th9OA)_0M>2Ze|q3S+idfdsF9(OY6_eOt(lmi-_>2U|O z4$LPEW~Rp-s8QxC=FUuyI~mjCPR8`Oli@lHbZ4f=os8*m2L={>ABgtoMrU#wWx9rk z@GIOg5&c}(77@K*Ff)0NGA8d4HJU*8;bhk7W>cJ~3ey^f$*fbLu1_#2WSMoay~|h5 zhyvn*q!a5lxuApb(+Cl$(KK^yYAN>jqTI`DY-AjPw3^^~Oh|d$@jFdN)UN@!|^ESXk$G}qO>}c-pHSE@!}}@8Haum z=p;xzN}@h_fRgWP{f*8~a88N>MIvEWQ3bk{tWO@Gz%*Q_z8~Olt8Eya$2Aj85{>nl2Zp5`D*7c zw0%-SN(1VWr$Yx>j1{4NaN*$o&tDV2l_K9he z2W_mOtqugTh*IhRC13C0=&HywPPfU^qa;eH1C)Hd^B3Aa=~L>U5uFVDX9ZD89iZeZ zp1;xd2{P&wz)8qV2VqQ>PzNCSdI!hM#hq{_pAH)uuz1Mw>A?TsD;^xs7a1j;PKPF5 ziE}AQy5zyNe9iM0x;`;o@{lq`TxXei>OV9iZf^9=wSpGD>KwF9m)_D3xfb6Q$AtO1|pBJ6s~81W!ljN+{91 z6ZOagjC{o-Vhai;{3{1rQiEeyG$o1B=l~^O@!*|7aVZIfL(se&L^-6*LimX+iw;2Y z^^U+fZw1{dgDp|$s1M;lh*hH!2C^hNK*?7;cuQ4eQtDgep#zlRcu=Aid9X9eS3G#X zS7el^2L*I-VS?18sdW5Sw=xksqcDpH@&}+{0tB%j8D0r>I%F;KfR=p4gLleBrX^}Z z0l8svD4*AWw?djs$8UA3+r}3eCD@YqL|7DZgKkEo>2&;7x4JwN2Bi`CbjCHsgJgIE z-@cy=v#Z^&ceq;Ixqo@T?T^|= z+O5q^V_F6byv@Vrg+xJKF@-t zc$LhcDPHX<*%x!ZyqsV5?Xih*s)ha9&8ynNwfV7bE2qYNh#z-0sPDJ~HQJ0mYTJJP z%3GbKi<0go*Df(>_Qm<_E}kg2bN;0zYlm&EpSG>?#0Phe)k-c@ zpDOQG=%oM9Xj5rR6Tdm@{Ra)(e{y8nMpfnA%_5_k&MQ14-T$+SkHnxYTwS_F(+^<;VIwldqq;UHc`c?#XHEGcb*?yGbn8r&I^lW3(WYA8J$*a)T%9qzZ=)_-m(=>{WwY6Q zqjU4+7uqcR=~&@`N&5>`95gBA=N=nok@~EMiOTL*@SAHvHG;c+>Gm{jto7#`c8RrG zHf%AVTE!N3HL4kITa&ZbkG>r|NZWAxTC;wBce;&jSY0*v+M~?GFSgPywY>I?^J&~T z#J16#VN05N7I7T2F{;mq57S5ftorqB!tb)N73;Jd_Gn^wmiNL+Ux!(odwnW=hxhu8 zC;V66Nik_&=R-nP$)pz>J`DD5;$t5a=Q`u(qPr9J1wZ(5z@|>-vaE(?{A8UD3tXhC3BSP z*egS{lgcj}@j+E8V?@)~dizS1S+eBS(;4T#PPQt)&2?1t!#Xw+|E=CjzD_}JXtj&(C`mRN1x98vetCrTkAaytjsJ_6MbGhUM#8a8S+8X`T5aT6`u`R z|Gvrk%H!uG)}8yi=Cg~vZn`**u2R%O=GN}#%jEdtdp^8)?^L|V^>_AV-){6Bl@wNT zT)&@B)H`aJmj0I3{a!$m#)%s{s$YFhY5cy2x9V%`j*%;0N3V}m+rFt_Zhr5^kESDh zzuKSPZacEmyZF?c7lA!Iy8Lb_nPtag2x*KJHd0@3_tJV9b_I7Xxg6=CY6PXwEo#jk>J1~2hujoWQbSeeDp`2-NCx?Sc z=uhZ$I+RTWooDAJp zOnW;y)7}m|3Fa&2&bTH7lJKC$i1~`SGt=G- zylxqYOG+k-4`v(;c=9YhCEv@#Eht4sNvHA2!MoRj7fG7N$L}hSqCsNqb1-bF&*PIr zMkJhULe?J-jDEhGhozgyv_y*r_s4^%6H1sOOyuKtmDh=0kx?So1Y&Kdp#^T+NSMf{ z;>Q=UUJw~2lgLNcb&>VQLqTX>d=d9#6&WSd9}gO?s9|-I^~VF0{P-f)sN$m3_s3&a z4^e+SK*^6UVs$SvN;;7bvH>Uv{*xy1@tex)Oc9Ym!v2N=ot1~noyimV_)X=ZrdD)u ziQ407!0__6q|dtrgI9-=s68Gkkk2jBb#8;m zD52M~8bv`tSfcV8vi5j@lBaldK8?62^{IR`Ey>#B0ZN|Yk%NgUw%Mj{k4HgiF?fHZ zseJqoc7WLh%k-9k-}6jB9AQ~CH!ZsmWWFBQd{cMGcqI;N1O^6`7z>fC6NNlB;j z$-y2%{q{*y`S?9TC@<5Xj z@li6Ve9VNCbjL$oDS0COZ*--CL&4F}186r`4LjGQxqSQ%w{jd+5|=9#uvLWWLYcKg zn#;#;ajOe?iHs7eLePCtdpruAu0)v3$M12gi^qwK5|a7kU>sP3GhGxRw8fhExjZkEejj4#bx#bY>okau|K)EzpveQ=tp9 ziag^$Lj~$X#n6&4nUCM&R*qx9BBNybx(Ac^~O`84$*YLfHa$r-{n@fDIzj0p*5Zo_WaQrhdn9MWIleETM%iY3w6{O zPYJtfh?Fuk@kEXBV8Z#T2k$0{OiHjORVa=HVv@q$Zb^>31(dvf9^F=#NGR#vV{)9# zhnk71z~lK-GM_=~F#&YqN7?k<@Myo0tQ#J12haA!dxIj8kUqgh-wO{&icVW6OXGvi zxO|Wz`Z{o=u?DuO^{wzwp$Oz0=9|T*pJu*YA#m*6f8G#fph5dPv_7Dbga#rc`DX6v zk@0r!bX&V3%`Ck*m=kT0jSKyt|JeDCMJL30XvbM(e6X*C8fYWNgGApy<>?u~6W}?t z4=xfsW??Yx?x2uU3FZSyhMrmiTWI`+A)+#2xDOKaq_E$KJ7|M4$u~hyPeFcUoYPvx zh^)N-($^09SQ<a}RRfG#2!TXKXqCwa(r%F6mvYhnbx$+G<%5mvnh2X|JM} zn~vMltGdZ{r@%KkzAwzn&)Pb-$%*py(!Uq_9x`m%kQ**(Iq$RL7A&3J(X6!Hno{O7yVo zaCCl^b=8!gf~ub>p0Ti=iLBgZkLFVX9y#oJUwu*P*3}D#c4>Y2Z1BFIoV`u1uHHGs z-FxKpmOrS%ttuaCm)a#L>FSxKJ3q!;ZT^1ro{qoWEk+hH8|v`9T-kUB^{wqGIbnVd z^U8LKRgNg#w(W>Ajh<>Nwb)|*xzX`sr~i%XAz%C}uu=K*{f5^rvGC-Mp98zL7N;O}~mm+rc2H_2WPoxi zXknuT>k1t`fip9p6M_Z~t7!Z>$7o1Q^J;f*w#w zV*`bRWjuJ@GDs!MHv@;o#@9b0_N_sw|Cnw}|17AVQbAr%zIit+HogKEv0IHE8#=E6 zmmI>X0LwPtY#SCEf8$HUE;V{=Xj=|5n#KsdZDck*r-=iT zO|OCN0VA{Nr&m4`aZB@Z$(A>>7OAHA%-#HHd#6RKZah(@?g(AGuXv9Yew_j?wsv>@ z`MIRU+{S@d7W+6^m^!AJ6kVC^F5TPQ?DmiY8tuOJbKEs=;}a*WJQh4R;8&fjl~ntm z)VVfOBR)*`-t>NRxtmR=uP`gQe`KYRH+#81I+0%IaIf^Ib0b@%m-hKGXnwWEBQK3l zlb9_CkIWfgYoOEb-EUfDY)A`o+L2wo&4@}9ZV&F{*W!U}aG9SMnwB1G(^s8xF|NzJ zP~TM>o<&$rleZ}H?9QD54`=wTJ>IYJ{ZmnA-(B5Qal@Q7n=E~f-YEO1PJ@(+b(g!k z>^l|Ux^CV{*Nu+tr*_*|q*hv~dZpVuXuHz8+yd{V(+>1FoKeZiDQ1_8T|>9fe!DE6 zIG6bBu^?dboSl-->(07Zuk*6{Rwdh|eZbKES%v(6y&7-wkGrCt+n%LuGN(H{ZSNBL z&r|dDb7WgbWt6T`Jf>~?4|_f0?Op`duAfwBv}F8B<&=c3U!r_YwqJC6cVNf*t8Rxh z9Nc8pi8h%nXN)kFlxtS##jzx{X?GLf#+F-W7Tqc_+jdG;WzeHQ zGH&;{pet2-Og;X&Q+#5}L*<*8k1?B6acza|C4FKuj`%gK@-R_lZ4uz)cg6YTRBB-C z+ACG3wW%|pQV+8`nv6?S>#ja2DXxjt({>cO)ACW}jq$Ck1vZn;x1Hr_(e!e96|Jmw z<+=Utze@G)y1hq9m%CRjtNu*7_PMj^?J-05ULNRPwvDN2zoNB|%7!{+6g_OVZ(dQ; z?JbkuO_tT`FFa$a^>L0v+QQ|96vd=LLt9WcT<*h z-1ec=sTV)0y8hc|WxD|#e74*+S<~Tiy9+z4@4w%^GqK2pVm1GLy~itJedPY8&F4ig z|Ijt4yBpOQh)NoEVQ;6})(56co~yVZFY`~g9&vAanvHNP+_G(M&IjgBo=`2NE) zX_u|yuTLs^|5MPfK^<%sx~(YLbb?=t>9a?an|{1m2N%16S2t{K-(=8N=W1siPlm3z z8C!c3NsazTkFGg2>dd4i#l4-w*7Yo0 z`|ZIrkDr|?^;8B24ER33xNpOxN=0t&&D^=#%e3|Fh~Jert0(`|l-hT-+McT~BHqL{ zNsbzkvMu>T?9J%wtwPHky!}^ZnckdtYP-?T~M>i<1aL6aoeP^d}!!} z{h!h`FTPe*RWkcHWc7HPQdOsI_n7)Q&T8A@;K>_K4y=7?#oX>riB=mn5AGJ~H@c$3 zp#I~F#;t6>=jO%esI*#JH%=RT&8nQmkSzak)2g2C*1_y@g)44_J}E6{tymK=IVrh! z&)V4y_H9ckc6G$+Vgd7;wtBsEckQu-sMl4FF21p_q}SGS-+uOeFrm7|x5~?_e$CjC zy8QE;>yy7-t?^=Pcx2^j_e)Of(regHi+cB~#RX(}pYeP-pfmVx}SWcOuUR~?#)Nzk?UAT1d(8-kGh8N@y>>@Wkd-VR?!>l8h z$5?fIeXz`pPdh3fp8hOEwZG4>W0SL*DK`&qci1(2)n>ESW80j~DO7L$*Sg6jj#aN{ zO4%GwP;9;Hogry{xPnim9nZd=%PH;9#&prujY&lhG{4^Sm3?;PvPFYpK1%=T+rH$v zwu-aQj-5MpIVaP4?aQ}8pT0;BewZAbaB*UxcBMy6k2l@B;6#V-3wHgxubj!`N6WfP z%Jo~2-L-4!>elmO)_GVx)m(pYSr*vmL5rd*Hm%-~T<&PhpjBm@6;wZJ?uxs8bDl=@ z+-vUAbl}}>)h1ck96LVIKlS9bBJM*di?>ggH9qvc)QsgxPv#wdH6~7N8!_x$rxu0w z*i2l|uCUecZsRu3OYae0>Q09a|J<&7#XF`%1M@E@2fJ?#Otvj`b8&<5Lm#Y>3@hI6 zRqcHZCmnoUv46$wi>k$~os-=@xvkl<4VIeH8`d^$(rx;U$o)x|9v5ohHK^+G(SARv zr3Y45crobEkC~-c)%!Vh{HH!S-`9<8{^0zZFT0aIR_sx2$MD#gPw(D6Y;kS#mJjcH zI3EwsNEq?@*DcHMcLoIiZochGXZa_`p|?Brc0WEN$y>UnfANh2W4c#4GPl{4{R75c z>RvQ+<(&KZsVN>;WXFaT|6L*V&Y>sUM@(31xjbi{$>(OR8jL$TvQUr1 zrK)cE)~==H;9-Ryo^00k>5b_2Et`zD*tXCz;3;)<^wZR7wSSl;&kfFso8jga- ze%ONV$zU&n)2taz0YRQcfjk-9TrWk;UT7NVF$E!Ils<#K6v*I3 zb}byV1Pzl^g0{9_h;L-1ldEr3L{JPU=8G`LL+I|VTGtC*w}LDY$F4E7E&4EGSBFKQSpNU>^la94YYT3aIih#u;SquMAwhltVUYom_I6-x8JzQ` zBe0;~@@KpXFc{S+5(-%#aBLGK&ZwYe6hzG+3r#9T#4{3bsBch6RCtpZNvNb>fL}mF zgm25BfPesmoQKzNN88D!7x0R%+{C_nkDfM|f>2ulzNQvRmcyb$LJV2QFxJEWEfi%# z=ua(ELqV~O_ggqk#V{J5*Uxc-LQ3e@#tfdvuMPb-@_`LQ-@IQdpkW<~Bq|^vtA+&o z+$7^9h4Fq3-XEeFYMrBn#zDLv!|7TEt|#y3loGP}p(tDiyP=2^`M<|Pg<((Dmq4om zcG9qHux|tT16sP3xP2RNuHY+O-II}?1*ZWH?O9Mzc72!9 zHe<_(1X@2JCM6-Tvp$#maM`R>{Mg)LzhbW%~0ADUF^)Wi`n@bJ2C>mCjF(y{|Xr ztM%~9$6GE4a$d1+l0?4OP2T2=m+jT>RzGrH`Yc(zxXjyHaW`EhKVx=9+&N+X(`0wr z+2KNpO`sbSPqATE$Q7akj`}Z(%}~m6nit_^KsVmUQVR|YkU*F$PqD>Gf#d%gn#);r zn>r>`>1;6)K$nFFe%`GE89W#zu8IQ7FLZJ($66u;S?8*AJ4D^))= zvi^Y62V!^iNl7VTGUj#DDsE>@7R+BQ>(u?Fzh!GHlUk3?o4yX%vN*B)QJMOm_a2LU zt=D!MVmDX%Sy6uO=g~gjmu)}g^!xC~A)8a@9e5qu>qg4{ZmB6H{Rj5nXP*AU%WUM^ zq|AYp@7UUPm27hEW4Gs`>O_a8Cu`ie*Vu8?+??z8vyK&Z98;@1_=&>T|MkI|<-3lkAFVyq zXRH2(+#=P^%pHF0tUD0{_k8!?d z-tH)EF=yCa_nODf*ME30cy;2FalbvkMBm(h$6?>|rAq?cem`lJ1HQ(>IICGX10GzO z(|z;|mwT08eN4UR@%#Fu^fGO)cN{iN)3MI4zwh_9~ISzWHmFVaX^bo<{F)C1Ya>>f95m}=$ArY!<@zeeV>_6m^(A4 zaX=3;<}2pTx}#ZOP<*xv8eMmQ3%p>;wB<~hHuS2af6kO?Lu)JM6XwoLnYJ8PyrCO1 zW!jM0rMpBpv$xkjXZc*LsP4O@ow1DME#?ni!=NS8?LYctHSTmS+RK> z^d1!v?HA=65)>K5a}PvpYDS?3T##kMK%*eV5oMfEkdKfjG&XL_hsNjWg5)7!s)1sI z3UQzsG%bQXAY|`p)q+k{Bqo|)kTBH@t;m8+sGe#xG(FYwfu<)Ke~UoGmSu1>k&e}1 zUeR`xo@i*xKt|<9wGd&d@g4d9I-z>1(b)7<%MY8LZ2a8|5&M(r$p-m#=oooqOrbnJ z3V2Sc)aFOF@X$da0elx;#I|I5xP3Q$Zfp_^OHVHO&#R11G3dlIb;Fv{`FF5_8;3v+B*}R4}N)+JUt0C?V z#mkV93v`2)0?;N4;nET=Q|!iA`&i>!z=6f>p5GuTRSDr?XvPY4 zPoOiP%LlYO6I5q9vUT-^-P=gN+zV9~fD#9so^UicJ>l{L#}ba`EyC8GfrvwqdtKZT zPJlONuhdZ8@qe8EW+|uIFRvdfQAY#dS>CRnE=)r_DRfvb0PTj>q!ZsZ$@mO>u}>+S)QeQKS3tdET$XU8de>G&`sJwx#VywCF6! z8Fcsi6OYd+OWeNO*Z&oGTqqQdyH7H6rIWY3P`Iu!B_~}3iilBAmpEO-U{_56yu+$+ z%w=>dOyhRdbPyQmESnkbOc~2rhAWNPL5BJvV>v6wb6>*0Qp=p|hP_*jz83y6Dn4|T zmwT&SNn<`PNH1Sxmh9%e8C9y4?>cArfVGoWc&VN&iF}pS+q6uf(Vd&l&4|77>UmG; zsJf5Z_jOaYw6m>Pd`t=3afPo~-}Zlf>)S-N#JAuBg1gj40+TUVjJF`cddMnr7U9)a;r8#cx%29T6ZO`oqc70mj<;Dob&dZ*P-EnU> z*T@R(y{7!D&)PB-IHE}q z8*bfnZkIM|uEjs8Z8H`wKDBXNBTba+Ms4$pC9SJBmN=Nq_gh%y=g52KbDDa88t!xY z)$1Ey1FCMhGj3wjga6jtc&GE{n3rP(*9_nG#9;EpUKH0)rbWg*<<)M%xxbKgTVk|3r8ckAXh3ywN#F59BpA zL`%T>6-c{MD2!RDGT1Uh$Cn5^xiO1PhH7kuGDZ}*Yc=!atX|GDN5sC3q00U*WuT~4 z3~Nfz3LJJpXxq@-z6~TO21MA{w+Zo$3UGo*xqkqNRdetS0(?Ww<8D6gek<&j#$x#A zZWh-on~m?`<80Tx(S^{Y6^{F!9v{(RN~^?Y-Aj6J-#&NM$a~A3ZYKWIG$!>>v3+GH zgdKUXP^*}@%51Nr>2Rx`&1>v$Ub(Qd#=QHeH6@+urcY_RDsEDd6&IoslG6^=RFrdn zy#L(8|KsgT;Gy2X_k|>DmXJ1~LelI@v`8e8BB2tqmLe&UP@$5g6j3Ubw27>RQb;9h zlr^HPMV3-1TK?xVW4gK1_t)H-*Z;om>viX1#_|5VxAUCmc}|tsH1+q55zE8hUOf8t zruLVlir}Zi9dCMN#^wk=ox4adAmpO@bUUA!o291Dn{Z!G?5WSz(`q`TwUrVj<@ArQ z58G^~PgYl}R}nfG_sUr2V4#HVv6_%Vg@DNciTPm@TvjVOu0AtQH)hA7%cA#hPCbV+ zTsN5CYdSxDfL63!y|rn1IAg;u%V*u1wud#6P=!WIeC?n?B#AjCT)V-;-lekvb z#dhtG>7GGH*NS_74mMZHh6*o?QJ7+puO6xYQP^Djez8vFVwG^Z*qGBc(TdY33Uy(v zHlJuFrq_$V5God4ZWL0X#1LIw?|;3#@l#PngpTaJ_mY=2V+orz5QwC+^~eG`aY4V4K^kdsyE-*o+I_i!e)G@M7yVW`;*JpdgtVsjD7MkBZld> z!vaCN2n~CuP?{zk zc6U$SV?3O0ov#a+^@|XB3AX%lv{MF@;2c}puZmiG(g56acYW#TO|51wjAFO=#-^-`i5LGG2nE?YtoLmv792C-V4B?ZYeqBiV zxomDvfj^2t!ZENk42_H?qfks7j*2Hy$aEC^OQCT?Ory^7zZ_V0@Q7Cy5$=VERSjU0 zSg4$U*x;Aw*XY>EWD*t4ATr2wI)O&Q63Ij~6Uf#C0t!XMGniaBHhWs}XW)?*eniB0 zjs%keiW1;r4i_J!Ng{}7e;Yd&aL1bG{D};z!^o6Cter>zCbD`b06z``^;#U}_Zkv= z3V{LU;S4H;N+DsG&{&#`rV_|ZI+I4C6EO@5g**74FQ$JtB`~nI$l#C%gaL3DL%I;c zr5c&o&P^Q7R8?dNOn-^IomSVWWq)E=;Kgtf*Q;NL%UdkPvug>{CeqHqMz zbzqnz3W34^We5|6qmUV7u1XqGwf^TG$d}-uog9n$gRC{^2cQC-CJ@ogZzn9w3LqiWT0?V6axj51W#t52vj^!Jbp1Ne!h0|CwSl#Vxe5l8F{3#MP^BnxGe~No)q>J z41qzSfJG8mZIZ#48`3lQ3#c%gnPf7Jz}=1k^d~=!JS$^i9h4)9BKt)6KPd9pQNkem@E!R}z1b^Kc1eu%qJV(Bz>^Lxz*}-#ODLi-!OC+X)Db47kVt zem4|pe_nL|^Zj^4?e;5e6P6{S`t4tj2ZseR+#P=L`+uH#|NHmjVIlu2e$1$@ z?@L7OZpRG!>ISRQy@}&7ed=p>j5NVG(mR_V(HKt}Ll+8E^oJp){``dK&M32nBv z-Mxu}ZBrFCKALTDFZa0M)pOQjvx};X6SuUjs$Ko5ev3jM=ET8=(es2S zyT(M#io?iV>A17NTqD1FT9)3dX#odiBsQyjl@zZSkhq*TGrn#|LjTaCvHn&TbIu*! zxy{>>DyuVocKx?%If}0Cv7)qPyHC(g?|2$g7DEl#b}Q5Lxs9R4CaaCb&Jm9`3pewS2Q&{uHwmyMWtzhL8gzUzV0_3m#xRtReUh(!-=UU z3Qq1+n5l~1^j_#>jQ6y!wKjLX6A$g#8?pM-Awz7&0-e_x=K3M0KS--xoe<#vLH$jR zVx>5$@|K%>>I_o-)eXa*@-}o=#e>m4gGYDwx4)n7b?>z7pwgnXtA_n*)Pt*V1$`xT zt|s2?C10L@wyc?T##(L6N9P>{RRvbGvikI8sGHJv96cop*S<1%d~2V1WbvMlWeI5? z4%Jc(*S5$#ACh;@2r3AyZfr{p8+Y%T)?oa+(BduEyKHt4bsraxT`Sr7wA5gEt%>4f zQj+=DW$l-GS4O%{+iMmTnw@g3E-E(iu4*AM>|DR7cf6^br&UF*NnF#AFt$gas zOc0%O?;^hUf#clii3epXrRrQmv#?z~9s6L_)t% zYyZ}R;h*F#R&AW^G`+7abo|zxCGS6v-RLS(`>XW#7wy2fY9DNw$mrS!TTJqwYagT1 zUyhE1t>{B`Qg$K>FF4;~DfN&XmnE8Gy+EKr){7BY3=qmVU*V+49Kj9Z894I8oKNNm zZr~y`@-2?w1~7NdS2&-{5!_%of*YU!a(;&M$sEBAuq;{M`d1eI^HKJfcR&yZlHm9u z0+EgkL^?E-H_(vh{9g`Uqc4GQokmf}cpMGVS|*c%1#vgzk60WH!@x743pQ8oFiI=P zpXdp|u|vU-BgUsBh@Jp<2m%@r-T&?iOJz`zG>l3`Gl^(AhKeII@kBgu)2UP}fyv-b zc7Gu-{bNem$k-z{K0H(c04M;yC5SWuG{^CfmDy8>Bs!Re5lBQTqzeR~2w{k13JFc6 z(=a4Dj>*NgWiJ8FC5As^kB8h6i#STb3?f0@2M?7N$b)zodn^^4&oDF!1tJH58|23T z#*+yscoqZ{109P*-`UHG+X!Zn95Bk^grP1>qgJlpQZ3Bb^kAhwu zkOz@T6g(N2sX%gL{$k#bQt0w2dMJvKq2mLrSa38YLrWlVmq1J;emCtIXc9mzbTXX; zMN<@!LBV4gI2sKe2m_>MOfCa*BtQJ;_WPH?Bhwrp6#Pi=NP|Z_AXGdC&$XZMQErDG zS&=xH1yD|Atw_XY9+ns)7vN!FnE?1PaCAD8K%~&fG$sj;#-W*L3X@8p(HU6o70Ehh z__HFB1Rn87;6x7&E3lvN9zFNS@(+RfF|tVW7$~_S#>!|oZ*U0hlEBMuL88&fLQ# zPV_LMXvn+K(6t4Ja9k0RFo74S9sW)t18l5OR5F3cV1No5gJ)35R6wAZaGY=vbYYzM zx0OMy0>M#%z6xR(Na6t0 z?*Kzkbhs*T1{MPru2{H2{CQ|UqoRK~Y$FpAS`2|25H^F635m4LApA*DjgPWGB(*>$ zv8VQHTQ<-$oeW58-DhWfSQ3zNv z6Dm`5EQQG(J^v3dq=wj-kgyb1JsbQUs00j!PKS#Z{ufp3QCct-MnB>T!VB>fjU6Qv z`~!&nzXRvEQB>Ix;G7I3M_z&RZkrW|Em-zz>o=7t0Y=8Dt>YeFDWAlwbDU8jzJ0>c zzRk{aZbdx%SYw^q`f%lPA)yl%B=tSrCRs1HOji(;+n<}&c!uKg{jkNcTy^ysN=L^q zMU4*oY8<8mveZ{{jHDI1=r{&yewFzu@rrK+{2(ns_pV~wEA;j*=8o5Q{MAA$G1`L?w)mN z(tS&Z4tUme4tCt?%E{SHeBASBpT~XDG28wyT+j6M*OP~hcDP23PfOi*pdKHk^Jta4 zqeb!2Rmo%D9H~$P)%_vHt$wNR!voc0XY6yRX)Sw*zO_d;*d;M?=lhd8Jbc!Sn;o!GTvq6I=&jA| zF8-%8&^}9RnN^g9*2Mvfolz6x%#RILeIoZWbvA6*-7rqPQ?KE;Rr;cBaSS8sLFWMQmJbNT5vSVFuTyIoA zY;f$r1auueWyy&R_&k%>_76Jp+>e@_+CX<-Os!Gv5){cFCqF$o*T*L6@u7UXm)R~S zMGoq|a(hy2a`U8!m)Db=Qm?e_*X(u9oP0gKI8cKiGc;B}U@P_)$TUzjxGw+yMyA<& z!f0X^j!kI(D`c8unFLM^EKC=Gff0rl(kzaJCKr&!{fOpeyG!zx+f=nWXLZzW- zM2MS6K+`Z>o*e8M%irjK0LhSEk$CFXCN7er%(xi|I@(@7em1^07}NvF@R}Mu?#ZiS2O2l!NXtX zizD;?2NnyrSLg}BD;5jnD*}avLgCRE6mWiE_$ed?8I1!J35_N*m`tu-Ang5&zeA6p zvqYFMn33RdfP@h+yujcjDh5_78bu+YZ~zuT0gH$RR1#2q6g2O||60a5COr2WDViyfgcheVK~h1`LFgA2AzVZV1Q6cVlW{mCIPJ%%0W~LmI!GOmimja z=U>vsi5@{2k-q}rMWO*LKso5VmBhm5DMv;JF0!5aH#n8A? zPQYH_+~d#8`4RmH>WFkPLn?2)qmDQdAYp($U}$AC}(N<~21K*+W*_R#(tDLAv>4b1Psc6%toF&Gds9Uu%c8eYPXBiBnN zfkFoI!mnn|&sz?HXRz}JUiqr*tby~_^8{%83}O6<$PGB=KkbqnCLj*@m^?B88*B@q zgVKb1Z|CebSsfuNBAR&Hv&&U0v4}FIp=-)!v9PG-i`$PUd>(RidSO}^+&sx^rLeC^ z`J26O_L@P-$f2dUHS}|9YhL;hfw75g${#Mv2p33Cc@VpBN6MxW#r#{#k7J{4r3hs? z2d!jY7N1O0*Ix1bE_KCP(?FM0ZECrpUOmCTBlL4yYuV@4nghAaT9xi*Lf>5K(vH@l zaRddFyQ9NWp_jE{g_RcwhSQop$hHi(CXHV!*6S7IZ!qH3%IVV5@gA=nK6jfdSRGktrL-xfI=x?c&{lqHl40M?1y}Knp?T_#Ymdd} zNKfC`W?78RFyBs{G4o}PT5w$Vsm}x7+Y8-%Y9msPlD0PGDGqgOo7e1mbh9Nj|4Jox zS&OPu@f8BW+EVa%(kiXi^$p&|??cZxV{a`k-0d3j^vQEfLiqKa&O!69?^|e5Nt4vL_6bL(%MaSLKy2RJ6*Y7^JNDUW%#<=!yhs?kRo26TP(GeC4 zjyRWxZ;mRh+*Pvr#FW6P+Yf{~HEVs`O?%^uj~Mdq^7(sC}?H)-K+nx-Q2@{2_!m4}=~CXY2g zt(Xt$P3txN90n&FEsD+6H;>4wbeigMNoB<{0|Aew64lC( z&l?{evXz-ryvoa+IX3(AE=@+O@8WB7cf@1_nwKZ8NYOp4F~MW`gpfJqqT@Z=ds3AL z+vkZIZILQxw!N5P-`KwEV$R|550;wlywRz%#`lI{$5nmXHOA7{=#z-MuI?}$5PR5V zdrhhsvvEPw+f#XNp9RXrOmd=}HT*oZZnhYSZ$7g?us&hO^V!j2l7?E9$@_61#fa~o z>RcME7h?8^m+6o59ph|cuJV=`WA|Xs1vfeGvGh6Q`uWSu&i=REKlcql7ymR04m_Fyiq!Ut- z_s-8W>;LLARbl4auggAvT5YHI&A>3WeXWldxvbY?PNZb_2WhNJ-T$~O-Pg+&E1-#i?kButb95AuiG%b3&4APb z$b3Wwl;6=f8k$BW;_y^%0EwUCwvpl{0azC#!~uPzxJiIAGVm#Wo6T`uT3J(tPXjwr zHs-{JaB;{msd$ae9?Df1GUPc}27?YFF;FmK$#^Ij0@?*|3z|;nj-G#6J~9tTV9^3d zAmqo0wL<6jOBuI()L3f$!3sU!74HhYBtU+1Cj${pIzx8=WF zO`M0$2@OnJ5X_Os(Ch(nh5V90#xbY_I>=tpBsyIFsZ<6Elxe{G=1x>t8yCN3Ec=<` z5mR9nD|zIZgPIk9?Ek)+MoFLka$rZEIUX!YAesB|%z;7y`_&)JN7nYvuW@4&M1I5u zOk!Ygsqh*bAYxPuFrUeEG6jdCf{GOQ3rxVq$V?_3Xt^lvJ#>^M2%kn4(o&=wGiNnH zEdWNA7eow{qcmVM0_cmVD9MnR;xJU8W6K%abL?V#F(KIpzL+28*;znsX`4l`1HPl*uM30y)@gi>q zy*_aMX>?%xgF+hxXgm|n20V};=^$yv02hsGuN$Q#@OkdB=l>Ci1sXC2&`8drh2Ia+|9(3JOo_x~5~(DpkpZR( zXgJV~5Yq=5xIF;8O87;!xqw z#)IJpmOw}2;F3fl0oxGEB;u%0BnP1qib>(F6tcQg@;7>_AkA$m*)BfFBYD+ zDdz@r)4ZEfsT%9^iydxB(p6Q}!g8 zDZPD(347Ei>DZ+9{$ksA)z=q%SL;2!L+8Qd>e$<^EniZhey#sHMbxDzea@hwoZTUG<$0oXTjj*fN0(Ut6^65vNsuvlsv_7v0Y z9noh!X721qhUYep(s!mJ>p1B8?M#D`ik4e?3I@fYus^HBB{#wd8jtx-6cU{zP0{bJ{c& zy#C$=xv4Y9Xs=LmP*D;{UzHc45`mWSkCfJ&u-@3W*1xi7QbLgPvUMlj#k*A64oMEU z1sYAAWL`pcX)ih;;dI^J>T}(YgmGeV&$F04mnx@SKU!Bk)#o6krb%V*1m%XxfDb`6 z9v`CUZ&bdzrBU(=;x^ZKMi9U0yq*zry8lL(xtK~)Yf&^1y zHI%oY+q%DYmFGkd7BDDNHN{t8LZhcKCUsaU45%_F9jg@x$5RW6PNl9gI&lzxQCs)$ zW$gqs!_2h4c-GVP->xRm#(hpt%b{8OuCI5t)^DOKXuNo2AZ>f0U3*oQ#LCdr#W$j{ z4+Zr1X^6{qxA~pksh^IUST$~5^6)pyRzHu6om+(;5F2OsELrn0@s_mw zxZ%hXpJWyvF%Z~$Z>r|Q5PwUW^D-APSJ6`mhaHj!>96t@T)r?nEyVv^iG|c24TEBv zb;Y%9^MVItvWDl`&J#b=*W9O*<-T&D$w+43#hWjB-_I1bBF-ckidWVT$VHhb4T(B- zr)-+P!*I}d>fEI3&kSFlv$;_x;Fk)HCB2VgY8X~WBz(uTfE{ylE4tOH6!mf;+ zDH$O6`aoM1cq=LE?bX0UYGET2K>b)k;=|s0dPU%3*6mK_bn1@%wk>okcG=%&I zx-cuF-TSWy=Nz7zmKp34tf8zUAh&$)a75adw$KTkU)6gwomMDs^o~pJCMO^73G63b zS3Y|E!g0$qkL?pA_XaNbk~?yvs9C#z!oSep~6Y zIe&Z>!TaT)d{=pNexy<(GfFI^G zd&RL`Jdm$&DlV*^JIDtDD~$cgoMx{$PP118)MI@M&uR9GhlFh8Dno#cLVUERKs*;o zK-2tW)(c-_y z#+pBz%i&+F0nOx74m0XSwI3mSb?n3+J8|L@Oyl$Px8rXzwFv7R|6HY5)Rt}B7Z*pLb&860Ln z4gin=&|EKb2koV}hpE@6LnUSZC zxUN7u>mN@Y#1yb`{vJH$j_v3CmOoGZM{FZYo!8hvR7*fW7Xac&fDzyc6dVlFc z2DM#077sjSAb=pUR1A~le?&sTg8?oooyaZsU|m4?6g=SAaQPXDodvwZTH-Z!?)l2U zlZo@hae%xNfWyJrLBUlC#`h069IQ(kpGIwD2mKKn#0d3G6<%Y59h3>hEIgA5Zn;<# znSeoocM7#m!cP!zCnqto$F)g^*)I#dNw z-~s_H%t2iTM<;jm{6Cw(Bv1#iRL;P%n&|vroudDTJv}>(;m`KuN)>wITg| zcnA$tTSN*G_%Ohdfx9SZxIlOSf&^g9AhvN-JeT%{oqF*pc&KK<5duWY%_5S7 z{`t6aC((a8VL6M5mACzL3B|%h24UELzJ#*#Q$7vb$YS~t8`K8bwO`(11NRg<1*9h6 z?18}p!31ogab!A`0U8JzC^-mJE`|nZviP?ZfXi}jEnoI}L3l*g?^-0pS0D`p5=w_!Apv2mKM-$ZFy>HsF0g z+K!>(=@beb__{bWwo&Z^XAu%AI01oDQiOU8O?iH(?0YCL2BQ5bBb_gu7BhFRHx@Vf*0bP zeZ-d>tL)AL=)?oH8qx=L#sOB=7w)3iv{duvv4#VpJ4yn6VMfkkWR3Fgvd>80-nHniS$@0MEjV&B#J`);-+4sTJ=aU- zu!g4FcAC*NKXtQbT@p4nz?6OPmj(#yM(pW*;9B#aYP`g#Ls!(KZ>w}zHk-;c-6 zoOSixI3e*i&yt4+qY8|~V|Ja>E;ZbhVOJ0OtQLc;=}9%RT`!My9B-YsdrNqfoNf3+ z#}oTw&ke1jmXUow#A5YNzg{^$%W_H2iQPTI>SfXUAM~6cd6?8jUvX~ld6+HyAY|T{ z3@2Ts+i!^5?B{wAIlpt@rVAM^2Y->&W!j=3+3n<3suCS{+AAI~DnCg(cgz z(q!W*-d(wCH)o>XYRd`VrW`cvOI)~S?j2L}m)DL|dUqM4u4dfWqdGnRTunV{`hq(> z<7!{OT&$7nS}whMkbpqQc4&iO-McL?nlh{?ojnQS1a|Kz4-NSA$L084kvG^ zIdbL@emH+kkC)ul^BX69mAw8|eYxH8$U9-CW}6Kph|T5QTS8Q>OIWT?y{sVY(Am)T zOfxfPpQZH4w8EgV=KTk?1s!02orq{c`qS-1!*ENkV^e;H|$Yx1GwbGdTQXjrb?xl;| zKmI1OK5>%tT(p^nK=(?G{VHeQPV_oOEw~cc@F*mpN8(kH$LW%ZVnv^))Rr80yjOjz zs&wW0RS(FwwF(NYC>i&ST?Qow$+>U*h5L-^WQ9-*rN8eiI_SUE)Okz$9oa+rLUm!M zmpR->yu9!rF}su^9`P=AICxt!#X{-BO<`xZp{QW5uDm z&GgIi;$nohLuvO)tG_o$we33i_RP)m^*57xFMVw`aJ0|5Y5&Ed&i>A)S0cAhshvN5 zRrI`XUV9$BI<8!#xA?)tS5iuO@?u+LCFq+2_GDgedvU)tuOoNe7)EBtHQM4yRcQy# zY;$riX*o!-m9k}?2;Tnrjn$O#eNHlgNe8|Pbe>rzJ!g;NMT@r@icyl88OLaiPY9&d z`pfcyUzzLdKL72|>)15CBTExkCb@N|ABf*WUiJRkr`8yo4~d^GJjY&em9dodd#0z$oea+#Xs)69>1itXH&3a?P1|v0*juymEsv~FYG?-%x-^8 zNNT6pPup-pV}Vx~YUbEm72(3&<@HuJb=8-;YZvObhBJfaI7aN8nx-VjG@jA5KFF+L z_n_LfId_fczVQ(cc)DBVM3!A?=GyHl!%nl0KEBy(x^y#fYU9%5-BYpKYIW+)hI~mb z>U$je{X%_v#mkQFfwo-7gsVh}!3)$m=-%T?_k^lfga-*Pa!EdS&Mas6;SLYNr<7;j zNtcOJ6jN3_ue=jcoxNWFOWG#Kl_7PF0WmF$6YQBRc(PGC z*fx2K&$^piz4Ql`5Y6NRw#j&bCs8b^Y=A^H8)9Ngw0V8;8l4nm-lezFExtxXZVO>DLneeP*WO%ahh^DM`$I zwx62CrOdzd`rUeRXx@aEyLw#)w-1w3%F1TcyZ8L6u>1>I16N_0bp`oXVVSMf<5@O{ zXY2OBZhYG|7q^`%>k*RQh`AL&q9f&2Fh^vUWT64s$cvF$G2pnIuW%~5tfsU`v6t1+ znDv5F(d9HY#B&-O;yH~Ck;cC4Pv&S9L3F|S3g?qKT17lZs|fk;$j^*u6-U*9*?$P< zR`_>m+z+7@lr@k-5{G4u6yETJ{|?Qv$CgjAagHlKO8xVZ__xS(=HG&@)|u?{>y5;#h)3;S?hR2IR(55 z&RPc|58}!D-!a5dZMy$%+&DhLoY+{7Do}RiH8#Ky@kCHo(xJlzbdX@suo#fkf^!_O z;9=}>s9!wwpL6rSjDBQ2!TJV)0p`cZvf3Tseouqve(L-`5jAJME6_qMX<`PaVr+Y=9z?aTFpMgnCQ@V!KU* z&Y7T>BvJr}#WG=?agQwj&nGPGRM5uu$9lrTPK74^cO?|Kcfx&&KQofEQ*mPZF|s_y zhPZ@*fRlh&<3VE~ED>5FF-XvH3v}RkXtzq{E*s~wRGiq5k;Q}U2CuO}(F-C6gbwQp!osUsPfUU0O`FBGBsF3$f!a)BiNe|>DwQU z>L}GYt5z^#OT&}=3O~y2;Qvpl0IH_{?5dnn0cg^BEfqAZTM=GQkj*YjdR1s>rK&9L zC;jrvVLMkVsWT;|Pu9AsKRFz@^hsD{!IPwy+uZzxXPV&CXy^hOezExI+)ueEVeqC+PT|Sjzz3y1&lP+sE>>66V5FWIUo~ktohtFgTxjad zu#ERF!^a=pU>qxvPVb1zQ8Y?8^R+bnlH_**LC@A>*oaOQA^KmEDn|yX^tlx4`QQUFK+rSf;5QP=asqbo1UuNuDX7cD@^!}!uUWeOV zzG+x5ShxIvL6u9v#+;^uZjX+xe=8PQt514=qIB+QA?e2nl7|z9jy7sKn$K7Gu(PVGXV9l`mRR-FP0n@hF%`*OJ!kfm zet7+)`h{Qj-6GEf3zw#%`l(89&ZwDr7;91H#7$n2mwu=IW95ruk5P42Tc_!CY4tiC zZT1wKn5{mkzOh?(@7F^!ecr!b5|o_q`Yy?7u@vgqf#IVH(_5BwCq7~-8@QMBZ0I_h z;+JS^r7&;z=7#d(T@~T4%5Uzoh`%1%*p3?0ZSdZ8zR>)Xp0sLc^IDhs$_c5#Ymo@$baX!xYuvzUDU+p+iX3g=Fq zi!@BztnlQCN~`SZg%cf&#$;datdIQ?e%r%!)7lA7zcMB(GWSt@8wfrIis+4T8i7?~ z57!8)WZO9~69*5^(>N8}NxHQ-=hzI&f=;{KJyRC81V{Tmm8d@vS(~~%MAC%ntAcDlKi+yri+qEjT<+xIbQd)d#b;CXZXSUE0>te zg`sZ>eE6x@SgBHf{;{SvvyGQEo7S4yS2ZmvQ2Kt{bPlNizqNcgvLyW7o|d$(u02!x zwFWH7i(;BwBi~C27)=R%SfbXrVjy$Og1rY459#^&M!Kk=)>VGgUSHQ1dB^H?!m&@Q z%E}eZbz2@Dd1TvhJgQsPhZ5XT+=;q#UCu3npkRE}P4Im7s?=?796O3vQai-gTba2B zWRUw-kAJh3*)X<6ZP`=tL+(R{)JzqGE1 zQq>b5XIOqZra7quz1rxBU`pC5@`6z9Pfr}XkDk3u%KqwTUgK(!@+rP-bARGq+s=^9 z%QuzaHIz1_#2#&l@%eE4T!LeJk=m5==-zt|*BruJ#5g^-U~W41VVb_r=ZC*F4$UpuK5voc`q^%gLv9KyGDJ5w zBtKL`O^lEE7DoFzGhk@Nxk~%6c(o2K4Nr@Gnu$4=;&V>rG8J6nQ#NE>DmSpuNX%bM zf9-#D#SHUd%>_sMY@X{?-=3*DC8^d=O%=Cq$D zqmPla)b%|JoGSKO?|c|@FtvsBHEIv8vfr@y{q7Zq+$)EbGtT$Q&36-uX}@wRYjz2~%F@KX(1^NxJ{z0z4y-u=K%+IFh>I%m0sNpZdJwaxZMZL(XteU-daRL2&Tyd0Bf zbWOEAb~;p<#xZ6KPwe#E)h+w1`(BxxcYoZs9gZ6s=Epn4%-QcFG40Ey*Do>x-Y#p6 zSgEF2I=j8v*s;tm-2nwDx7_2d%o|Cv)xhs%Vq^^Pp3+}dTt*0WT~kHCe9%L zjA@rilg$xgl+Dm#@q^EHhx^X(2oLm0%{@o&e(m&NUJ z|BdK3C}VS8eKobY?6!eVvxn*=gV{CTPnjA|WGuPNWj!TF>`wk{MKt zd_Q~nSR=PcVe*=1hrWyVT}eRezOW^9J?>|kAIZq<`5HN2tL5skDYq;Z2Df2jZ~Nul zbgg-0z1LWZ@!Vz5us-5jdGYkUukJm_DbKu9V&$21T6%i#8xN0t0pG-1k1O8#RUw1b zJ$ZCW$yLZ;U6B4&$Y8f${;NU;%fJCCKyWMs@!<2!t}<}MbHJhEe1%g=7!mWM@oZN{ zcson*k9-bGy3cySDSyDVmi>W%U5>oq2-;XJ7Fj>c{^ZfM34WSOaD+FAZy|_gI6PON z+5l_o5AYQ}T1RkLS}adRBsP#>fL{w})Od>x@D=FDO~Wz3G8_!gfourLDp>rZ!25;7 zq+n=VJw@2hc=Uw(Q#L6Uix{6kJ7-p|0t{E+n4v%g2yzglGZ?;MFo78Vpd!Uu3H%v1&Qt#p8yL#KYZYE&gM1Z_28R|f`39W;7OekJ(2y7W#^^*c z5k<$Mxv|ty#uk5vQiJ~vv~d7Q$jHb-e`Ou;vEn&;u3Y*T7O;OjBcVYC5$dua2hqVn zJqEh%fsg@-73^^S0HR>+ar}AcoCyiaH_$QsLumvVFz9Xm05Tipv+|dZbcA~SBQ}K6 z2v%pj#s=U%1$v9XT%-{3IGB|b8i4#jwnv13RA>jlqO<#xIsx2k@h0sJ^{!Q z7%&qA$0X>hOaj34_cIcnIvEF@5)gS3sF$Ft4~0R5&hS_QiGjfb!Ic}_XI%sM96i$F z0m>#nq6avQm$C_HMDP?k4RAj^o<;>iEr7gKDh_0?IOzHS1tKnIBRtsW{R33}<%$~_ zd(b6-1tN%VM#dh46oD|mKRUtC5sP9FsLU-{8f;Jiy2f*h9r)PO z8gVE_+H61vA=tZMFT)XZ049YdA@JAm)Efs4s$c>WylUaCI0~K)ZF3RxT0BrJsL=nM zyUfbRp4Ob`SzSUA>F7xG2mnjwW$2;J1`30P4jU9`ABKi&7Y!P_p>b4b(S-$LEN*7} zs2;;COqO-+=b69Fy6kh7&Hn;r|0iR6p3%?LZr=FYgi$SJIJQ(IDEPAe5u0b^=;X%O zp)$|NiQ>js%AmQ>8Dj9!JKc6LD9&QL>%f*OywXSlK-qViZJJ6gdp{W-Tq7fUZB>MU zgG=uHlHDE>SVHYI_okXk{emL;Jo&dzg6|hL6j->m2B9aaOU^ z;?myLH^gmZEww0bB(^%!HmXv=kAH#lYBSLi*g~gG7A^x zW$rjpUGRLpr@7*H?Ir2Ex8Y_VkJ%|Zqj|Ar_oFDOrAig6&#jm=DXnW~W15xxp>J0f z-hDB#M1RE@al+@oZ`sZ-$u_wS;1|$b#YcJFb(M!d|tL?8R&2AC(lKj zfAX5WA;>Oe-u0tOS$m>A9vvcidR*!=YlyV7wZ4aM6O$GR7*p@BZBj^&R}K7nve!|4 z;^O^VrG|svd?VpX<4cdDgm)}klU8}$-d;z}St@$gH~Zw_JDUR=+&v$Jy;i?-H461C zZr}L~ZDlI4S};q^Wz~@<;ZHq7h|13O6J;? z2lFde+W4EU48^aA_%ti7$#}VBrk$Bn(3Cb|lD5>C#1{g~E;qcZeR!|8==y$Kip4WY zpP3lBp@eZ!N^PXm-BISV{VFfyS{N4uEI9Y%u&sp3y)w8sHyg~|aBRG~gxb-WeMZ7B zu(9h8`S-Ysc`1x{?NlAZ6d9i~Ye8mtmgt+*%g0~TMNSV1IOgj+ZT4O(f$F-uo;e|J z_AU;;FJF*(YKI&7)Wu!XCK)cCB!B-?jLPzj&R2RaYDFsF6+E`b`lC$H_*YqZHF&LK zCW2$;Oix<;EN*el*bbA!+U2WphdRFEH|qH5ppEm6TO`G3i|uD>=nK55jMLQ$k-4CO z9<$1N?hN|coFmIOCDmI#MZF3vo?CU|+GDw}wB19k`#+lAL?#ubF0NG&GWKVje62MVgEBoNArXFe@-*ED-(BrYhXqe^QTRzV z9|lUMV^D6AD@8=Mo%h{Uy~)8xOUR(ObW&~A0!Hfc+!uRwCn+&!3Hd)6o^pL#<3sQ2 zx>==#XJ(a^?wT&={P=?9V%jIW14FMni(C?fdMjwAM?{XE&8CtMXe3B=psS0PhoU`Z zX*@WkFWdW6VaE4*MK-KHyN66&df8V`>=Y0@vXK)&*g_-G`-DMoS5FL*Y%0gIV0umd1+CHvV*eJ;060X zwnf&n+aA5%Q?^zM6er@c{vd+2Vm>UVmRdP;ZgB#yP5c*)_3o@q=D zrsn#x&r{ZpJC*lPSTN)&MQnb%chG!o)8mOEKJDZ~n%ZbnU+SqXeqts^#NwVlpuHbB z)_Y~nb^Wx;yAw&zs@FQc4-USom~dpvR*lT`=AGM|$LiDMH&rj z6=&P37U4cE?^tB<^n>()E49g8>eiQDM9@Ch#ztQXbByY><0?TT{z2{IX+e`*? ze8YNWz9)_G-7dR#N2BJoE7G@*y_)S5D=sdv=z@~cMHjc3`{WJMB&y#Oo<5SQEV^Fq zyEx@wp!3e-$}=R(&5c*&J13f|){)82+f}`KY6JamK2)8HH};Qf`S8$jr|XiW3xTCm zRh)beYL#78`BddV=$8|ex#BC4_WgsL;4m$KR3IBMf027Zvq}ibd-}wQ)W_dk>Xi4T zFPQLNsZ_UXv#RAZgZocpniCZ~)E-S|%GeHs*S>iyCy!aIH+K51M{hhPW^79ldOuEK ztZwO-fXTNit$XJMb=EHWF4$A=-1`fl5E6Z^%jds=LiV9O8YqOTFoL}O6;MdxFrGPH zSa^;X7L?0Ja6OI}7J_52kv@(W7VzfSUm&^<5#VmEmJt`A(p34pPnNWW)Kfi@TV&LN~fG6|XmlQ1aoou@z#QZgOx z&EU+-%}`=ZEB;20nA-sH34>w>k9gZ)dGKns2P0wV@CvCJ8r)cDNHa_zf?%Oh0W@Er z!XLv;3E`)=&B(+7fw~U#RrxV-@QA|^?)Nf%$Zbi8EjEz?76^DUl}5ory8>ueOGOiy zRKSY4Ot_$vGpr6i4gE;;2-%VZ_yT9zBVCE2P9n9KFFt$<w7 z1%o~;_P>uT`#j-OY=9wx0}J4D02~9d3ZOdp_mEkp9a!S;v9Nz{#Ox!EKe7Fok$`kT zb%iq_u>f>IL*m~qC+^VrXMppA#mWwiGaq>k4UP!t(#u36XBvS*K+XmP!ouJHM+SX7 zsB5@`|CucIcgHh=`yidGu+Z9;0L|BsrUXdmDl8US-Tr}v7*c59*B*)?fsGloZ~*Qq zOiEbhh^ar~B?9-NKX~HEjfcOJ5dkg{{}j$_M1adbu`y&{@Awqk$o9yI4LF2gYyEb zM?hAv5h9ZRd&QD{P3BK*U=9WVFT@60I2rMIg$~7JxKJZa(Mf;c^Gaa3*zzYf&i06a z(L|{E{g{yeMia2Vzix1CF?_VQ;p~r`*nZ4N9%HkI>I#Yh(itdCV5rcCod%SDFx5nM zNZ7h)Xs*HctYevKo&=Usk5I+&+p}s&O{J~vVXwSUG9DH^dMppl{x zWB^Db6e8qUh%l6^5eggk;Y^yptQkR{b{KRtOGIj+!ea$#6k&!_K>|x)o-0VFSL}qw zCi{DbCYD?_FjEzgUYKiIVbDO5EBjc!G(&ydx{KQB@*T(4(7zAsB#UR8dY-=N7<+W( z?k+(a2gUP|s!=;zP_O&DUbl69zTB&uq8Om+7CAX!TuHFatECp6GlI{y)p_>r*q1#a zyG(6R)x1+#dCbmzn%2X1>u}4%BOZNe>Dw}}g*=RFL7{i8Bgt(Dij$dxHM% zHk5gO5m~7!TFs}!aD#M7v`5-YW=MkWTIKk$Z`c1n+O7kv#{T^)A)=C%RUsj%vxhB2 zGRr19ldMpgMZ{}G_9!xvO_7uk8QH6pjO-FZ_U8ZjKIc5C-;>Lup8xN6z1Mr*Q_nef z-~GMsQW^(m@aO43=cb}7%zoQ+cUjXNsYli0xIeo}<|buEM7z2Cz`{U%9!mtS@- z+w6v%@4o2borB%N4orJHaa4YVnlb)|k6-a ze%!9ZX1=f9?}~XeTj*q}yc<2J!<@T&4}^~m?l;u==J<-9-_}3*)^}r21>dhpN5-68 z7xg@_XK);Za;)C)=ZAK#Fh8$D?pKA|^knVRa#a^zF&Qap(S4kyPjzX~o4DlVj~YkX zSiYd#tzM(s95OM&y!_Q*21qZ zd_Fg<)TZh@zcUq&M)SsmjIL?;{m`kX9>;tIMv3zy4a^VDUQn~?^v&lQ@O%?8By~1> zF0Yw#V`PqZ4A9~K?9ZxpzQ76I1<=TmX)fzQ`ivAO;I!E-ZA*OrOlbq{*Ww+s3_uyW82jp2=N-Gj7O zt0txk4C#=c<|%eIUA03c&XZ8)lT63 z$Ue^UeT|$+oA#D}u)<->*d1q2Y)@ZudXCktw$En|HVYVh!?&{W^ywbPZL{tSyl5Pd zXeQk!`W&+OM(ejc*@wCfpO^<+bID)O;B%)jCz{xusL*B6gKCZPy|b(I(9|#w*is>> zV#l+V>iHc!T8;3X*(SV|CVzuc+2qHy*=D2uv+V7Tm&VH~c-EZSyYZ8Cb*ij)j<_$q z(vFI5)L+3vUuS>nvS;V<)Lte7hsMp^(fn)2HshWddG>J4UhTIn zbL%|6=w~2m{S+%eP2q`4$|W=wGHknU-%sK1BZ`+G-vS;q*K7C+kFR@K;d0Kl113 zBx}eE`jcs^d7>Yp`%7u7c?oSb4=Y9ekMvgaMT#Q2wxSOcrOUd|ILHFXvtEpp@{yO9 zAh|(xA2+elz}$k^a4Lp7yw2mEMQoJKu9hzXt_=DHxT#5jZc?hz$^zhZMJlFfri2=E z97PY=6&?my0UR3=wD8I-F&tYr4Y-L7`CZC9SArH5U|hov1et3TlL)<;MLmXbN#{^( zrC>zjsB~!dYyub6DJOR^b}Map1EwJXZAW-z&MHxvfRW<8$wP<5~9~h zbqYW`l%gRGQi8M*wGVI;8$BW+EPxb$!GI*SOyE=heL!-lq@st4)1m3dBiqnWfr9;( z5)~-im6a0Mv}#dOMFmPDlqytet(KWTpmtMk+La!U`rzr|$ToP!aO6;FML-WnY=@8_ zDj1H$heK4NKIg7bLJvo5W-t{-K2X19!&4r~qY?~94(lW|bAb*GB>>0_18>hNG*S?i zqE4;RVi-zQS`|Ec1aNAH7qUtS2?#Z#%&$ARaWx#JDCdK?pbwrTF=aRpvJ9R%968Kp zNf8QawITuV=!7Ex2_0fe3!xeOy98a%VS!%H=M$ntM&v5!(Fp4dAU#TOfTYgb9QCMv zI2OdFAC7EeL%v_YQ%ND}qXO;$gf0zn1K|-%ZjDl|0QiL2>Ex2YQS@MRk?}}JPmf2o z(KBM>QYA${Acd%sA@50#M__pXr78h-fVxR>(`@weNL;0*xE~e_NFG>JEYLd4W-FZe zE!}O4K0g-3rgwIO#Sp95;6)`9^VKQ^Pc2fYlyV-AFBeGES_okhXFrLOfg~bKBJKtx zP+MRk(9zS*Zfv7xwk(%BkM8_PD7z#xPM;r%KqpG2|Gq?0_jZm)B+bvE4L?}&bC~VM z;m)F8A`7@f`a3pz?hwF)Lcj(jV7v0AYK=w!O-|rP#7a3|EtM%47$ymo|KO%&1-LEn z313U!vcw-vBtRvq#4XGHjRx{j5Md+5dfknNSbhjfa!#YNMBKC+y+*h&R$CJnuVkn5I#A1zHrV>gS zf^oWR8%NO-Sp!@W>F6Q9=Lq60>*yJCok{?56B}U4V7&s8q3?BadgS5G&9-Hku@ye- zP&HA#QUxV$hO7qlb$>33QfXuQZ(~&yEliy&Ng0%oet&O=bQu)>Zmi3ogL?Sfk(nR+ zHX!%l((CgZH14)~+C@o^Yg@`CF7WZ*zjW;F{sUGYSh+Iv=hqF_mmbQyFfMJ(f%Y-; z=2$nJcj}YXyhiIG6>JX7`pk3OhzQu85;QTO67=SlVv8$GY^mLvTuF+@?&hr4|_G#^rz+c$8VAjWG%Sbs#Vp7 z$__Rgnl9^pZqA{%w?3WUdpY2}n^Q<|t*2$5UNHHhjm}EWH;(@n{w#0Zg3ybjqtX&@ zY@B-TVXyb=PK-!9u;cluZKm=GeN2B`I~F+L(yOE)XI7sb5qV;P!Sb#RZIiAxY*w#V z*VW@Y%nvwMY1Q-1O@1sJBCht@rAPAQQM)%^%{o$NN0ltU!6P)Yek=>GDXg<;oaL%)I{dy+%fCmrSN_a z_ohbYS~>UL9654g(}W`@W>yN{Q)^)r+adOE9PDPCc+_;pd3$-o8*eSvCD*a}YMDKB z(v3%F714uZj`uU^-?eeahp&vwZ>*hsZHmV@qu?IZD-T+BEg>ppaGMzpS%*K^Mk$wN zHC34$dj4TSrRpCJJUO5kQ0?8RrhcIg_d}Pbh6`qniFww|&fGOxZJ5wy@c9Qp_sRsD zg$#=cyX{){n3wc3Ek1E>~80*7`U;*kR?Z zyck)}w@24+i)-oqs^`IbO_ZZw@Yh6no9jt()8ky1 zeF%I}>GIlua&KzK_K4E<4Zr)^L3BoXw286f@sJ-or?q|GYt@=b#`6P$-E0pT2mM@K zrs)x*6FUNp9)ySut|c7uo{)P_t?|g#CV2+BoC@0TBlCoBr){5JjeO|be(e6>}qnzyox`o8GdDtCJBX5T7pZurDbbB*&^xZG*f-s=vhwbKmg6Dy(`tb(_oa zbH+wkt)HLw#JSHUmj$`ooF(<2^N&pL^R@ebvo=iMH){T_jX&cyJ)irzB0n?7y5=qU z6ixpdA3xv7cJlPMTi^ETI>X6kD^~Y=9F_WfZ$|ctVZD7;k6NhxDG1WOtDnDeoA0Kv z&L_&gi`p~R$wN3{OW*5@``1<*RTg%5l_ZqxemioJctuzBstxm`mJwq#X=BFiFz|Wb zVqn1PQ}2WNK5|drC>sBz!^2j2RT8(q4fJd9bZf@ZR^R&!ch0DwxO_8iSo8{ymYd$5 zTKXYy$h?(dUs_K+7w`YAdHd7L`F4gz);%D^RWV6`Fb99S&Kk|;zKTCsK4um7z{>Q?olOe?95-c%Z}%pU4f3)X2P*n{|>E} zB%zq_q|isxvLqBeoO*|@3hET2$nVgVOd0(-GP){A+1XQ1(N#eiU2mjp&&iJ{k8$dS z{*%dWu8WZ7f=OsDn1tqnNoX#Zgyw=t^jxr_MMdh5r8nc!U2|y+C@I{@@%1zYloS<9 zkjm#&eG11j6ujuj1bl$aK`>w!8Ok>jo=T|_L*5xcI+aE#;c1j=CCq=}E=qLMnMWkj zLEN;e07WKpTq}qjm~SCKoa|y}M8=^2ML~aqizWa*fbMUJ7?*Kr39b{=q~fO4Xow}@ z$&uLT9%maHoF~+Ln3#&eGgH8DQ3VbfV6FgJ%GJ>PmZ%xRB)XM=o9GMroQ_`K=WL^A z^m-BP3T|e(7z$K?I}~&}#L`5f5|qU#5e{yejqY@PXa#-FGBoJ8iJ;#F&u`>1Ks7{F zOsIuE38-@t5D&ym!k(mvYI5n?l_I`i@z)10HhaD8?_H|+~@k(=uT%F8#tySsTz5HjSO@XNXMW!FI7l1P|#8-Q4ZxZ*-zBw z%}w<5M5kMpkY>o@&Ng~xuX9-9p^Z?8RvN)~gJuHO0~Eakzd5*xpu!vqFlp$c)0`s&oP$@vr zl`CXg0Zx8mxK0R|s{sscxEj^qTq0T!yAU-WN?zDcK{Z4vP%I`aXcp1`YuoE?5*)QX z@``dC;fNrq2<2Qp2!EsxNU;z*+5bcI5-x=nu=2`LK_b@iq8@-XHN8G~!cxSVhUg(#000Idck_j8 z2964LYC=FBWLlL5;4>9pD-a@+s})G38nr~gTn@PuTG08`pnQYl1xfXSnvQEJ;2(~V zd-&_PVXlVU)yZJ`0;C_b_4J`p7FGz6ZES?h3JW{f*GNQQYl#$Eu@*9@YB3)I!8{Ep z|IFw)+`+L53W)^^8k7%SG+~Ad1jziOekKwA9i#!%MU_kpF+Z7_YHtH)zm^`xf*az&Z}z2-=K?vAv% z(Ys@fv?nf~l4T7itWrfCi@6lNvB?nALF?y?IZ@C3P@`wZw!coh)9IRdRloEv_g=4m zKc~Hc>Cl`lKO1c^O}3h_^lV_Bh1rJ+x%am0%hEXazS^?a$=37C<_)Z6Z+}+M;$*}A zJAdq+nRPgC@{Gw%jqT=NF}BDYQN8oyD?glOm*-7cY@9PIG-CHo)#-9)t>KI-{G5cCTNX?&Z2zz2Qyxe*4145c#V5ms|SX_cz`@ajdd$-TK?-MjVLoe(2?V z@MpIxW6Q_>TrKh6(+KM`+2BJL@$jpMm!HXgnYG2XP3kDOcdegIt@kCyWI(PbkJo!-*;$P&cR1vQDo^FB z*16O;oIXJ7dv$r|by3;`%ky6~^<3)g>9anpox99(P`$aXKjb^txJ)oTnP2J137bky zQYzX{Inw&X=`Nm^L$1~tcCco@b32xnU3w|th079ah}L}yiTkpCc2sb1xeAA4CNwdB z(QN90+WY&q9@y*j28Syb)(o>S9k6Wk)uA7%o-7|QI>Ai7X>8RW+j-3{@17=FXdnFk zR{c@uZZ{Y{t9N{#i?WYXW2_oJ?m0U2S$V&Y9Uea)z4=X2S>M&R_LWQyS6bRB>eTK0 z);|ZlG76orcIUR+ZrKAh(d8XAqUyUoUQSuI$YI9L`Rs+1Df*tWL(=!x zz~dXbE^ZPtrG|CYIS(Fr1|58E729s~(8xY(Yj=t0>s343CpCUatu-Ik%~;~=-7DTg zJK^4w1Uq%TjH;&9q&Dw=Ee#c{@V2c`K6yyFs+JZHD%tn1G)D7aYnP|?9d-;``{LLt z*_`eJJ@9BDAUW0)F{xdH3xOH#8s){Do zUi*Cgf7QHSC9Sp#s29BV=DwAm*Dmu4AAK`Nka=d-*&me}nV$@-RnGBA>+79X_tpAj z`KV^j?3>|qv(A##yWjcuTUQkSs2jC?c0|j&cX`j9-PTE><*mieJNt~UP-U>=h>PJO0{nXz`?=PjhzyiqP zNVW@slVh;yU$xh}sb-JIQ{rQS|~)93(y!uEmg66Y-IR5-Y_Dl^FUQ za9`jFmBj?lEF+fG)<8dONYX}1R98sQIBpSvdki5K;|7OMl^Rkw0Jh^Fq$7}12J3>) z*NTuJkugy2(jwvmrJJ!x$bg21loOG_N5TctUl3@=f0OYfXLFkV_on9#f=UC|L=d%; zkozsoeIUda7WZ4`m@a%&FI~&hz_o(dh;k6tX2K_66B`oHa-mqs6AIyY357j5^bH}v zrIblY+6+^b;cPF3mo`@^C#>42)rsK2tZP{z7%(EFpx8#wY*{WZ-_$w{QFjboBEUt4 zE*cgg%2?$z_(fTOScM6vKkd^#d%UKxI9`712ioKDUPdlrBuR@$S(+9jN}+- zpe%!DHY&h1O;0A`K!N=JUl%fFY}{qW1yKBx;UEEM9u*tOjFat?ZEQfw zE0tgjA$f}}P9xU{gi0}zzZyOgF4&@l%!37W3gdKp!%TJ*AvH-VdPo!@0V=~O>F<0U zWGsYAnE=YH#66lXmP1@h3HeZ=Tn>Fc1#H_HO;4R1xe1<-IdG~#`c@Y`F-;-aIJVI< zW8*F{uHSko1_DaiL~)1*8a>58U?qYJom;h1t40z`piruXLOEY6l`2FEIHU7a@StY~ z&)w!FM7<1^4;_C3(IX>=Eth@t%-Fcwyy%7{@`Xtt#SAz zB@+!_%@=A^kfh>EL|Uzurxi1hF+>}Vt2LGs7|2={elp^vf_%CLjS}c<9eGBsnVY2-6^33lZgpUTAZHB4X;eUDa#+6L&H<+%4Wo)CrGz}V30?@2 z8WBLJgC~_sUCx_L?949bZg-=Pu~bGISNwu5Cn;^=-!}+GZ2u3GaymA;%UOm-DCInC zu($#9#lXh_FryMEgoHUM6ahcQXU-)`bA|45DqXJEWno7n0KcHnO2T{|YILN!i3&7i z68XjC+lw$x|NJ}@r%}l+?)kz4=@c`(jvUfKR=ID3%0A`o-cg0{p0gu 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 z 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æ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⊀`O$3aJHmOd0hyU%h{IN2;T;d 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�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 L@w>nK>c#&Br%f7Y diff --git a/dmatrix/doc/latex/Makefile b/dmatrix/doc/latex/Makefile deleted file mode 100644 index 8b7c89a1..00000000 --- a/dmatrix/doc/latex/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -all: clean refman.pdf - -pdf: refman.pdf - -refman.pdf: refman.tex - pdflatex refman.tex - makeindex refman.idx - pdflatex refman.tex - latex_count=5 ; \ - while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ - do \ - echo "Rerunning latex...." ;\ - pdflatex refman.tex ;\ - latex_count=`expr $$latex_count - 1` ;\ - done - - -clean: - rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf diff --git a/dmatrix/doc/latex/annotated.tex b/dmatrix/doc/latex/annotated.tex deleted file mode 100644 index 5099d78f..00000000 --- a/dmatrix/doc/latex/annotated.tex +++ /dev/null @@ -1,17 +0,0 @@ -\section{Class List} -Here are the classes, structs, unions and interfaces with brief descriptions:\begin{DoxyCompactList} -\item\contentsline{section}{\hyperlink{structalist}{alist} }{\pageref{structalist}}{} -\item\contentsline{section}{\hyperlink{structcilist}{cilist} }{\pageref{structcilist}}{} -\item\contentsline{section}{\hyperlink{structcllist}{cllist} }{\pageref{structcllist}}{} -\item\contentsline{section}{\hyperlink{structcomplex}{complex} }{\pageref{structcomplex}}{} -\item\contentsline{section}{\hyperlink{classDMatrix}{DMatrix} (\hyperlink{classDMatrix}{DMatrix} class )}{\pageref{classDMatrix}}{} -\item\contentsline{section}{\hyperlink{structdoublecomplex}{doublecomplex} }{\pageref{structdoublecomplex}}{} -\item\contentsline{section}{\hyperlink{classErrorHandler}{ErrorHandler} (\hyperlink{classErrorHandler}{ErrorHandler} class )}{\pageref{classErrorHandler}}{} -\item\contentsline{section}{\hyperlink{structicilist}{icilist} }{\pageref{structicilist}}{} -\item\contentsline{section}{\hyperlink{classInitializeDMatrixClass}{InitializeDMatrixClass} (\hyperlink{classInitializeDMatrixClass}{InitializeDMatrixClass} class )}{\pageref{classInitializeDMatrixClass}}{} -\item\contentsline{section}{\hyperlink{structinlist}{inlist} }{\pageref{structinlist}}{} -\item\contentsline{section}{\hyperlink{unionMultitype}{Multitype} }{\pageref{unionMultitype}}{} -\item\contentsline{section}{\hyperlink{structNamelist}{Namelist} }{\pageref{structNamelist}}{} -\item\contentsline{section}{\hyperlink{structolist}{olist} }{\pageref{structolist}}{} -\item\contentsline{section}{\hyperlink{structVardesc}{Vardesc} }{\pageref{structVardesc}}{} -\end{DoxyCompactList} diff --git a/dmatrix/doc/latex/classDMatrix.tex b/dmatrix/doc/latex/classDMatrix.tex deleted file mode 100644 index 07d143df..00000000 --- a/dmatrix/doc/latex/classDMatrix.tex +++ /dev/null @@ -1,5325 +0,0 @@ -\hypertarget{classDMatrix}{ -\section{DMatrix Class Reference} -\label{classDMatrix}\index{DMatrix@{DMatrix}} -} - - -\hyperlink{classDMatrix}{DMatrix} class. - - - - -{\ttfamily \#include $<$dmatrixv.h$>$} - -\subsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -void \hyperlink{classDMatrix_a414e84e3c2c91900f44b58a9d09d0acc}{input\_\-matrix} () -\begin{DoxyCompactList}\small\item\em Allows the user to enter the elements of a matrix using command line prompts. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a998b1e7e9dd6c837971f264660075efe}{Print} (const char $\ast$text) const -\begin{DoxyCompactList}\small\item\em Prints the elements of a \hyperlink{classDMatrix}{DMatrix} object. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a6e471ebaba82f41591b69fdfc8d72eaa}{PrintInfo} (const char $\ast$text) const -\begin{DoxyCompactList}\small\item\em Prints information about a \hyperlink{classDMatrix}{DMatrix} object. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a12b3c21b0467172f8a6ae976f04a9e99}{Read} (FILE $\ast$filex) -\begin{DoxyCompactList}\small\item\em Reads the elements of a matrix from a file. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a67346b3c1a7e04b0e071e59e06b5399a}{Save} (const char $\ast$FileName) -\begin{DoxyCompactList}\small\item\em Saves the elements of a matrix to a file. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a26e8a17738092057014b0b72ef99c661}{Load} (const char $\ast$FileName) -\begin{DoxyCompactList}\small\item\em Reads the elements of a matrix from a file. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a3470a954caccffa3bec8b134c2e5f179}{Fprint} (FILE $\ast$filex) -\begin{DoxyCompactList}\small\item\em Prints the elements of a matrix elements matrix to a file. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_abebb69fbb1f71d2b49f575153bb36fee}{FillWithZeros} (void) -\begin{DoxyCompactList}\small\item\em Assigns a zero value to each element of a matrix. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a78d654687b6b56497279a81bdc28d4f7}{SwapRows} (int i, int j) -\begin{DoxyCompactList}\small\item\em Swaps two rows of a matrix. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a3b9322caa649274e47049960b1f60a33}{SwapColumns} (int i, int j) -\begin{DoxyCompactList}\small\item\em Swaps two columns of a matrix. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a23e7c1ac8350421a1798a59363452f79}{Transpose} (void) -\begin{DoxyCompactList}\small\item\em Transposes a matrix. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_ae18275d9d832807ea53e4ccb93e461f0}{diag} (const \hyperlink{classDMatrix}{DMatrix} \&dd) -\begin{DoxyCompactList}\small\item\em Assigns values to the diagonal elements of a matrix, while all off-\/diagonal elements are set to zero. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_af2c9e4ddf67ac9cf85141f1afb6cde37}{SetColumn} (const \hyperlink{classDMatrix}{DMatrix} \&Col, int icol) -\begin{DoxyCompactList}\small\item\em Assigns values to a column of a matrix, while other columns are left untouched. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a8cc97e6d3bb30a15c521d822638949eb}{SetRow} (const \hyperlink{classDMatrix}{DMatrix} \&Row, int irow) -\begin{DoxyCompactList}\small\item\em Assigns values to a row of a matrix, while other columns are left untouched. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a54df2f008095aa1ec06ecebce8073c38}{colMult} (long c, double x) -\begin{DoxyCompactList}\small\item\em Multiples the elements of a specified column of a matrix by a constant scalar value. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a3907e2350b967ee27825eb9b9c6f4992}{rowMult} (long r, double x) -\begin{DoxyCompactList}\small\item\em Multiples the elements of a specified row of a matrix by a constant scalar value. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a8b15c0468cccb85d5102e4e1138e8f44}{find} (\hyperlink{classDMatrix}{DMatrix} \&I, \hyperlink{classDMatrix}{DMatrix} \&J) const -\begin{DoxyCompactList}\small\item\em Finds non-\/zero values of a matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_abf563652a938b64d2074d734584b738c}{find} (int $\ast$I, int $\ast$J) const -\begin{DoxyCompactList}\small\item\em Finds non-\/zero values of a matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a6c8455bfd3811abb82bca639f2ead3af}{sub\_\-matrix} (long r1, long r2, long c1, long c2) const -\begin{DoxyCompactList}\small\item\em Extracts a specified sub-\/matrix from a matrix. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a580fc5ea46fe5208dd49a9f1ade06e20}{SetSubMatrix} (long row, long col, const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em Assigns the elements of a matrix object to a section of the calling object. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_ae9ea1cd2a83a4e84e072b62addd825cc}{getn} () -\begin{DoxyCompactList}\small\item\em Gets the number of rows from the calling object. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_a1954420b4966f38c5ed7e386648f087b}{getm} () -\begin{DoxyCompactList}\small\item\em Gets the number of columns from the calling object. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_a569af1f26034f5450d059637c9ea909e}{getn} () const -\begin{DoxyCompactList}\small\item\em Gets the number of rows from the calling object. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_a61fb36c4c0b342f7aabc0c709e761c26}{getm} () const -\begin{DoxyCompactList}\small\item\em Gets the number of columns from the calling object. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_ac5729ab1d4162789c067ed4928ea86e5}{GetNoRows} () -\begin{DoxyCompactList}\small\item\em Gets the number of rows from the calling object. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_a45ab6509deee2a3e1a13d27e2b3e929e}{GetNoRows} () const -\begin{DoxyCompactList}\small\item\em Gets the number of rows from the calling object. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_a16ac005120f99416a8e914aa1119eff1}{GetNoCols} () -\begin{DoxyCompactList}\small\item\em Gets the number of columns from the calling object. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_a8b234f10a804f49ccf711051ac022156}{GetNoCols} () const -\begin{DoxyCompactList}\small\item\em Gets the number of columns from the calling object. \item\end{DoxyCompactList}\item -double $\ast$ \hyperlink{classDMatrix_aeda5a29d08ef2a98344d65ba37fe53b1}{GetPr} () -\begin{DoxyCompactList}\small\item\em Gets the pointer to the array where the elements of the matrix are stored. \item\end{DoxyCompactList}\item -double $\ast$ \hyperlink{classDMatrix_a2b8280816c4f3508d522462fd09732cf}{GetConstPr} () const -\begin{DoxyCompactList}\small\item\em Gets a pointer to the array where the elements of the matrix are stored (for const objects) \item\end{DoxyCompactList}\item -double $\ast$ \hyperlink{classDMatrix_a48e4e74d3cd7affb6af7d1d0beaca129}{geta} () -\begin{DoxyCompactList}\small\item\em Gets a pointer to the array where the elements of the matrix are stored. \item\end{DoxyCompactList}\item -int \hyperlink{classDMatrix_a34b0f1e03bfc35e7e6ac298d21ca78c7}{getatype} () -\begin{DoxyCompactList}\small\item\em Gets the type of element storage of a matrix. \item\end{DoxyCompactList}\item -int \hyperlink{classDMatrix_a5616c72557eae51c38af63f6684391d0}{isEmpty} () -\begin{DoxyCompactList}\small\item\em Check if a matrix object is empty, if other words this method checks if the calling object has zero elements. \item\end{DoxyCompactList}\item -int \hyperlink{classDMatrix_a05a0f57ed7ed6cc3d57d9294d48ee4cc}{isVector} () const -\begin{DoxyCompactList}\small\item\em Check if a matrix object contains a row or column vector. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a874f1e4a2796127f8efc9dedfe901603}{element} (long i, long j) -\begin{DoxyCompactList}\small\item\em Returns the value of a specified element of a matrix. \item\end{DoxyCompactList}\item -double \& \hyperlink{classDMatrix_afbeef8ed62a91eef48e8664f6a9accd0}{elem} (long i, long j) -\begin{DoxyCompactList}\small\item\em Returns a reference to the specified element of a matrix. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_ad07f4bea1e8e45647eb1514c1cb745be}{elem} (long i, long j) const -\begin{DoxyCompactList}\small\item\em Returns the value of a specified element of a matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_add29fc33eedb04efe3950fcc4c2a31dd}{Column} (long icol) const -\begin{DoxyCompactList}\small\item\em Returns a \hyperlink{classDMatrix}{DMatrix} object containing a speficied column of the calling object. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a90261694eb6d26818dfbebbe099c1373}{Row} (long irow) const -\begin{DoxyCompactList}\small\item\em Returns a \hyperlink{classDMatrix}{DMatrix} object containing a speficied row of the calling object. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aeb2c289d9a40b0869f2fef29ffd6340e}{mpow} (int p) -\begin{DoxyCompactList}\small\item\em Computes and returns the integer power of a matrix. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a631c638e92b0b7964f42b11addbaaa01}{ -\hyperlink{classDMatrix_a631c638e92b0b7964f42b11addbaaa01}{DMatrix} (void)} -\label{classDMatrix_a631c638e92b0b7964f42b11addbaaa01} - -\begin{DoxyCompactList}\small\item\em Default constructor. Creates an empty matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix_ae3911763fdae4b6f4d41772031c9a2da}{DMatrix} (long Initn, long Initm) -\begin{DoxyCompactList}\small\item\em Constructor with dimensions. Creates a matrix with allocated storage given specified numbers of rows and columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix_a4751cd36f1eb0b65f4c25eced0142192}{DMatrix} (long vDim, double $\ast$v, long Initn, long Initm) -\begin{DoxyCompactList}\small\item\em Constructor with dimensions using pre-\/allocated storage. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix_a7e8d467c27e1dc57c2cdae0c28efea21}{DMatrix} (long Initn) -\begin{DoxyCompactList}\small\item\em Constructor with a single dimension, creates a column vector. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix_a823b4bf5f2957ea5c2d9339292237234}{DMatrix} (long Initn, long Initm, double a11,...) -\begin{DoxyCompactList}\small\item\em Constructor using a variable list of element values. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix_af8ff7b8c264b0390e20c2c9c58a03b64}{DMatrix} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em Copy constructor. Creates a new \hyperlink{classDMatrix}{DMatrix} object with the same dimensions and element values as a given \hyperlink{classDMatrix}{DMatrix} object. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a06129166d2e2166192f1f35841d1c0e5}{ -\hyperlink{classDMatrix_a06129166d2e2166192f1f35841d1c0e5}{$\sim$DMatrix} ()} -\label{classDMatrix_a06129166d2e2166192f1f35841d1c0e5} - -\begin{DoxyCompactList}\small\item\em Destructor. Destroys a previously created \hyperlink{classDMatrix}{DMatrix} object and frees any allocated memory. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a523236d1477888fc53f74bbc00a30fa6}{Resize} (long nnrow, long nncol) -\begin{DoxyCompactList}\small\item\em Changes the number of rows and columns of an existing matrix. Allocates new memory if necessary. If the calling object uses preallocated memory and the requested size would exceed that memory, an error is thrown. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_ab8c6ade7a8a3cfaae690572887575fdc}{assign} (long rows, long columns, double a11,...) -\begin{DoxyCompactList}\small\item\em Assigns values to the elements of an existing \hyperlink{classDMatrix}{DMatrix} object using a variable list of values. Resizes the matrix if necessary. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a0363c3677623145f180fe42d294c6ede}{MemCpyArray} (double $\ast$aptr) -\begin{DoxyCompactList}\small\item\em Copies values to the elements of a \hyperlink{classDMatrix}{DMatrix} object from an existing array. The number of elements of the \hyperlink{classDMatrix}{DMatrix} object is assumed to be the number of values to be copied. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac87ec83dbff242d422e1cb369bd2ca88}{operator+} (const \hyperlink{classDMatrix}{DMatrix} \&rval) const -\begin{DoxyCompactList}\small\item\em Matrix addition operator. The sizes of the matrices being added should be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_add9bb19634bb522c9e877491094e738c}{operator+=} (const \hyperlink{classDMatrix}{DMatrix} \&rval) -\begin{DoxyCompactList}\small\item\em Matrix addition and substitution operator. The sizes of the matrices being added should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a666ade216863c56a4c349bb8fee0b972}{operator+} (double x) const -\begin{DoxyCompactList}\small\item\em Adds a scalar real value to each element of the matrix. . \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a9535ca71463a4e2f687b680569c9dd75}{operator-\/=} (const \hyperlink{classDMatrix}{DMatrix} \&rval) -\begin{DoxyCompactList}\small\item\em Matrix subtraction and substitution operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_adf28e5ff346309620d9dded905cf5b22}{operator-\/} (const \hyperlink{classDMatrix}{DMatrix} \&rval) const -\begin{DoxyCompactList}\small\item\em Matrix subtraction operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac0a611dd59097d0a3920abf376d054e7}{operator-\/} (double x) const -\begin{DoxyCompactList}\small\item\em Subtracts a scalar real value from each element of the matrix. . \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a17a7fbea90ec8a16e4ced726128d4b5f}{operator$\ast$} (const \hyperlink{classDMatrix}{DMatrix} \&rval) const -\begin{DoxyCompactList}\small\item\em Matrix product operator. Returns the result of the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_abda7d982b252b058549dbe48ec1276ba}{operator$\ast$=} (const \hyperlink{classDMatrix}{DMatrix} \&rval) -\begin{DoxyCompactList}\small\item\em Matrix product operator with substitution. Computes the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown. The calling object is modified to store the results of the operation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a671296ddd1c619d1ee31a308ac56840c}{operator$\ast$} (double Arg) const -\begin{DoxyCompactList}\small\item\em Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_afe1c2b5daad8e441bb1da8edeccbe6a2}{operator$\ast$=} (double Arg) -\begin{DoxyCompactList}\small\item\em Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value), and modifies the calling object to store the result of the operation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ae58c7f379fbb88acad6b704961f7029c}{operator/} (double Arg) const -\begin{DoxyCompactList}\small\item\em Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value). \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a3b8d471ba4ef3cd2e9dc5931e5b77e01}{operator/} (const \hyperlink{classDMatrix}{DMatrix} \&rval) const -\begin{DoxyCompactList}\small\item\em Computes the right division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the left object by the inverse of the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The right hand side object must be a square matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aa26baf81cd578c80fed72d7b6179ad1f}{operator\%} (const \hyperlink{classDMatrix}{DMatrix} \&rval) const -\begin{DoxyCompactList}\small\item\em Computes the left division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the inverse of the left object by the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The left hand side object must be a square matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ab57902d452e18ec32edbfb300a59940f}{operator/=} (double Arg) -\begin{DoxyCompactList}\small\item\em Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value) and modifies the left hand side object with the result of the operation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_add548c8713cb71b189a0535d05a37cc9}{operator=} (const \hyperlink{classDMatrix}{DMatrix} \&rval) -\begin{DoxyCompactList}\small\item\em Matrix assignment. The size of the left hand side object is modified if necessary, and the values of all real elements of the right hand side object and copied to the left hand side object. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_af94a79c28f61abb7ef91c97a5113f2d4}{operator=} (double val) -\begin{DoxyCompactList}\small\item\em Matrix assignment to a scalar. The size of the left hand side object is modified to one row by one column if necessary, and the value of the right hand side argument is copied to the single element of the matrix. If the calling object is a \char`\"{}colon reference\char`\"{} matrix, then the right hand side value is copied to each element of the referenced array elements. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a5625e608ef4e437bdce83858df5b3c97}{operator=} (const char $\ast$str) -\begin{DoxyCompactList}\small\item\em Matrix assignment to a constant matrix defined as a character string using the bracket notation used in Matlab and Octave. The size of the left hand side object is modified if necessary. For example, the identity matrix of size two by two would be entered as \char`\"{}\mbox{[}1.0 0.0;0.0 1.0\mbox{]}\char`\"{}. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a7b756f28bc990d6b5b67a176143b9fc0}{operator$|$$|$} (const \hyperlink{classDMatrix}{DMatrix} \&B) const -\begin{DoxyCompactList}\small\item\em Concatenates two matrices side by side. The dimensions number of rows of the matrices involved must be the same, otherwise an error is thrown. The number of columns of the resulting matrix is the addition of the number of columns of both matrices involved. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a0346b7c7d5952c7dbae995150ee40476}{operator\&\&} (const \hyperlink{classDMatrix}{DMatrix} \&B) const -\begin{DoxyCompactList}\small\item\em Stacks the right hand side matrix below the left hand side matrix. The dimensions number of columns of the matrices involved must be the same, otherwise an error is thrown. The number of rows of the resulting matrix is the addition of the number of rows of both matrices involved. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_af380c4e561b0f321b5bf7103038fa2cb}{operator$^\wedge$} (double x) -\begin{DoxyCompactList}\small\item\em Elementwise power operator. Returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions of the calling object and each of its elements is computed as the corresponding element of the calling object to the power of the right hand side argument. Care must be taken when using this operator as the associations do not work in the same way as with the $\ast$ operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A$^\wedge$x). \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a051fc52a9620318d04dd454d7970d319}{operator\&} (const \hyperlink{classDMatrix}{DMatrix} B) const -\begin{DoxyCompactList}\small\item\em Elementwise product operator. Returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions of the calling objects and each of its elements is computed as the product of the corresponding elements of the calling object and the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the $\ast$ operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A\&B). \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ada9cc203a754a96ac3cb6122c9eba0fd}{operator$|$} (const \hyperlink{classDMatrix}{DMatrix} B) const -\begin{DoxyCompactList}\small\item\em Elementwise division operator. Returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions of the calling objects and each of its elements is computed as the of the corresponding element of the calling object by the corresponding element of the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the / operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A$|$B). \item\end{DoxyCompactList}\item -double \& \hyperlink{classDMatrix_ad944a2f5b2df21a1ae752f368e257f34}{operator()} (long row, long col) -\begin{DoxyCompactList}\small\item\em Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row and column indices. Indices start from 1. \item\end{DoxyCompactList}\item -double \& \hyperlink{classDMatrix_a15adc46b55cb516b67bb408447f8275e}{operator()} (long row, const char $\ast$end) -\begin{DoxyCompactList}\small\item\em Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of zero or negative indices. The matrix is resized if necessary. \item\end{DoxyCompactList}\item -double \& \hyperlink{classDMatrix_a430e6b0a88061c4fe70e1c64ccaf285a}{operator()} (const char $\ast$end, long col) -\begin{DoxyCompactList}\small\item\em Matrix indexing. Returns a reference to the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a1e736f0992464a5d849ebbe5a4eb3bbf}{operator()} (long row, long col) const -\begin{DoxyCompactList}\small\item\em Matrix indexing. Returns the value of the matrix element located at the position indicated by the row and column indices. Indices start from 1. An error in thrown in case of a range violation. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_aafb023a91a09e10f3c95414b29a32d22}{operator()} (long row, const char $\ast$end) const -\begin{DoxyCompactList}\small\item\em Matrix indexing. Returns the value of the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of a range violation. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_aca1e6c7d7c8859a705bc87674003a194}{operator()} (const char $\ast$end, long col) const -\begin{DoxyCompactList}\small\item\em Matrix indexing. Returns the value of the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation. \item\end{DoxyCompactList}\item -double \& \hyperlink{classDMatrix_a6f6ad5489850d8200b6a49c9da098877}{operator()} (long index) -\begin{DoxyCompactList}\small\item\em Single index matrix indexing. Returns a reference to the matrix element located at the linear position indicated by the index, assuming column major storage. The indexs start from 1. The matrix is resized if necessary. An error is thrown in case of zero or negative indices. \item\end{DoxyCompactList}\item -double \& \hyperlink{classDMatrix_a8a1118191a95c48e44043ddb89dbd826}{operator()} (const char $\ast$end) -\begin{DoxyCompactList}\small\item\em Access to last linear element. Returns a reference to the last linear matrix element, assuming column major storage. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a181f357abea59bca3f4d9efb16fb5618}{operator()} (long k) const -\begin{DoxyCompactList}\small\item\em Single index matrix indexing. Returns the value of the matrix element located at the linear position indicated by the index, assuming column major storage. The index starts from 1. An error is thrown in case of range error. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a107a1b256e91c653cd48a863ba063494}{operator()} (const char $\ast$end) const -\begin{DoxyCompactList}\small\item\em Access to last linear element. Returns the value of the last linear matrix element, assuming column major storage. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac13b6fc14bdd5f3947cccb8f41173433}{operator$>$} (double val) const -\begin{DoxyCompactList}\small\item\em Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is greater than the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a60f1f1c8766a649c91c64243a7f37b77}{operator$<$} (double val) const -\begin{DoxyCompactList}\small\item\em Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is lower than the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_adf2cf4223a098eb273fd3b6c71fea201}{operator$>$=} (double val) const -\begin{DoxyCompactList}\small\item\em Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is greater or equal than the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a2f0eadd7bb2b7afc5e6109243a839c1d}{operator$<$=} (double val) const -\begin{DoxyCompactList}\small\item\em Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is lower or equal than the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a02a8277b7f165d774d6463f284bb71b4}{operator==} (double val) const -\begin{DoxyCompactList}\small\item\em Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is equal to the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a475f14adcb18e617464bd66021fc4ca2}{operator!=} (double val) const -\begin{DoxyCompactList}\small\item\em Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is different from the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a1cb2ee04434b9874b01bc1494f49c639}{operator$>$} (const \hyperlink{classDMatrix}{DMatrix} \&val) const -\begin{DoxyCompactList}\small\item\em Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater than the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac488bfc1076b6e69fdb8cb8e37acdff4}{operator$<$} (const \hyperlink{classDMatrix}{DMatrix} \&val) const -\begin{DoxyCompactList}\small\item\em Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower than the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac17447effdb7cfc9252bf5232c3e99d6}{operator$>$=} (const \hyperlink{classDMatrix}{DMatrix} \&val) const -\begin{DoxyCompactList}\small\item\em Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater or equal than the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a220c708ecc6554de0abf07788eb9ab89}{operator$<$=} (const \hyperlink{classDMatrix}{DMatrix} \&val) const -\begin{DoxyCompactList}\small\item\em Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower or equal than the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a9851dca0d4acb9001926dfef3d4226b8}{operator==} (const \hyperlink{classDMatrix}{DMatrix} \&val) const -\begin{DoxyCompactList}\small\item\em Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is equal to the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a50d36066d7917dee27b67665b91d78a3}{operator!=} (const \hyperlink{classDMatrix}{DMatrix} \&val) const -\begin{DoxyCompactList}\small\item\em Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is different from the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a2716e6ec24ea80068a5baec55e98c370}{operator()} (const \hyperlink{classDMatrix}{DMatrix} \&RowIndx, const \hyperlink{classDMatrix}{DMatrix} \&ColIndx) -\begin{DoxyCompactList}\small\item\em Submatrix extraction and referencing using arrays of indices. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a160cbc57bd615ceb60ebdb500371a37c}{operator()} (const \hyperlink{classDMatrix}{DMatrix} \&RowIndx) -\begin{DoxyCompactList}\small\item\em Linear sub-\/vector extraction and referencing using an array of indices assuming column-\/major storage. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aad182b5dbdaa8ec1911904639d5626de}{operator()} (const \hyperlink{classDMatrix}{DMatrix} \&RowIndx, long col) -\begin{DoxyCompactList}\small\item\em Sub-\/vector extraction and referencing using an array of row indices for a given column. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_af44540d97b6e449fd3f1551956ea2518}{operator()} (long row, const \hyperlink{classDMatrix}{DMatrix} \&ColIndx) -\begin{DoxyCompactList}\small\item\em Sub-\/vector extraction and referencing using an array of column indices for a given row. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a847dc65e8a09a3274b7a6e54acb37a17}{operator()} (const \hyperlink{classDMatrix}{DMatrix} \&RowIndx, const char $\ast$end) -\begin{DoxyCompactList}\small\item\em Sub-\/vector extraction and referencing using an array of row indices for the last column of a matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ad9815228adc3856c7cdc8ecca281d5a3}{operator()} (const char $\ast$end, const \hyperlink{classDMatrix}{DMatrix} \&ColIndx) -\begin{DoxyCompactList}\small\item\em Sub-\/vector extraction and referencing using an array of column indices for the last column of a matrix. \item\end{DoxyCompactList}\end{DoxyCompactItemize} -\subsection*{Static Public Member Functions} -\begin{DoxyCompactItemize} -\item -static void \hyperlink{classDMatrix_aadec35682639717d9bc698cfee3953ad}{AllocateAuxArr} (void) -\begin{DoxyCompactList}\small\item\em Allocates the array of auxiliary (temporary) objects used by the class. \item\end{DoxyCompactList}\item -static void \hyperlink{classDMatrix_a6389bc3790f8b71dd59a8f2bd659fc27}{DeAllocateAuxArr} (void) -\begin{DoxyCompactList}\small\item\em De-\/allocates the array of auxiliary (temporary) objects previously allocated by \hyperlink{classDMatrix_aadec35682639717d9bc698cfee3953ad}{AllocateAuxArr()} \item\end{DoxyCompactList}\item -static double \hyperlink{classDMatrix_a02bef7569ab47374e79f9acd9fa517b2}{random\_\-uniform} (void) -\begin{DoxyCompactList}\small\item\em Returns a pseudo-\/random uniformly distributed number in the range \mbox{[}0,1\mbox{]}. \item\end{DoxyCompactList}\item -static double \hyperlink{classDMatrix_ac79a34758fce637c1f23149f267ed623}{random\_\-gaussian} (void) -\begin{DoxyCompactList}\small\item\em Returns a pseudo-\/random Gaussian distributed number with zero mean and unit variance. \item\end{DoxyCompactList}\item -static \hyperlink{classDMatrix}{DMatrix} $\ast$$\ast$ \hyperlink{classDMatrix_adfa26d6b647b74af5f592d51bf70e8f4}{GetAuxPr} (void) -\begin{DoxyCompactList}\small\item\em Gets a pointer to the array of auxiliary objects. \item\end{DoxyCompactList}\item -static int \hyperlink{classDMatrix_a3c854cc931571f2eba43f374e17ff18d}{isThereError} (void) -\begin{DoxyCompactList}\small\item\em Checks if the error flag has been raised. If so, a 1 is returned, 0 otherwise. \item\end{DoxyCompactList}\item -static void \hyperlink{classDMatrix_a7521e5968a095edd6b80779f95b25309}{SetPrintLevel} (int plevel) -\begin{DoxyCompactList}\small\item\em Sets the print level. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_af784203b9838e92c481ab977498cfeb9}{ -static int {\bfseries PrintLevel} ()} -\label{classDMatrix_af784203b9838e92c481ab977498cfeb9} - -\item -\hypertarget{classDMatrix_a8b81363f7e8e3eeef78851fa149b806f}{ -static double \hyperlink{classDMatrix_a8b81363f7e8e3eeef78851fa149b806f}{GetEPS} ()} -\label{classDMatrix_a8b81363f7e8e3eeef78851fa149b806f} - -\begin{DoxyCompactList}\small\item\em This function returns the machine numerical precision. \item\end{DoxyCompactList}\end{DoxyCompactItemize} -\subsection*{Protected Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{classDMatrix_a45db94207b6ce1580b2b280d620de7dd}{ -void \hyperlink{classDMatrix_a45db94207b6ce1580b2b280d620de7dd}{SetAuxFlag} (int arg)} -\label{classDMatrix_a45db94207b6ce1580b2b280d620de7dd} - -\begin{DoxyCompactList}\small\item\em Sets the value of auxFlag. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ac4fb297fbf91ef6f520158636ad85f4e}{ -int \hyperlink{classDMatrix_ac4fb297fbf91ef6f520158636ad85f4e}{GetAuxFlag} ()} -\label{classDMatrix_ac4fb297fbf91ef6f520158636ad85f4e} - -\begin{DoxyCompactList}\small\item\em Gets the value of auxFlag. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_ac643c444a18419885b5ac5a2f8d003be}{Allocate} (long size) -\begin{DoxyCompactList}\small\item\em Allocate memory to store matrix elements. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a077cd396523652629a258cb11f469886}{DeAllocate} () -\begin{DoxyCompactList}\small\item\em De-\/allocate memory previously allocated with \hyperlink{classDMatrix_ac643c444a18419885b5ac5a2f8d003be}{DMatrix::Allocate()}. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a8935b0337db48a93dd91cb87c698b291}{compMat} (const \hyperlink{classDMatrix}{DMatrix} \&m2, char op) const -\begin{DoxyCompactList}\small\item\em Elementwise comparison of matrix elements. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_ac13795ccdc5f59c8bcec90207f484fe8}{SetReferencedDMatrixPointer} (\hyperlink{classDMatrix}{DMatrix} $\ast$arg) -\begin{DoxyCompactList}\small\item\em Sets the value of the referenced matrix pointer. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} $\ast$ \hyperlink{classDMatrix_a9bb99d0f897fe9e23b5370e11bf80d3f}{GetReferencedDMatrixPointer} () -\begin{DoxyCompactList}\small\item\em Gets the value of the referenced matrix pointer. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a73b829dadf5b159839b57a399f1fa8c8}{SetRowIndexPointer} (const \hyperlink{classDMatrix}{DMatrix} $\ast$arg) -\begin{DoxyCompactList}\small\item\em Sets the row index pointer. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a877dbfd1042abd3391f77a4aaf90c296}{SetColIndexPointer} (const \hyperlink{classDMatrix}{DMatrix} $\ast$arg) -\begin{DoxyCompactList}\small\item\em Sets the column index pointer. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_aeb006280bc37e1d13ecf16164fff0f5c}{SetMType} (int arg) -\begin{DoxyCompactList}\small\item\em Sets the type of matrix. \item\end{DoxyCompactList}\item -int \hyperlink{classDMatrix_a8617eafafa13e38ba6dd7d0265b1c9a3}{GetMType} () -\begin{DoxyCompactList}\small\item\em Gets the type of matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a9630eee5b92eb0b651789204f91b55e7}{AssignmentToColonReference} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em Assigns a matrix to the values pointed to by a colon reference matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac4080d0de15b606eac2a3e0ab34a8e13}{AssignmentToColonReference} (double arg) -\begin{DoxyCompactList}\small\item\em Assigns a double value to each value pointed to by a colon reference matrix. \item\end{DoxyCompactList}\end{DoxyCompactItemize} -\subsection*{Static Protected Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{classDMatrix_a219884cf7cdede14bf16b1e2f72b8519}{ -static \hyperlink{classDMatrix}{DMatrix} $\ast$ \hyperlink{classDMatrix_a219884cf7cdede14bf16b1e2f72b8519}{GetTempPr} (int i)} -\label{classDMatrix_a219884cf7cdede14bf16b1e2f72b8519} - -\begin{DoxyCompactList}\small\item\em returns pointer to the i-\/th temporary object \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_acd872a02e93bdabb985544e6f2dfcce5}{ -static int \hyperlink{classDMatrix_acd872a02e93bdabb985544e6f2dfcce5}{GetMemberFlag} ()} -\label{classDMatrix_acd872a02e93bdabb985544e6f2dfcce5} - -\begin{DoxyCompactList}\small\item\em Gets the memberFlag value from the object. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a720e5aedc8031aa796b2f176a3baafff}{ -static void \hyperlink{classDMatrix_a720e5aedc8031aa796b2f176a3baafff}{SetMemberFlag} (int arg)} -\label{classDMatrix_a720e5aedc8031aa796b2f176a3baafff} - -\begin{DoxyCompactList}\small\item\em Sets the memberFlag value. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a627d51c532b05cff96fe700d403935d1}{ -static void \hyperlink{classDMatrix_a627d51c532b05cff96fe700d403935d1}{ChkAuxArrays} ()} -\label{classDMatrix_a627d51c532b05cff96fe700d403935d1} - -\begin{DoxyCompactList}\small\item\em Checks the auxiliary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a0c91bf06a776242d7d6ad0a7542f6941}{ -static int \hyperlink{classDMatrix_a0c91bf06a776242d7d6ad0a7542f6941}{GetNoAuxArr} ()} -\label{classDMatrix_a0c91bf06a776242d7d6ad0a7542f6941} - -\begin{DoxyCompactList}\small\item\em Gets the number of temporary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a591f532e37974cc25ebc194e9fc7d7e3}{ -static long \hyperlink{classDMatrix_a591f532e37974cc25ebc194e9fc7d7e3}{GetDimAux} ()} -\label{classDMatrix_a591f532e37974cc25ebc194e9fc7d7e3} - -\begin{DoxyCompactList}\small\item\em Gets the dimensions of the array of temporary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a14abde5d3504796b201a0202a8970f51}{ -static int \hyperlink{classDMatrix_a14abde5d3504796b201a0202a8970f51}{GetInitFlag} ()} -\label{classDMatrix_a14abde5d3504796b201a0202a8970f51} - -\begin{DoxyCompactList}\small\item\em Gets the value of initFlag. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a8cef5f97f92074b16625846b8f550df1}{ -static void \hyperlink{classDMatrix_a8cef5f97f92074b16625846b8f550df1}{SetInitFlag} (int arg)} -\label{classDMatrix_a8cef5f97f92074b16625846b8f550df1} - -\begin{DoxyCompactList}\small\item\em Sets the value of initFlag. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ace53a9ed8bb434bc0a67b1f069316f9f}{ -static int \hyperlink{classDMatrix_ace53a9ed8bb434bc0a67b1f069316f9f}{GetAuxIndx} ()} -\label{classDMatrix_ace53a9ed8bb434bc0a67b1f069316f9f} - -\begin{DoxyCompactList}\small\item\em Gets the current index of temporary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ab4a11314f2975a137017e2d57cd3e5d5}{ -static int \hyperlink{classDMatrix_ab4a11314f2975a137017e2d57cd3e5d5}{IncrementAuxIndx} ()} -\label{classDMatrix_ab4a11314f2975a137017e2d57cd3e5d5} - -\begin{DoxyCompactList}\small\item\em Increments the index of temporary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a2211b735aecd50ed6762ed92de52a547}{ -static int \hyperlink{classDMatrix_a2211b735aecd50ed6762ed92de52a547}{DecrementAuxIndx} ()} -\label{classDMatrix_a2211b735aecd50ed6762ed92de52a547} - -\begin{DoxyCompactList}\small\item\em Decrements the index of temporary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ae65a4d724762861f0be576fccd5f9268}{ -static void \hyperlink{classDMatrix_ae65a4d724762861f0be576fccd5f9268}{SetAuxIndx} (int i)} -\label{classDMatrix_ae65a4d724762861f0be576fccd5f9268} - -\begin{DoxyCompactList}\small\item\em Sets the index of temporary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a869b844f16fb6cbd67a6ae49ce9e85ba}{ -static void \hyperlink{classDMatrix_a869b844f16fb6cbd67a6ae49ce9e85ba}{SetDimAux} (long dd)} -\label{classDMatrix_a869b844f16fb6cbd67a6ae49ce9e85ba} - -\begin{DoxyCompactList}\small\item\em Sets the dimension of each object in the array of temporary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a0206fa2a95f063d9dc2da4b3bad1bddb}{ -static void \hyperlink{classDMatrix_a0206fa2a95f063d9dc2da4b3bad1bddb}{SetNoAuxArr} (int nn)} -\label{classDMatrix_a0206fa2a95f063d9dc2da4b3bad1bddb} - -\begin{DoxyCompactList}\small\item\em Sets the number of auxiliary objects. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_afa61b704944672add882239a0c59c0c2}{ -static void \hyperlink{classDMatrix_afa61b704944672add882239a0c59c0c2}{RiseErrorFlag} ()} -\label{classDMatrix_afa61b704944672add882239a0c59c0c2} - -\begin{DoxyCompactList}\small\item\em Sets the errorFlag member to true. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ab8b0bcf34072a17bbfbbccfb4bdc3854}{ -static clock\_\-t \hyperlink{classDMatrix_ab8b0bcf34072a17bbfbbccfb4bdc3854}{GetStartTicks} (void)} -\label{classDMatrix_ab8b0bcf34072a17bbfbbccfb4bdc3854} - -\begin{DoxyCompactList}\small\item\em Gets the value of start\_\-clock member. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a13b4271744d10ea297a889ec7077857b}{ -static void \hyperlink{classDMatrix_a13b4271744d10ea297a889ec7077857b}{SetStartTicks} (clock\_\-t st)} -\label{classDMatrix_a13b4271744d10ea297a889ec7077857b} - -\begin{DoxyCompactList}\small\item\em Sets the value of start\_\-clock member. \item\end{DoxyCompactList}\end{DoxyCompactItemize} -\subsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{classDMatrix_a3857b87c430ba8cc0113f0988daf6893}{ -double $\ast$ \hyperlink{classDMatrix_a3857b87c430ba8cc0113f0988daf6893}{a}} -\label{classDMatrix_a3857b87c430ba8cc0113f0988daf6893} - -\begin{DoxyCompactList}\small\item\em Array of doubles to store matrix elements using column major storage. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{ -long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}} -\label{classDMatrix_a6b7668991ff7d01230b3599836a5d682} - -\begin{DoxyCompactList}\small\item\em Number of matrix rows. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd}{ -long \hyperlink{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd}{m}} -\label{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd} - -\begin{DoxyCompactList}\small\item\em Number of matrix columns. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_af74d7ca8df8470885972d41500a27ff7}{ -long \hyperlink{classDMatrix_af74d7ca8df8470885972d41500a27ff7}{asize}} -\label{classDMatrix_af74d7ca8df8470885972d41500a27ff7} - -\begin{DoxyCompactList}\small\item\em Number of allocated elements in a. \item\end{DoxyCompactList}\item -int \hyperlink{classDMatrix_a7d862f142821d27ff3ca0620170428ba}{atype} -\item -int \hyperlink{classDMatrix_a1b72a6547b064c5e262e5db9389b34f4}{mtype} -\item -\hypertarget{classDMatrix_a94587c0c67c81ca027a6fa0db7968dee}{ -int \hyperlink{classDMatrix_a94587c0c67c81ca027a6fa0db7968dee}{auxFlag}} -\label{classDMatrix_a94587c0c67c81ca027a6fa0db7968dee} - -\begin{DoxyCompactList}\small\item\em Flag to indicate auxiliary (temporary) matrix flag = 1 if temporary matrix, 0 otherwise. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ae25aeefd7343fa1c4e2af40b58ea6417}{ -int \hyperlink{classDMatrix_ae25aeefd7343fa1c4e2af40b58ea6417}{allocated}} -\label{classDMatrix_ae25aeefd7343fa1c4e2af40b58ea6417} - -\begin{DoxyCompactList}\small\item\em Flag to indicate that element storage has been allocated. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_aeac61a503c71ccb91ed1716b2783929b}{ -\hyperlink{classDMatrix}{DMatrix} $\ast$ \hyperlink{classDMatrix_aeac61a503c71ccb91ed1716b2783929b}{mt}} -\label{classDMatrix_aeac61a503c71ccb91ed1716b2783929b} - -\begin{DoxyCompactList}\small\item\em Referenced matrix pointer. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a65ac7d1345a971d77e67ee703c2a2810}{ -const \hyperlink{classDMatrix}{DMatrix} $\ast$ \hyperlink{classDMatrix_a65ac7d1345a971d77e67ee703c2a2810}{rowIndx}} -\label{classDMatrix_a65ac7d1345a971d77e67ee703c2a2810} - -\begin{DoxyCompactList}\small\item\em Row indices. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a07458d7c2b1b8de8e8c999b9599f4b8b}{ -const \hyperlink{classDMatrix}{DMatrix} $\ast$ \hyperlink{classDMatrix_a07458d7c2b1b8de8e8c999b9599f4b8b}{colIndx}} -\label{classDMatrix_a07458d7c2b1b8de8e8c999b9599f4b8b} - -\begin{DoxyCompactList}\small\item\em Column indices. \item\end{DoxyCompactList}\end{DoxyCompactItemize} -\subsection*{Static Protected Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{classDMatrix_a8e0787660169ccbbbe03abfe35cfa2bb}{ -static \hyperlink{classDMatrix}{DMatrix} $\ast$ \hyperlink{classDMatrix_a8e0787660169ccbbbe03abfe35cfa2bb}{auxPr}} -\label{classDMatrix_a8e0787660169ccbbbe03abfe35cfa2bb} - -\begin{DoxyCompactList}\small\item\em Array of Temporary matrices. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a56775df03984b80a3d42399b7ab76fce}{ -static int \hyperlink{classDMatrix_a56775df03984b80a3d42399b7ab76fce}{noAuxArr}} -\label{classDMatrix_a56775df03984b80a3d42399b7ab76fce} - -\begin{DoxyCompactList}\small\item\em Number of auxiliary matrices. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a5bb25eb7096e0e1e23a3d8060f022604}{ -static long \hyperlink{classDMatrix_a5bb25eb7096e0e1e23a3d8060f022604}{dimAux}} -\label{classDMatrix_a5bb25eb7096e0e1e23a3d8060f022604} - -\begin{DoxyCompactList}\small\item\em Dimension of auxiliary arrays. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a4751f59f6b2d9ca38bc86861356daacb}{ -static int \hyperlink{classDMatrix_a4751f59f6b2d9ca38bc86861356daacb}{auxIndx}} -\label{classDMatrix_a4751f59f6b2d9ca38bc86861356daacb} - -\begin{DoxyCompactList}\small\item\em Index of used auxiliary matrices. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a5ea72e70cde471344b0cb5fa4a5c2652}{ -static int \hyperlink{classDMatrix_a5ea72e70cde471344b0cb5fa4a5c2652}{memberFlag}} -\label{classDMatrix_a5ea72e70cde471344b0cb5fa4a5c2652} - -\begin{DoxyCompactList}\small\item\em Member function flag to control resetting of auxIndx. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a372c2986dfa355aa97371f996b5daa48}{ -static int \hyperlink{classDMatrix_a372c2986dfa355aa97371f996b5daa48}{initFlag}} -\label{classDMatrix_a372c2986dfa355aa97371f996b5daa48} - -\begin{DoxyCompactList}\small\item\em Flag to indicate aux arrays allocation. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_afc8acc5933599402803919f0536d8afa}{ -static const double \hyperlink{classDMatrix_afc8acc5933599402803919f0536d8afa}{MACH\_\-EPS}} -\label{classDMatrix_afc8acc5933599402803919f0536d8afa} - -\begin{DoxyCompactList}\small\item\em Machine precision constant. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ac1534658aee6a96156f92f0c124cf805}{ -static int \hyperlink{classDMatrix_ac1534658aee6a96156f92f0c124cf805}{errorFlag}} -\label{classDMatrix_ac1534658aee6a96156f92f0c124cf805} - -\begin{DoxyCompactList}\small\item\em Flag to indicate error condition. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_aac5e51f153fa877df6a37998a663a80f}{ -static int \hyperlink{classDMatrix_aac5e51f153fa877df6a37998a663a80f}{print\_\-level}} -\label{classDMatrix_aac5e51f153fa877df6a37998a663a80f} - -\begin{DoxyCompactList}\small\item\em Print level flag, 1: output sent to sderr, 0: no output sent. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_abc1151795b37eb105f0a56cff7f0dbd9}{ -static long \hyperlink{classDMatrix_abc1151795b37eb105f0a56cff7f0dbd9}{seed} \mbox{[}$\,$\mbox{]}} -\label{classDMatrix_abc1151795b37eb105f0a56cff7f0dbd9} - -\begin{DoxyCompactList}\small\item\em current state of each stream \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ad0fa6340a823be80a8ff8334ca4ffa36}{ -static int \hyperlink{classDMatrix_ad0fa6340a823be80a8ff8334ca4ffa36}{stream}} -\label{classDMatrix_ad0fa6340a823be80a8ff8334ca4ffa36} - -\begin{DoxyCompactList}\small\item\em stream index for pseudo-\/ramdon number generator \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_a67f6d06df5d5c3ffc5259b17353af8a2}{ -static time\_\-t \hyperlink{classDMatrix_a67f6d06df5d5c3ffc5259b17353af8a2}{start\_\-time}} -\label{classDMatrix_a67f6d06df5d5c3ffc5259b17353af8a2} - -\begin{DoxyCompactList}\small\item\em variable to store start time after \hyperlink{classDMatrix_ace51fd7d8435f88c8b2b3bcf64367673}{tic()} call. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ad01743f08b2cffeaf5e212765adcdda0}{ -static clock\_\-t \hyperlink{classDMatrix_ad01743f08b2cffeaf5e212765adcdda0}{start\_\-clock}} -\label{classDMatrix_ad01743f08b2cffeaf5e212765adcdda0} - -\begin{DoxyCompactList}\small\item\em clock\_\-t variable \item\end{DoxyCompactList}\end{DoxyCompactItemize} -\subsection*{Friends} -\begin{DoxyCompactItemize} -\item -void \hyperlink{classDMatrix_ae96d9db92ff5e3a72e0e7b0eda05490f}{CholeskyDecomp} (\hyperlink{classDMatrix}{DMatrix} \&A, int \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}, \hyperlink{classDMatrix}{DMatrix} \&pM) -\begin{DoxyCompactList}\small\item\em Cholesky decomposition of a matrix. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_ac66ec50116a7b447a9ba3d0cc38043eb}{CholeskySolution} (const \hyperlink{classDMatrix}{DMatrix} \&A, int \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}, const \hyperlink{classDMatrix}{DMatrix} \&pM, const \hyperlink{classDMatrix}{DMatrix} \&bM, \hyperlink{classDMatrix}{DMatrix} \&xM) -\begin{DoxyCompactList}\small\item\em Cholesky solution using the Cholesky decomposition of a matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac100c02f140686e07a7b520bf5a58e25}{operator-\/} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em Matrix unary minus operator. Returns an object of the same dimensions as A but with changed element signs. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ab52a3e622e1d9bab78e860842f5dd983}{colon} (double i1, double increment, double i2) -\begin{DoxyCompactList}\small\item\em This function generates a \hyperlink{classDMatrix}{DMatrix} object with a vector starting from a given value, with given increments and ending in a given value. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ad79d00fc58e2584963625ecf46ccabee}{colon} (int i1, int increment, int i2) -\begin{DoxyCompactList}\small\item\em This function generates \hyperlink{classDMatrix}{DMatrix} object with a vector starting from a given value, with given increments and ending in a given value. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a1cbcbb56a983edaa8e40dba43df831c0}{colon} (int i1, int i2) -\begin{DoxyCompactList}\small\item\em This function generates \hyperlink{classDMatrix}{DMatrix} object with a vector starting from a given value, with unit increments, and ending in a given value. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a1f79ebd6d8952d215f2792a9c19a0064}{colon} (double i1, double i2) -\begin{DoxyCompactList}\small\item\em This function generates \hyperlink{classDMatrix}{DMatrix} object with a vector starting from a given value, with unit increments, and ending in a given value. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a2987194d90eec1f076a329414ac07278}{colon} (void) -\begin{DoxyCompactList}\small\item\em This function generates a special \hyperlink{classDMatrix}{DMatrix} object with one row and one column which is understood by the indexing functions that take a \hyperlink{classDMatrix}{DMatrix} object as an argument to mean \char`\"{}all rows\char`\"{} or \char`\"{}all columns\char`\"{}. \item\end{DoxyCompactList}\item -int \hyperlink{classDMatrix_ad90390441283c128e0c64ad67b7a7d16}{any} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a 1 if any alement of \hyperlink{classDMatrix}{DMatrix} object that is passed as argument is non-\/zero, otherwise it returns a zero. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aed1822acbc4a807359a836ab57386d07}{mpow} (\hyperlink{classDMatrix}{DMatrix} \&A, int p) -\begin{DoxyCompactList}\small\item\em This function calculates the integer matrix power. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_abf562762c4dfe45f93d14976001bc61e}{operator$\ast$} (double r, const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function multiplies a real number by a matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ada53ba13afcbd8b7e0916c3275839a85}{tra} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns the transpose of a given matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a322373e24822a8633c2ddfd8f7397c11}{inv} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns the inverse of a given square matrix. If the argument is not a square matrix an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a07480acdabc192269bf2fceb56eb2ef4}{pinv} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns the pseudo-\/inverse of a given rectangular matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac33c390deeaf029a44055773fa06bd00}{identity} (long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}) -\begin{DoxyCompactList}\small\item\em This function returns the identity matrix with a given number of rows and columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ab54dc58f34aa18e7ff82b21b3533b173}{identity} (long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}, long \hyperlink{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd}{m}) -\begin{DoxyCompactList}\small\item\em This function returns a truncated identity matrix with specified numbers of rows and columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aafc7c944155ff0404f3201ce8b764bea}{eye} (long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}) -\begin{DoxyCompactList}\small\item\em This function returns the identity matrix with a given number of rows and columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aee7a643a65d88ae71a19462563fb9805}{eye} (long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}, long \hyperlink{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd}{m}) -\begin{DoxyCompactList}\small\item\em This function returns a truncated identity matrix with specified numbers of rows and columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a2150db6f40794cd7741043bcd593d2ce}{zeros} (long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}, long \hyperlink{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd}{m}) -\begin{DoxyCompactList}\small\item\em This function returns a matrix full of zeros with specified numbers of rows and columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ad90074f7636d5a5a80de596f210b398c}{ones} (long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}, long \hyperlink{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd}{m}) -\begin{DoxyCompactList}\small\item\em This function returns a matrix full of ones with specified numbers of rows and columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a0cbd806dab65e5458cb5ad832615c506}{expm} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns the exponential matrix of a given square matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ad7d82c1616fcc97e403e50a5066ec851}{sin} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a matrix with the sine of each element of the input matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aa9e07c7b8674a182891bfaf4699906b9}{cos} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a matrix with the cosine of each element of the input matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a60601de2de5f8d857668cca1cea050e5}{tan} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a matrix with the tangent of each element of the input matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a16013e5264442d52b6d98a4a49fee29f}{exp} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a matrix with the natural exponential of each element of the input matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a6b8bfbf386b29e7333e14e4e6d894608}{sinh} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a matrix with the hyperbolic sine of each element of the input matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a567d9f47845cd22715ad3d44e4644b40}{cosh} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a matrix with the hyperbolic cosine of each element of the input matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a524a9c2858469d68aac6a342eac2198a}{tanh} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a matrix with the hyperbolic tangent of each element of the input matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a75ca121105b6022b5cff058be162f209}{log} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a matrix with the natural logarithm of each element of the input matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a417b7d2c566648bf891e5da105ba4233}{diag} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em if A is a matrix this function extracts a column vector with the diagonal values of A. If A is a vector this function returns a matrix having the elements of A in the diagonal \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a36fc8f1174ba00e793bd88142dc11b9f}{TProduct} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function returns the product of the first matrix transposed times the second matrix. The number of rows of both matrices must be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ad77d1a08b972e1cbba7bb60b7ea20bf1}{ProductT} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function returns the product of the first matrix times the second matrix transposed. The number of columns of both matrices must be the same, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_acf0028536903ebb3dc83f1a83b20165c}{TProductT} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function returns the product of the first matrix transposed times the second matrix transposed. The number of rows of the first matrix must be the same as the number of columns of the second matrix, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a4d51f780b4a609cd73c6c6b9b2ff1884}{Product} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function calculates the product of two matrices. The number of columns of the first matrix must be the same as the number of rows of the second matrix, otherwise an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aebb97348d6f64a5a77e6b0a5bcfa3afb}{LUSolve} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&b) -\begin{DoxyCompactList}\small\item\em Solves the system of equations $ A x = b $ using LU factorisation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ad9133e1f6215a490287e1f0b262c5212}{LUFSolve} (const \hyperlink{classDMatrix}{DMatrix} \&ALU, const \hyperlink{classDMatrix}{DMatrix} \&b) -\begin{DoxyCompactList}\small\item\em Solves the system of equations $ A x = b $ using LU factorisation using a previously found LU factors. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a0167e219388b005d7b41ea3403191fd3}{CholSolve} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&b) -\begin{DoxyCompactList}\small\item\em Solves the system of equations $ A x = b $ using Cholesky factorisation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ae5b99d9b1b937f38054ac8d16237b1c2}{CholFSolve} (const \hyperlink{classDMatrix}{DMatrix} \&Achol, const \hyperlink{classDMatrix}{DMatrix} \&b) -\begin{DoxyCompactList}\small\item\em Solves the system of equations $ A x = b $ using Cholesky factorisation. The function uses a previously found Cholesky factorisation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a1266502a32517e157a8a56a312e13b54}{Chol} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em Returns the Cholesky factorisation of a matrix A, which must be a positive definite symmetric matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_af65da2b06dfaa39404003f6a7d09121b}{CholeskyRoot} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em Returns the Cholesky root R of a given matrix A, such that A=R'R. A must be a positive definite symmetric matrix. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a3b4d3e101ff20bd05a1908437481bef0}{QRSolve} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&b) -\begin{DoxyCompactList}\small\item\em Solves the system of equations $ A x = b $ using QR factorisation. The number of rows of matrix A must be greater or equal than the number of columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a3a0e406e05efdd9374cc918645053b27}{QRFSolve} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&b) -\begin{DoxyCompactList}\small\item\em Solves the system of equations $ A x = b $ using QR factorisation. The function uses a previously found QR factorisation. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a31d884a31b9ef5b534de344af01e2a38}{QR} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em Returns the QR factorisation of a matrix A. The number of rows of matrix A must be greater or equal than the number of columns. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aba0583d31407f78cfe1176d74d03fa59}{LSMNSolve} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function solves overdetermined or underdetermined real linear systems $ A x = B $ using a QR or LQ factorization of A. It is assumed that matrix A has full rank. The function uses the LAPACK routine dgels. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a1ccd9a0ef8a37d739b31e85f84c2743c}{LQ} (const \hyperlink{classDMatrix}{DMatrix} \&A, \hyperlink{classDMatrix}{DMatrix} $\ast$Q) -\begin{DoxyCompactList}\small\item\em Returns the LQ factorisation of a matrix A. The function uses the LAPACK routine dgelqf\_\-(). \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a71dd04fdd14b319042752e184ded3393}{LU} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em Returns the LU factorisation of a matrix A. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_afb39cb034e5bef5e4e416a22d53afb56}{SVD} (const \hyperlink{classDMatrix}{DMatrix} \&A, \hyperlink{classDMatrix}{DMatrix} $\ast$U=NULL, \hyperlink{classDMatrix}{DMatrix} $\ast$V=NULL) -\begin{DoxyCompactList}\small\item\em Returns the singular value decomposition of a matrix $ A = U' diag(s) V $, where vector s contains the singular values of A. The function uses the LAPACK routine dgesvd\_\-(). \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ad80782cbeec0075aeaa43fc2e2264cc0}{orth} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns Q, the orthonormal basis for the range of a matrix A, such that $ Q Q' = I $. The number of columns of Q is the rank of A. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a038aceaf8588f3f7743562f598cab15d}{null} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns Z, the orthonormal basis for the null space of a matrix A, such that $ Z Z' = I $ and $ A Z=0 $. The number of columns of Z is the nullity of A. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a13a156103ead07b546c81e6bdd366280}{SVDSolve} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function uses the LAPACK routine dgelss\_\-() to compute the minimum norm solution to a real linear least squares problem: Minimize $ || B - A x ||_2 $ using the singular value decomposition (SVD) of A. A is a rectangular matrix which may be rank-\/deficient. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a2dfbc15150a97456fefdd9d23b1e0932}{schur} (const \hyperlink{classDMatrix}{DMatrix} \&A, \hyperlink{classDMatrix}{DMatrix} $\ast$U=NULL) -\begin{DoxyCompactList}\small\item\em This function computes and returns the Schur decomposition of a matrix A, such that $ A=Q'U Q $, where U is an upper triangular matrix and Q is a unitary matrix. This function uses the LAPACK routine dgees\_\-() \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a160797dd45b601c20b26ad4c189fe8f2}{eig} (const \hyperlink{classDMatrix}{DMatrix} \&A, \hyperlink{classDMatrix}{DMatrix} $\ast$V=NULL) -\begin{DoxyCompactList}\small\item\em This function computes the eigenvalues and (optionally) the eigenvectors of a matrix A. This function uses the LAPACK routines dsyev\_\-() and dgeev\_\-. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_aafa519c3dd4bd2b69731ef2fef01a371}{enorm} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function computes and return the Euclidean norm of a matrix A, which is the square root of the sum of its squared elements. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a5169a4190b500841d156828863e414c8}{norm} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function computes 2-\/norm of matrix A, which is computed as the maximum singular value of A. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_afc6bf998f40686caf55730b53cea7150}{InfNorm} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function computes infinity norm of matrix A, which is computed as the maximum absolute value row sum. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a650d19963c7ca65fe5e8f58c08fc3e55}{Fnorm} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function computes Frobenius norm of matrix A. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a8de28f4be67d64533552e166b44ea128}{Abs} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function computes and returns the element-\/wise absolute value of matrix A. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a734ba2f493c1e69b72dfaf09cfdc1224}{Max} (const \hyperlink{classDMatrix}{DMatrix} \&A, int $\ast$rindx=NULL, int $\ast$cindx=NULL) -\begin{DoxyCompactList}\small\item\em This function finds and returns the element of matrix A with maximum value. It also returns the indices of such element. If more than one element has the same maximum value, the indices of the first element found when searching column by column is returned. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a6bd64bff4bf5dea949448371d9e34c14}{MaxAbs} (const \hyperlink{classDMatrix}{DMatrix} \&A, int $\ast$rindx=NULL, int $\ast$cindx=NULL) -\begin{DoxyCompactList}\small\item\em This function finds and returns the element of matrix A with maximum absolute value. It also returns the indices of such element. If more than one element has the same maximum absolute value, the indices of the first element found when searching column by column is returned. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a6168ace6eec6c2c1724638a1e4c1059c}{Min} (const \hyperlink{classDMatrix}{DMatrix} \&A, int $\ast$rindx=NULL, int $\ast$cindx=NULL) -\begin{DoxyCompactList}\small\item\em This function finds and returns the element of matrix A with minimum value. It also returns the indices of such element. If more than one element has the same minimum value, the indices of the first element found when searching column by column is returned. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a8a3779432dbf1db00faf44079f9a4129}{MinAbs} (const \hyperlink{classDMatrix}{DMatrix} \&A, int $\ast$rindx=NULL, int $\ast$cindx=NULL) -\begin{DoxyCompactList}\small\item\em This function finds and returns the element of matrix A with minimum absolute value. It also returns the indices of such element. If more than one element has the same minimum absolute value, the indices of the first element found when searching column by column is returned. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_ad77fbdfed1b98748e430e4efc2c91856}{sort} (\hyperlink{classDMatrix}{DMatrix} \&x, int indx\mbox{[}$\,$\mbox{]}=NULL) -\begin{DoxyCompactList}\small\item\em This function sorts the input vector x in ascending order. Optionally, it also returns an integer array of sorted indices. If the input object is not a vector, then an error is thrown. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a6b5be996dbe79c22b1a6d616644a1b73}{sort} (\hyperlink{classDMatrix}{DMatrix} \&x, \hyperlink{classDMatrix}{DMatrix} \&indx) -\begin{DoxyCompactList}\small\item\em This function sorts the input vector x in ascending order. It also returns a \hyperlink{classDMatrix}{DMatrix} object with the sorted indices. If the input object is not a vector, then an error is thrown. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a28b13c78f679925c43ba7743e4def95e}{dotProduct} (const \hyperlink{classDMatrix}{DMatrix} \&x, const \hyperlink{classDMatrix}{DMatrix} \&y) -\begin{DoxyCompactList}\small\item\em This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_ae80c19e8c19de710f5790698e9568756}{dot} (const \hyperlink{classDMatrix}{DMatrix} \&x, const \hyperlink{classDMatrix}{DMatrix} \&y) -\begin{DoxyCompactList}\small\item\em This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a824f640d88220c84f5b31d9ed191c8ba}{crossProduct} (const \hyperlink{classDMatrix}{DMatrix} \&x, const \hyperlink{classDMatrix}{DMatrix} \&y) -\begin{DoxyCompactList}\small\item\em This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aaf0cb02dcd852ce56ccb39d550fa7c0a}{cross} (const \hyperlink{classDMatrix}{DMatrix} \&x, const \hyperlink{classDMatrix}{DMatrix} \&y) -\begin{DoxyCompactList}\small\item\em This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown. \item\end{DoxyCompactList}\item -int \hyperlink{classDMatrix_ad31c97e930c0fdc797ecd165f251fc27}{isSymmetric} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function checks if the input matrix is symmetric. If the input matrix is not square, an error is thrown. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a474926f74756b827c79b7127a84a4bb6}{cond} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function calculates the 2-\/norm condition number of a matrix, which is the ratio of the maximum singular value to the minimum singular value of the matrix. A large condition number indicates a nearly singular matrix. If the input matrix is not square, an error is thrown. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a5421e6760accac0eefb83d4a604e0612}{rcond} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function estimates the 1-\/norm reciprocal condition number of a matrix. The function uses the LAPACK function dgecon. if A is well conditioned, then rcond(A) is near 1. If A is badly conditioned, then rcond(A) is close to the machine numerical precision (very small). If the input matrix is not square, an error is thrown. \item\end{DoxyCompactList}\item -int \hyperlink{classDMatrix_a5379bc44e75307fc4f0242ef196ca2c8}{rank} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns an estimate of the rank of a matrix, which is the number of linearly independent rows or columns. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_aafe913bbf754d4c204e4d09033de4ff5}{det} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns the determinant of a square matrix. If the input matrix is not square, an error is thrown. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a25e61176fea3c03f41f8a4524a3a08b0}{trace} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns the trace of a square matrix. If the input matrix is not square, an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a210dc48c90f3be6b71e35784b3625633}{mean} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a row vector with the mean values of the columns of matrix A. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a7c163993971bbf77eb42200e73061eee}{Std} (const \hyperlink{classDMatrix}{DMatrix} \&A, int ntype=0) -\begin{DoxyCompactList}\small\item\em This function returns a row vector with the standard deviation of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-\/1), where n is the number of rows of A. Otherwise, the result is normalised with n. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a261380c58f5a12770bdecf4c0d57eddb}{cov} (const \hyperlink{classDMatrix}{DMatrix} \&A, int ntype=0) -\begin{DoxyCompactList}\small\item\em Computes the covariance matrix of a data matrix where the N rows correspond to samples and the M columns are variables. The result is returned as an M x M matrix. If ntype=0 (default) then the result is normalised with N-\/1. Otherwise, if ntype=1, the result is normalised with N. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ac4da4357ee63d240053aebfc8d687784}{cov} (\hyperlink{classDMatrix}{DMatrix} \&X, \hyperlink{classDMatrix}{DMatrix} \&Y, int ntype=0) -\begin{DoxyCompactList}\small\item\em Computes the covariance matrix of two vectors X and Y of dimension N. The result is returned as an 1 x 1 \hyperlink{classDMatrix}{DMatrix} object. If ntype=0 (default) then the result is normalised with N-\/1. Otherwise, if ntype=1, the result is normalised with N. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a45de81d6d9403a02c173fadc2ffb369a}{var} (\hyperlink{classDMatrix}{DMatrix} \&A, int ntype=0) -\begin{DoxyCompactList}\small\item\em This function returns a row vector with the variance of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-\/1), where n is the number of rows of A. Otherwise, the result is normalised with n. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a7c0db4e6107794b51335d3c767a9cb55}{sum} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a row vector with the sum of the elements of each column of matrix A. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a6cec987fa2c6fb5fb22aaa07e647adba}{prod} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a row vector with the product of the elements of each column of matrix A. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a4fcfc361ca88cbbf21c89c50eca932d8}{elemProduct} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function computes and returns the element-\/wise product of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a7d66bf14f6c28485a886ece99589d366}{elemDivision} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function computes and returns the element-\/wise division of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. The dimensions of the returned object are the same as the dimensions of the factors. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_adc052c1c9f76c909347b83f662fb5952}{kronProduct} (const \hyperlink{classDMatrix}{DMatrix} \&A, const \hyperlink{classDMatrix}{DMatrix} \&B) -\begin{DoxyCompactList}\small\item\em This function computes and returns the Kronecker product of two matrices. The row (column) dimension of the returned object is the product of the row (column) dimensions of both factors. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a643b82daee87c5738faac272b56e8ea8}{vec} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a column vector made by stacking the columns of a matrix one below the other from left to right. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a5fef948be5e07507f9e0c9cc11e6cd09}{MatrixSign} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions as the input matrix such that each of its elements is 1 is the corresponding value of the input matrix is positive, -\/1 if the corresponding value of the input matrix is negative, and 0 if the corresponding value of the input matrix is 0. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_addd401503db0026290c74a9ae860ba6a}{find} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns a column vector with the linear indices of the non-\/zero elements of the input matrix A. The linear index is 1 for element (1,1) of the input matrix A, and length(A) for the (nrows,ncols) element of the input matrix A. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a299e165ca173181d5efb78a2098f742c}{randu} (long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}, long \hyperlink{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd}{m}) -\begin{DoxyCompactList}\small\item\em This function returns an nxm matrix where each element is a uniform pseudo-\/random number in the range (0,1). \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a4bc7a80762269f95de50605fc87f0223}{randn} (long \hyperlink{classDMatrix_a6b7668991ff7d01230b3599836a5d682}{n}, long \hyperlink{classDMatrix_a9cb55e3ad06f81025fed1ffbb0ae28bd}{m}) -\begin{DoxyCompactList}\small\item\em This function returns an nxm matrix where each element is a Gaussian pseudo-\/random number in the range with zero mean and variance 1. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_aa3d52614c6e5b34caff46a462af5e48c}{linspace} (double X1, double X2, long N) -\begin{DoxyCompactList}\small\item\em This function returns a linearly spaced vector with N points between the values X1 and X2. \item\end{DoxyCompactList}\item -void \hyperlink{classDMatrix_a6067456d71764a846f24a141e77d00f3}{error\_\-message} (const char $\ast$input\_\-text) -\begin{DoxyCompactList}\small\item\em This function prints an error message and throws an exception to be handled by the \hyperlink{classErrorHandler}{ErrorHandler} class. \item\end{DoxyCompactList}\item -\hypertarget{classDMatrix_ace51fd7d8435f88c8b2b3bcf64367673}{ -void \hyperlink{classDMatrix_ace51fd7d8435f88c8b2b3bcf64367673}{tic} (void)} -\label{classDMatrix_ace51fd7d8435f88c8b2b3bcf64367673} - -\begin{DoxyCompactList}\small\item\em This function, which is to be used in conjunction with function \hyperlink{classDMatrix_a38664cf3d259198ae1e644736aa5e70e}{toc()}, starts counting elapsed CPU time. \item\end{DoxyCompactList}\item -double \hyperlink{classDMatrix_a38664cf3d259198ae1e644736aa5e70e}{toc} () -\begin{DoxyCompactList}\small\item\em This function, which is to be used in conjunction with function \hyperlink{classDMatrix_ace51fd7d8435f88c8b2b3bcf64367673}{tic()}, stops counting CPU time, and it prints and returns the elapsed time in seconds since the function \hyperlink{classDMatrix_ace51fd7d8435f88c8b2b3bcf64367673}{tic()} was called. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ae2a60a1294685079c39ea189bacdb4d2}{Sqrt} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function computes the square root of each element of the input matrix A, and it returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions as the input matrix. If any element of the input matrix is negative, an error is thrown. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_a8483633c05422fa0beb4fcad7276152f}{triu} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function extracts and return the triangular upper part of the input matrix A. The returned object has the same dimensions as the input object. \item\end{DoxyCompactList}\item -\hyperlink{classDMatrix}{DMatrix} \& \hyperlink{classDMatrix_ae626fae47c554940c8384933c6ca1e9f}{reshape} (\hyperlink{classDMatrix}{DMatrix} \&A, long N, long M) -\begin{DoxyCompactList}\small\item\em This function returns the N-\/by-\/M matrix whose elements are taken columnwise from the input matrix A. An error is thrown if A does not have N$\ast$M elements. \item\end{DoxyCompactList}\item -long \hyperlink{classDMatrix_a416133f8c3a457e0997f7f387697be62}{length} (const \hyperlink{classDMatrix}{DMatrix} \&A) -\begin{DoxyCompactList}\small\item\em This function returns the number of elements of a matrix A. \item\end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} -\hyperlink{classDMatrix}{DMatrix} class. A C++ class for dense and real matrix and vector computations with interfaces to a number of LAPACK functions - -\subsection{Constructor \& Destructor Documentation} -\hypertarget{classDMatrix_ae3911763fdae4b6f4d41772031c9a2da}{ -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\subsubsection[{DMatrix}]{\setlength{\rightskip}{0pt plus 5cm}DMatrix::DMatrix ( -\begin{DoxyParamCaption} -\item[{long}]{Initn, } -\item[{long}]{Initm} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_ae3911763fdae4b6f4d41772031c9a2da} - - -Constructor with dimensions. Creates a matrix with allocated storage given specified numbers of rows and columns. - - -\begin{DoxyParams}{Parameters} -{\em Initn,:} & number of rows \\ -\hline -{\em Initm,:} & number of columns \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_a4751cd36f1eb0b65f4c25eced0142192}{ -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\subsubsection[{DMatrix}]{\setlength{\rightskip}{0pt plus 5cm}DMatrix::DMatrix ( -\begin{DoxyParamCaption} -\item[{long}]{vDim, } -\item[{double $\ast$}]{v, } -\item[{long}]{Initn, } -\item[{long}]{Initm} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a4751cd36f1eb0b65f4c25eced0142192} - - -Constructor with dimensions using pre-\/allocated storage. - - -\begin{DoxyParams}{Parameters} -{\em vDim,:} & Allocated length of array v \\ -\hline -{\em v,:} & double array to be used as storage by the \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em Initn,:} & number of rows \\ -\hline -{\em Initm,:} & number of columns \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_a7e8d467c27e1dc57c2cdae0c28efea21}{ -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\subsubsection[{DMatrix}]{\setlength{\rightskip}{0pt plus 5cm}DMatrix::DMatrix ( -\begin{DoxyParamCaption} -\item[{long}]{Initn} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a7e8d467c27e1dc57c2cdae0c28efea21} - - -Constructor with a single dimension, creates a column vector. - - -\begin{DoxyParams}{Parameters} -{\em Initn,:} & number of rows \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_a823b4bf5f2957ea5c2d9339292237234}{ -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\subsubsection[{DMatrix}]{\setlength{\rightskip}{0pt plus 5cm}DMatrix::DMatrix ( -\begin{DoxyParamCaption} -\item[{long}]{Initn, } -\item[{long}]{Initm, } -\item[{double}]{a11, } -\item[{}]{...} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a823b4bf5f2957ea5c2d9339292237234} - - -Constructor using a variable list of element values. - - -\begin{DoxyParams}{Parameters} -{\em Initn,:} & number of rows \\ -\hline -{\em Initm,:} & number of columns \\ -\hline -{\em a11,:} & first element of list doubles, values are entered column by column \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_af8ff7b8c264b0390e20c2c9c58a03b64}{ -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\index{DMatrix@{DMatrix}!DMatrix@{DMatrix}} -\subsubsection[{DMatrix}]{\setlength{\rightskip}{0pt plus 5cm}DMatrix::DMatrix ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_af8ff7b8c264b0390e20c2c9c58a03b64} - - -Copy constructor. Creates a new \hyperlink{classDMatrix}{DMatrix} object with the same dimensions and element values as a given \hyperlink{classDMatrix}{DMatrix} object. - - -\begin{DoxyParams}{Parameters} -{\em A,:} & \hyperlink{classDMatrix}{DMatrix} object to be copied \\ -\hline -\end{DoxyParams} - - -\subsection{Member Function Documentation} -\hypertarget{classDMatrix_ac643c444a18419885b5ac5a2f8d003be}{ -\index{DMatrix@{DMatrix}!Allocate@{Allocate}} -\index{Allocate@{Allocate}!DMatrix@{DMatrix}} -\subsubsection[{Allocate}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::Allocate ( -\begin{DoxyParamCaption} -\item[{long}]{size} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}protected\mbox{]}}}} -\label{classDMatrix_ac643c444a18419885b5ac5a2f8d003be} - - -Allocate memory to store matrix elements. - - -\begin{DoxyParams}{Parameters} -{\em size} & number of double elements to allocate \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_a077cd396523652629a258cb11f469886}{DeAllocate()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_aadec35682639717d9bc698cfee3953ad}{ -\index{DMatrix@{DMatrix}!AllocateAuxArr@{AllocateAuxArr}} -\index{AllocateAuxArr@{AllocateAuxArr}!DMatrix@{DMatrix}} -\subsubsection[{AllocateAuxArr}]{\setlength{\rightskip}{0pt plus 5cm}static void DMatrix::AllocateAuxArr ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}static\mbox{]}}}} -\label{classDMatrix_aadec35682639717d9bc698cfee3953ad} - - -Allocates the array of auxiliary (temporary) objects used by the class. - -Allocates a \hyperlink{classDMatrix}{DMatrix} array of size N\_\-TEMP\_\-OBJECTS. Each element is allocated a storage of size D\_\-TEMP\_\-OBJECTS. These two macros are given default values but may be changed by the user at compilation time. The purpose of the array of temporary objects is to to store the intermediate objects resulting from single lines of code that call various operators and functions returning \hyperlink{classDMatrix}{DMatrix} objects. A simple example is as follows. Consider the C++ statement D= A$\ast$B + C; where A,B C and D are \hyperlink{classDMatrix}{DMatrix} objects. This statement involves two temporary objects: one to store the result of A$\ast$B, and another one to store the result of (A$\ast$B)+C; \begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_ab8c6ade7a8a3cfaae690572887575fdc}{ -\index{DMatrix@{DMatrix}!assign@{assign}} -\index{assign@{assign}!DMatrix@{DMatrix}} -\subsubsection[{assign}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::assign ( -\begin{DoxyParamCaption} -\item[{long}]{rows, } -\item[{long}]{columns, } -\item[{double}]{a11, } -\item[{}]{...} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_ab8c6ade7a8a3cfaae690572887575fdc} - - -Assigns values to the elements of an existing \hyperlink{classDMatrix}{DMatrix} object using a variable list of values. Resizes the matrix if necessary. - - -\begin{DoxyParams}{Parameters} -{\em rows,:} & number of rows \\ -\hline -{\em columns,:} & number of columns \\ -\hline -{\em a11,:} & first element of the list of double arguments. \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_a9630eee5b92eb0b651789204f91b55e7}{ -\index{DMatrix@{DMatrix}!AssignmentToColonReference@{AssignmentToColonReference}} -\index{AssignmentToColonReference@{AssignmentToColonReference}!DMatrix@{DMatrix}} -\subsubsection[{AssignmentToColonReference}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::AssignmentToColonReference ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}protected\mbox{]}}}} -\label{classDMatrix_a9630eee5b92eb0b651789204f91b55e7} - - -Assigns a matrix to the values pointed to by a colon reference matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -reference to \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_ac4080d0de15b606eac2a3e0ab34a8e13}{ -\index{DMatrix@{DMatrix}!AssignmentToColonReference@{AssignmentToColonReference}} -\index{AssignmentToColonReference@{AssignmentToColonReference}!DMatrix@{DMatrix}} -\subsubsection[{AssignmentToColonReference}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::AssignmentToColonReference ( -\begin{DoxyParamCaption} -\item[{double}]{arg} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}protected\mbox{]}}}} -\label{classDMatrix_ac4080d0de15b606eac2a3e0ab34a8e13} - - -Assigns a double value to each value pointed to by a colon reference matrix. - - -\begin{DoxyParams}{Parameters} -{\em arg} & is a double value to be assigned. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -reference to \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_a54df2f008095aa1ec06ecebce8073c38}{ -\index{DMatrix@{DMatrix}!colMult@{colMult}} -\index{colMult@{colMult}!DMatrix@{DMatrix}} -\subsubsection[{colMult}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::colMult ( -\begin{DoxyParamCaption} -\item[{long}]{c, } -\item[{double}]{x} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a54df2f008095aa1ec06ecebce8073c38} - - -Multiples the elements of a specified column of a matrix by a constant scalar value. - - -\begin{DoxyParams}{Parameters} -{\em c,:} & index to the column that is to be changed \\ -\hline -{\em x,:} & scalar value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_add29fc33eedb04efe3950fcc4c2a31dd}{ -\index{DMatrix@{DMatrix}!Column@{Column}} -\index{Column@{Column}!DMatrix@{DMatrix}} -\subsubsection[{Column}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::Column ( -\begin{DoxyParamCaption} -\item[{long}]{icol} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_add29fc33eedb04efe3950fcc4c2a31dd} - - -Returns a \hyperlink{classDMatrix}{DMatrix} object containing a speficied column of the calling object. - - -\begin{DoxyParams}{Parameters} -{\em icol,:} & column index (starting from 1) \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -\hyperlink{classDMatrix}{DMatrix} object with the specified column -\end{DoxyReturn} -\hypertarget{classDMatrix_a8935b0337db48a93dd91cb87c698b291}{ -\index{DMatrix@{DMatrix}!compMat@{compMat}} -\index{compMat@{compMat}!DMatrix@{DMatrix}} -\subsubsection[{compMat}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::compMat ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{m2, } -\item[{char}]{op} -\end{DoxyParamCaption} -) const\hspace{0.3cm}{\ttfamily \mbox{[}protected\mbox{]}}}} -\label{classDMatrix_a8935b0337db48a93dd91cb87c698b291} - - -Elementwise comparison of matrix elements. - - -\begin{DoxyParams}{Parameters} -{\em m2} & \hyperlink{classDMatrix}{DMatrix} object to be compared with the calling object. \\ -\hline -{\em op} & (char) indicates type of operator. Use 1 for $>$, 2 for $>$=,. 3 for $<$, 4 for $<$=, 5 for ==, 6 for != comparisons \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -A reference to a \hyperlink{classDMatrix}{DMatrix} object such that its elements are 1 if the comparison is true, 0 otherwise. -\end{DoxyReturn} -\hypertarget{classDMatrix_a077cd396523652629a258cb11f469886}{ -\index{DMatrix@{DMatrix}!DeAllocate@{DeAllocate}} -\index{DeAllocate@{DeAllocate}!DMatrix@{DMatrix}} -\subsubsection[{DeAllocate}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::DeAllocate ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}protected\mbox{]}}}} -\label{classDMatrix_a077cd396523652629a258cb11f469886} - - -De-\/allocate memory previously allocated with \hyperlink{classDMatrix_ac643c444a18419885b5ac5a2f8d003be}{DMatrix::Allocate()}. - -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_ac643c444a18419885b5ac5a2f8d003be}{Allocate()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_a6389bc3790f8b71dd59a8f2bd659fc27}{ -\index{DMatrix@{DMatrix}!DeAllocateAuxArr@{DeAllocateAuxArr}} -\index{DeAllocateAuxArr@{DeAllocateAuxArr}!DMatrix@{DMatrix}} -\subsubsection[{DeAllocateAuxArr}]{\setlength{\rightskip}{0pt plus 5cm}static void DMatrix::DeAllocateAuxArr ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}static\mbox{]}}}} -\label{classDMatrix_a6389bc3790f8b71dd59a8f2bd659fc27} - - -De-\/allocates the array of auxiliary (temporary) objects previously allocated by \hyperlink{classDMatrix_aadec35682639717d9bc698cfee3953ad}{AllocateAuxArr()} - -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_ae18275d9d832807ea53e4ccb93e461f0}{ -\index{DMatrix@{DMatrix}!diag@{diag}} -\index{diag@{diag}!DMatrix@{DMatrix}} -\subsubsection[{diag}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::diag ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{dd} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_ae18275d9d832807ea53e4ccb93e461f0} - - -Assigns values to the diagonal elements of a matrix, while all off-\/diagonal elements are set to zero. - -The dimensions of dd should be consistant with the dimensions of the calling object -\begin{DoxyParams}{Parameters} -{\em dd,:} & reference to constant \hyperlink{classDMatrix}{DMatrix} object which should contain a vector with the desired diagonal elements \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_ad07f4bea1e8e45647eb1514c1cb745be}{ -\index{DMatrix@{DMatrix}!elem@{elem}} -\index{elem@{elem}!DMatrix@{DMatrix}} -\subsubsection[{elem}]{\setlength{\rightskip}{0pt plus 5cm}double DMatrix::elem ( -\begin{DoxyParamCaption} -\item[{long}]{i, } -\item[{long}]{j} -\end{DoxyParamCaption} -) const\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_ad07f4bea1e8e45647eb1514c1cb745be} - - -Returns the value of a specified element of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em i,:} & row index (starting from 1) \\ -\hline -{\em j,:} & column index (starting from 1) \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -double value -\end{DoxyReturn} -\hypertarget{classDMatrix_afbeef8ed62a91eef48e8664f6a9accd0}{ -\index{DMatrix@{DMatrix}!elem@{elem}} -\index{elem@{elem}!DMatrix@{DMatrix}} -\subsubsection[{elem}]{\setlength{\rightskip}{0pt plus 5cm}double\& DMatrix::elem ( -\begin{DoxyParamCaption} -\item[{long}]{i, } -\item[{long}]{j} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_afbeef8ed62a91eef48e8664f6a9accd0} - - -Returns a reference to the specified element of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em i,:} & row index (starting from 1) \\ -\hline -{\em j,:} & column index (starting from 1) \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -double reference -\end{DoxyReturn} -\hypertarget{classDMatrix_a874f1e4a2796127f8efc9dedfe901603}{ -\index{DMatrix@{DMatrix}!element@{element}} -\index{element@{element}!DMatrix@{DMatrix}} -\subsubsection[{element}]{\setlength{\rightskip}{0pt plus 5cm}double DMatrix::element ( -\begin{DoxyParamCaption} -\item[{long}]{i, } -\item[{long}]{j} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a874f1e4a2796127f8efc9dedfe901603} - - -Returns the value of a specified element of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em i,:} & row index (starting from 1) \\ -\hline -{\em j,:} & column index (starting from 1) \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -double value -\end{DoxyReturn} -\hypertarget{classDMatrix_abebb69fbb1f71d2b49f575153bb36fee}{ -\index{DMatrix@{DMatrix}!FillWithZeros@{FillWithZeros}} -\index{FillWithZeros@{FillWithZeros}!DMatrix@{DMatrix}} -\subsubsection[{FillWithZeros}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::FillWithZeros ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_abebb69fbb1f71d2b49f575153bb36fee} - - -Assigns a zero value to each element of a matrix. - -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a8b15c0468cccb85d5102e4e1138e8f44}{ -\index{DMatrix@{DMatrix}!find@{find}} -\index{find@{find}!DMatrix@{DMatrix}} -\subsubsection[{find}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::find ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} \&}]{I, } -\item[{{\bf DMatrix} \&}]{J} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a8b15c0468cccb85d5102e4e1138e8f44} - - -Finds non-\/zero values of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em I,:} & \hyperlink{classDMatrix}{DMatrix} object with the row index of each non-\/zero element \\ -\hline -{\em J,:} & \hyperlink{classDMatrix}{DMatrix} object with the column index of each non-\/zero element \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -\hyperlink{classDMatrix}{DMatrix} object with the same dimensions as the calling object, and with elements which are 0 if the corresponding element of the calling object is 0, 1 otherwise. -\end{DoxyReturn} -\hypertarget{classDMatrix_abf563652a938b64d2074d734584b738c}{ -\index{DMatrix@{DMatrix}!find@{find}} -\index{find@{find}!DMatrix@{DMatrix}} -\subsubsection[{find}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::find ( -\begin{DoxyParamCaption} -\item[{int $\ast$}]{I, } -\item[{int $\ast$}]{J} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_abf563652a938b64d2074d734584b738c} - - -Finds non-\/zero values of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em I,:} & C++ double array with the row index of each non-\/zero element \\ -\hline -{\em J,:} & C++ double array with the column index of each non-\/zero element \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -\hyperlink{classDMatrix}{DMatrix} object with the same dimensions as the calling object, and with elements which are 0 if the corresponding element of the calling object is 0, 1 otherwise. -\end{DoxyReturn} -\hypertarget{classDMatrix_a3470a954caccffa3bec8b134c2e5f179}{ -\index{DMatrix@{DMatrix}!Fprint@{Fprint}} -\index{Fprint@{Fprint}!DMatrix@{DMatrix}} -\subsubsection[{Fprint}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::Fprint ( -\begin{DoxyParamCaption} -\item[{FILE $\ast$}]{filex} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a3470a954caccffa3bec8b134c2e5f179} - - -Prints the elements of a matrix elements matrix to a file. - - -\begin{DoxyParams}{Parameters} -{\em filex} & is a pointer to a file already opened using \char`\"{}fopen()\char`\"{}. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a48e4e74d3cd7affb6af7d1d0beaca129}{ -\index{DMatrix@{DMatrix}!geta@{geta}} -\index{geta@{geta}!DMatrix@{DMatrix}} -\subsubsection[{geta}]{\setlength{\rightskip}{0pt plus 5cm}double$\ast$ DMatrix::geta ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a48e4e74d3cd7affb6af7d1d0beaca129} - - -Gets a pointer to the array where the elements of the matrix are stored. - -\begin{DoxyReturn}{Returns} -double pointer -\end{DoxyReturn} -\hypertarget{classDMatrix_a34b0f1e03bfc35e7e6ac298d21ca78c7}{ -\index{DMatrix@{DMatrix}!getatype@{getatype}} -\index{getatype@{getatype}!DMatrix@{DMatrix}} -\subsubsection[{getatype}]{\setlength{\rightskip}{0pt plus 5cm}int DMatrix::getatype ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a34b0f1e03bfc35e7e6ac298d21ca78c7} - - -Gets the type of element storage of a matrix. - -\begin{DoxyReturn}{Returns} -int value: 0 if the array is allocated, 1 if the storage is done using a previously declared array of doubles. -\end{DoxyReturn} -\hypertarget{classDMatrix_adfa26d6b647b74af5f592d51bf70e8f4}{ -\index{DMatrix@{DMatrix}!GetAuxPr@{GetAuxPr}} -\index{GetAuxPr@{GetAuxPr}!DMatrix@{DMatrix}} -\subsubsection[{GetAuxPr}]{\setlength{\rightskip}{0pt plus 5cm}static {\bf DMatrix}$\ast$$\ast$ DMatrix::GetAuxPr ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline, static\mbox{]}}}} -\label{classDMatrix_adfa26d6b647b74af5f592d51bf70e8f4} - - -Gets a pointer to the array of auxiliary objects. - -\begin{DoxyReturn}{Returns} -DMatrix$\ast$$\ast$ pointer -\end{DoxyReturn} -\hypertarget{classDMatrix_a2b8280816c4f3508d522462fd09732cf}{ -\index{DMatrix@{DMatrix}!GetConstPr@{GetConstPr}} -\index{GetConstPr@{GetConstPr}!DMatrix@{DMatrix}} -\subsubsection[{GetConstPr}]{\setlength{\rightskip}{0pt plus 5cm}double$\ast$ DMatrix::GetConstPr ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -) const\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a2b8280816c4f3508d522462fd09732cf} - - -Gets a pointer to the array where the elements of the matrix are stored (for const objects) - -\begin{DoxyReturn}{Returns} -double pointer -\end{DoxyReturn} -\hypertarget{classDMatrix_a1954420b4966f38c5ed7e386648f087b}{ -\index{DMatrix@{DMatrix}!getm@{getm}} -\index{getm@{getm}!DMatrix@{DMatrix}} -\subsubsection[{getm}]{\setlength{\rightskip}{0pt plus 5cm}long DMatrix::getm ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a1954420b4966f38c5ed7e386648f087b} - - -Gets the number of columns from the calling object. - -\begin{DoxyReturn}{Returns} -long value with the number of columns -\end{DoxyReturn} -\hypertarget{classDMatrix_a61fb36c4c0b342f7aabc0c709e761c26}{ -\index{DMatrix@{DMatrix}!getm@{getm}} -\index{getm@{getm}!DMatrix@{DMatrix}} -\subsubsection[{getm}]{\setlength{\rightskip}{0pt plus 5cm}long DMatrix::getm ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -) const\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a61fb36c4c0b342f7aabc0c709e761c26} - - -Gets the number of columns from the calling object. - -\begin{DoxyReturn}{Returns} -long value with the number of columns -\end{DoxyReturn} -\hypertarget{classDMatrix_a8617eafafa13e38ba6dd7d0265b1c9a3}{ -\index{DMatrix@{DMatrix}!GetMType@{GetMType}} -\index{GetMType@{GetMType}!DMatrix@{DMatrix}} -\subsubsection[{GetMType}]{\setlength{\rightskip}{0pt plus 5cm}int DMatrix::GetMType ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline, protected\mbox{]}}}} -\label{classDMatrix_a8617eafafa13e38ba6dd7d0265b1c9a3} - - -Gets the type of matrix. - -\begin{DoxyReturn}{Returns} -int value -\end{DoxyReturn} -\hypertarget{classDMatrix_ae9ea1cd2a83a4e84e072b62addd825cc}{ -\index{DMatrix@{DMatrix}!getn@{getn}} -\index{getn@{getn}!DMatrix@{DMatrix}} -\subsubsection[{getn}]{\setlength{\rightskip}{0pt plus 5cm}long DMatrix::getn ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_ae9ea1cd2a83a4e84e072b62addd825cc} - - -Gets the number of rows from the calling object. - -\begin{DoxyReturn}{Returns} -long value with the number of rows. -\end{DoxyReturn} -\hypertarget{classDMatrix_a569af1f26034f5450d059637c9ea909e}{ -\index{DMatrix@{DMatrix}!getn@{getn}} -\index{getn@{getn}!DMatrix@{DMatrix}} -\subsubsection[{getn}]{\setlength{\rightskip}{0pt plus 5cm}long DMatrix::getn ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -) const\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a569af1f26034f5450d059637c9ea909e} - - -Gets the number of rows from the calling object. - -\begin{DoxyReturn}{Returns} -long value with the number of rows. -\end{DoxyReturn} -\hypertarget{classDMatrix_a16ac005120f99416a8e914aa1119eff1}{ -\index{DMatrix@{DMatrix}!GetNoCols@{GetNoCols}} -\index{GetNoCols@{GetNoCols}!DMatrix@{DMatrix}} -\subsubsection[{GetNoCols}]{\setlength{\rightskip}{0pt plus 5cm}long DMatrix::GetNoCols ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a16ac005120f99416a8e914aa1119eff1} - - -Gets the number of columns from the calling object. - -\begin{DoxyReturn}{Returns} -long value with the number of columns -\end{DoxyReturn} -\hypertarget{classDMatrix_a8b234f10a804f49ccf711051ac022156}{ -\index{DMatrix@{DMatrix}!GetNoCols@{GetNoCols}} -\index{GetNoCols@{GetNoCols}!DMatrix@{DMatrix}} -\subsubsection[{GetNoCols}]{\setlength{\rightskip}{0pt plus 5cm}long DMatrix::GetNoCols ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -) const\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a8b234f10a804f49ccf711051ac022156} - - -Gets the number of columns from the calling object. - -\begin{DoxyReturn}{Returns} -long value with the number of columns -\end{DoxyReturn} -\hypertarget{classDMatrix_a45ab6509deee2a3e1a13d27e2b3e929e}{ -\index{DMatrix@{DMatrix}!GetNoRows@{GetNoRows}} -\index{GetNoRows@{GetNoRows}!DMatrix@{DMatrix}} -\subsubsection[{GetNoRows}]{\setlength{\rightskip}{0pt plus 5cm}long DMatrix::GetNoRows ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -) const\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a45ab6509deee2a3e1a13d27e2b3e929e} - - -Gets the number of rows from the calling object. - -\begin{DoxyReturn}{Returns} -long value with the number of rows. -\end{DoxyReturn} -\hypertarget{classDMatrix_ac5729ab1d4162789c067ed4928ea86e5}{ -\index{DMatrix@{DMatrix}!GetNoRows@{GetNoRows}} -\index{GetNoRows@{GetNoRows}!DMatrix@{DMatrix}} -\subsubsection[{GetNoRows}]{\setlength{\rightskip}{0pt plus 5cm}long DMatrix::GetNoRows ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_ac5729ab1d4162789c067ed4928ea86e5} - - -Gets the number of rows from the calling object. - -\begin{DoxyReturn}{Returns} -long value with the number of rows. -\end{DoxyReturn} -\hypertarget{classDMatrix_aeda5a29d08ef2a98344d65ba37fe53b1}{ -\index{DMatrix@{DMatrix}!GetPr@{GetPr}} -\index{GetPr@{GetPr}!DMatrix@{DMatrix}} -\subsubsection[{GetPr}]{\setlength{\rightskip}{0pt plus 5cm}double$\ast$ DMatrix::GetPr ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_aeda5a29d08ef2a98344d65ba37fe53b1} - - -Gets the pointer to the array where the elements of the matrix are stored. - -\begin{DoxyReturn}{Returns} -double pointer -\end{DoxyReturn} -\hypertarget{classDMatrix_a9bb99d0f897fe9e23b5370e11bf80d3f}{ -\index{DMatrix@{DMatrix}!GetReferencedDMatrixPointer@{GetReferencedDMatrixPointer}} -\index{GetReferencedDMatrixPointer@{GetReferencedDMatrixPointer}!DMatrix@{DMatrix}} -\subsubsection[{GetReferencedDMatrixPointer}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}$\ast$ DMatrix::GetReferencedDMatrixPointer ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline, protected\mbox{]}}}} -\label{classDMatrix_a9bb99d0f897fe9e23b5370e11bf80d3f} - - -Gets the value of the referenced matrix pointer. - -\begin{DoxyReturn}{Returns} -pointer to \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_a414e84e3c2c91900f44b58a9d09d0acc}{ -\index{DMatrix@{DMatrix}!input\_\-matrix@{input\_\-matrix}} -\index{input\_\-matrix@{input\_\-matrix}!DMatrix@{DMatrix}} -\subsubsection[{input\_\-matrix}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::input\_\-matrix ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a414e84e3c2c91900f44b58a9d09d0acc} - - -Allows the user to enter the elements of a matrix using command line prompts. - -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a5616c72557eae51c38af63f6684391d0}{ -\index{DMatrix@{DMatrix}!isEmpty@{isEmpty}} -\index{isEmpty@{isEmpty}!DMatrix@{DMatrix}} -\subsubsection[{isEmpty}]{\setlength{\rightskip}{0pt plus 5cm}int DMatrix::isEmpty ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a5616c72557eae51c38af63f6684391d0} - - -Check if a matrix object is empty, if other words this method checks if the calling object has zero elements. - -\begin{DoxyReturn}{Returns} -int value: 0 if calling object is not empty, 1 otherwise -\end{DoxyReturn} -\hypertarget{classDMatrix_a3c854cc931571f2eba43f374e17ff18d}{ -\index{DMatrix@{DMatrix}!isThereError@{isThereError}} -\index{isThereError@{isThereError}!DMatrix@{DMatrix}} -\subsubsection[{isThereError}]{\setlength{\rightskip}{0pt plus 5cm}static int DMatrix::isThereError ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline, static\mbox{]}}}} -\label{classDMatrix_a3c854cc931571f2eba43f374e17ff18d} - - -Checks if the error flag has been raised. If so, a 1 is returned, 0 otherwise. - -\begin{DoxyReturn}{Returns} -int value -\end{DoxyReturn} -\hypertarget{classDMatrix_a05a0f57ed7ed6cc3d57d9294d48ee4cc}{ -\index{DMatrix@{DMatrix}!isVector@{isVector}} -\index{isVector@{isVector}!DMatrix@{DMatrix}} -\subsubsection[{isVector}]{\setlength{\rightskip}{0pt plus 5cm}int DMatrix::isVector ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -) const\hspace{0.3cm}{\ttfamily \mbox{[}inline\mbox{]}}}} -\label{classDMatrix_a05a0f57ed7ed6cc3d57d9294d48ee4cc} - - -Check if a matrix object contains a row or column vector. - -\begin{DoxyReturn}{Returns} -int value: 1 if calling object is a vector, 0 otherwise -\end{DoxyReturn} -\hypertarget{classDMatrix_a26e8a17738092057014b0b72ef99c661}{ -\index{DMatrix@{DMatrix}!Load@{Load}} -\index{Load@{Load}!DMatrix@{DMatrix}} -\subsubsection[{Load}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::Load ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{FileName} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a26e8a17738092057014b0b72ef99c661} - - -Reads the elements of a matrix from a file. - -The calling object should have the appropriate number of rows and columns. -\begin{DoxyParams}{Parameters} -{\em FileName} & is a string with the file name where the matrix elements are stored. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a0363c3677623145f180fe42d294c6ede}{ -\index{DMatrix@{DMatrix}!MemCpyArray@{MemCpyArray}} -\index{MemCpyArray@{MemCpyArray}!DMatrix@{DMatrix}} -\subsubsection[{MemCpyArray}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::MemCpyArray ( -\begin{DoxyParamCaption} -\item[{double $\ast$}]{aptr} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a0363c3677623145f180fe42d294c6ede} - - -Copies values to the elements of a \hyperlink{classDMatrix}{DMatrix} object from an existing array. The number of elements of the \hyperlink{classDMatrix}{DMatrix} object is assumed to be the number of values to be copied. - - -\begin{DoxyParams}{Parameters} -{\em aptr,:} & pointer to the start of the array of doubles to be copied. \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_aeb2c289d9a40b0869f2fef29ffd6340e}{ -\index{DMatrix@{DMatrix}!mpow@{mpow}} -\index{mpow@{mpow}!DMatrix@{DMatrix}} -\subsubsection[{mpow}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::mpow ( -\begin{DoxyParamCaption} -\item[{int}]{p} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_aeb2c289d9a40b0869f2fef29ffd6340e} - - -Computes and returns the integer power of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em p,:} & integer value, starting from 0 \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -\hyperlink{classDMatrix}{DMatrix} object with the result of the calculation -\end{DoxyReturn} -\hypertarget{classDMatrix_a475f14adcb18e617464bd66021fc4ca2}{ -\index{DMatrix@{DMatrix}!operator!=@{operator!=}} -\index{operator!=@{operator!=}!DMatrix@{DMatrix}} -\subsubsection[{operator!=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator!= ( -\begin{DoxyParamCaption} -\item[{double}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a475f14adcb18e617464bd66021fc4ca2} - - -Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is different from the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & right hand side value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a50d36066d7917dee27b67665b91d78a3}{ -\index{DMatrix@{DMatrix}!operator!=@{operator!=}} -\index{operator!=@{operator!=}!DMatrix@{DMatrix}} -\subsubsection[{operator!=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator!= ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a50d36066d7917dee27b67665b91d78a3} - - -Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is different from the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & val: right hand side object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_aa26baf81cd578c80fed72d7b6179ad1f}{ -\index{DMatrix@{DMatrix}!operator\%@{operator\%}} -\index{operator\%@{operator\%}!DMatrix@{DMatrix}} -\subsubsection[{operator\%}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator\% ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_aa26baf81cd578c80fed72d7b6179ad1f} - - -Computes the left division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the inverse of the left object by the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The left hand side object must be a square matrix. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & \hyperlink{classDMatrix}{DMatrix} object at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a051fc52a9620318d04dd454d7970d319}{ -\index{DMatrix@{DMatrix}!operator\&@{operator\&}} -\index{operator\&@{operator\&}!DMatrix@{DMatrix}} -\subsubsection[{operator\&}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator\& ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix}}]{B} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a051fc52a9620318d04dd454d7970d319} - - -Elementwise product operator. Returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions of the calling objects and each of its elements is computed as the product of the corresponding elements of the calling object and the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the $\ast$ operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A\&B). - - -\begin{DoxyParams}{Parameters} -{\em B,:} & \hyperlink{classDMatrix}{DMatrix} object at the right hand side of the operator \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a0346b7c7d5952c7dbae995150ee40476}{ -\index{DMatrix@{DMatrix}!operator\&\&@{operator\&\&}} -\index{operator\&\&@{operator\&\&}!DMatrix@{DMatrix}} -\subsubsection[{operator\&\&}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator\&\& ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a0346b7c7d5952c7dbae995150ee40476} - - -Stacks the right hand side matrix below the left hand side matrix. The dimensions number of columns of the matrices involved must be the same, otherwise an error is thrown. The number of rows of the resulting matrix is the addition of the number of rows of both matrices involved. - - -\begin{DoxyParams}{Parameters} -{\em B,:} & \hyperlink{classDMatrix}{DMatrix} object at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_aad182b5dbdaa8ec1911904639d5626de}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{RowIndx, } -\item[{long}]{col} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_aad182b5dbdaa8ec1911904639d5626de} - - -Sub-\/vector extraction and referencing using an array of row indices for a given column. - - -\begin{DoxyParams}{Parameters} -{\em RowIndx} & is a \hyperlink{classDMatrix}{DMatrix} array that contains row index values usually generated using the \hyperlink{classDMatrix_a2987194d90eec1f076a329414ac07278}{colon()} function. \\ -\hline -{\em col} & is a column index \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a \hyperlink{classDMatrix}{DMatrix} mtype 1 object that maps to the referenced elements of the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_aca1e6c7d7c8859a705bc87674003a194}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{end, } -\item[{long}]{col} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_aca1e6c7d7c8859a705bc87674003a194} - - -Matrix indexing. Returns the value of the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation. - - -\begin{DoxyParams}{Parameters} -{\em end,:} & Character string containing the word \char`\"{}end\char`\"{}. \\ -\hline -{\em col,:} & Column index starting from 1. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -double value of the indexed matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_a107a1b256e91c653cd48a863ba063494}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{end} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a107a1b256e91c653cd48a863ba063494} - - -Access to last linear element. Returns the value of the last linear matrix element, assuming column major storage. - - -\begin{DoxyParams}{Parameters} -{\em end,:} & Character string containing the word \char`\"{}end\char`\"{}. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -value of the last matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_ad9815228adc3856c7cdc8ecca281d5a3}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{end, } -\item[{const {\bf DMatrix} \&}]{ColIndx} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_ad9815228adc3856c7cdc8ecca281d5a3} - - -Sub-\/vector extraction and referencing using an array of column indices for the last column of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em end} & is a character string containing the word \char`\"{}end\char`\"{}. \\ -\hline -{\em ColIndx} & is a \hyperlink{classDMatrix}{DMatrix} array that contains column index values usually generated using the \hyperlink{classDMatrix_a2987194d90eec1f076a329414ac07278}{colon()} function. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a \hyperlink{classDMatrix}{DMatrix} mtype 1 object that maps to the referenced elements of the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_a8a1118191a95c48e44043ddb89dbd826}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{end} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a8a1118191a95c48e44043ddb89dbd826} - - -Access to last linear element. Returns a reference to the last linear matrix element, assuming column major storage. - - -\begin{DoxyParams}{Parameters} -{\em end,:} & Character string containing the word \char`\"{}end\char`\"{}. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -reference to indexed matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_a2716e6ec24ea80068a5baec55e98c370}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{RowIndx, } -\item[{const {\bf DMatrix} \&}]{ColIndx} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a2716e6ec24ea80068a5baec55e98c370} - - -Submatrix extraction and referencing using arrays of indices. - - -\begin{DoxyParams}{Parameters} -{\em RowIndx} & is a \hyperlink{classDMatrix}{DMatrix} array that contains row index values usually generated using the \hyperlink{classDMatrix_a2987194d90eec1f076a329414ac07278}{colon()} function. \\ -\hline -{\em ColIndx} & is a \hyperlink{classDMatrix}{DMatrix} array that contains column index values usually generated using the \hyperlink{classDMatrix_a2987194d90eec1f076a329414ac07278}{colon()} function. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a \hyperlink{classDMatrix}{DMatrix} mtype 1 object that maps to the referenced elements of the calling object. -\end{DoxyReturn} -\hypertarget{classDMatrix_a160cbc57bd615ceb60ebdb500371a37c}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{RowIndx} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a160cbc57bd615ceb60ebdb500371a37c} - - -Linear sub-\/vector extraction and referencing using an array of indices assuming column-\/major storage. - - -\begin{DoxyParams}{Parameters} -{\em RowIndx} & is a \hyperlink{classDMatrix}{DMatrix} array that contains row index values usually generated using the \hyperlink{classDMatrix_a2987194d90eec1f076a329414ac07278}{colon()} function. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a \hyperlink{classDMatrix}{DMatrix} mtype 1 object that maps to the referenced elements of the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_ad944a2f5b2df21a1ae752f368e257f34}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{long}]{row, } -\item[{long}]{col} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_ad944a2f5b2df21a1ae752f368e257f34} - - -Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row and column indices. Indices start from 1. - - -\begin{DoxyParams}{Parameters} -{\em row,:} & Row index starting from 1. \\ -\hline -{\em col,:} & Column index starting from 1. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the indexed matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_a15adc46b55cb516b67bb408447f8275e}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{long}]{row, } -\item[{const char $\ast$}]{end} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a15adc46b55cb516b67bb408447f8275e} - - -Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of zero or negative indices. The matrix is resized if necessary. - - -\begin{DoxyParams}{Parameters} -{\em row,:} & Row index starting from 1. \\ -\hline -{\em end,:} & Character string containing the word \char`\"{}end\char`\"{}. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the indexed matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_a430e6b0a88061c4fe70e1c64ccaf285a}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{end, } -\item[{long}]{col} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a430e6b0a88061c4fe70e1c64ccaf285a} - - -Matrix indexing. Returns a reference to the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation. - - -\begin{DoxyParams}{Parameters} -{\em end,:} & Character string containing the word \char`\"{}end\char`\"{}. \\ -\hline -{\em col,:} & Column index starting from 1. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the indexed matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_af44540d97b6e449fd3f1551956ea2518}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{long}]{row, } -\item[{const {\bf DMatrix} \&}]{ColIndx} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_af44540d97b6e449fd3f1551956ea2518} - - -Sub-\/vector extraction and referencing using an array of column indices for a given row. - - -\begin{DoxyParams}{Parameters} -{\em row} & is a row index. \\ -\hline -{\em ColIndx} & is a \hyperlink{classDMatrix}{DMatrix} array that contains column index values usually generated using the \hyperlink{classDMatrix_a2987194d90eec1f076a329414ac07278}{colon()} function. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a \hyperlink{classDMatrix}{DMatrix} mtype 1 object that maps to the referenced elements of the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_aafb023a91a09e10f3c95414b29a32d22}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{long}]{row, } -\item[{const char $\ast$}]{end} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_aafb023a91a09e10f3c95414b29a32d22} - - -Matrix indexing. Returns the value of the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of a range violation. - - -\begin{DoxyParams}{Parameters} -{\em row,:} & Row index starting from 1. \\ -\hline -{\em end,:} & Character string containing the word \char`\"{}end\char`\"{}. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -double value of the indexed matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_a6f6ad5489850d8200b6a49c9da098877}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{long}]{index} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a6f6ad5489850d8200b6a49c9da098877} - - -Single index matrix indexing. Returns a reference to the matrix element located at the linear position indicated by the index, assuming column major storage. The indexs start from 1. The matrix is resized if necessary. An error is thrown in case of zero or negative indices. - - -\begin{DoxyParams}{Parameters} -{\em index,:} & index value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -reference to indexed matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_a847dc65e8a09a3274b7a6e54acb37a17}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{RowIndx, } -\item[{const char $\ast$}]{end} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a847dc65e8a09a3274b7a6e54acb37a17} - - -Sub-\/vector extraction and referencing using an array of row indices for the last column of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em RowIndx} & is a \hyperlink{classDMatrix}{DMatrix} array that contains row index values usually generated using the \hyperlink{classDMatrix_a2987194d90eec1f076a329414ac07278}{colon()} function. \\ -\hline -{\em end} & is a character string containing the word \char`\"{}end\char`\"{}. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a \hyperlink{classDMatrix}{DMatrix} mtype 1 object that maps to the referenced elements of the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_a181f357abea59bca3f4d9efb16fb5618}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{long}]{k} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a181f357abea59bca3f4d9efb16fb5618} - - -Single index matrix indexing. Returns the value of the matrix element located at the linear position indicated by the index, assuming column major storage. The index starts from 1. An error is thrown in case of range error. - - -\begin{DoxyParams}{Parameters} -{\em k,:} & index value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Value of indexed matrix element. -\end{DoxyReturn} -\hypertarget{classDMatrix_a1e736f0992464a5d849ebbe5a4eb3bbf}{ -\index{DMatrix@{DMatrix}!operator()@{operator()}} -\index{operator()@{operator()}!DMatrix@{DMatrix}} -\subsubsection[{operator()}]{\setlength{\rightskip}{0pt plus 5cm}double DMatrix::operator() ( -\begin{DoxyParamCaption} -\item[{long}]{row, } -\item[{long}]{col} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a1e736f0992464a5d849ebbe5a4eb3bbf} - - -Matrix indexing. Returns the value of the matrix element located at the position indicated by the row and column indices. Indices start from 1. An error in thrown in case of a range violation. - - -\begin{DoxyParams}{Parameters} -{\em row,:} & Row index starting from 1. \\ -\hline -{\em col,:} & Column index starting from 1. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -double value of the indexed element. -\end{DoxyReturn} -\hypertarget{classDMatrix_a17a7fbea90ec8a16e4ced726128d4b5f}{ -\index{DMatrix@{DMatrix}!operator$\ast$@{operator$\ast$}} -\index{operator$\ast$@{operator$\ast$}!DMatrix@{DMatrix}} -\subsubsection[{operator$\ast$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$\ast$ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a17a7fbea90ec8a16e4ced726128d4b5f} - - -Matrix product operator. Returns the result of the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & matrix located at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a671296ddd1c619d1ee31a308ac56840c}{ -\index{DMatrix@{DMatrix}!operator$\ast$@{operator$\ast$}} -\index{operator$\ast$@{operator$\ast$}!DMatrix@{DMatrix}} -\subsubsection[{operator$\ast$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$\ast$ ( -\begin{DoxyParamCaption} -\item[{double}]{Arg} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a671296ddd1c619d1ee31a308ac56840c} - - -Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. - - -\begin{DoxyParams}{Parameters} -{\em Arg,:} & double value that will multiply each element of the matrix. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference the calling \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_afe1c2b5daad8e441bb1da8edeccbe6a2}{ -\index{DMatrix@{DMatrix}!operator$\ast$=@{operator$\ast$=}} -\index{operator$\ast$=@{operator$\ast$=}!DMatrix@{DMatrix}} -\subsubsection[{operator$\ast$=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$\ast$= ( -\begin{DoxyParamCaption} -\item[{double}]{Arg} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_afe1c2b5daad8e441bb1da8edeccbe6a2} - - -Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value), and modifies the calling object to store the result of the operation. - - -\begin{DoxyParams}{Parameters} -{\em Arg,:} & double value that will multiply each element of the matrix. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the calling \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_abda7d982b252b058549dbe48ec1276ba}{ -\index{DMatrix@{DMatrix}!operator$\ast$=@{operator$\ast$=}} -\index{operator$\ast$=@{operator$\ast$=}!DMatrix@{DMatrix}} -\subsubsection[{operator$\ast$=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$\ast$= ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_abda7d982b252b058549dbe48ec1276ba} - - -Matrix product operator with substitution. Computes the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown. The calling object is modified to store the results of the operation. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & matrix located at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the calling \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_ac87ec83dbff242d422e1cb369bd2ca88}{ -\index{DMatrix@{DMatrix}!operator+@{operator+}} -\index{operator+@{operator+}!DMatrix@{DMatrix}} -\subsubsection[{operator+}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator+ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_ac87ec83dbff242d422e1cb369bd2ca88} - - -Matrix addition operator. The sizes of the matrices being added should be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & matrix located at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a666ade216863c56a4c349bb8fee0b972}{ -\index{DMatrix@{DMatrix}!operator+@{operator+}} -\index{operator+@{operator+}!DMatrix@{DMatrix}} -\subsubsection[{operator+}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator+ ( -\begin{DoxyParamCaption} -\item[{double}]{x} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a666ade216863c56a4c349bb8fee0b972} - - -Adds a scalar real value to each element of the matrix. . - - -\begin{DoxyParams}{Parameters} -{\em x,:} & double value to be added \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_add9bb19634bb522c9e877491094e738c}{ -\index{DMatrix@{DMatrix}!operator+=@{operator+=}} -\index{operator+=@{operator+=}!DMatrix@{DMatrix}} -\subsubsection[{operator+=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator+= ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_add9bb19634bb522c9e877491094e738c} - - -Matrix addition and substitution operator. The sizes of the matrices being added should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & matrix located right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_ac0a611dd59097d0a3920abf376d054e7}{ -\index{DMatrix@{DMatrix}!operator-\/@{operator-\/}} -\index{operator-\/@{operator-\/}!DMatrix@{DMatrix}} -\subsubsection[{operator-\/}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator-\/ ( -\begin{DoxyParamCaption} -\item[{double}]{x} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_ac0a611dd59097d0a3920abf376d054e7} - - -Subtracts a scalar real value from each element of the matrix. . - - -\begin{DoxyParams}{Parameters} -{\em x,:} & double value to be subtracted \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_adf28e5ff346309620d9dded905cf5b22}{ -\index{DMatrix@{DMatrix}!operator-\/@{operator-\/}} -\index{operator-\/@{operator-\/}!DMatrix@{DMatrix}} -\subsubsection[{operator-\/}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator-\/ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_adf28e5ff346309620d9dded905cf5b22} - - -Matrix subtraction operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & matrix located at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a9535ca71463a4e2f687b680569c9dd75}{ -\index{DMatrix@{DMatrix}!operator-\/=@{operator-\/=}} -\index{operator-\/=@{operator-\/=}!DMatrix@{DMatrix}} -\subsubsection[{operator-\/=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator-\/= ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a9535ca71463a4e2f687b680569c9dd75} - - -Matrix subtraction and substitution operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & matrix located right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_a3b8d471ba4ef3cd2e9dc5931e5b77e01}{ -\index{DMatrix@{DMatrix}!operator/@{operator/}} -\index{operator/@{operator/}!DMatrix@{DMatrix}} -\subsubsection[{operator/}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator/ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a3b8d471ba4ef3cd2e9dc5931e5b77e01} - - -Computes the right division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the left object by the inverse of the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The right hand side object must be a square matrix. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & \hyperlink{classDMatrix}{DMatrix} object at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ae58c7f379fbb88acad6b704961f7029c}{ -\index{DMatrix@{DMatrix}!operator/@{operator/}} -\index{operator/@{operator/}!DMatrix@{DMatrix}} -\subsubsection[{operator/}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator/ ( -\begin{DoxyParamCaption} -\item[{double}]{Arg} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_ae58c7f379fbb88acad6b704961f7029c} - - -Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value). - - -\begin{DoxyParams}{Parameters} -{\em Arg,:} & double value that will divide each element of the matrix. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ab57902d452e18ec32edbfb300a59940f}{ -\index{DMatrix@{DMatrix}!operator/=@{operator/=}} -\index{operator/=@{operator/=}!DMatrix@{DMatrix}} -\subsubsection[{operator/=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator/= ( -\begin{DoxyParamCaption} -\item[{double}]{Arg} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_ab57902d452e18ec32edbfb300a59940f} - - -Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value) and modifies the left hand side object with the result of the operation. - - -\begin{DoxyParams}{Parameters} -{\em Arg,:} & double value that will divide each element of the matrix. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_a60f1f1c8766a649c91c64243a7f37b77}{ -\index{DMatrix@{DMatrix}!operator$<$@{operator$<$}} -\index{operator$<$@{operator$<$}!DMatrix@{DMatrix}} -\subsubsection[{operator$<$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$<$ ( -\begin{DoxyParamCaption} -\item[{double}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a60f1f1c8766a649c91c64243a7f37b77} - - -Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is lower than the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & right hand side value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ac488bfc1076b6e69fdb8cb8e37acdff4}{ -\index{DMatrix@{DMatrix}!operator$<$@{operator$<$}} -\index{operator$<$@{operator$<$}!DMatrix@{DMatrix}} -\subsubsection[{operator$<$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$<$ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_ac488bfc1076b6e69fdb8cb8e37acdff4} - - -Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower than the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & val: right hand side object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a220c708ecc6554de0abf07788eb9ab89}{ -\index{DMatrix@{DMatrix}!operator$<$=@{operator$<$=}} -\index{operator$<$=@{operator$<$=}!DMatrix@{DMatrix}} -\subsubsection[{operator$<$=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$<$= ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a220c708ecc6554de0abf07788eb9ab89} - - -Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower or equal than the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & val: right hand side object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a2f0eadd7bb2b7afc5e6109243a839c1d}{ -\index{DMatrix@{DMatrix}!operator$<$=@{operator$<$=}} -\index{operator$<$=@{operator$<$=}!DMatrix@{DMatrix}} -\subsubsection[{operator$<$=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$<$= ( -\begin{DoxyParamCaption} -\item[{double}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a2f0eadd7bb2b7afc5e6109243a839c1d} - - -Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is lower or equal than the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & right hand side value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_add548c8713cb71b189a0535d05a37cc9}{ -\index{DMatrix@{DMatrix}!operator=@{operator=}} -\index{operator=@{operator=}!DMatrix@{DMatrix}} -\subsubsection[{operator=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator= ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{rval} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_add548c8713cb71b189a0535d05a37cc9} - - -Matrix assignment. The size of the left hand side object is modified if necessary, and the values of all real elements of the right hand side object and copied to the left hand side object. - - -\begin{DoxyParams}{Parameters} -{\em rval,:} & \hyperlink{classDMatrix}{DMatrix} object at the right hand side of the operator \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_af94a79c28f61abb7ef91c97a5113f2d4}{ -\index{DMatrix@{DMatrix}!operator=@{operator=}} -\index{operator=@{operator=}!DMatrix@{DMatrix}} -\subsubsection[{operator=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator= ( -\begin{DoxyParamCaption} -\item[{double}]{val} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_af94a79c28f61abb7ef91c97a5113f2d4} - - -Matrix assignment to a scalar. The size of the left hand side object is modified to one row by one column if necessary, and the value of the right hand side argument is copied to the single element of the matrix. If the calling object is a \char`\"{}colon reference\char`\"{} matrix, then the right hand side value is copied to each element of the referenced array elements. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & double value at the right hand side of the operator \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_a5625e608ef4e437bdce83858df5b3c97}{ -\index{DMatrix@{DMatrix}!operator=@{operator=}} -\index{operator=@{operator=}!DMatrix@{DMatrix}} -\subsubsection[{operator=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator= ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{str} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a5625e608ef4e437bdce83858df5b3c97} - - -Matrix assignment to a constant matrix defined as a character string using the bracket notation used in Matlab and Octave. The size of the left hand side object is modified if necessary. For example, the identity matrix of size two by two would be entered as \char`\"{}\mbox{[}1.0 0.0;0.0 1.0\mbox{]}\char`\"{}. - - -\begin{DoxyParams}{Parameters} -{\em str,:} & Character string containing the constant matrix defined using Matlab/Octave bracket notation. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to the calling object -\end{DoxyReturn} -\hypertarget{classDMatrix_a9851dca0d4acb9001926dfef3d4226b8}{ -\index{DMatrix@{DMatrix}!operator==@{operator==}} -\index{operator==@{operator==}!DMatrix@{DMatrix}} -\subsubsection[{operator==}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator== ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a9851dca0d4acb9001926dfef3d4226b8} - - -Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is equal to the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & val: right hand side object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a02a8277b7f165d774d6463f284bb71b4}{ -\index{DMatrix@{DMatrix}!operator==@{operator==}} -\index{operator==@{operator==}!DMatrix@{DMatrix}} -\subsubsection[{operator==}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator== ( -\begin{DoxyParamCaption} -\item[{double}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a02a8277b7f165d774d6463f284bb71b4} - - -Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is equal to the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & right hand side value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a1cb2ee04434b9874b01bc1494f49c639}{ -\index{DMatrix@{DMatrix}!operator$>$@{operator$>$}} -\index{operator$>$@{operator$>$}!DMatrix@{DMatrix}} -\subsubsection[{operator$>$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$>$ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a1cb2ee04434b9874b01bc1494f49c639} - - -Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater than the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & val: right hand side object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ac13b6fc14bdd5f3947cccb8f41173433}{ -\index{DMatrix@{DMatrix}!operator$>$@{operator$>$}} -\index{operator$>$@{operator$>$}!DMatrix@{DMatrix}} -\subsubsection[{operator$>$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$>$ ( -\begin{DoxyParamCaption} -\item[{double}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_ac13b6fc14bdd5f3947cccb8f41173433} - - -Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is greater than the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & right hand side value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_adf2cf4223a098eb273fd3b6c71fea201}{ -\index{DMatrix@{DMatrix}!operator$>$=@{operator$>$=}} -\index{operator$>$=@{operator$>$=}!DMatrix@{DMatrix}} -\subsubsection[{operator$>$=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$>$= ( -\begin{DoxyParamCaption} -\item[{double}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_adf2cf4223a098eb273fd3b6c71fea201} - - -Checks if each element of the \hyperlink{classDMatrix}{DMatrix} object on the left hand side is greater or equal than the right hand side value. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & right hand side value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ac17447effdb7cfc9252bf5232c3e99d6}{ -\index{DMatrix@{DMatrix}!operator$>$=@{operator$>$=}} -\index{operator$>$=@{operator$>$=}!DMatrix@{DMatrix}} -\subsubsection[{operator$>$=}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$>$= ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{val} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_ac17447effdb7cfc9252bf5232c3e99d6} - - -Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater or equal than the corresponding element of the right hand side matrix. The result is a \hyperlink{classDMatrix}{DMatrix} object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em val,:} & val: right hand side object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_af380c4e561b0f321b5bf7103038fa2cb}{ -\index{DMatrix@{DMatrix}!operator$^\wedge$@{operator$^\wedge$}} -\index{operator$^\wedge$@{operator$^\wedge$}!DMatrix@{DMatrix}} -\subsubsection[{operator$^\wedge$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$^\wedge$ ( -\begin{DoxyParamCaption} -\item[{double}]{x} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_af380c4e561b0f321b5bf7103038fa2cb} - - -Elementwise power operator. Returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions of the calling object and each of its elements is computed as the corresponding element of the calling object to the power of the right hand side argument. Care must be taken when using this operator as the associations do not work in the same way as with the $\ast$ operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A$^\wedge$x). - - -\begin{DoxyParams}{Parameters} -{\em x,:} & double argument at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ada9cc203a754a96ac3cb6122c9eba0fd}{ -\index{DMatrix@{DMatrix}!operator$|$@{operator$|$}} -\index{operator$|$@{operator$|$}!DMatrix@{DMatrix}} -\subsubsection[{operator$|$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$|$ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix}}]{B} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_ada9cc203a754a96ac3cb6122c9eba0fd} - - -Elementwise division operator. Returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions of the calling objects and each of its elements is computed as the of the corresponding element of the calling object by the corresponding element of the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the / operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A$|$B). - - -\begin{DoxyParams}{Parameters} -{\em B,:} & \hyperlink{classDMatrix}{DMatrix} object at the right hand side of the operator \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a7b756f28bc990d6b5b67a176143b9fc0}{ -\index{DMatrix@{DMatrix}!operator$|$$|$@{operator$|$$|$}} -\index{operator$|$$|$@{operator$|$$|$}!DMatrix@{DMatrix}} -\subsubsection[{operator$|$$|$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::operator$|$$|$ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a7b756f28bc990d6b5b67a176143b9fc0} - - -Concatenates two matrices side by side. The dimensions number of rows of the matrices involved must be the same, otherwise an error is thrown. The number of columns of the resulting matrix is the addition of the number of columns of both matrices involved. - - -\begin{DoxyParams}{Parameters} -{\em B,:} & \hyperlink{classDMatrix}{DMatrix} object at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a998b1e7e9dd6c837971f264660075efe}{ -\index{DMatrix@{DMatrix}!Print@{Print}} -\index{Print@{Print}!DMatrix@{DMatrix}} -\subsubsection[{Print}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::Print ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{text} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a998b1e7e9dd6c837971f264660075efe} - - -Prints the elements of a \hyperlink{classDMatrix}{DMatrix} object. - - -\begin{DoxyParams}{Parameters} -{\em text} & is a string that serves as a prompt for the matrix being entered. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a6e471ebaba82f41591b69fdfc8d72eaa}{ -\index{DMatrix@{DMatrix}!PrintInfo@{PrintInfo}} -\index{PrintInfo@{PrintInfo}!DMatrix@{DMatrix}} -\subsubsection[{PrintInfo}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::PrintInfo ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{text} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a6e471ebaba82f41591b69fdfc8d72eaa} - - -Prints information about a \hyperlink{classDMatrix}{DMatrix} object. - - -\begin{DoxyParams}{Parameters} -{\em text} & is a a string that serves as a label for the matrix being printed. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_ac79a34758fce637c1f23149f267ed623}{ -\index{DMatrix@{DMatrix}!random\_\-gaussian@{random\_\-gaussian}} -\index{random\_\-gaussian@{random\_\-gaussian}!DMatrix@{DMatrix}} -\subsubsection[{random\_\-gaussian}]{\setlength{\rightskip}{0pt plus 5cm}static double DMatrix::random\_\-gaussian ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}static\mbox{]}}}} -\label{classDMatrix_ac79a34758fce637c1f23149f267ed623} - - -Returns a pseudo-\/random Gaussian distributed number with zero mean and unit variance. - -\begin{DoxyReturn}{Returns} -double Gaussian pseudo-\/random value -\end{DoxyReturn} -\hypertarget{classDMatrix_a02bef7569ab47374e79f9acd9fa517b2}{ -\index{DMatrix@{DMatrix}!random\_\-uniform@{random\_\-uniform}} -\index{random\_\-uniform@{random\_\-uniform}!DMatrix@{DMatrix}} -\subsubsection[{random\_\-uniform}]{\setlength{\rightskip}{0pt plus 5cm}static double DMatrix::random\_\-uniform ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}static\mbox{]}}}} -\label{classDMatrix_a02bef7569ab47374e79f9acd9fa517b2} - - -Returns a pseudo-\/random uniformly distributed number in the range \mbox{[}0,1\mbox{]}. - -\begin{DoxyReturn}{Returns} -double pseudo-\/random value in the range \mbox{[}0,1\mbox{]} -\end{DoxyReturn} -\hypertarget{classDMatrix_a12b3c21b0467172f8a6ae976f04a9e99}{ -\index{DMatrix@{DMatrix}!Read@{Read}} -\index{Read@{Read}!DMatrix@{DMatrix}} -\subsubsection[{Read}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::Read ( -\begin{DoxyParamCaption} -\item[{FILE $\ast$}]{filex} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a12b3c21b0467172f8a6ae976f04a9e99} - - -Reads the elements of a matrix from a file. - -The file in question should contain the elements of the matrix row by row The elements should be separated by spaces and each row should be separated by a new line. The calling object should have the appropriate number of rows and columns. -\begin{DoxyParams}{Parameters} -{\em filex} & pointer to a file already opened using \char`\"{}fopen()\char`\"{}. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a523236d1477888fc53f74bbc00a30fa6}{ -\index{DMatrix@{DMatrix}!Resize@{Resize}} -\index{Resize@{Resize}!DMatrix@{DMatrix}} -\subsubsection[{Resize}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::Resize ( -\begin{DoxyParamCaption} -\item[{long}]{nnrow, } -\item[{long}]{nncol} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a523236d1477888fc53f74bbc00a30fa6} - - -Changes the number of rows and columns of an existing matrix. Allocates new memory if necessary. If the calling object uses preallocated memory and the requested size would exceed that memory, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em nnrow,:} & new number of rows \\ -\hline -{\em nncol,:} & new number of columns \\ -\hline -\end{DoxyParams} -\hypertarget{classDMatrix_a90261694eb6d26818dfbebbe099c1373}{ -\index{DMatrix@{DMatrix}!Row@{Row}} -\index{Row@{Row}!DMatrix@{DMatrix}} -\subsubsection[{Row}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::Row ( -\begin{DoxyParamCaption} -\item[{long}]{irow} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a90261694eb6d26818dfbebbe099c1373} - - -Returns a \hyperlink{classDMatrix}{DMatrix} object containing a speficied row of the calling object. - - -\begin{DoxyParams}{Parameters} -{\em irow,:} & row index (starting from 1) \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -\hyperlink{classDMatrix}{DMatrix} object with the specified row -\end{DoxyReturn} -\hypertarget{classDMatrix_a3907e2350b967ee27825eb9b9c6f4992}{ -\index{DMatrix@{DMatrix}!rowMult@{rowMult}} -\index{rowMult@{rowMult}!DMatrix@{DMatrix}} -\subsubsection[{rowMult}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::rowMult ( -\begin{DoxyParamCaption} -\item[{long}]{r, } -\item[{double}]{x} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a3907e2350b967ee27825eb9b9c6f4992} - - -Multiples the elements of a specified row of a matrix by a constant scalar value. - - -\begin{DoxyParams}{Parameters} -{\em r,:} & index to the row that is to be changed \\ -\hline -{\em x,:} & scalar value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a67346b3c1a7e04b0e071e59e06b5399a}{ -\index{DMatrix@{DMatrix}!Save@{Save}} -\index{Save@{Save}!DMatrix@{DMatrix}} -\subsubsection[{Save}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::Save ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{FileName} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a67346b3c1a7e04b0e071e59e06b5399a} - - -Saves the elements of a matrix to a file. - - -\begin{DoxyParams}{Parameters} -{\em FileName} & is a string with the desired file name \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a877dbfd1042abd3391f77a4aaf90c296}{ -\index{DMatrix@{DMatrix}!SetColIndexPointer@{SetColIndexPointer}} -\index{SetColIndexPointer@{SetColIndexPointer}!DMatrix@{DMatrix}} -\subsubsection[{SetColIndexPointer}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SetColIndexPointer ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} $\ast$}]{arg} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline, protected\mbox{]}}}} -\label{classDMatrix_a877dbfd1042abd3391f77a4aaf90c296} - - -Sets the column index pointer. - - -\begin{DoxyParams}{Parameters} -{\em arg} & Pointer to \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_af2c9e4ddf67ac9cf85141f1afb6cde37}{ -\index{DMatrix@{DMatrix}!SetColumn@{SetColumn}} -\index{SetColumn@{SetColumn}!DMatrix@{DMatrix}} -\subsubsection[{SetColumn}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SetColumn ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{Col, } -\item[{int}]{icol} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_af2c9e4ddf67ac9cf85141f1afb6cde37} - - -Assigns values to a column of a matrix, while other columns are left untouched. - - -\begin{DoxyParams}{Parameters} -{\em Col,:} & reference to constant \hyperlink{classDMatrix}{DMatrix} object which should contain a vector with the desired column values \\ -\hline -{\em icol,:} & index to the column that is to be changed \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_aeb006280bc37e1d13ecf16164fff0f5c}{ -\index{DMatrix@{DMatrix}!SetMType@{SetMType}} -\index{SetMType@{SetMType}!DMatrix@{DMatrix}} -\subsubsection[{SetMType}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SetMType ( -\begin{DoxyParamCaption} -\item[{int}]{arg} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}protected\mbox{]}}}} -\label{classDMatrix_aeb006280bc37e1d13ecf16164fff0f5c} - - -Sets the type of matrix. - - -\begin{DoxyParams}{Parameters} -{\em arg} & (int) should be 0 for a normal matrix, or 1 for a colon reference matrix \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a7521e5968a095edd6b80779f95b25309}{ -\index{DMatrix@{DMatrix}!SetPrintLevel@{SetPrintLevel}} -\index{SetPrintLevel@{SetPrintLevel}!DMatrix@{DMatrix}} -\subsubsection[{SetPrintLevel}]{\setlength{\rightskip}{0pt plus 5cm}static void DMatrix::SetPrintLevel ( -\begin{DoxyParamCaption} -\item[{int}]{plevel} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}static\mbox{]}}}} -\label{classDMatrix_a7521e5968a095edd6b80779f95b25309} - - -Sets the print level. - - -\begin{DoxyParams}{Parameters} -{\em plevel} & desired print level \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_ac13795ccdc5f59c8bcec90207f484fe8}{ -\index{DMatrix@{DMatrix}!SetReferencedDMatrixPointer@{SetReferencedDMatrixPointer}} -\index{SetReferencedDMatrixPointer@{SetReferencedDMatrixPointer}!DMatrix@{DMatrix}} -\subsubsection[{SetReferencedDMatrixPointer}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SetReferencedDMatrixPointer ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} $\ast$}]{arg} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline, protected\mbox{]}}}} -\label{classDMatrix_ac13795ccdc5f59c8bcec90207f484fe8} - - -Sets the value of the referenced matrix pointer. - - -\begin{DoxyParams}{Parameters} -{\em arg} & Pointer to \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a8cc97e6d3bb30a15c521d822638949eb}{ -\index{DMatrix@{DMatrix}!SetRow@{SetRow}} -\index{SetRow@{SetRow}!DMatrix@{DMatrix}} -\subsubsection[{SetRow}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SetRow ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{Row, } -\item[{int}]{irow} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a8cc97e6d3bb30a15c521d822638949eb} - - -Assigns values to a row of a matrix, while other columns are left untouched. - - -\begin{DoxyParams}{Parameters} -{\em Row,:} & reference to constant \hyperlink{classDMatrix}{DMatrix} object which should contain a vector with the desired row values \\ -\hline -{\em irow,:} & index to the row that is to be changed \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a73b829dadf5b159839b57a399f1fa8c8}{ -\index{DMatrix@{DMatrix}!SetRowIndexPointer@{SetRowIndexPointer}} -\index{SetRowIndexPointer@{SetRowIndexPointer}!DMatrix@{DMatrix}} -\subsubsection[{SetRowIndexPointer}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SetRowIndexPointer ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} $\ast$}]{arg} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}inline, protected\mbox{]}}}} -\label{classDMatrix_a73b829dadf5b159839b57a399f1fa8c8} - - -Sets the row index pointer. - - -\begin{DoxyParams}{Parameters} -{\em arg} & Pointer to \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a580fc5ea46fe5208dd49a9f1ade06e20}{ -\index{DMatrix@{DMatrix}!SetSubMatrix@{SetSubMatrix}} -\index{SetSubMatrix@{SetSubMatrix}!DMatrix@{DMatrix}} -\subsubsection[{SetSubMatrix}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SetSubMatrix ( -\begin{DoxyParamCaption} -\item[{long}]{row, } -\item[{long}]{col, } -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a580fc5ea46fe5208dd49a9f1ade06e20} - - -Assigns the elements of a matrix object to a section of the calling object. - - -\begin{DoxyParams}{Parameters} -{\em row,:} & start of row range \\ -\hline -{\em col,:} & start of column range \\ -\hline -{\em A,:} & \hyperlink{classDMatrix}{DMatrix} object whose element values are to be copied into the calling object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a6c8455bfd3811abb82bca639f2ead3af}{ -\index{DMatrix@{DMatrix}!sub\_\-matrix@{sub\_\-matrix}} -\index{sub\_\-matrix@{sub\_\-matrix}!DMatrix@{DMatrix}} -\subsubsection[{sub\_\-matrix}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& DMatrix::sub\_\-matrix ( -\begin{DoxyParamCaption} -\item[{long}]{r1, } -\item[{long}]{r2, } -\item[{long}]{c1, } -\item[{long}]{c2} -\end{DoxyParamCaption} -) const}} -\label{classDMatrix_a6c8455bfd3811abb82bca639f2ead3af} - - -Extracts a specified sub-\/matrix from a matrix. - - -\begin{DoxyParams}{Parameters} -{\em r1,:} & start of row range \\ -\hline -{\em r2,:} & end of row range \\ -\hline -{\em c1,:} & start of column range \\ -\hline -{\em c2,:} & end of column range \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -\hyperlink{classDMatrix}{DMatrix} object with the specified sub-\/matrix -\end{DoxyReturn} -\hypertarget{classDMatrix_a3b9322caa649274e47049960b1f60a33}{ -\index{DMatrix@{DMatrix}!SwapColumns@{SwapColumns}} -\index{SwapColumns@{SwapColumns}!DMatrix@{DMatrix}} -\subsubsection[{SwapColumns}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SwapColumns ( -\begin{DoxyParamCaption} -\item[{int}]{i, } -\item[{int}]{j} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a3b9322caa649274e47049960b1f60a33} - - -Swaps two columns of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em i,:} & first column index \\ -\hline -{\em j,:} & second column index. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a78d654687b6b56497279a81bdc28d4f7}{ -\index{DMatrix@{DMatrix}!SwapRows@{SwapRows}} -\index{SwapRows@{SwapRows}!DMatrix@{DMatrix}} -\subsubsection[{SwapRows}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::SwapRows ( -\begin{DoxyParamCaption} -\item[{int}]{i, } -\item[{int}]{j} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a78d654687b6b56497279a81bdc28d4f7} - - -Swaps two rows of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em i,:} & first row index \\ -\hline -{\em j,:} & second row index. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a23e7c1ac8350421a1798a59363452f79}{ -\index{DMatrix@{DMatrix}!Transpose@{Transpose}} -\index{Transpose@{Transpose}!DMatrix@{DMatrix}} -\subsubsection[{Transpose}]{\setlength{\rightskip}{0pt plus 5cm}void DMatrix::Transpose ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)}} -\label{classDMatrix_a23e7c1ac8350421a1798a59363452f79} - - -Transposes a matrix. - -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} - - -\subsection{Friends And Related Function Documentation} -\hypertarget{classDMatrix_a8de28f4be67d64533552e166b44ea128}{ -\index{DMatrix@{DMatrix}!Abs@{Abs}} -\index{Abs@{Abs}!DMatrix@{DMatrix}} -\subsubsection[{Abs}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& Abs ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a8de28f4be67d64533552e166b44ea128} - - -This function computes and returns the element-\/wise absolute value of matrix A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation. -\end{DoxyReturn} -\hypertarget{classDMatrix_ad90390441283c128e0c64ad67b7a7d16}{ -\index{DMatrix@{DMatrix}!any@{any}} -\index{any@{any}!DMatrix@{DMatrix}} -\subsubsection[{any}]{\setlength{\rightskip}{0pt plus 5cm}int any ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad90390441283c128e0c64ad67b7a7d16} - - -This function returns a 1 if any alement of \hyperlink{classDMatrix}{DMatrix} object that is passed as argument is non-\/zero, otherwise it returns a zero. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -an integer value which is either 1 or 0. -\end{DoxyReturn} -\hypertarget{classDMatrix_a1266502a32517e157a8a56a312e13b54}{ -\index{DMatrix@{DMatrix}!Chol@{Chol}} -\index{Chol@{Chol}!DMatrix@{DMatrix}} -\subsubsection[{Chol}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& Chol ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a1266502a32517e157a8a56a312e13b54} - - -Returns the Cholesky factorisation of a matrix A, which must be a positive definite symmetric matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object· \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_ae5b99d9b1b937f38054ac8d16237b1c2}{CholFSolve()}, \hyperlink{classDMatrix_a0167e219388b005d7b41ea3403191fd3}{CholSolve()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_ae96d9db92ff5e3a72e0e7b0eda05490f}{ -\index{DMatrix@{DMatrix}!CholeskyDecomp@{CholeskyDecomp}} -\index{CholeskyDecomp@{CholeskyDecomp}!DMatrix@{DMatrix}} -\subsubsection[{CholeskyDecomp}]{\setlength{\rightskip}{0pt plus 5cm}void CholeskyDecomp ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} \&}]{A, } -\item[{int}]{n, } -\item[{{\bf DMatrix} \&}]{pM} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ae96d9db92ff5e3a72e0e7b0eda05490f} - - -Cholesky decomposition of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em n} & is the number of columns of the input matrix A. \\ -\hline -{\em pM} & (modified), is a \hyperlink{classDMatrix}{DMatrix} object which on output contains the Cholesky decomposition of input matrix a. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_ac66ec50116a7b447a9ba3d0cc38043eb}{CholeskySolution()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_af65da2b06dfaa39404003f6a7d09121b}{ -\index{DMatrix@{DMatrix}!CholeskyRoot@{CholeskyRoot}} -\index{CholeskyRoot@{CholeskyRoot}!DMatrix@{DMatrix}} -\subsubsection[{CholeskyRoot}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& CholeskyRoot ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_af65da2b06dfaa39404003f6a7d09121b} - - -Returns the Cholesky root R of a given matrix A, such that A=R'R. A must be a positive definite symmetric matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object· \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ac66ec50116a7b447a9ba3d0cc38043eb}{ -\index{DMatrix@{DMatrix}!CholeskySolution@{CholeskySolution}} -\index{CholeskySolution@{CholeskySolution}!DMatrix@{DMatrix}} -\subsubsection[{CholeskySolution}]{\setlength{\rightskip}{0pt plus 5cm}void CholeskySolution ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{int}]{n, } -\item[{const {\bf DMatrix} \&}]{pM, } -\item[{const {\bf DMatrix} \&}]{bM, } -\item[{{\bf DMatrix} \&}]{xM} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ac66ec50116a7b447a9ba3d0cc38043eb} - - -Cholesky solution using the Cholesky decomposition of a matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em n} & is the number of columns of the input matrix A. \\ -\hline -{\em pM} & \hyperlink{classDMatrix}{DMatrix} object which on output contains the Cholesky decomposition of input matrix a. \\ -\hline -{\em bM} & \hyperlink{classDMatrix}{DMatrix} object with a vector of right-\/hand-\/side values \\ -\hline -{\em xM} & (modified) \hyperlink{classDMatrix}{DMatrix} object which on return contains the solution to the system of equations \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_ae96d9db92ff5e3a72e0e7b0eda05490f}{CholeskyDecomp()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_ae5b99d9b1b937f38054ac8d16237b1c2}{ -\index{DMatrix@{DMatrix}!CholFSolve@{CholFSolve}} -\index{CholFSolve@{CholFSolve}!DMatrix@{DMatrix}} -\subsubsection[{CholFSolve}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& CholFSolve ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{Achol, } -\item[{const {\bf DMatrix} \&}]{b} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ae5b99d9b1b937f38054ac8d16237b1c2} - - -Solves the system of equations $ A x = b $ using Cholesky factorisation. The function uses a previously found Cholesky factorisation. - - -\begin{DoxyParams}{Parameters} -{\em Achol} & is a \hyperlink{classDMatrix}{DMatrix} object resulting from a previous call to \hyperlink{classDMatrix_a1266502a32517e157a8a56a312e13b54}{Chol()}. \\ -\hline -{\em b} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation (the resulting vector x) -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_ae5b99d9b1b937f38054ac8d16237b1c2}{CholFSolve()}, \hyperlink{classDMatrix_a1266502a32517e157a8a56a312e13b54}{Chol()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_a0167e219388b005d7b41ea3403191fd3}{ -\index{DMatrix@{DMatrix}!CholSolve@{CholSolve}} -\index{CholSolve@{CholSolve}!DMatrix@{DMatrix}} -\subsubsection[{CholSolve}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& CholSolve ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{b} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a0167e219388b005d7b41ea3403191fd3} - - -Solves the system of equations $ A x = b $ using Cholesky factorisation. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em b} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation (the resulting vector x) -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_ae5b99d9b1b937f38054ac8d16237b1c2}{CholFSolve()}, \hyperlink{classDMatrix_a1266502a32517e157a8a56a312e13b54}{Chol()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_a2987194d90eec1f076a329414ac07278}{ -\index{DMatrix@{DMatrix}!colon@{colon}} -\index{colon@{colon}!DMatrix@{DMatrix}} -\subsubsection[{colon}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& colon ( -\begin{DoxyParamCaption} -\item[{void}]{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a2987194d90eec1f076a329414ac07278} - - -This function generates a special \hyperlink{classDMatrix}{DMatrix} object with one row and one column which is understood by the indexing functions that take a \hyperlink{classDMatrix}{DMatrix} object as an argument to mean \char`\"{}all rows\char`\"{} or \char`\"{}all columns\char`\"{}. - -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_ab52a3e622e1d9bab78e860842f5dd983}{ -\index{DMatrix@{DMatrix}!colon@{colon}} -\index{colon@{colon}!DMatrix@{DMatrix}} -\subsubsection[{colon}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& colon ( -\begin{DoxyParamCaption} -\item[{double}]{i1, } -\item[{double}]{increment, } -\item[{double}]{i2} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ab52a3e622e1d9bab78e860842f5dd983} - - -This function generates a \hyperlink{classDMatrix}{DMatrix} object with a vector starting from a given value, with given increments and ending in a given value. - - -\begin{DoxyParams}{Parameters} -{\em i1} & is the first value \\ -\hline -{\em increment} & is the increment \\ -\hline -{\em i2} & is the last value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_ad79d00fc58e2584963625ecf46ccabee}{ -\index{DMatrix@{DMatrix}!colon@{colon}} -\index{colon@{colon}!DMatrix@{DMatrix}} -\subsubsection[{colon}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& colon ( -\begin{DoxyParamCaption} -\item[{int}]{i1, } -\item[{int}]{increment, } -\item[{int}]{i2} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad79d00fc58e2584963625ecf46ccabee} - - -This function generates \hyperlink{classDMatrix}{DMatrix} object with a vector starting from a given value, with given increments and ending in a given value. - - -\begin{DoxyParams}{Parameters} -{\em i1} & is the first value \\ -\hline -{\em increment} & is the increment \\ -\hline -{\em i2} & is the last value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_a1cbcbb56a983edaa8e40dba43df831c0}{ -\index{DMatrix@{DMatrix}!colon@{colon}} -\index{colon@{colon}!DMatrix@{DMatrix}} -\subsubsection[{colon}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& colon ( -\begin{DoxyParamCaption} -\item[{int}]{i1, } -\item[{int}]{i2} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a1cbcbb56a983edaa8e40dba43df831c0} - - -This function generates \hyperlink{classDMatrix}{DMatrix} object with a vector starting from a given value, with unit increments, and ending in a given value. - - -\begin{DoxyParams}{Parameters} -{\em i1} & is the first value \\ -\hline -{\em i2} & is the last value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_a1f79ebd6d8952d215f2792a9c19a0064}{ -\index{DMatrix@{DMatrix}!colon@{colon}} -\index{colon@{colon}!DMatrix@{DMatrix}} -\subsubsection[{colon}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& colon ( -\begin{DoxyParamCaption} -\item[{double}]{i1, } -\item[{double}]{i2} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a1f79ebd6d8952d215f2792a9c19a0064} - - -This function generates \hyperlink{classDMatrix}{DMatrix} object with a vector starting from a given value, with unit increments, and ending in a given value. - - -\begin{DoxyParams}{Parameters} -{\em i1} & is the first value \\ -\hline -{\em i2} & is the last value \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object -\end{DoxyReturn} -\hypertarget{classDMatrix_a474926f74756b827c79b7127a84a4bb6}{ -\index{DMatrix@{DMatrix}!cond@{cond}} -\index{cond@{cond}!DMatrix@{DMatrix}} -\subsubsection[{cond}]{\setlength{\rightskip}{0pt plus 5cm}double cond ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a474926f74756b827c79b7127a84a4bb6} - - -This function calculates the 2-\/norm condition number of a matrix, which is the ratio of the maximum singular value to the minimum singular value of the matrix. A large condition number indicates a nearly singular matrix. If the input matrix is not square, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the 2-\/norm condition number -\end{DoxyReturn} -\hypertarget{classDMatrix_aa9e07c7b8674a182891bfaf4699906b9}{ -\index{DMatrix@{DMatrix}!cos@{cos}} -\index{cos@{cos}!DMatrix@{DMatrix}} -\subsubsection[{cos}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& cos ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aa9e07c7b8674a182891bfaf4699906b9} - - -This function returns a matrix with the cosine of each element of the input matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a567d9f47845cd22715ad3d44e4644b40}{ -\index{DMatrix@{DMatrix}!cosh@{cosh}} -\index{cosh@{cosh}!DMatrix@{DMatrix}} -\subsubsection[{cosh}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& cosh ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a567d9f47845cd22715ad3d44e4644b40} - - -This function returns a matrix with the hyperbolic cosine of each element of the input matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a261380c58f5a12770bdecf4c0d57eddb}{ -\index{DMatrix@{DMatrix}!cov@{cov}} -\index{cov@{cov}!DMatrix@{DMatrix}} -\subsubsection[{cov}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& cov ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{int}]{ntype = {\ttfamily 0}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a261380c58f5a12770bdecf4c0d57eddb} - - -Computes the covariance matrix of a data matrix where the N rows correspond to samples and the M columns are variables. The result is returned as an M x M matrix. If ntype=0 (default) then the result is normalised with N-\/1. Otherwise, if ntype=1, the result is normalised with N. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em ntype} & is the type of normalization, 0 (default) or 1. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ac4da4357ee63d240053aebfc8d687784}{ -\index{DMatrix@{DMatrix}!cov@{cov}} -\index{cov@{cov}!DMatrix@{DMatrix}} -\subsubsection[{cov}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& cov ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} \&}]{X, } -\item[{{\bf DMatrix} \&}]{Y, } -\item[{int}]{ntype = {\ttfamily 0}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ac4da4357ee63d240053aebfc8d687784} - - -Computes the covariance matrix of two vectors X and Y of dimension N. The result is returned as an 1 x 1 \hyperlink{classDMatrix}{DMatrix} object. If ntype=0 (default) then the result is normalised with N-\/1. Otherwise, if ntype=1, the result is normalised with N. - - -\begin{DoxyParams}{Parameters} -{\em X} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em Y} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em ntype} & is the type of normalization, 0 (default) or 1. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_aaf0cb02dcd852ce56ccb39d550fa7c0a}{ -\index{DMatrix@{DMatrix}!cross@{cross}} -\index{cross@{cross}!DMatrix@{DMatrix}} -\subsubsection[{cross}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& cross ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{x, } -\item[{const {\bf DMatrix} \&}]{y} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aaf0cb02dcd852ce56ccb39d550fa7c0a} - - -This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em x} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em y} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the cross product of x and y. -\end{DoxyReturn} -\hypertarget{classDMatrix_a824f640d88220c84f5b31d9ed191c8ba}{ -\index{DMatrix@{DMatrix}!crossProduct@{crossProduct}} -\index{crossProduct@{crossProduct}!DMatrix@{DMatrix}} -\subsubsection[{crossProduct}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& crossProduct ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{x, } -\item[{const {\bf DMatrix} \&}]{y} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a824f640d88220c84f5b31d9ed191c8ba} - - -This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em x} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em y} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the cross product of x and y. -\end{DoxyReturn} -\hypertarget{classDMatrix_aafe913bbf754d4c204e4d09033de4ff5}{ -\index{DMatrix@{DMatrix}!det@{det}} -\index{det@{det}!DMatrix@{DMatrix}} -\subsubsection[{det}]{\setlength{\rightskip}{0pt plus 5cm}double det ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aafe913bbf754d4c204e4d09033de4ff5} - - -This function returns the determinant of a square matrix. If the input matrix is not square, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the determinant of the matrix. -\end{DoxyReturn} -\hypertarget{classDMatrix_a417b7d2c566648bf891e5da105ba4233}{ -\index{DMatrix@{DMatrix}!diag@{diag}} -\index{diag@{diag}!DMatrix@{DMatrix}} -\subsubsection[{diag}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& diag ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a417b7d2c566648bf891e5da105ba4233} - - -if A is a matrix this function extracts a column vector with the diagonal values of A. If A is a vector this function returns a matrix having the elements of A in the diagonal - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ae80c19e8c19de710f5790698e9568756}{ -\index{DMatrix@{DMatrix}!dot@{dot}} -\index{dot@{dot}!DMatrix@{DMatrix}} -\subsubsection[{dot}]{\setlength{\rightskip}{0pt plus 5cm}double dot ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{x, } -\item[{const {\bf DMatrix} \&}]{y} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ae80c19e8c19de710f5790698e9568756} - - -This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em x} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em y} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the dot product of x and y. -\end{DoxyReturn} -\hypertarget{classDMatrix_a28b13c78f679925c43ba7743e4def95e}{ -\index{DMatrix@{DMatrix}!dotProduct@{dotProduct}} -\index{dotProduct@{dotProduct}!DMatrix@{DMatrix}} -\subsubsection[{dotProduct}]{\setlength{\rightskip}{0pt plus 5cm}double dotProduct ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{x, } -\item[{const {\bf DMatrix} \&}]{y} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a28b13c78f679925c43ba7743e4def95e} - - -This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em x} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em y} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the dot product of x and y. -\end{DoxyReturn} -\hypertarget{classDMatrix_a160797dd45b601c20b26ad4c189fe8f2}{ -\index{DMatrix@{DMatrix}!eig@{eig}} -\index{eig@{eig}!DMatrix@{DMatrix}} -\subsubsection[{eig}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& eig ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{{\bf DMatrix} $\ast$}]{V = {\ttfamily NULL}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a160797dd45b601c20b26ad4c189fe8f2} - - -This function computes the eigenvalues and (optionally) the eigenvectors of a matrix A. This function uses the LAPACK routines dsyev\_\-() and dgeev\_\-. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em V} & is a pointer to a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the real part of the eigenvalues in the first column and the complex part of the eigenvalues in the second column. -\end{DoxyReturn} -\hypertarget{classDMatrix_a7d66bf14f6c28485a886ece99589d366}{ -\index{DMatrix@{DMatrix}!elemDivision@{elemDivision}} -\index{elemDivision@{elemDivision}!DMatrix@{DMatrix}} -\subsubsection[{elemDivision}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& elemDivision ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a7d66bf14f6c28485a886ece99589d366} - - -This function computes and returns the element-\/wise division of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. The dimensions of the returned object are the same as the dimensions of the factors. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a4fcfc361ca88cbbf21c89c50eca932d8}{ -\index{DMatrix@{DMatrix}!elemProduct@{elemProduct}} -\index{elemProduct@{elemProduct}!DMatrix@{DMatrix}} -\subsubsection[{elemProduct}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& elemProduct ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a4fcfc361ca88cbbf21c89c50eca932d8} - - -This function computes and returns the element-\/wise product of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_aafa519c3dd4bd2b69731ef2fef01a371}{ -\index{DMatrix@{DMatrix}!enorm@{enorm}} -\index{enorm@{enorm}!DMatrix@{DMatrix}} -\subsubsection[{enorm}]{\setlength{\rightskip}{0pt plus 5cm}double enorm ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aafa519c3dd4bd2b69731ef2fef01a371} - - -This function computes and return the Euclidean norm of a matrix A, which is the square root of the sum of its squared elements. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the Euclidean norm. -\end{DoxyReturn} -\hypertarget{classDMatrix_a6067456d71764a846f24a141e77d00f3}{ -\index{DMatrix@{DMatrix}!error\_\-message@{error\_\-message}} -\index{error\_\-message@{error\_\-message}!DMatrix@{DMatrix}} -\subsubsection[{error\_\-message}]{\setlength{\rightskip}{0pt plus 5cm}void error\_\-message ( -\begin{DoxyParamCaption} -\item[{const char $\ast$}]{input\_\-text} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a6067456d71764a846f24a141e77d00f3} - - -This function prints an error message and throws an exception to be handled by the \hyperlink{classErrorHandler}{ErrorHandler} class. - - -\begin{DoxyParams}{Parameters} -{\em input\_\-text} & is the error message \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_a16013e5264442d52b6d98a4a49fee29f}{ -\index{DMatrix@{DMatrix}!exp@{exp}} -\index{exp@{exp}!DMatrix@{DMatrix}} -\subsubsection[{exp}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& exp ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a16013e5264442d52b6d98a4a49fee29f} - - -This function returns a matrix with the natural exponential of each element of the input matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a0cbd806dab65e5458cb5ad832615c506}{ -\index{DMatrix@{DMatrix}!expm@{expm}} -\index{expm@{expm}!DMatrix@{DMatrix}} -\subsubsection[{expm}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& expm ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a0cbd806dab65e5458cb5ad832615c506} - - -This function returns the exponential matrix of a given square matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_aafc7c944155ff0404f3201ce8b764bea}{ -\index{DMatrix@{DMatrix}!eye@{eye}} -\index{eye@{eye}!DMatrix@{DMatrix}} -\subsubsection[{eye}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& eye ( -\begin{DoxyParamCaption} -\item[{long}]{n} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aafc7c944155ff0404f3201ce8b764bea} - - -This function returns the identity matrix with a given number of rows and columns. - - -\begin{DoxyParams}{Parameters} -{\em n} & is the desired number of rows and columns \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_aee7a643a65d88ae71a19462563fb9805}{ -\index{DMatrix@{DMatrix}!eye@{eye}} -\index{eye@{eye}!DMatrix@{DMatrix}} -\subsubsection[{eye}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& eye ( -\begin{DoxyParamCaption} -\item[{long}]{n, } -\item[{long}]{m} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aee7a643a65d88ae71a19462563fb9805} - - -This function returns a truncated identity matrix with specified numbers of rows and columns. - - -\begin{DoxyParams}{Parameters} -{\em n} & is the desired number of rows \\ -\hline -{\em m} & is the desired number of columns \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_addd401503db0026290c74a9ae860ba6a}{ -\index{DMatrix@{DMatrix}!find@{find}} -\index{find@{find}!DMatrix@{DMatrix}} -\subsubsection[{find}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& find ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_addd401503db0026290c74a9ae860ba6a} - - -This function returns a column vector with the linear indices of the non-\/zero elements of the input matrix A. The linear index is 1 for element (1,1) of the input matrix A, and length(A) for the (nrows,ncols) element of the input matrix A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a650d19963c7ca65fe5e8f58c08fc3e55}{ -\index{DMatrix@{DMatrix}!Fnorm@{Fnorm}} -\index{Fnorm@{Fnorm}!DMatrix@{DMatrix}} -\subsubsection[{Fnorm}]{\setlength{\rightskip}{0pt plus 5cm}double Fnorm ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a650d19963c7ca65fe5e8f58c08fc3e55} - - -This function computes Frobenius norm of matrix A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the Frobenius norm -\end{DoxyReturn} -\hypertarget{classDMatrix_ab54dc58f34aa18e7ff82b21b3533b173}{ -\index{DMatrix@{DMatrix}!identity@{identity}} -\index{identity@{identity}!DMatrix@{DMatrix}} -\subsubsection[{identity}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& identity ( -\begin{DoxyParamCaption} -\item[{long}]{n, } -\item[{long}]{m} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ab54dc58f34aa18e7ff82b21b3533b173} - - -This function returns a truncated identity matrix with specified numbers of rows and columns. - - -\begin{DoxyParams}{Parameters} -{\em n} & is the desired number of rows \\ -\hline -{\em m} & is the desired number of columns \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ac33c390deeaf029a44055773fa06bd00}{ -\index{DMatrix@{DMatrix}!identity@{identity}} -\index{identity@{identity}!DMatrix@{DMatrix}} -\subsubsection[{identity}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& identity ( -\begin{DoxyParamCaption} -\item[{long}]{n} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ac33c390deeaf029a44055773fa06bd00} - - -This function returns the identity matrix with a given number of rows and columns. - - -\begin{DoxyParams}{Parameters} -{\em n} & is the desired number of rows and columns \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_afc6bf998f40686caf55730b53cea7150}{ -\index{DMatrix@{DMatrix}!InfNorm@{InfNorm}} -\index{InfNorm@{InfNorm}!DMatrix@{DMatrix}} -\subsubsection[{InfNorm}]{\setlength{\rightskip}{0pt plus 5cm}double InfNorm ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_afc6bf998f40686caf55730b53cea7150} - - -This function computes infinity norm of matrix A, which is computed as the maximum absolute value row sum. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the infinity norm -\end{DoxyReturn} -\hypertarget{classDMatrix_a322373e24822a8633c2ddfd8f7397c11}{ -\index{DMatrix@{DMatrix}!inv@{inv}} -\index{inv@{inv}!DMatrix@{DMatrix}} -\subsubsection[{inv}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& inv ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a322373e24822a8633c2ddfd8f7397c11} - - -This function returns the inverse of a given square matrix. If the argument is not a square matrix an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ad31c97e930c0fdc797ecd165f251fc27}{ -\index{DMatrix@{DMatrix}!isSymmetric@{isSymmetric}} -\index{isSymmetric@{isSymmetric}!DMatrix@{DMatrix}} -\subsubsection[{isSymmetric}]{\setlength{\rightskip}{0pt plus 5cm}int isSymmetric ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad31c97e930c0fdc797ecd165f251fc27} - - -This function checks if the input matrix is symmetric. If the input matrix is not square, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -1 if the input matrix is symmetric, 0 otherwise. -\end{DoxyReturn} -\hypertarget{classDMatrix_adc052c1c9f76c909347b83f662fb5952}{ -\index{DMatrix@{DMatrix}!kronProduct@{kronProduct}} -\index{kronProduct@{kronProduct}!DMatrix@{DMatrix}} -\subsubsection[{kronProduct}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& kronProduct ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_adc052c1c9f76c909347b83f662fb5952} - - -This function computes and returns the Kronecker product of two matrices. The row (column) dimension of the returned object is the product of the row (column) dimensions of both factors. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a416133f8c3a457e0997f7f387697be62}{ -\index{DMatrix@{DMatrix}!length@{length}} -\index{length@{length}!DMatrix@{DMatrix}} -\subsubsection[{length}]{\setlength{\rightskip}{0pt plus 5cm}long length ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a416133f8c3a457e0997f7f387697be62} - - -This function returns the number of elements of a matrix A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the number of elements of the input matrix. -\end{DoxyReturn} -\hypertarget{classDMatrix_aa3d52614c6e5b34caff46a462af5e48c}{ -\index{DMatrix@{DMatrix}!linspace@{linspace}} -\index{linspace@{linspace}!DMatrix@{DMatrix}} -\subsubsection[{linspace}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& linspace ( -\begin{DoxyParamCaption} -\item[{double}]{X1, } -\item[{double}]{X2, } -\item[{long}]{N} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aa3d52614c6e5b34caff46a462af5e48c} - - -This function returns a linearly spaced vector with N points between the values X1 and X2. - - -\begin{DoxyParams}{Parameters} -{\em X1} & is a real number \\ -\hline -{\em X2} & is a real number \\ -\hline -{\em N} & is the desired length of the returned vector \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a75ca121105b6022b5cff058be162f209}{ -\index{DMatrix@{DMatrix}!log@{log}} -\index{log@{log}!DMatrix@{DMatrix}} -\subsubsection[{log}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& log ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a75ca121105b6022b5cff058be162f209} - - -This function returns a matrix with the natural logarithm of each element of the input matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a1ccd9a0ef8a37d739b31e85f84c2743c}{ -\index{DMatrix@{DMatrix}!LQ@{LQ}} -\index{LQ@{LQ}!DMatrix@{DMatrix}} -\subsubsection[{LQ}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& LQ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{{\bf DMatrix} $\ast$}]{Q} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a1ccd9a0ef8a37d739b31e85f84c2743c} - - -Returns the LQ factorisation of a matrix A. The function uses the LAPACK routine dgelqf\_\-(). - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object· \\ -\hline -{\em Q} & is a pointer to a \hyperlink{classDMatrix}{DMatrix} object, which is modified on output to contain the Q factor of the decomposition. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the L factor of the decomposition. -\end{DoxyReturn} -\hypertarget{classDMatrix_aba0583d31407f78cfe1176d74d03fa59}{ -\index{DMatrix@{DMatrix}!LSMNSolve@{LSMNSolve}} -\index{LSMNSolve@{LSMNSolve}!DMatrix@{DMatrix}} -\subsubsection[{LSMNSolve}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& LSMNSolve ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aba0583d31407f78cfe1176d74d03fa59} - - -This function solves overdetermined or underdetermined real linear systems $ A x = B $ using a QR or LQ factorization of A. It is assumed that matrix A has full rank. The function uses the LAPACK routine dgels. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation (the resulting vector x) -\end{DoxyReturn} -\hypertarget{classDMatrix_a71dd04fdd14b319042752e184ded3393}{ -\index{DMatrix@{DMatrix}!LU@{LU}} -\index{LU@{LU}!DMatrix@{DMatrix}} -\subsubsection[{LU}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& LU ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a71dd04fdd14b319042752e184ded3393} - - -Returns the LU factorisation of a matrix A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object· \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_ad9133e1f6215a490287e1f0b262c5212}{LUFSolve()}, \hyperlink{classDMatrix_aebb97348d6f64a5a77e6b0a5bcfa3afb}{LUSolve()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_ad9133e1f6215a490287e1f0b262c5212}{ -\index{DMatrix@{DMatrix}!LUFSolve@{LUFSolve}} -\index{LUFSolve@{LUFSolve}!DMatrix@{DMatrix}} -\subsubsection[{LUFSolve}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& LUFSolve ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{ALU, } -\item[{const {\bf DMatrix} \&}]{b} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad9133e1f6215a490287e1f0b262c5212} - - -Solves the system of equations $ A x = b $ using LU factorisation using a previously found LU factors. - - -\begin{DoxyParams}{Parameters} -{\em ALU} & is a \hyperlink{classDMatrix}{DMatrix} object resulting from a previous call to the \hyperlink{classDMatrix_a71dd04fdd14b319042752e184ded3393}{LU()} function \\ -\hline -{\em b} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation (the resulting vector x) -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_a71dd04fdd14b319042752e184ded3393}{LU()}, \hyperlink{classDMatrix_aebb97348d6f64a5a77e6b0a5bcfa3afb}{LUSolve()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_aebb97348d6f64a5a77e6b0a5bcfa3afb}{ -\index{DMatrix@{DMatrix}!LUSolve@{LUSolve}} -\index{LUSolve@{LUSolve}!DMatrix@{DMatrix}} -\subsubsection[{LUSolve}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& LUSolve ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{b} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aebb97348d6f64a5a77e6b0a5bcfa3afb} - - -Solves the system of equations $ A x = b $ using LU factorisation. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em b} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation (the resulting vector x) -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_ad9133e1f6215a490287e1f0b262c5212}{LUFSolve()}, \hyperlink{classDMatrix_a71dd04fdd14b319042752e184ded3393}{LU()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_a5fef948be5e07507f9e0c9cc11e6cd09}{ -\index{DMatrix@{DMatrix}!MatrixSign@{MatrixSign}} -\index{MatrixSign@{MatrixSign}!DMatrix@{DMatrix}} -\subsubsection[{MatrixSign}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& MatrixSign ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a5fef948be5e07507f9e0c9cc11e6cd09} - - -This function returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions as the input matrix such that each of its elements is 1 is the corresponding value of the input matrix is positive, -\/1 if the corresponding value of the input matrix is negative, and 0 if the corresponding value of the input matrix is 0. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a734ba2f493c1e69b72dfaf09cfdc1224}{ -\index{DMatrix@{DMatrix}!Max@{Max}} -\index{Max@{Max}!DMatrix@{DMatrix}} -\subsubsection[{Max}]{\setlength{\rightskip}{0pt plus 5cm}double Max ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{int $\ast$}]{rindx = {\ttfamily NULL}, } -\item[{int $\ast$}]{cindx = {\ttfamily NULL}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a734ba2f493c1e69b72dfaf09cfdc1224} - - -This function finds and returns the element of matrix A with maximum value. It also returns the indices of such element. If more than one element has the same maximum value, the indices of the first element found when searching column by column is returned. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em rindx} & is an optional pointer to an integer which is modified with the row index. \\ -\hline -{\em cindx} & is an optional pointer to an integer which is modified with the column index. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the element with maximum value. -\end{DoxyReturn} -\hypertarget{classDMatrix_a6bd64bff4bf5dea949448371d9e34c14}{ -\index{DMatrix@{DMatrix}!MaxAbs@{MaxAbs}} -\index{MaxAbs@{MaxAbs}!DMatrix@{DMatrix}} -\subsubsection[{MaxAbs}]{\setlength{\rightskip}{0pt plus 5cm}double MaxAbs ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{int $\ast$}]{rindx = {\ttfamily NULL}, } -\item[{int $\ast$}]{cindx = {\ttfamily NULL}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a6bd64bff4bf5dea949448371d9e34c14} - - -This function finds and returns the element of matrix A with maximum absolute value. It also returns the indices of such element. If more than one element has the same maximum absolute value, the indices of the first element found when searching column by column is returned. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em rindx} & is a pointer to an integer which is modified with the row index. \\ -\hline -{\em cindx} & is a pointer to an integer which is modified with the column index. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the absolute value of the element with maximum absolute value. -\end{DoxyReturn} -\hypertarget{classDMatrix_a210dc48c90f3be6b71e35784b3625633}{ -\index{DMatrix@{DMatrix}!mean@{mean}} -\index{mean@{mean}!DMatrix@{DMatrix}} -\subsubsection[{mean}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& mean ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a210dc48c90f3be6b71e35784b3625633} - - -This function returns a row vector with the mean values of the columns of matrix A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a6168ace6eec6c2c1724638a1e4c1059c}{ -\index{DMatrix@{DMatrix}!Min@{Min}} -\index{Min@{Min}!DMatrix@{DMatrix}} -\subsubsection[{Min}]{\setlength{\rightskip}{0pt plus 5cm}double Min ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{int $\ast$}]{rindx = {\ttfamily NULL}, } -\item[{int $\ast$}]{cindx = {\ttfamily NULL}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a6168ace6eec6c2c1724638a1e4c1059c} - - -This function finds and returns the element of matrix A with minimum value. It also returns the indices of such element. If more than one element has the same minimum value, the indices of the first element found when searching column by column is returned. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em rindx} & is a pointer to an integer which is modified with the row index. \\ -\hline -{\em cindx} & is a pointer to an integer which is modified with the column index. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the absolute value of the element with minimum absolute value. -\end{DoxyReturn} -\hypertarget{classDMatrix_a8a3779432dbf1db00faf44079f9a4129}{ -\index{DMatrix@{DMatrix}!MinAbs@{MinAbs}} -\index{MinAbs@{MinAbs}!DMatrix@{DMatrix}} -\subsubsection[{MinAbs}]{\setlength{\rightskip}{0pt plus 5cm}double MinAbs ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{int $\ast$}]{rindx = {\ttfamily NULL}, } -\item[{int $\ast$}]{cindx = {\ttfamily NULL}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a8a3779432dbf1db00faf44079f9a4129} - - -This function finds and returns the element of matrix A with minimum absolute value. It also returns the indices of such element. If more than one element has the same minimum absolute value, the indices of the first element found when searching column by column is returned. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em rindx} & is a pointer to an integer which is modified with the row index. \\ -\hline -{\em cindx} & is a pointer to an integer which is modified with the column index. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the absolute value of the element with minimum absolute value. -\end{DoxyReturn} -\hypertarget{classDMatrix_aed1822acbc4a807359a836ab57386d07}{ -\index{DMatrix@{DMatrix}!mpow@{mpow}} -\index{mpow@{mpow}!DMatrix@{DMatrix}} -\subsubsection[{mpow}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& mpow ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} \&}]{A, } -\item[{int}]{p} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_aed1822acbc4a807359a836ab57386d07} - - -This function calculates the integer matrix power. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em p} & is an integer value which can be positive or negative \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a5169a4190b500841d156828863e414c8}{ -\index{DMatrix@{DMatrix}!norm@{norm}} -\index{norm@{norm}!DMatrix@{DMatrix}} -\subsubsection[{norm}]{\setlength{\rightskip}{0pt plus 5cm}double norm ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a5169a4190b500841d156828863e414c8} - - -This function computes 2-\/norm of matrix A, which is computed as the maximum singular value of A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the value of the 2-\/norm -\end{DoxyReturn} -\hypertarget{classDMatrix_a038aceaf8588f3f7743562f598cab15d}{ -\index{DMatrix@{DMatrix}!null@{null}} -\index{null@{null}!DMatrix@{DMatrix}} -\subsubsection[{null}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& null ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a038aceaf8588f3f7743562f598cab15d} - - -This function returns Z, the orthonormal basis for the null space of a matrix A, such that $ Z Z' = I $ and $ A Z=0 $. The number of columns of Z is the nullity of A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ad90074f7636d5a5a80de596f210b398c}{ -\index{DMatrix@{DMatrix}!ones@{ones}} -\index{ones@{ones}!DMatrix@{DMatrix}} -\subsubsection[{ones}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& ones ( -\begin{DoxyParamCaption} -\item[{long}]{n, } -\item[{long}]{m} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad90074f7636d5a5a80de596f210b398c} - - -This function returns a matrix full of ones with specified numbers of rows and columns. - - -\begin{DoxyParams}{Parameters} -{\em n} & is the desired number of rows \\ -\hline -{\em m} & is the desired number of columns \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_abf562762c4dfe45f93d14976001bc61e}{ -\index{DMatrix@{DMatrix}!operator$\ast$@{operator$\ast$}} -\index{operator$\ast$@{operator$\ast$}!DMatrix@{DMatrix}} -\subsubsection[{operator$\ast$}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& operator$\ast$ ( -\begin{DoxyParamCaption} -\item[{double}]{r, } -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_abf562762c4dfe45f93d14976001bc61e} - - -This function multiplies a real number by a matrix. - - -\begin{DoxyParams}{Parameters} -{\em r} & is a double value \\ -\hline -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ac100c02f140686e07a7b520bf5a58e25}{ -\index{DMatrix@{DMatrix}!operator-\/@{operator-\/}} -\index{operator-\/@{operator-\/}!DMatrix@{DMatrix}} -\subsubsection[{operator-\/}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& operator-\/ ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ac100c02f140686e07a7b520bf5a58e25} - - -Matrix unary minus operator. Returns an object of the same dimensions as A but with changed element signs. - - -\begin{DoxyParams}{Parameters} -{\em A,:} & matrix located at the right hand side of the operator. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ad80782cbeec0075aeaa43fc2e2264cc0}{ -\index{DMatrix@{DMatrix}!orth@{orth}} -\index{orth@{orth}!DMatrix@{DMatrix}} -\subsubsection[{orth}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& orth ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad80782cbeec0075aeaa43fc2e2264cc0} - - -This function returns Q, the orthonormal basis for the range of a matrix A, such that $ Q Q' = I $. The number of columns of Q is the rank of A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a07480acdabc192269bf2fceb56eb2ef4}{ -\index{DMatrix@{DMatrix}!pinv@{pinv}} -\index{pinv@{pinv}!DMatrix@{DMatrix}} -\subsubsection[{pinv}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& pinv ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a07480acdabc192269bf2fceb56eb2ef4} - - -This function returns the pseudo-\/inverse of a given rectangular matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a6cec987fa2c6fb5fb22aaa07e647adba}{ -\index{DMatrix@{DMatrix}!prod@{prod}} -\index{prod@{prod}!DMatrix@{DMatrix}} -\subsubsection[{prod}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& prod ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a6cec987fa2c6fb5fb22aaa07e647adba} - - -This function returns a row vector with the product of the elements of each column of matrix A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a4d51f780b4a609cd73c6c6b9b2ff1884}{ -\index{DMatrix@{DMatrix}!Product@{Product}} -\index{Product@{Product}!DMatrix@{DMatrix}} -\subsubsection[{Product}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& Product ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a4d51f780b4a609cd73c6c6b9b2ff1884} - - -This function calculates the product of two matrices. The number of columns of the first matrix must be the same as the number of rows of the second matrix, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ad77d1a08b972e1cbba7bb60b7ea20bf1}{ -\index{DMatrix@{DMatrix}!ProductT@{ProductT}} -\index{ProductT@{ProductT}!DMatrix@{DMatrix}} -\subsubsection[{ProductT}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& ProductT ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad77d1a08b972e1cbba7bb60b7ea20bf1} - - -This function returns the product of the first matrix times the second matrix transposed. The number of columns of both matrices must be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a31d884a31b9ef5b534de344af01e2a38}{ -\index{DMatrix@{DMatrix}!QR@{QR}} -\index{QR@{QR}!DMatrix@{DMatrix}} -\subsubsection[{QR}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& QR ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a31d884a31b9ef5b534de344af01e2a38} - - -Returns the QR factorisation of a matrix A. The number of rows of matrix A must be greater or equal than the number of columns. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object· \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_a3a0e406e05efdd9374cc918645053b27}{QRFSolve()}, \hyperlink{classDMatrix_a3b4d3e101ff20bd05a1908437481bef0}{QRSolve()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_a3a0e406e05efdd9374cc918645053b27}{ -\index{DMatrix@{DMatrix}!QRFSolve@{QRFSolve}} -\index{QRFSolve@{QRFSolve}!DMatrix@{DMatrix}} -\subsubsection[{QRFSolve}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& QRFSolve ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{b} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a3a0e406e05efdd9374cc918645053b27} - - -Solves the system of equations $ A x = b $ using QR factorisation. The function uses a previously found QR factorisation. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em b} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation (the resulting vector x) -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_a3b4d3e101ff20bd05a1908437481bef0}{QRSolve()}, \hyperlink{classDMatrix_a31d884a31b9ef5b534de344af01e2a38}{QR()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_a3b4d3e101ff20bd05a1908437481bef0}{ -\index{DMatrix@{DMatrix}!QRSolve@{QRSolve}} -\index{QRSolve@{QRSolve}!DMatrix@{DMatrix}} -\subsubsection[{QRSolve}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& QRSolve ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{b} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a3b4d3e101ff20bd05a1908437481bef0} - - -Solves the system of equations $ A x = b $ using QR factorisation. The number of rows of matrix A must be greater or equal than the number of columns. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em b} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation (the resulting vector x) -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_a3a0e406e05efdd9374cc918645053b27}{QRFSolve()}, \hyperlink{classDMatrix_a31d884a31b9ef5b534de344af01e2a38}{QR()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_a4bc7a80762269f95de50605fc87f0223}{ -\index{DMatrix@{DMatrix}!randn@{randn}} -\index{randn@{randn}!DMatrix@{DMatrix}} -\subsubsection[{randn}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& randn ( -\begin{DoxyParamCaption} -\item[{long}]{n, } -\item[{long}]{m} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a4bc7a80762269f95de50605fc87f0223} - - -This function returns an nxm matrix where each element is a Gaussian pseudo-\/random number in the range with zero mean and variance 1. - - -\begin{DoxyParams}{Parameters} -{\em n} & is the desired number of rows of the returned matrix \\ -\hline -{\em m} & is the desired number of columns of the returned matrix \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a299e165ca173181d5efb78a2098f742c}{ -\index{DMatrix@{DMatrix}!randu@{randu}} -\index{randu@{randu}!DMatrix@{DMatrix}} -\subsubsection[{randu}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& randu ( -\begin{DoxyParamCaption} -\item[{long}]{n, } -\item[{long}]{m} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a299e165ca173181d5efb78a2098f742c} - - -This function returns an nxm matrix where each element is a uniform pseudo-\/random number in the range (0,1). - - -\begin{DoxyParams}{Parameters} -{\em n} & is the desired number of rows of the returned matrix \\ -\hline -{\em m} & is the desired number of columns of the returned matrix \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a5379bc44e75307fc4f0242ef196ca2c8}{ -\index{DMatrix@{DMatrix}!rank@{rank}} -\index{rank@{rank}!DMatrix@{DMatrix}} -\subsubsection[{rank}]{\setlength{\rightskip}{0pt plus 5cm}int rank ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a5379bc44e75307fc4f0242ef196ca2c8} - - -This function returns an estimate of the rank of a matrix, which is the number of linearly independent rows or columns. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the rank estimate. -\end{DoxyReturn} -\hypertarget{classDMatrix_a5421e6760accac0eefb83d4a604e0612}{ -\index{DMatrix@{DMatrix}!rcond@{rcond}} -\index{rcond@{rcond}!DMatrix@{DMatrix}} -\subsubsection[{rcond}]{\setlength{\rightskip}{0pt plus 5cm}double rcond ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a5421e6760accac0eefb83d4a604e0612} - - -This function estimates the 1-\/norm reciprocal condition number of a matrix. The function uses the LAPACK function dgecon. if A is well conditioned, then rcond(A) is near 1. If A is badly conditioned, then rcond(A) is close to the machine numerical precision (very small). If the input matrix is not square, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the reciprocal condition number estimate -\end{DoxyReturn} -\hypertarget{classDMatrix_ae626fae47c554940c8384933c6ca1e9f}{ -\index{DMatrix@{DMatrix}!reshape@{reshape}} -\index{reshape@{reshape}!DMatrix@{DMatrix}} -\subsubsection[{reshape}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& reshape ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} \&}]{A, } -\item[{long}]{N, } -\item[{long}]{M} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ae626fae47c554940c8384933c6ca1e9f} - - -This function returns the N-\/by-\/M matrix whose elements are taken columnwise from the input matrix A. An error is thrown if A does not have N$\ast$M elements. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em N} & is the desired number of rows of the reshaped matrix \\ -\hline -{\em M} & is the desired number of columns of the reshaped matrix \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a2dfbc15150a97456fefdd9d23b1e0932}{ -\index{DMatrix@{DMatrix}!schur@{schur}} -\index{schur@{schur}!DMatrix@{DMatrix}} -\subsubsection[{schur}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& schur ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{{\bf DMatrix} $\ast$}]{U = {\ttfamily NULL}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a2dfbc15150a97456fefdd9d23b1e0932} - - -This function computes and returns the Schur decomposition of a matrix A, such that $ A=Q'U Q $, where U is an upper triangular matrix and Q is a unitary matrix. This function uses the LAPACK routine dgees\_\-() - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em U} & is a pointer to a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the unitary matrix Q. -\end{DoxyReturn} -\hypertarget{classDMatrix_ad7d82c1616fcc97e403e50a5066ec851}{ -\index{DMatrix@{DMatrix}!sin@{sin}} -\index{sin@{sin}!DMatrix@{DMatrix}} -\subsubsection[{sin}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& sin ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad7d82c1616fcc97e403e50a5066ec851} - - -This function returns a matrix with the sine of each element of the input matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a6b8bfbf386b29e7333e14e4e6d894608}{ -\index{DMatrix@{DMatrix}!sinh@{sinh}} -\index{sinh@{sinh}!DMatrix@{DMatrix}} -\subsubsection[{sinh}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& sinh ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a6b8bfbf386b29e7333e14e4e6d894608} - - -This function returns a matrix with the hyperbolic sine of each element of the input matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a6b5be996dbe79c22b1a6d616644a1b73}{ -\index{DMatrix@{DMatrix}!sort@{sort}} -\index{sort@{sort}!DMatrix@{DMatrix}} -\subsubsection[{sort}]{\setlength{\rightskip}{0pt plus 5cm}void sort ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} \&}]{x, } -\item[{{\bf DMatrix} \&}]{indx} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a6b5be996dbe79c22b1a6d616644a1b73} - - -This function sorts the input vector x in ascending order. It also returns a \hyperlink{classDMatrix}{DMatrix} object with the sorted indices. If the input object is not a vector, then an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em x} & is a \hyperlink{classDMatrix}{DMatrix} object which upon input contains the unsorted vector and upon output contains the sorted vector. \\ -\hline -{\em indx} & is a \hyperlink{classDMatrix}{DMatrix} object which upon output contains the values of the sorted indices. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_ad77fbdfed1b98748e430e4efc2c91856}{ -\index{DMatrix@{DMatrix}!sort@{sort}} -\index{sort@{sort}!DMatrix@{DMatrix}} -\subsubsection[{sort}]{\setlength{\rightskip}{0pt plus 5cm}void sort ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} \&}]{x, } -\item[{int}]{indx\mbox{[}$\,$\mbox{]} = {\ttfamily NULL}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ad77fbdfed1b98748e430e4efc2c91856} - - -This function sorts the input vector x in ascending order. Optionally, it also returns an integer array of sorted indices. If the input object is not a vector, then an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em x} & is a \hyperlink{classDMatrix}{DMatrix} object which upon input contains the unsorted vector and upon output contains the sorted vector. \\ -\hline -{\em indx} & is a pointer to the first element of the array of sorted indices. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -void -\end{DoxyReturn} -\hypertarget{classDMatrix_ae2a60a1294685079c39ea189bacdb4d2}{ -\index{DMatrix@{DMatrix}!Sqrt@{Sqrt}} -\index{Sqrt@{Sqrt}!DMatrix@{DMatrix}} -\subsubsection[{Sqrt}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& Sqrt ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ae2a60a1294685079c39ea189bacdb4d2} - - -This function computes the square root of each element of the input matrix A, and it returns a \hyperlink{classDMatrix}{DMatrix} object with the same dimensions as the input matrix. If any element of the input matrix is negative, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a7c163993971bbf77eb42200e73061eee}{ -\index{DMatrix@{DMatrix}!Std@{Std}} -\index{Std@{Std}!DMatrix@{DMatrix}} -\subsubsection[{Std}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& Std ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{int}]{ntype = {\ttfamily 0}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a7c163993971bbf77eb42200e73061eee} - - -This function returns a row vector with the standard deviation of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-\/1), where n is the number of rows of A. Otherwise, the result is normalised with n. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em ntype} & is the type of normalization, 0 (default) or 1. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a7c0db4e6107794b51335d3c767a9cb55}{ -\index{DMatrix@{DMatrix}!sum@{sum}} -\index{sum@{sum}!DMatrix@{DMatrix}} -\subsubsection[{sum}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& sum ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a7c0db4e6107794b51335d3c767a9cb55} - - -This function returns a row vector with the sum of the elements of each column of matrix A. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_afb39cb034e5bef5e4e416a22d53afb56}{ -\index{DMatrix@{DMatrix}!SVD@{SVD}} -\index{SVD@{SVD}!DMatrix@{DMatrix}} -\subsubsection[{SVD}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& SVD ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{{\bf DMatrix} $\ast$}]{U = {\ttfamily NULL}, } -\item[{{\bf DMatrix} $\ast$}]{V = {\ttfamily NULL}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_afb39cb034e5bef5e4e416a22d53afb56} - - -Returns the singular value decomposition of a matrix $ A = U' diag(s) V $, where vector s contains the singular values of A. The function uses the LAPACK routine dgesvd\_\-(). - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object· \\ -\hline -{\em U} & is a pointer to a \hyperlink{classDMatrix}{DMatrix} object, which is modified on output to contain the U factor of the decomposition. \\ -\hline -{\em V} & is a pointer to a \hyperlink{classDMatrix}{DMatrix} object, which is modified on output to contain the V factor of the decomposition. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with a vector that contains the singular values of matrix A. -\end{DoxyReturn} -\hypertarget{classDMatrix_a13a156103ead07b546c81e6bdd366280}{ -\index{DMatrix@{DMatrix}!SVDSolve@{SVDSolve}} -\index{SVDSolve@{SVDSolve}!DMatrix@{DMatrix}} -\subsubsection[{SVDSolve}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& SVDSolve ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a13a156103ead07b546c81e6bdd366280} - - -This function uses the LAPACK routine dgelss\_\-() to compute the minimum norm solution to a real linear least squares problem: Minimize $ || B - A x ||_2 $ using the singular value decomposition (SVD) of A. A is a rectangular matrix which may be rank-\/deficient. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation (the resulting vector x) -\end{DoxyReturn} -\begin{DoxySeeAlso}{See also} -\hyperlink{classDMatrix_afb39cb034e5bef5e4e416a22d53afb56}{SVD()} -\end{DoxySeeAlso} -\hypertarget{classDMatrix_a60601de2de5f8d857668cca1cea050e5}{ -\index{DMatrix@{DMatrix}!tan@{tan}} -\index{tan@{tan}!DMatrix@{DMatrix}} -\subsubsection[{tan}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& tan ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a60601de2de5f8d857668cca1cea050e5} - - -This function returns a matrix with the tangent of each element of the input matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a524a9c2858469d68aac6a342eac2198a}{ -\index{DMatrix@{DMatrix}!tanh@{tanh}} -\index{tanh@{tanh}!DMatrix@{DMatrix}} -\subsubsection[{tanh}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& tanh ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a524a9c2858469d68aac6a342eac2198a} - - -This function returns a matrix with the hyperbolic tangent of each element of the input matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a38664cf3d259198ae1e644736aa5e70e}{ -\index{DMatrix@{DMatrix}!toc@{toc}} -\index{toc@{toc}!DMatrix@{DMatrix}} -\subsubsection[{toc}]{\setlength{\rightskip}{0pt plus 5cm}double toc ( -\begin{DoxyParamCaption} -{} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a38664cf3d259198ae1e644736aa5e70e} - - -This function, which is to be used in conjunction with function \hyperlink{classDMatrix_ace51fd7d8435f88c8b2b3bcf64367673}{tic()}, stops counting CPU time, and it prints and returns the elapsed time in seconds since the function \hyperlink{classDMatrix_ace51fd7d8435f88c8b2b3bcf64367673}{tic()} was called. - -\begin{DoxyReturn}{Returns} -the elapsed time in seconds. -\end{DoxyReturn} -\hypertarget{classDMatrix_a36fc8f1174ba00e793bd88142dc11b9f}{ -\index{DMatrix@{DMatrix}!TProduct@{TProduct}} -\index{TProduct@{TProduct}!DMatrix@{DMatrix}} -\subsubsection[{TProduct}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& TProduct ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a36fc8f1174ba00e793bd88142dc11b9f} - - -This function returns the product of the first matrix transposed times the second matrix. The number of rows of both matrices must be the same, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_acf0028536903ebb3dc83f1a83b20165c}{ -\index{DMatrix@{DMatrix}!TProductT@{TProductT}} -\index{TProductT@{TProductT}!DMatrix@{DMatrix}} -\subsubsection[{TProductT}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& TProductT ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A, } -\item[{const {\bf DMatrix} \&}]{B} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_acf0028536903ebb3dc83f1a83b20165c} - - -This function returns the product of the first matrix transposed times the second matrix transposed. The number of rows of the first matrix must be the same as the number of columns of the second matrix, otherwise an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -{\em B} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_ada53ba13afcbd8b7e0916c3275839a85}{ -\index{DMatrix@{DMatrix}!tra@{tra}} -\index{tra@{tra}!DMatrix@{DMatrix}} -\subsubsection[{tra}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& tra ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_ada53ba13afcbd8b7e0916c3275839a85} - - -This function returns the transpose of a given matrix. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a25e61176fea3c03f41f8a4524a3a08b0}{ -\index{DMatrix@{DMatrix}!trace@{trace}} -\index{trace@{trace}!DMatrix@{DMatrix}} -\subsubsection[{trace}]{\setlength{\rightskip}{0pt plus 5cm}double trace ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a25e61176fea3c03f41f8a4524a3a08b0} - - -This function returns the trace of a square matrix. If the input matrix is not square, an error is thrown. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -the trace of the matrix. -\end{DoxyReturn} -\hypertarget{classDMatrix_a8483633c05422fa0beb4fcad7276152f}{ -\index{DMatrix@{DMatrix}!triu@{triu}} -\index{triu@{triu}!DMatrix@{DMatrix}} -\subsubsection[{triu}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& triu ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a8483633c05422fa0beb4fcad7276152f} - - -This function extracts and return the triangular upper part of the input matrix A. The returned object has the same dimensions as the input object. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a45de81d6d9403a02c173fadc2ffb369a}{ -\index{DMatrix@{DMatrix}!var@{var}} -\index{var@{var}!DMatrix@{DMatrix}} -\subsubsection[{var}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& var ( -\begin{DoxyParamCaption} -\item[{{\bf DMatrix} \&}]{A, } -\item[{int}]{ntype = {\ttfamily 0}} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a45de81d6d9403a02c173fadc2ffb369a} - - -This function returns a row vector with the variance of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-\/1), where n is the number of rows of A. Otherwise, the result is normalised with n. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -{\em ntype} & is the type of normalization, 0 (default) or 1. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a643b82daee87c5738faac272b56e8ea8}{ -\index{DMatrix@{DMatrix}!vec@{vec}} -\index{vec@{vec}!DMatrix@{DMatrix}} -\subsubsection[{vec}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& vec ( -\begin{DoxyParamCaption} -\item[{const {\bf DMatrix} \&}]{A} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a643b82daee87c5738faac272b56e8ea8} - - -This function returns a column vector made by stacking the columns of a matrix one below the other from left to right. - - -\begin{DoxyParams}{Parameters} -{\em A} & is a \hyperlink{classDMatrix}{DMatrix} object. \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} -\hypertarget{classDMatrix_a2150db6f40794cd7741043bcd593d2ce}{ -\index{DMatrix@{DMatrix}!zeros@{zeros}} -\index{zeros@{zeros}!DMatrix@{DMatrix}} -\subsubsection[{zeros}]{\setlength{\rightskip}{0pt plus 5cm}{\bf DMatrix}\& zeros ( -\begin{DoxyParamCaption} -\item[{long}]{n, } -\item[{long}]{m} -\end{DoxyParamCaption} -)\hspace{0.3cm}{\ttfamily \mbox{[}friend\mbox{]}}}} -\label{classDMatrix_a2150db6f40794cd7741043bcd593d2ce} - - -This function returns a matrix full of zeros with specified numbers of rows and columns. - - -\begin{DoxyParams}{Parameters} -{\em n} & is the desired number of rows \\ -\hline -{\em m} & is the desired number of columns \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -Reference to a temporary \hyperlink{classDMatrix}{DMatrix} object with the result of the operation -\end{DoxyReturn} - - -\subsection{Member Data Documentation} -\hypertarget{classDMatrix_a7d862f142821d27ff3ca0620170428ba}{ -\index{DMatrix@{DMatrix}!atype@{atype}} -\index{atype@{atype}!DMatrix@{DMatrix}} -\subsubsection[{atype}]{\setlength{\rightskip}{0pt plus 5cm}int {\bf DMatrix::atype}\hspace{0.3cm}{\ttfamily \mbox{[}protected\mbox{]}}}} -\label{classDMatrix_a7d862f142821d27ff3ca0620170428ba} -Flag to indicate type of allocation. type = 0 : allocated matrix type = 1 : non-\/allocated matrix, uses predefined array for storage \hypertarget{classDMatrix_a1b72a6547b064c5e262e5db9389b34f4}{ -\index{DMatrix@{DMatrix}!mtype@{mtype}} -\index{mtype@{mtype}!DMatrix@{DMatrix}} -\subsubsection[{mtype}]{\setlength{\rightskip}{0pt plus 5cm}int {\bf DMatrix::mtype}\hspace{0.3cm}{\ttfamily \mbox{[}protected\mbox{]}}}} -\label{classDMatrix_a1b72a6547b064c5e262e5db9389b34f4} -Flag to indicate type of matrix mtype = 0 : normal matrix mtype = 1 : colon -\/ reference matrix - -The documentation for this class was generated from the following file:\begin{DoxyCompactItemize} -\item -dmatrixv.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/classErrorHandler.tex b/dmatrix/doc/latex/classErrorHandler.tex deleted file mode 100644 index c6fcc75a..00000000 --- a/dmatrix/doc/latex/classErrorHandler.tex +++ /dev/null @@ -1,58 +0,0 @@ -\hypertarget{classErrorHandler}{ -\section{ErrorHandler Class Reference} -\label{classErrorHandler}\index{ErrorHandler@{ErrorHandler}} -} - - -\hyperlink{classErrorHandler}{ErrorHandler} class. - - - - -{\ttfamily \#include $<$dmatrixv.h$>$} - -\subsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\hyperlink{classErrorHandler_a6d507618dc2e6ba1d83f7f9efcb0053a}{ErrorHandler} (const string m) -\begin{DoxyCompactList}\small\item\em A constructor which takes the error message as an argument and assigns it to error\_\-message. \item\end{DoxyCompactList}\end{DoxyCompactItemize} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{classErrorHandler_a4eb3e8f364dab7bee13c79e51b323bf8}{ -string \hyperlink{classErrorHandler_a4eb3e8f364dab7bee13c79e51b323bf8}{error\_\-message}} -\label{classErrorHandler_a4eb3e8f364dab7bee13c79e51b323bf8} - -\begin{DoxyCompactList}\small\item\em A string of characters which contains the error message. \item\end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} -\hyperlink{classErrorHandler}{ErrorHandler} class. This is a C++ class intended to handle error conditions. - -\subsection{Constructor \& Destructor Documentation} -\hypertarget{classErrorHandler_a6d507618dc2e6ba1d83f7f9efcb0053a}{ -\index{ErrorHandler@{ErrorHandler}!ErrorHandler@{ErrorHandler}} -\index{ErrorHandler@{ErrorHandler}!ErrorHandler@{ErrorHandler}} -\subsubsection[{ErrorHandler}]{\setlength{\rightskip}{0pt plus 5cm}ErrorHandler::ErrorHandler ( -\begin{DoxyParamCaption} -\item[{const string}]{m} -\end{DoxyParamCaption} -)}} -\label{classErrorHandler_a6d507618dc2e6ba1d83f7f9efcb0053a} - - -A constructor which takes the error message as an argument and assigns it to error\_\-message. - - -\begin{DoxyParams}{Parameters} -{\em m} & is the error message string. \\ -\hline -\end{DoxyParams} -\begin{DoxySeeAlso}{See also} -function \hyperlink{classErrorHandler_a4eb3e8f364dab7bee13c79e51b323bf8}{error\_\-message()}. -\end{DoxySeeAlso} - - -The documentation for this class was generated from the following file:\begin{DoxyCompactItemize} -\item -dmatrixv.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/classInitializeDMatrixClass.tex b/dmatrix/doc/latex/classInitializeDMatrixClass.tex deleted file mode 100644 index 61bf2cf3..00000000 --- a/dmatrix/doc/latex/classInitializeDMatrixClass.tex +++ /dev/null @@ -1,34 +0,0 @@ -\hypertarget{classInitializeDMatrixClass}{ -\section{InitializeDMatrixClass Class Reference} -\label{classInitializeDMatrixClass}\index{InitializeDMatrixClass@{InitializeDMatrixClass}} -} - - -\hyperlink{classInitializeDMatrixClass}{InitializeDMatrixClass} class. - - - - -{\ttfamily \#include $<$dmatrixv.h$>$} - -\subsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{classInitializeDMatrixClass_a205e18726609139178de0663a5c8ccbc}{ -\hyperlink{classInitializeDMatrixClass_a205e18726609139178de0663a5c8ccbc}{InitializeDMatrixClass} ()} -\label{classInitializeDMatrixClass_a205e18726609139178de0663a5c8ccbc} - -\begin{DoxyCompactList}\small\item\em This is the default constructor which calls the function \hyperlink{classDMatrix_aadec35682639717d9bc698cfee3953ad}{DMatrix::AllocateAuxArr()}. \item\end{DoxyCompactList}\item -\hypertarget{classInitializeDMatrixClass_ac77fb277a57018bb436d7487d877096c}{ -\hyperlink{classInitializeDMatrixClass_ac77fb277a57018bb436d7487d877096c}{$\sim$InitializeDMatrixClass} ()} -\label{classInitializeDMatrixClass_ac77fb277a57018bb436d7487d877096c} - -\begin{DoxyCompactList}\small\item\em This is the destructor which calls the function \hyperlink{classDMatrix_a6389bc3790f8b71dd59a8f2bd659fc27}{DMatrix::DeAllocateAuxArr()}. \item\end{DoxyCompactList}\end{DoxyCompactItemize} - - -\subsection{Detailed Description} -\hyperlink{classInitializeDMatrixClass}{InitializeDMatrixClass} class. This is a dummy C++ class intended to initialise the temporary objects of the \hyperlink{classDMatrix}{DMatrix} class. - -The documentation for this class was generated from the following file:\begin{DoxyCompactItemize} -\item -dmatrixv.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/doxygen.sty b/dmatrix/doc/latex/doxygen.sty deleted file mode 100644 index 4abb46b9..00000000 --- a/dmatrix/doc/latex/doxygen.sty +++ /dev/null @@ -1,445 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{doxygen} - -% Packages used by this style file -\RequirePackage{alltt} -\RequirePackage{array} -\RequirePackage{calc} -\RequirePackage{color} -\RequirePackage{fancyhdr} -\RequirePackage{longtable} -\RequirePackage{verbatim} -\RequirePackage{ifthen} -\RequirePackage[table]{xcolor} - -% Use helvetica font instead of times roman -\RequirePackage{helvet} -\RequirePackage{sectsty} -\RequirePackage{tocloft} -\allsectionsfont{\usefont{OT1}{phv}{bc}{n}\selectfont} -\providecommand{\cftchapfont}{% - \fontsize{11}{13}\usefont{OT1}{phv}{bc}{n}\selectfont -} -\providecommand{\cftchappagefont}{% - \fontsize{11}{13}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cftsecfont}{% - \fontsize{10}{12}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cftsecpagefont}{% - \fontsize{10}{12}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cftsubsecfont}{% - \fontsize{10}{12}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cftsubsecpagefont}{% - \fontsize{10}{12}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cftsubsubsecfont}{% - \fontsize{9}{11}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cftsubsubsecpagefont}{% - \fontsize{9}{11}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cftparafont}{% - \fontsize{9}{11}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cftparapagefont}{% - \fontsize{9}{11}\usefont{OT1}{phv}{c}{n}\selectfont -} -\providecommand{\cfttoctitlefont}{% - \fontsize{20}{22}\usefont{OT1}{phv}{b}{n}\selectfont -} -\providecommand{\rmdefault}{phv} -\providecommand{\bfdefault}{bc} - - -% Setup fancy headings -\pagestyle{fancyplain} -\newcommand{\clearemptydoublepage}{% - \newpage{\pagestyle{empty}\cleardoublepage}% -} -\renewcommand{\chaptermark}[1]{% - \markboth{#1}{}% -} -\renewcommand{\sectionmark}[1]{% - \markright{\thesection\ #1}% -} -\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}} -\fancyhead[CE]{\fancyplain{}{}} -\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}} -\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}} -\fancyhead[CO]{\fancyplain{}{}} -\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}} -\fancyfoot[LE]{\fancyplain{}{}} -\fancyfoot[CE]{\fancyplain{}{}} -\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated on Thu Jul 28 2011 11:41:53 for DMatrix and SparseMatrix C++ classes by Doxygen }} -\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated on Thu Jul 28 2011 11:41:53 for DMatrix and SparseMatrix C++ classes by Doxygen }} -\fancyfoot[CO]{\fancyplain{}{}} -\fancyfoot[RO]{\fancyplain{}{}} -%---------- Internal commands used in this style file ---------------- - -% Generic environment used by all paragraph-based environments defined -% below. Note that the command \title{...} needs to be defined inside -% those environments! -\newenvironment{DoxyDesc}[1]{% - \begin{list}{}% - {% - \settowidth{\labelwidth}{40pt}% - \setlength{\leftmargin}{\labelwidth}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{-4pt}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1]% -}{% - \end{list}% -} - -%---------- Commands used by doxygen LaTeX output generator ---------- - -% Used by
 ... 
-\newenvironment{DoxyPre}{% - \small% - \begin{alltt}% -}{% - \end{alltt}% - \normalsize% -} - -% Used by @code ... @endcode -\newenvironment{DoxyCode}{% - \footnotesize% - \verbatim% -}{% - \endverbatim% - \normalsize% -} - -% Used by @example, @include, @includelineno and @dontinclude -\newenvironment{DoxyCodeInclude}{% - \DoxyCode% -}{% - \endDoxyCode% -} - -% Used by @verbatim ... @endverbatim -\newenvironment{DoxyVerb}{% - \footnotesize% - \verbatim% -}{% - \endverbatim% - \normalsize% -} - -% Used by @verbinclude -\newenvironment{DoxyVerbInclude}{% - \DoxyVerb% -}{% - \endDoxyVerb% -} - -% Used by numbered lists (using '-#' or
    ...
) -\newenvironment{DoxyEnumerate}{% - \enumerate% -}{% - \endenumerate% -} - -% Used by bullet lists (using '-', @li, @arg, or
    ...
) -\newenvironment{DoxyItemize}{% - \itemize% -}{% - \enditemize% -} - -% Used by description lists (using
...
) -\newenvironment{DoxyDescription}{% - \description% -}{% - \enddescription% -} - -% Used by @image, @dotfile, and @dot ... @enddot -% (only if caption is specified) -\newenvironment{DoxyImage}{% - \begin{figure}[H]% - \begin{center}% -}{% - \end{center}% - \end{figure}% -} - -% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc -% (only if no caption is specified) -\newenvironment{DoxyImageNoCaption}{% -}{% -} - -% Used by @attention -\newenvironment{DoxyAttention}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @author and @authors -\newenvironment{DoxyAuthor}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @date -\newenvironment{DoxyDate}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @invariant -\newenvironment{DoxyInvariant}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @note -\newenvironment{DoxyNote}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @post -\newenvironment{DoxyPostcond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @pre -\newenvironment{DoxyPrecond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @remark -\newenvironment{DoxyRemark}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @return -\newenvironment{DoxyReturn}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @since -\newenvironment{DoxySince}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @see -\newenvironment{DoxySeeAlso}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @version -\newenvironment{DoxyVersion}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @warning -\newenvironment{DoxyWarning}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @internal -\newenvironment{DoxyInternal}[1]{% - \paragraph*{#1}% -}{% -} - -% Used by @par and @paragraph -\newenvironment{DoxyParagraph}[1]{% - \begin{list}{}% - {% - \settowidth{\labelwidth}{40pt}% - \setlength{\leftmargin}{\labelwidth}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{-4pt}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1]% -}{% - \end{list}% -} - -% Used by parameter lists -\newenvironment{DoxyParams}[2][]{% - \begin{DoxyDesc}{#2}% - \begin{description}% - \item[] \hspace{\fill} \vspace{-25pt}% - \definecolor{tableShade}{HTML}{F8F8F8}% - \rowcolors{1}{white}{tableShade}% - \arrayrulecolor{gray}% - \setlength{\tabcolsep}{0.01\textwidth}% - \ifthenelse{\equal{#1}{}} - {\begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% - p{0.87\textwidth}|}}% - {\ifthenelse{\equal{#1}{1}}% - {\begin{longtable}{|>{\centering}p{0.10\textwidth}|% - >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% - p{0.75\textwidth}|}}% - {\begin{longtable}{|>{\centering}p{0.10\textwidth}|% - >{\centering\hspace{0pt}}p{0.15\textwidth}|% - >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% - p{0.58\textwidth}|}}% - }\hline% -}{% - \end{longtable}% - \end{description}% - \end{DoxyDesc}% -} - -% is used for parameters within a detailed function description -\newenvironment{DoxyParamCaption}{% - \renewcommand{\item}[2][]{##1 {\em ##2}}% - }{% -} - -% Used by return value lists -\newenvironment{DoxyRetVals}[1]{% - \begin{DoxyDesc}{#1}% - \begin{description}% - \item[] \hspace{\fill} \vspace{-25pt}% - \definecolor{tableShade}{HTML}{F8F8F8}% - \rowcolors{1}{white}{tableShade}% - \arrayrulecolor{gray}% - \setlength{\tabcolsep}{0.01\textwidth}% - \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% - p{0.77\textwidth}|}% - \hline% -}{% - \end{longtable}% - \end{description}% - \end{DoxyDesc}% -} - -% Used by exception lists -\newenvironment{DoxyExceptions}[1]{% - \begin{DoxyDesc}{#1}% - \begin{description}% - \item[] \hspace{\fill} \vspace{-25pt}% - \definecolor{tableShade}{HTML}{F8F8F8}% - \rowcolors{1}{white}{tableShade}% - \arrayrulecolor{gray}% - \setlength{\tabcolsep}{0.01\textwidth}% - \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% - p{0.77\textwidth}|}% - \hline% -}{% - \end{longtable}% - \end{description}% - \end{DoxyDesc}% -} - -% Used by template parameter lists -\newenvironment{DoxyTemplParams}[1]{% - \begin{DoxyDesc}{#1}% - \begin{description}% - \item[] \hspace{\fill} \vspace{-25pt}% - \definecolor{tableShade}{HTML}{F8F8F8}% - \rowcolors{1}{white}{tableShade}% - \arrayrulecolor{gray}% - \setlength{\tabcolsep}{0.01\textwidth}% - \begin{longtable}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% - p{0.77\textwidth}|}% - \hline% -}{% - \end{longtable}% - \end{description}% - \end{DoxyDesc}% -} - -\newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})} -\newenvironment{DoxyCompactList} -{\begin{list}{}{ - \setlength{\leftmargin}{0.5cm} - \setlength{\itemsep}{0pt} - \setlength{\parsep}{0pt} - \setlength{\topsep}{0pt} - \renewcommand{\makelabel}{\hfill}}} -{\end{list}} -\newenvironment{DoxyCompactItemize} -{ - \begin{itemize} - \setlength{\itemsep}{-3pt} - \setlength{\parsep}{0pt} - \setlength{\topsep}{0pt} - \setlength{\partopsep}{0pt} -} -{\end{itemize}} -\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} -\newlength{\tmplength} -\newenvironment{TabularC}[1] -{ -\setlength{\tmplength} - {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} - \par\begin{tabular*}{\linewidth} - {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} -} -{\end{tabular*}\par} -\newcommand{\entrylabel}[1]{ - {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\vspace{1.5\baselineskip}}}} -\newenvironment{Desc} -{\begin{list}{} - { - \settowidth{\labelwidth}{40pt} - \setlength{\leftmargin}{\labelwidth} - \setlength{\parsep}{0pt} - \setlength{\itemsep}{-4pt} - \renewcommand{\makelabel}{\entrylabel} - } -} -{\end{list}} -\newenvironment{Indent} - {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} - \item[]\ignorespaces} - {\unskip\end{list}} -\setlength{\parindent}{0cm} -\setlength{\parskip}{0.2cm} -\addtocounter{secnumdepth}{1} -\usepackage[T1]{fontenc} -\makeatletter -\renewcommand{\paragraph}{\@startsection{paragraph}{4}{0ex}% - {-3.25ex plus -1ex minus -0.2ex}% - {1.5ex plus 0.2ex}% - {\normalfont\normalsize\bfseries}} -\makeatother -\stepcounter{secnumdepth} -\stepcounter{tocdepth} -\definecolor{comment}{rgb}{0.5,0.0,0.0} -\definecolor{keyword}{rgb}{0.0,0.5,0.0} -\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} -\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} -\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} -\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} -\definecolor{charliteral}{rgb}{0.0,0.5,0.5} -\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} -\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} -\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} -\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} diff --git a/dmatrix/doc/latex/index.tex b/dmatrix/doc/latex/index.tex deleted file mode 100644 index 94c30f37..00000000 --- a/dmatrix/doc/latex/index.tex +++ /dev/null @@ -1,13 +0,0 @@ -\hypertarget{index_intro}{}\section{Introduction}\label{index_intro} -The author developed the main features of the \hyperlink{classDMatrix}{DMatrix} class between 1994 and 1999. The class makes extensive use of operator overloading in order to facilitate the implementation in C++ of complicated matrix expressions, and it has intefaces to a number of LAPACK routines. In 2008, the class has been tested with current compilers, its functionality was expanded, and the code was published under the GNU Lesser General Public License. The class at present is restricted to dense and real matrices. In 2008, the SparseMatrix class was added to the library to incorporate basic sparse matrix functionality. The SparseMatrix class offers interfaces to some functions available in the CXSparse and LUSOL libraries. - -The library should compile without problems with the following C++ compilers: GNU C++ version 4.X and Microsoft Visual Studio 2005.\hypertarget{index_license}{}\section{License}\label{index_license} -This work is copyright (c) Victor M. Becerra (2009) - -This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-\/1301 USA, or visit \href{http://www.gnu.org/licenses/}{\tt http://www.gnu.org/licenses/} - -Author: Dr. Victor M. Becerra, University of Reading, School of Systems Engineering, P.O. Box 225, Reading RG6 6AY, United Kingdom, e-\/mail: \href{mailto:v.m.becerra@ieee.org}{\tt v.m.becerra@ieee.org}.\hypertarget{index_install}{}\section{Installing the library}\label{index_install} -See the INSTALL file. \hypertarget{index_examples}{}\section{Examples of use}\label{index_examples} -See the source code in the examples directory. \ No newline at end of file diff --git a/dmatrix/doc/latex/missfont.log b/dmatrix/doc/latex/missfont.log deleted file mode 100644 index 198b7e14..00000000 --- a/dmatrix/doc/latex/missfont.log +++ /dev/null @@ -1 +0,0 @@ -mktextfm ecrm1000 diff --git a/dmatrix/doc/latex/refman.log b/dmatrix/doc/latex/refman.log deleted file mode 100644 index a580a344..00000000 --- a/dmatrix/doc/latex/refman.log +++ /dev/null @@ -1,861 +0,0 @@ -This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) (format=pdflatex 2015.7.29) 11 AUG 2015 07:40 -entering extended mode - restricted \write18 enabled. - %&-line parsing enabled. -**refman.tex -(./refman.tex -LaTeX2e <2011/06/27> -Babel <3.9h> and hyphenation patterns for 4 languages loaded. -(/usr/share/texlive/texmf-dist/tex/latex/base/book.cls -Document Class: book 2007/10/19 v1.4h Standard LaTeX document class -(/usr/share/texlive/texmf-dist/tex/latex/base/bk10.clo -File: bk10.clo 2007/10/19 v1.4h Standard LaTeX file (size option) -) -\c@part=\count79 -\c@chapter=\count80 -\c@section=\count81 -\c@subsection=\count82 -\c@subsubsection=\count83 -\c@paragraph=\count84 -\c@subparagraph=\count85 -\c@figure=\count86 -\c@table=\count87 -\abovecaptionskip=\skip41 -\belowcaptionskip=\skip42 -\bibindent=\dimen102 -) -(/usr/share/texlive/texmf-dist/tex/latex/base/makeidx.sty -Package: makeidx 2000/03/29 v1.0m Standard LaTeX package -) -(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty -Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) - -(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty -Package: keyval 1999/03/16 v1.13 key=value parser (DPC) -\KV@toks@=\toks14 -) -(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty -Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR) - -(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty -Package: trig 1999/03/16 v1.09 sin cos tan (DPC) -) -(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg -File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live -) -Package graphics Info: Driver file: pdftex.def on input line 91. - -(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def -File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX - -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty -Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) -) -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty -Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) -) -\Gread@gobject=\count88 -)) -\Gin@req@height=\dimen103 -\Gin@req@width=\dimen104 -) -(/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty -Package: multicol 2011/06/27 v1.7a multicolumn formatting (FMi) -\c@tracingmulticols=\count89 -\mult@box=\box26 -\multicol@leftmargin=\dimen105 -\c@unbalance=\count90 -\c@collectmore=\count91 -\doublecol@number=\count92 -\multicoltolerance=\count93 -\multicolpretolerance=\count94 -\full@width=\dimen106 -\page@free=\dimen107 -\premulticols=\dimen108 -\postmulticols=\dimen109 -\multicolsep=\skip43 -\multicolbaselineskip=\skip44 -\partial@page=\box27 -\last@line=\box28 -\mult@rightbox=\box29 -\mult@grightbox=\box30 -\mult@gfirstbox=\box31 -\mult@firstbox=\box32 -\@tempa=\box33 -\@tempa=\box34 -\@tempa=\box35 -\@tempa=\box36 -\@tempa=\box37 -\@tempa=\box38 -\@tempa=\box39 -\@tempa=\box40 -\@tempa=\box41 -\@tempa=\box42 -\@tempa=\box43 -\@tempa=\box44 -\@tempa=\box45 -\@tempa=\box46 -\@tempa=\box47 -\@tempa=\box48 -\@tempa=\box49 -\c@columnbadness=\count95 -\c@finalcolumnbadness=\count96 -\last@try=\dimen110 -\multicolovershoot=\dimen111 -\multicolundershoot=\dimen112 -\mult@nat@firstbox=\box50 -\colbreak@box=\box51 -\multicol@sort@counter=\count97 -) -(/usr/share/texlive/texmf-dist/tex/latex/float/float.sty -Package: float 2001/11/08 v1.3d Float enhancements (AL) -\c@float@type=\count98 -\float@exts=\toks15 -\float@box=\box52 -\@float@everytoks=\toks16 -\@floatcapt=\box53 -) -(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty -\lst@mode=\count99 -\lst@gtempboxa=\box54 -\lst@token=\toks17 -\lst@length=\count100 -\lst@currlwidth=\dimen113 -\lst@column=\count101 -\lst@pos=\count102 -\lst@lostspace=\dimen114 -\lst@width=\dimen115 -\lst@newlines=\count103 -\lst@lineno=\count104 -\lst@maxwidth=\dimen116 - -(/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty -File: lstmisc.sty 2013/08/26 1.5b (Carsten Heinz) -\c@lstnumber=\count105 -\lst@skipnumbers=\count106 -\lst@framebox=\box55 -) -(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.cfg -File: listings.cfg 2013/08/26 1.5b listings configuration -)) -Package: listings 2013/08/26 1.5b (Carsten Heinz) - -(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty -Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC) - -(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg -File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive -) -Package color Info: Driver file: pdftex.def on input line 130. -) -(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty -Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC) -) -(/usr/share/texmf/tex/latex/xcolor/xcolor.sty -Package: xcolor 2007/01/21 v2.11 LaTeX color extensions (UK) - -(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/color.cfg -File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive -) -Package xcolor Info: Driver file: pdftex.def on input line 225. - -(/usr/share/texlive/texmf-dist/tex/latex/colortbl/colortbl.sty -Package: colortbl 2012/02/13 v1.0a Color table columns (DPC) - -(/usr/share/texlive/texmf-dist/tex/latex/tools/array.sty -Package: array 2008/09/09 v2.4c Tabular extension package (FMi) -\col@sep=\dimen117 -\extrarowheight=\dimen118 -\NC@list=\toks18 -\extratabsurround=\skip45 -\backup@length=\skip46 -) -\everycr=\toks19 -\minrowclearance=\skip47 -) -LaTeX Info: Redefining \color on input line 702. -\rownum=\count107 -Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1337. -Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1341. -Package xcolor Info: Model `RGB' extended on input line 1353. -Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1355. -Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1356. -Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1357. -Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1358. -Package xcolor Info: Model `Gray' substituted by `gray' on input line 1359. -Package xcolor Info: Model `wave' substituted by `hsb' on input line 1360. -) -(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty -Package: textcomp 2005/09/27 v1.99g Standard LaTeX package -Package textcomp Info: Sub-encoding information: -(textcomp) 5 = only ISO-Adobe without \textcurrency -(textcomp) 4 = 5 + \texteuro -(textcomp) 3 = 4 + \textohm -(textcomp) 2 = 3 + \textestimated + \textcurrency -(textcomp) 1 = TS1 - \textcircled - \t -(textcomp) 0 = TS1 (full) -(textcomp) Font families with sub-encoding setting implement -(textcomp) only a restricted character set as indicated. -(textcomp) Family '?' is the default used for unknown fonts. -(textcomp) See the documentation for details. -Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 71. - -(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def -File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file -) -LaTeX Info: Redefining \oldstylenums on input line 266. -Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 281. -Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 282. -Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 283. -Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 284. -Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 285. -Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 286. -Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 287. -Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 288. -Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 289. -Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 290. -Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 291. -Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 292. -Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 293. -Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 294. -Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 295. -Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 296. -Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 297. -Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 298. -Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 299. -Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 300. -Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 301. -Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 302. -Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 303. -Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 304. - -Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 305. -Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 306. -Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 307. -Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 308. -Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 309. -Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 310. -Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 311. -Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 312. -Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 313. -Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 314. -Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 315. -Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 316. -Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 317. -Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 318. -Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 319. -Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 320. -Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 321. -Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 322. -Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 323. -Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 324. -Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 325. -Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 326. -Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 327. -Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 328. -Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 329. -Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 330. -Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 331. -Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 332. -Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 333. -Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 334. -Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 335. -Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 336. -Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 337. -Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 338. -Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 339. -Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 340. -) -(/usr/share/texlive/texmf-dist/tex/latex/base/alltt.sty -Package: alltt 1997/06/16 v2.0g defines alltt environment -) -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty -Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) -Package ifpdf Info: pdfTeX in PDF mode is detected. -) -(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty -Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX - -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty -Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO) - - -(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty -Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO) -Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO) -Package hobsub Info: Skipping package `infwarerr' (already loaded). -Package hobsub Info: Skipping package `ltxcmds' (already loaded). -Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) -Package ifluatex Info: LuaTeX not detected. -Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO) -Package ifvtex Info: VTeX not detected. -Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO) -Package hobsub Info: Skipping package `ifpdf' (already loaded). -Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) -Package etexcmds Info: Could not find \expanded. -(etexcmds) That can mean that you are not using pdfTeX 1.50 or -(etexcmds) that some package has redefined \expanded. -(etexcmds) In the latter case, load this package earlier. -Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) -Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) -Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO -) -Package pdftexcmds Info: LuaTeX not detected. -Package pdftexcmds Info: \pdf@primitive is available. -Package pdftexcmds Info: \pdf@ifprimitive is available. -Package pdftexcmds Info: \pdfdraftmode found. -Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO) -Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO -) -Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO) -Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO) -) -Package hobsub Info: Skipping package `hobsub' (already loaded). -Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO) -Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO) -Package: xcolor-patch 2011/01/30 xcolor patch -Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO) -Package atveryend Info: \enddocument detected (standard20110627). -Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO) -Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO) -Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO) -) -(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty -Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional -) -(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty -Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO) -) -(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty -Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) -) -\@linkdim=\dimen119 -\Hy@linkcounter=\count108 -\Hy@pagecounter=\count109 - -(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def -File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO) -) -\Hy@SavedSpaceFactor=\count110 - -(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg -File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive -) -Package hyperref Info: Option `colorlinks' set `true' on input line 4319. -Package hyperref Info: Option `unicode' set `true' on input line 4319. - -(/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def -File: puenc.def 2012/11/06 v6.83m Hyperref: PDF Unicode definition (HO) -) -Package hyperref Info: Hyper figures OFF on input line 4443. -Package hyperref Info: Link nesting OFF on input line 4448. -Package hyperref Info: Hyper index ON on input line 4451. -Package hyperref Info: Plain pages OFF on input line 4458. -Package hyperref Info: Backreferencing ON on input line 4461. -Package hyperref Info: Implicit mode ON; LaTeX internals redefined. -Package hyperref Info: Bookmarks ON on input line 4688. - -(/usr/share/texlive/texmf-dist/tex/latex/hyperref/backref.sty -Package: backref 2012/07/25 v1.38 Bibliographical back referencing - -(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty -Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO) -Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 -82. -)) -\c@Hy@tempcnt=\count111 - -(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty -\Urlmuskip=\muskip10 -Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. -) -LaTeX Info: Redefining \url on input line 5041. -\XeTeXLinkMargin=\dimen120 -\Fld@menulength=\count112 -\Field@Width=\dimen121 -\Fld@charsize=\dimen122 -Package hyperref Info: Hyper figures OFF on input line 6295. -Package hyperref Info: Link nesting OFF on input line 6300. -Package hyperref Info: Hyper index ON on input line 6303. -Package hyperref Info: backreferencing ON on input line 6308. -Package hyperref Info: Link coloring ON on input line 6313. -Package hyperref Info: Link coloring with OCG OFF on input line 6320. -Package hyperref Info: PDF/A mode OFF on input line 6325. -LaTeX Info: Redefining \ref on input line 6365. -LaTeX Info: Redefining \pageref on input line 6369. -\Hy@abspage=\count113 -\c@Item=\count114 -\c@Hfootnote=\count115 -) - -Package hyperref Message: Driver: hpdftex. - -(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def -File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX -\Fld@listcount=\count116 -\c@bookmark@seq@number=\count117 -\Hy@SectionHShift=\skip48 -) -(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty -Package: inputenc 2008/03/30 v1.1d Input encoding file -\inpenc@prehook=\toks20 -\inpenc@posthook=\toks21 - -(/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def -File: utf8.def 2008/04/05 v1.1m UTF-8 support for inputenc -Now handling font encoding OML ... -... no UTF-8 mapping file for font encoding OML -Now handling font encoding T1 ... -... processing UTF-8 mapping file for font encoding T1 - -(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu -File: t1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc - defining Unicode char U+00A1 (decimal 161) - defining Unicode char U+00A3 (decimal 163) - defining Unicode char U+00AB (decimal 171) - defining Unicode char U+00BB (decimal 187) - defining Unicode char U+00BF (decimal 191) - defining Unicode char U+00C0 (decimal 192) - defining Unicode char U+00C1 (decimal 193) - defining Unicode char U+00C2 (decimal 194) - defining Unicode char U+00C3 (decimal 195) - defining Unicode char U+00C4 (decimal 196) - defining Unicode char U+00C5 (decimal 197) - defining Unicode char U+00C6 (decimal 198) - defining Unicode char U+00C7 (decimal 199) - defining Unicode char U+00C8 (decimal 200) - defining Unicode char U+00C9 (decimal 201) - defining Unicode char U+00CA (decimal 202) - defining Unicode char U+00CB (decimal 203) - defining Unicode char U+00CC (decimal 204) - defining Unicode char U+00CD (decimal 205) - defining Unicode char U+00CE (decimal 206) - defining Unicode char U+00CF (decimal 207) - defining Unicode char U+00D0 (decimal 208) - defining Unicode char U+00D1 (decimal 209) - defining Unicode char U+00D2 (decimal 210) - defining Unicode char U+00D3 (decimal 211) - defining Unicode char U+00D4 (decimal 212) - defining Unicode char U+00D5 (decimal 213) - defining Unicode char U+00D6 (decimal 214) - defining Unicode char U+00D8 (decimal 216) - defining Unicode char U+00D9 (decimal 217) - defining Unicode char U+00DA (decimal 218) - defining Unicode char U+00DB (decimal 219) - defining Unicode char U+00DC (decimal 220) - defining Unicode char U+00DD (decimal 221) - defining Unicode char U+00DE (decimal 222) - defining Unicode char U+00DF (decimal 223) - defining Unicode char U+00E0 (decimal 224) - defining Unicode char U+00E1 (decimal 225) - defining Unicode char U+00E2 (decimal 226) - defining Unicode char U+00E3 (decimal 227) - defining Unicode char U+00E4 (decimal 228) - defining Unicode char U+00E5 (decimal 229) - defining Unicode char U+00E6 (decimal 230) - defining Unicode char U+00E7 (decimal 231) - defining Unicode char U+00E8 (decimal 232) - defining Unicode char U+00E9 (decimal 233) - defining Unicode char U+00EA (decimal 234) - defining Unicode char U+00EB (decimal 235) - defining Unicode char U+00EC (decimal 236) - defining Unicode char U+00ED (decimal 237) - defining Unicode char U+00EE (decimal 238) - defining Unicode char U+00EF (decimal 239) - defining Unicode char U+00F0 (decimal 240) - defining Unicode char U+00F1 (decimal 241) - defining Unicode char U+00F2 (decimal 242) - defining Unicode char U+00F3 (decimal 243) - defining Unicode char U+00F4 (decimal 244) - defining Unicode char U+00F5 (decimal 245) - defining Unicode char U+00F6 (decimal 246) - defining Unicode char U+00F8 (decimal 248) - defining Unicode char U+00F9 (decimal 249) - defining Unicode char U+00FA (decimal 250) - defining Unicode char U+00FB (decimal 251) - defining Unicode char U+00FC (decimal 252) - defining Unicode char U+00FD (decimal 253) - defining Unicode char U+00FE (decimal 254) - defining Unicode char U+00FF (decimal 255) - defining Unicode char U+0102 (decimal 258) - defining Unicode char U+0103 (decimal 259) - defining Unicode char U+0104 (decimal 260) - defining Unicode char U+0105 (decimal 261) - defining Unicode char U+0106 (decimal 262) - defining Unicode char U+0107 (decimal 263) - defining Unicode char U+010C (decimal 268) - defining Unicode char U+010D (decimal 269) - defining Unicode char U+010E (decimal 270) - defining Unicode char U+010F (decimal 271) - defining Unicode char U+0110 (decimal 272) - defining Unicode char U+0111 (decimal 273) - defining Unicode char U+0118 (decimal 280) - defining Unicode char U+0119 (decimal 281) - defining Unicode char U+011A (decimal 282) - defining Unicode char U+011B (decimal 283) - defining Unicode char U+011E (decimal 286) - defining Unicode char U+011F (decimal 287) - defining Unicode char U+0130 (decimal 304) - defining Unicode char U+0131 (decimal 305) - defining Unicode char U+0132 (decimal 306) - defining Unicode char U+0133 (decimal 307) - defining Unicode char U+0139 (decimal 313) - defining Unicode char U+013A (decimal 314) - defining Unicode char U+013D (decimal 317) - defining Unicode char U+013E (decimal 318) - defining Unicode char U+0141 (decimal 321) - defining Unicode char U+0142 (decimal 322) - defining Unicode char U+0143 (decimal 323) - defining Unicode char U+0144 (decimal 324) - defining Unicode char U+0147 (decimal 327) - defining Unicode char U+0148 (decimal 328) - defining Unicode char U+014A (decimal 330) - defining Unicode char U+014B (decimal 331) - defining Unicode char U+0150 (decimal 336) - defining Unicode char U+0151 (decimal 337) - defining Unicode char U+0152 (decimal 338) - defining Unicode char U+0153 (decimal 339) - defining Unicode char U+0154 (decimal 340) - defining Unicode char U+0155 (decimal 341) - defining Unicode char U+0158 (decimal 344) - defining Unicode char U+0159 (decimal 345) - defining Unicode char U+015A (decimal 346) - defining Unicode char U+015B (decimal 347) - defining Unicode char U+015E (decimal 350) - defining Unicode char U+015F (decimal 351) - defining Unicode char U+0160 (decimal 352) - defining Unicode char U+0161 (decimal 353) - defining Unicode char U+0162 (decimal 354) - defining Unicode char U+0163 (decimal 355) - defining Unicode char U+0164 (decimal 356) - defining Unicode char U+0165 (decimal 357) - defining Unicode char U+016E (decimal 366) - defining Unicode char U+016F (decimal 367) - defining Unicode char U+0170 (decimal 368) - defining Unicode char U+0171 (decimal 369) - defining Unicode char U+0178 (decimal 376) - defining Unicode char U+0179 (decimal 377) - defining Unicode char U+017A (decimal 378) - defining Unicode char U+017B (decimal 379) - defining Unicode char U+017C (decimal 380) - defining Unicode char U+017D (decimal 381) - defining Unicode char U+017E (decimal 382) - defining Unicode char U+200C (decimal 8204) - defining Unicode char U+2013 (decimal 8211) - defining Unicode char U+2014 (decimal 8212) - defining Unicode char U+2018 (decimal 8216) - defining Unicode char U+2019 (decimal 8217) - defining Unicode char U+201A (decimal 8218) - defining Unicode char U+201C (decimal 8220) - defining Unicode char U+201D (decimal 8221) - defining Unicode char U+201E (decimal 8222) - defining Unicode char U+2030 (decimal 8240) - defining Unicode char U+2031 (decimal 8241) - defining Unicode char U+2039 (decimal 8249) - defining Unicode char U+203A (decimal 8250) - defining Unicode char U+2423 (decimal 9251) -) -Now handling font encoding OT1 ... -... processing UTF-8 mapping file for font encoding OT1 - -(/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu -File: ot1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc - defining Unicode char U+00A1 (decimal 161) - defining Unicode char U+00A3 (decimal 163) - defining Unicode char U+00B8 (decimal 184) - defining Unicode char U+00BF (decimal 191) - defining Unicode char U+00C5 (decimal 197) - defining Unicode char U+00C6 (decimal 198) - defining Unicode char U+00D8 (decimal 216) - defining Unicode char U+00DF (decimal 223) - defining Unicode char U+00E6 (decimal 230) - defining Unicode char U+00EC (decimal 236) - defining Unicode char U+00ED (decimal 237) - defining Unicode char U+00EE (decimal 238) - defining Unicode char U+00EF (decimal 239) - defining Unicode char U+00F8 (decimal 248) - defining Unicode char U+0131 (decimal 305) - defining Unicode char U+0141 (decimal 321) - defining Unicode char U+0142 (decimal 322) - defining Unicode char U+0152 (decimal 338) - defining Unicode char U+0153 (decimal 339) - defining Unicode char U+2013 (decimal 8211) - defining Unicode char U+2014 (decimal 8212) - defining Unicode char U+2018 (decimal 8216) - defining Unicode char U+2019 (decimal 8217) - defining Unicode char U+201C (decimal 8220) - defining Unicode char U+201D (decimal 8221) -) -Now handling font encoding OMS ... -... processing UTF-8 mapping file for font encoding OMS - -(/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu -File: omsenc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc - defining Unicode char U+00A7 (decimal 167) - defining Unicode char U+00B6 (decimal 182) - defining Unicode char U+00B7 (decimal 183) - defining Unicode char U+2020 (decimal 8224) - defining Unicode char U+2021 (decimal 8225) - defining Unicode char U+2022 (decimal 8226) -) -Now handling font encoding OMX ... -... no UTF-8 mapping file for font encoding OMX -Now handling font encoding U ... -... no UTF-8 mapping file for font encoding U -Now handling font encoding TS1 ... -... processing UTF-8 mapping file for font encoding TS1 - -(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.dfu -File: ts1enc.dfu 2008/04/05 v1.1m UTF-8 support for inputenc - defining Unicode char U+00A2 (decimal 162) - defining Unicode char U+00A3 (decimal 163) - defining Unicode char U+00A4 (decimal 164) - defining Unicode char U+00A5 (decimal 165) - defining Unicode char U+00A6 (decimal 166) - defining Unicode char U+00A7 (decimal 167) - defining Unicode char U+00A8 (decimal 168) - defining Unicode char U+00A9 (decimal 169) - defining Unicode char U+00AA (decimal 170) - defining Unicode char U+00AC (decimal 172) - defining Unicode char U+00AE (decimal 174) - defining Unicode char U+00AF (decimal 175) - defining Unicode char U+00B0 (decimal 176) - defining Unicode char U+00B1 (decimal 177) - defining Unicode char U+00B2 (decimal 178) - defining Unicode char U+00B3 (decimal 179) - defining Unicode char U+00B4 (decimal 180) - defining Unicode char U+00B5 (decimal 181) - defining Unicode char U+00B6 (decimal 182) - defining Unicode char U+00B7 (decimal 183) - defining Unicode char U+00B9 (decimal 185) - defining Unicode char U+00BA (decimal 186) - defining Unicode char U+00BC (decimal 188) - defining Unicode char U+00BD (decimal 189) - defining Unicode char U+00BE (decimal 190) - defining Unicode char U+00D7 (decimal 215) - defining Unicode char U+00F7 (decimal 247) - defining Unicode char U+0192 (decimal 402) - defining Unicode char U+02C7 (decimal 711) - defining Unicode char U+02D8 (decimal 728) - defining Unicode char U+02DD (decimal 733) - defining Unicode char U+0E3F (decimal 3647) - defining Unicode char U+2016 (decimal 8214) - defining Unicode char U+2020 (decimal 8224) - defining Unicode char U+2021 (decimal 8225) - defining Unicode char U+2022 (decimal 8226) - defining Unicode char U+2030 (decimal 8240) - defining Unicode char U+2031 (decimal 8241) - defining Unicode char U+203B (decimal 8251) - defining Unicode char U+203D (decimal 8253) - defining Unicode char U+2044 (decimal 8260) - defining Unicode char U+204E (decimal 8270) - defining Unicode char U+2052 (decimal 8274) - defining Unicode char U+20A1 (decimal 8353) - defining Unicode char U+20A4 (decimal 8356) - defining Unicode char U+20A6 (decimal 8358) - defining Unicode char U+20A9 (decimal 8361) - defining Unicode char U+20AB (decimal 8363) - defining Unicode char U+20AC (decimal 8364) - defining Unicode char U+20B1 (decimal 8369) - defining Unicode char U+2103 (decimal 8451) - defining Unicode char U+2116 (decimal 8470) - defining Unicode char U+2117 (decimal 8471) - defining Unicode char U+211E (decimal 8478) - defining Unicode char U+2120 (decimal 8480) - defining Unicode char U+2122 (decimal 8482) - defining Unicode char U+2126 (decimal 8486) - defining Unicode char U+2127 (decimal 8487) - defining Unicode char U+212E (decimal 8494) - defining Unicode char U+2190 (decimal 8592) - defining Unicode char U+2191 (decimal 8593) - defining Unicode char U+2192 (decimal 8594) - defining Unicode char U+2193 (decimal 8595) - defining Unicode char U+2329 (decimal 9001) - defining Unicode char U+232A (decimal 9002) - defining Unicode char U+2422 (decimal 9250) - defining Unicode char U+25E6 (decimal 9702) - defining Unicode char U+25EF (decimal 9711) - defining Unicode char U+266A (decimal 9834) -) -Now handling font encoding PD1 ... -... no UTF-8 mapping file for font encoding PD1 -Now handling font encoding PU ... -... no UTF-8 mapping file for font encoding PU - defining Unicode char U+00A9 (decimal 169) - defining Unicode char U+00AA (decimal 170) - defining Unicode char U+00AE (decimal 174) - defining Unicode char U+00BA (decimal 186) - defining Unicode char U+02C6 (decimal 710) - defining Unicode char U+02DC (decimal 732) - defining Unicode char U+200C (decimal 8204) - defining Unicode char U+2026 (decimal 8230) - defining Unicode char U+2122 (decimal 8482) - defining Unicode char U+2423 (decimal 9251) -)) -(/usr/share/texlive/texmf-dist/tex/latex/psnfss/mathptmx.sty -Package: mathptmx 2005/04/12 PSNFSS-v9.2a Times w/ Math, improved (SPQR, WaS) -LaTeX Font Info: Redeclaring symbol font `operators' on input line 28. -LaTeX Font Info: Overwriting symbol font `operators' in version `normal' -(Font) OT1/cmr/m/n --> OT1/ztmcm/m/n on input line 28. -LaTeX Font Info: Overwriting symbol font `operators' in version `bold' -(Font) OT1/cmr/bx/n --> OT1/ztmcm/m/n on input line 28. -LaTeX Font Info: Redeclaring symbol font `letters' on input line 29. -LaTeX Font Info: Overwriting symbol font `letters' in version `normal' -(Font) OML/cmm/m/it --> OML/ztmcm/m/it on input line 29. -LaTeX Font Info: Overwriting symbol font `letters' in version `bold' -(Font) OML/cmm/b/it --> OML/ztmcm/m/it on input line 29. -LaTeX Font Info: Redeclaring symbol font `symbols' on input line 30. -LaTeX Font Info: Overwriting symbol font `symbols' in version `normal' -(Font) OMS/cmsy/m/n --> OMS/ztmcm/m/n on input line 30. -LaTeX Font Info: Overwriting symbol font `symbols' in version `bold' -(Font) OMS/cmsy/b/n --> OMS/ztmcm/m/n on input line 30. -LaTeX Font Info: Redeclaring symbol font `largesymbols' on input line 31. -LaTeX Font Info: Overwriting symbol font `largesymbols' in version `normal' -(Font) OMX/cmex/m/n --> OMX/ztmcm/m/n on input line 31. -LaTeX Font Info: Overwriting symbol font `largesymbols' in version `bold' -(Font) OMX/cmex/m/n --> OMX/ztmcm/m/n on input line 31. -\symbold=\mathgroup4 -\symitalic=\mathgroup5 -LaTeX Font Info: Redeclaring math alphabet \mathbf on input line 34. -LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' -(Font) OT1/cmr/bx/n --> OT1/ptm/bx/n on input line 34. -LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `bold' -(Font) OT1/cmr/bx/n --> OT1/ptm/bx/n on input line 34. -LaTeX Font Info: Redeclaring math alphabet \mathit on input line 35. -LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' -(Font) OT1/cmr/m/it --> OT1/ptm/m/it on input line 35. -LaTeX Font Info: Overwriting math alphabet `\mathit' in version `bold' -(Font) OT1/cmr/bx/it --> OT1/ptm/m/it on input line 35. -LaTeX Info: Redefining \hbar on input line 50. -) -(/usr/share/texlive/texmf-dist/tex/latex/psnfss/helvet.sty -Package: helvet 2005/04/12 PSNFSS-v9.2a (WaS) -) -(/usr/share/texlive/texmf-dist/tex/latex/psnfss/courier.sty -Package: courier 2005/04/12 PSNFSS-v9.2a (WaS) -) (./doxygen.sty -Package: doxygen - -(/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty -Package: calc 2007/08/22 v4.3 Infix arithmetic (KKT,FJ) -\calc@Acount=\count118 -\calc@Bcount=\count119 -\calc@Adimen=\dimen123 -\calc@Bdimen=\dimen124 -\calc@Askip=\skip49 -\calc@Bskip=\skip50 -LaTeX Info: Redefining \setlength on input line 76. -LaTeX Info: Redefining \addtolength on input line 77. -\calc@Ccount=\count120 -\calc@Cskip=\skip51 -) -(/usr/share/texlive/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty -\fancy@headwidth=\skip52 -\f@ncyO@elh=\skip53 -\f@ncyO@erh=\skip54 -\f@ncyO@olh=\skip55 -\f@ncyO@orh=\skip56 -\f@ncyO@elf=\skip57 -\f@ncyO@erf=\skip58 -\f@ncyO@olf=\skip59 -\f@ncyO@orf=\skip60 -) -(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty -Package: longtable 2004/02/01 v4.11 Multi-page Table package (DPC) -\LTleft=\skip61 -\LTright=\skip62 -\LTpre=\skip63 -\LTpost=\skip64 -\LTchunksize=\count121 -\LTcapwidth=\dimen125 -\LT@head=\box56 -\LT@firsthead=\box57 -\LT@foot=\box58 -\LT@lastfoot=\box59 -\LT@cols=\count122 -\LT@rows=\count123 -\c@LT@tables=\count124 -\c@LT@chunks=\count125 -\LT@p@ftn=\toks22 -) -(/usr/share/texlive/texmf-dist/tex/latex/tools/verbatim.sty -Package: verbatim 2003/08/22 v1.5q LaTeX2e package for verbatim enhancements -\every@verbatim=\toks23 -\verbatim@line=\toks24 -\verbatim@in@stream=\read1 -) -(/usr/share/texlive/texmf-dist/tex/latex/sectsty/sectsty.sty -Package: sectsty 2002/02/25 v2.0.2 Commands to change all sectional heading sty -les -) -(/usr/share/texlive/texmf-dist/tex/latex/tocloft/tocloft.sty -Package: tocloft 2013/05/02 v2.3f parameterised ToC, etc., typesetting -Package tocloft Info: The document has chapter divisions on input line 44. -\cftparskip=\skip65 -\cftbeforetoctitleskip=\skip66 -\cftaftertoctitleskip=\skip67 -\cftbeforepartskip=\skip68 -\cftpartnumwidth=\skip69 -\cftpartindent=\skip70 -\cftbeforechapskip=\skip71 -\cftchapindent=\skip72 -\cftchapnumwidth=\skip73 -\cftbeforesecskip=\skip74 -\cftsecindent=\skip75 -\cftsecnumwidth=\skip76 -\cftbeforesubsecskip=\skip77 -\cftsubsecindent=\skip78 -\cftsubsecnumwidth=\skip79 -\cftbeforesubsubsecskip=\skip80 -\cftsubsubsecindent=\skip81 -\cftsubsubsecnumwidth=\skip82 -\cftbeforeparaskip=\skip83 -\cftparaindent=\skip84 -\cftparanumwidth=\skip85 -\cftbeforesubparaskip=\skip86 -\cftsubparaindent=\skip87 -\cftsubparanumwidth=\skip88 -\cftbeforeloftitleskip=\skip89 -\cftafterloftitleskip=\skip90 -\cftbeforefigskip=\skip91 -\cftfigindent=\skip92 -\cftfignumwidth=\skip93 -\c@lofdepth=\count126 -\c@lotdepth=\count127 -\cftbeforelottitleskip=\skip94 -\cftafterlottitleskip=\skip95 -\cftbeforetabskip=\skip96 -\cfttabindent=\skip97 -\cfttabnumwidth=\skip98 -) -\tmplength=\skip99 - -(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty -Package: fontenc 2005/09/27 v1.99g Standard LaTeX package - -(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def -File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file -LaTeX Font Info: Redeclaring font encoding T1 on input line 43. -) -! Font T1/cmr/m/n/10=ecrm1000 at 10.0pt not loadable: Metric (TFM) file not fou -nd. - - relax -l.100 \fontencoding\encodingdefault\selectfont - -? x - -Here is how much of TeX's memory you used: - 11310 strings out of 494985 - 156742 string characters out of 6180356 - 230521 words of memory out of 5000000 - 14442 multiletter control sequences out of 15000+600000 - 3640 words of font info for 14 fonts, out of 8000000 for 9000 - 36 hyphenation exceptions out of 8191 - 41i,0n,45p,295b,219s stack positions out of 5000i,500n,10000p,200000b,80000s -No pages of output. -PDF statistics: - 0 PDF objects out of 1000 (max. 8388607) - 0 named destinations out of 1000 (max. 500000) - 1 words of extra memory for PDF output out of 10000 (max. 10000000) - diff --git a/dmatrix/doc/latex/refman.tex b/dmatrix/doc/latex/refman.tex deleted file mode 100644 index 5a70c8a3..00000000 --- a/dmatrix/doc/latex/refman.tex +++ /dev/null @@ -1,76 +0,0 @@ -\documentclass[a4paper]{book} -\usepackage{makeidx} -\usepackage{graphicx} -\usepackage{multicol} -\usepackage{float} -\usepackage{listings} -\usepackage{color} -\usepackage{ifthen} -\usepackage[table]{xcolor} -\usepackage{textcomp} -\usepackage{alltt} -\usepackage{ifpdf} -\ifpdf -\usepackage[pdftex, - pagebackref=true, - colorlinks=true, - linkcolor=blue, - unicode - ]{hyperref} -\else -\usepackage[ps2pdf, - pagebackref=true, - colorlinks=true, - linkcolor=blue, - unicode - ]{hyperref} -\usepackage{pspicture} -\fi -\usepackage[utf8]{inputenc} -\usepackage{mathptmx} -\usepackage[scaled=.90]{helvet} -\usepackage{courier} -\usepackage{doxygen} -\lstset{language=C++,inputencoding=utf8,basicstyle=\footnotesize,breaklines=true,breakatwhitespace=true,tabsize=8,numbers=left } -\makeindex -\setcounter{tocdepth}{3} -\renewcommand{\footrulewidth}{0.4pt} -\begin{document} -\hypersetup{pageanchor=false} -\begin{titlepage} -\vspace*{7cm} -\begin{center} -{\Large DMatrix and SparseMatrix C++ classes }\\ -\vspace*{1cm} -{\large Generated by Doxygen 1.7.3}\\ -\vspace*{0.5cm} -{\small Thu Jul 28 2011 11:41:53}\\ -\end{center} -\end{titlepage} -\clearemptydoublepage -\pagenumbering{roman} -\tableofcontents -\clearemptydoublepage -\pagenumbering{arabic} -\hypersetup{pageanchor=true} -\chapter{DMatrix and SparseMatrix classes} -\label{index}\hypertarget{index}{}\input{index} -\chapter{Class Index} -\input{annotated} -\chapter{Class Documentation} -\input{structalist} -\input{structcilist} -\input{structcllist} -\input{structcomplex} -\input{classDMatrix} -\input{structdoublecomplex} -\input{classErrorHandler} -\input{structicilist} -\input{classInitializeDMatrixClass} -\input{structinlist} -\input{unionMultitype} -\input{structNamelist} -\input{structolist} -\input{structVardesc} -\printindex -\end{document} diff --git a/dmatrix/doc/latex/structNamelist.tex b/dmatrix/doc/latex/structNamelist.tex deleted file mode 100644 index fae47d48..00000000 --- a/dmatrix/doc/latex/structNamelist.tex +++ /dev/null @@ -1,27 +0,0 @@ -\hypertarget{structNamelist}{ -\section{Namelist Struct Reference} -\label{structNamelist}\index{Namelist@{Namelist}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structNamelist_a43f48d333d37610aa80483ee76c78d26}{ -char $\ast$ {\bfseries name}} -\label{structNamelist_a43f48d333d37610aa80483ee76c78d26} - -\item -\hypertarget{structNamelist_a5e41f1eccfc8b25536f76c1ced89c3fc}{ -\hyperlink{structVardesc}{Vardesc} $\ast$$\ast$ {\bfseries vars}} -\label{structNamelist_a5e41f1eccfc8b25536f76c1ced89c3fc} - -\item -\hypertarget{structNamelist_a30a6e0a05803290fed780890bcc436fa}{ -int {\bfseries nvars}} -\label{structNamelist_a30a6e0a05803290fed780890bcc436fa} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structVardesc.tex b/dmatrix/doc/latex/structVardesc.tex deleted file mode 100644 index da365a1f..00000000 --- a/dmatrix/doc/latex/structVardesc.tex +++ /dev/null @@ -1,32 +0,0 @@ -\hypertarget{structVardesc}{ -\section{Vardesc Struct Reference} -\label{structVardesc}\index{Vardesc@{Vardesc}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structVardesc_a9dcb9122e28bfb7d88caed2ffa38f1ad}{ -char $\ast$ {\bfseries name}} -\label{structVardesc_a9dcb9122e28bfb7d88caed2ffa38f1ad} - -\item -\hypertarget{structVardesc_abc6f3753ac54741fafe32fcc744993ab}{ -char $\ast$ {\bfseries addr}} -\label{structVardesc_abc6f3753ac54741fafe32fcc744993ab} - -\item -\hypertarget{structVardesc_a7be667d06905f6c6463ede740ed242ec}{ -ftnlen $\ast$ {\bfseries dims}} -\label{structVardesc_a7be667d06905f6c6463ede740ed242ec} - -\item -\hypertarget{structVardesc_ac901f905f9cf2c9011684b7e612cc16c}{ -int {\bfseries type}} -\label{structVardesc_ac901f905f9cf2c9011684b7e612cc16c} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structalist.tex b/dmatrix/doc/latex/structalist.tex deleted file mode 100644 index 0397602b..00000000 --- a/dmatrix/doc/latex/structalist.tex +++ /dev/null @@ -1,22 +0,0 @@ -\hypertarget{structalist}{ -\section{alist Struct Reference} -\label{structalist}\index{alist@{alist}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structalist_af470841413f5853794fa9830d1e71ecd}{ -flag {\bfseries aerr}} -\label{structalist_af470841413f5853794fa9830d1e71ecd} - -\item -\hypertarget{structalist_a02749fb381f7642c1d5d01902817f673}{ -ftnint {\bfseries aunit}} -\label{structalist_a02749fb381f7642c1d5d01902817f673} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structcilist.tex b/dmatrix/doc/latex/structcilist.tex deleted file mode 100644 index 98ba3351..00000000 --- a/dmatrix/doc/latex/structcilist.tex +++ /dev/null @@ -1,37 +0,0 @@ -\hypertarget{structcilist}{ -\section{cilist Struct Reference} -\label{structcilist}\index{cilist@{cilist}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structcilist_aaa609be8bdf78a8fc7ba35b2ed0e6083}{ -flag {\bfseries cierr}} -\label{structcilist_aaa609be8bdf78a8fc7ba35b2ed0e6083} - -\item -\hypertarget{structcilist_a3e5d0438673d14f5889fb6a3e712a076}{ -ftnint {\bfseries ciunit}} -\label{structcilist_a3e5d0438673d14f5889fb6a3e712a076} - -\item -\hypertarget{structcilist_af16867fbc88cc3b26ecdedd0259fc5f5}{ -flag {\bfseries ciend}} -\label{structcilist_af16867fbc88cc3b26ecdedd0259fc5f5} - -\item -\hypertarget{structcilist_a8c5159e1728cd9954138ecb392f04b8c}{ -char $\ast$ {\bfseries cifmt}} -\label{structcilist_a8c5159e1728cd9954138ecb392f04b8c} - -\item -\hypertarget{structcilist_ace7c117f446a91e75e9f920fcff86546}{ -ftnint {\bfseries cirec}} -\label{structcilist_ace7c117f446a91e75e9f920fcff86546} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structcllist.tex b/dmatrix/doc/latex/structcllist.tex deleted file mode 100644 index ace0551f..00000000 --- a/dmatrix/doc/latex/structcllist.tex +++ /dev/null @@ -1,27 +0,0 @@ -\hypertarget{structcllist}{ -\section{cllist Struct Reference} -\label{structcllist}\index{cllist@{cllist}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structcllist_afce750ad0c1a89568d816ee4c2c40333}{ -flag {\bfseries cerr}} -\label{structcllist_afce750ad0c1a89568d816ee4c2c40333} - -\item -\hypertarget{structcllist_a5ecb27d52d6d1cdccf23f00e6586e4ff}{ -ftnint {\bfseries cunit}} -\label{structcllist_a5ecb27d52d6d1cdccf23f00e6586e4ff} - -\item -\hypertarget{structcllist_a8f52d307fd020ad43a2f2e9a2d665103}{ -char $\ast$ {\bfseries csta}} -\label{structcllist_a8f52d307fd020ad43a2f2e9a2d665103} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structcomplex.tex b/dmatrix/doc/latex/structcomplex.tex deleted file mode 100644 index 9866aa9d..00000000 --- a/dmatrix/doc/latex/structcomplex.tex +++ /dev/null @@ -1,22 +0,0 @@ -\hypertarget{structcomplex}{ -\section{complex Struct Reference} -\label{structcomplex}\index{complex@{complex}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structcomplex_a03cba9844d71e49f4ddf7c5f3dd45822}{ -real {\bfseries r}} -\label{structcomplex_a03cba9844d71e49f4ddf7c5f3dd45822} - -\item -\hypertarget{structcomplex_aa55283d87e8d89c794bac746fb11d524}{ -real {\bfseries i}} -\label{structcomplex_aa55283d87e8d89c794bac746fb11d524} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structdoublecomplex.tex b/dmatrix/doc/latex/structdoublecomplex.tex deleted file mode 100644 index e53bcbfb..00000000 --- a/dmatrix/doc/latex/structdoublecomplex.tex +++ /dev/null @@ -1,22 +0,0 @@ -\hypertarget{structdoublecomplex}{ -\section{doublecomplex Struct Reference} -\label{structdoublecomplex}\index{doublecomplex@{doublecomplex}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdoublecomplex_aa21d9095ea8af6f0530961e14e25d060}{ -doublereal {\bfseries r}} -\label{structdoublecomplex_aa21d9095ea8af6f0530961e14e25d060} - -\item -\hypertarget{structdoublecomplex_a29ac0f1fc7a96e2344ef1464a80e2877}{ -doublereal {\bfseries i}} -\label{structdoublecomplex_a29ac0f1fc7a96e2344ef1464a80e2877} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structicilist.tex b/dmatrix/doc/latex/structicilist.tex deleted file mode 100644 index 2e06629a..00000000 --- a/dmatrix/doc/latex/structicilist.tex +++ /dev/null @@ -1,42 +0,0 @@ -\hypertarget{structicilist}{ -\section{icilist Struct Reference} -\label{structicilist}\index{icilist@{icilist}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structicilist_aee2f6c57bb6df08adfc9d62a185f999a}{ -flag {\bfseries icierr}} -\label{structicilist_aee2f6c57bb6df08adfc9d62a185f999a} - -\item -\hypertarget{structicilist_a4da4c2525fa8e39989ddc28f99b86b13}{ -char $\ast$ {\bfseries iciunit}} -\label{structicilist_a4da4c2525fa8e39989ddc28f99b86b13} - -\item -\hypertarget{structicilist_a598f4d4f880c560238c7a32f5dcb3e51}{ -flag {\bfseries iciend}} -\label{structicilist_a598f4d4f880c560238c7a32f5dcb3e51} - -\item -\hypertarget{structicilist_a3689b68768a386cbcc460eb2632118e9}{ -char $\ast$ {\bfseries icifmt}} -\label{structicilist_a3689b68768a386cbcc460eb2632118e9} - -\item -\hypertarget{structicilist_ac6025ddf8b1ade5cb73d607dd2d30501}{ -ftnint {\bfseries icirlen}} -\label{structicilist_ac6025ddf8b1ade5cb73d607dd2d30501} - -\item -\hypertarget{structicilist_a6e4cb8719f1c76ee87273671448da892}{ -ftnint {\bfseries icirnum}} -\label{structicilist_a6e4cb8719f1c76ee87273671448da892} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structinlist.tex b/dmatrix/doc/latex/structinlist.tex deleted file mode 100644 index 1d965521..00000000 --- a/dmatrix/doc/latex/structinlist.tex +++ /dev/null @@ -1,142 +0,0 @@ -\hypertarget{structinlist}{ -\section{inlist Struct Reference} -\label{structinlist}\index{inlist@{inlist}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structinlist_a58bf72b64fab5d27aa0f7ef878d5c8d2}{ -flag {\bfseries inerr}} -\label{structinlist_a58bf72b64fab5d27aa0f7ef878d5c8d2} - -\item -\hypertarget{structinlist_a69244da0365f1012d4ed89d569c7e687}{ -ftnint {\bfseries inunit}} -\label{structinlist_a69244da0365f1012d4ed89d569c7e687} - -\item -\hypertarget{structinlist_a335023ababe7eb52a89577de0a1f155c}{ -char $\ast$ {\bfseries infile}} -\label{structinlist_a335023ababe7eb52a89577de0a1f155c} - -\item -\hypertarget{structinlist_a09d868ed15261e31dfe2d6471d3f73e1}{ -ftnlen {\bfseries infilen}} -\label{structinlist_a09d868ed15261e31dfe2d6471d3f73e1} - -\item -\hypertarget{structinlist_a6266bd70b0f26d29d084e9e159cf7907}{ -ftnint $\ast$ {\bfseries inex}} -\label{structinlist_a6266bd70b0f26d29d084e9e159cf7907} - -\item -\hypertarget{structinlist_a791dfdf3cc38883912c17f44dfbbb2af}{ -ftnint $\ast$ {\bfseries inopen}} -\label{structinlist_a791dfdf3cc38883912c17f44dfbbb2af} - -\item -\hypertarget{structinlist_a0827d903d61f0f02e48414de0893e7a9}{ -ftnint $\ast$ {\bfseries innum}} -\label{structinlist_a0827d903d61f0f02e48414de0893e7a9} - -\item -\hypertarget{structinlist_a020090cdbc0134b62d96dee447ded084}{ -ftnint $\ast$ {\bfseries innamed}} -\label{structinlist_a020090cdbc0134b62d96dee447ded084} - -\item -\hypertarget{structinlist_ac34ac359c5711418bc7a0fe50bc017e5}{ -char $\ast$ {\bfseries inname}} -\label{structinlist_ac34ac359c5711418bc7a0fe50bc017e5} - -\item -\hypertarget{structinlist_ae975e40f5e868451a31221c7cfe4da4e}{ -ftnlen {\bfseries innamlen}} -\label{structinlist_ae975e40f5e868451a31221c7cfe4da4e} - -\item -\hypertarget{structinlist_aa4fb66e031aa3c7c4d8659145091ff6b}{ -char $\ast$ {\bfseries inacc}} -\label{structinlist_aa4fb66e031aa3c7c4d8659145091ff6b} - -\item -\hypertarget{structinlist_a78dde025010d1d60468984985467e5a5}{ -ftnlen {\bfseries inacclen}} -\label{structinlist_a78dde025010d1d60468984985467e5a5} - -\item -\hypertarget{structinlist_a31bfcb7364ef9a1fd38262997247ca67}{ -char $\ast$ {\bfseries inseq}} -\label{structinlist_a31bfcb7364ef9a1fd38262997247ca67} - -\item -\hypertarget{structinlist_a552769caaf819b20716b02e9c713880d}{ -ftnlen {\bfseries inseqlen}} -\label{structinlist_a552769caaf819b20716b02e9c713880d} - -\item -\hypertarget{structinlist_aaff7195ea86562d29a61cb609145f01d}{ -char $\ast$ {\bfseries indir}} -\label{structinlist_aaff7195ea86562d29a61cb609145f01d} - -\item -\hypertarget{structinlist_a17804ade39a70636a3f8ff551847b7b1}{ -ftnlen {\bfseries indirlen}} -\label{structinlist_a17804ade39a70636a3f8ff551847b7b1} - -\item -\hypertarget{structinlist_a48b9f02a979e0e160e58e335e2c4ea9a}{ -char $\ast$ {\bfseries infmt}} -\label{structinlist_a48b9f02a979e0e160e58e335e2c4ea9a} - -\item -\hypertarget{structinlist_afbb4864f07c6e2c17d03cf936e6c1132}{ -ftnlen {\bfseries infmtlen}} -\label{structinlist_afbb4864f07c6e2c17d03cf936e6c1132} - -\item -\hypertarget{structinlist_a990d5a197e15fce7513d83942602f08a}{ -char $\ast$ {\bfseries inform}} -\label{structinlist_a990d5a197e15fce7513d83942602f08a} - -\item -\hypertarget{structinlist_aacc22fa1618d60aab28463a4d6b9dbe9}{ -ftnint {\bfseries informlen}} -\label{structinlist_aacc22fa1618d60aab28463a4d6b9dbe9} - -\item -\hypertarget{structinlist_af5807b5c897be8635d1bbca8c5cf9e39}{ -char $\ast$ {\bfseries inunf}} -\label{structinlist_af5807b5c897be8635d1bbca8c5cf9e39} - -\item -\hypertarget{structinlist_a4a5e555086d129a2b8edc7d2ff3b3725}{ -ftnlen {\bfseries inunflen}} -\label{structinlist_a4a5e555086d129a2b8edc7d2ff3b3725} - -\item -\hypertarget{structinlist_ad11fedcf60bcfb643548dc8992f8774c}{ -ftnint $\ast$ {\bfseries inrecl}} -\label{structinlist_ad11fedcf60bcfb643548dc8992f8774c} - -\item -\hypertarget{structinlist_a0d5491f5ed82c5e4f787ac0411fd7600}{ -ftnint $\ast$ {\bfseries innrec}} -\label{structinlist_a0d5491f5ed82c5e4f787ac0411fd7600} - -\item -\hypertarget{structinlist_a3cbc44275b6c1cab2d1aad14af0b3318}{ -char $\ast$ {\bfseries inblank}} -\label{structinlist_a3cbc44275b6c1cab2d1aad14af0b3318} - -\item -\hypertarget{structinlist_a2aec2496017c66c3ba0d96adcb2b37a0}{ -ftnlen {\bfseries inblanklen}} -\label{structinlist_a2aec2496017c66c3ba0d96adcb2b37a0} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/structolist.tex b/dmatrix/doc/latex/structolist.tex deleted file mode 100644 index 5bbdc0ee..00000000 --- a/dmatrix/doc/latex/structolist.tex +++ /dev/null @@ -1,57 +0,0 @@ -\hypertarget{structolist}{ -\section{olist Struct Reference} -\label{structolist}\index{olist@{olist}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structolist_acb7f3c45380f7965c9ab177c228ed936}{ -flag {\bfseries oerr}} -\label{structolist_acb7f3c45380f7965c9ab177c228ed936} - -\item -\hypertarget{structolist_af4443a6a577bfe9292cbf741c24c6e79}{ -ftnint {\bfseries ounit}} -\label{structolist_af4443a6a577bfe9292cbf741c24c6e79} - -\item -\hypertarget{structolist_a6af6060865be898dfc66c0fd6630d545}{ -char $\ast$ {\bfseries ofnm}} -\label{structolist_a6af6060865be898dfc66c0fd6630d545} - -\item -\hypertarget{structolist_a497ca7ef9c2e42d5cd30c847fdbd3f10}{ -ftnlen {\bfseries ofnmlen}} -\label{structolist_a497ca7ef9c2e42d5cd30c847fdbd3f10} - -\item -\hypertarget{structolist_a2cf08ac4e1e2fc9e6f21299df3f1d2e6}{ -char $\ast$ {\bfseries osta}} -\label{structolist_a2cf08ac4e1e2fc9e6f21299df3f1d2e6} - -\item -\hypertarget{structolist_ad27927ac817bff0dbfa00d07f3e3e2d2}{ -char $\ast$ {\bfseries oacc}} -\label{structolist_ad27927ac817bff0dbfa00d07f3e3e2d2} - -\item -\hypertarget{structolist_abe3c8fd2be6dc58be3157e2e0f48cf6a}{ -char $\ast$ {\bfseries ofm}} -\label{structolist_abe3c8fd2be6dc58be3157e2e0f48cf6a} - -\item -\hypertarget{structolist_a4c83b168f7afdd6c81a7843193c5755e}{ -ftnint {\bfseries orl}} -\label{structolist_a4c83b168f7afdd6c81a7843193c5755e} - -\item -\hypertarget{structolist_a6b914b4f6d4df1f377d40c964bd71625}{ -char $\ast$ {\bfseries oblnk}} -\label{structolist_a6b914b4f6d4df1f377d40c964bd71625} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/doc/latex/unionMultitype.tex b/dmatrix/doc/latex/unionMultitype.tex deleted file mode 100644 index 2d226fa8..00000000 --- a/dmatrix/doc/latex/unionMultitype.tex +++ /dev/null @@ -1,47 +0,0 @@ -\hypertarget{unionMultitype}{ -\section{Multitype Union Reference} -\label{unionMultitype}\index{Multitype@{Multitype}} -} -\subsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{unionMultitype_a6144d7589398ee0202ee7f4fbfad4f21}{ -integer1 {\bfseries g}} -\label{unionMultitype_a6144d7589398ee0202ee7f4fbfad4f21} - -\item -\hypertarget{unionMultitype_a556d63188675caed2d40a14cbfe740e8}{ -shortint {\bfseries h}} -\label{unionMultitype_a556d63188675caed2d40a14cbfe740e8} - -\item -\hypertarget{unionMultitype_a8b913dac6031042a8f5192ee033bb5f1}{ -integer {\bfseries i}} -\label{unionMultitype_a8b913dac6031042a8f5192ee033bb5f1} - -\item -\hypertarget{unionMultitype_ab4eba1c6e83e32ee5b08b7550b46907c}{ -real {\bfseries r}} -\label{unionMultitype_ab4eba1c6e83e32ee5b08b7550b46907c} - -\item -\hypertarget{unionMultitype_ad14eee30c207909f64d8adc2110dc8a1}{ -doublereal {\bfseries d}} -\label{unionMultitype_ad14eee30c207909f64d8adc2110dc8a1} - -\item -\hypertarget{unionMultitype_a30e3bb4e990a88a087fad898df096868}{ -\hyperlink{structcomplex}{complex} {\bfseries c}} -\label{unionMultitype_a30e3bb4e990a88a087fad898df096868} - -\item -\hypertarget{unionMultitype_aa031f83e1db7e8f751458cebe7b9d897}{ -\hyperlink{structdoublecomplex}{doublecomplex} {\bfseries z}} -\label{unionMultitype_aa031f83e1db7e8f751458cebe7b9d897} - -\end{DoxyCompactItemize} - - -The documentation for this union was generated from the following file:\begin{DoxyCompactItemize} -\item -f2c.h\end{DoxyCompactItemize} diff --git a/dmatrix/examples/A.dat b/dmatrix/examples/A.dat deleted file mode 100644 index 6f87f132..00000000 --- a/dmatrix/examples/A.dat +++ /dev/null @@ -1,7 +0,0 @@ -3 3 6 -1 1 -1.226470e+03 -1 2 8.286760e+00 -2 3 6.215070e+00 -2 1 1.946800e+02 -3 2 -2.399010e+03 -3 3 -3.284910e+03 diff --git a/dmatrix/examples/CMakeLists.txt b/dmatrix/examples/CMakeLists.txt deleted file mode 100644 index ece091e8..00000000 --- a/dmatrix/examples/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(dmatrix_examples LANGUAGES CXX) - -add_executable(colon "colon.cxx") -target_link_libraries(colon PUBLIC dmatrix) - -add_executable(expm "expm.cxx") -target_link_libraries(expm PUBLIC dmatrix) - -add_executable(rand "rand.cxx") -target_link_libraries(rand PUBLIC dmatrix) - -add_executable(ricc "ricc.cxx") -target_link_libraries(ricc PUBLIC dmatrix) - -add_executable(sparse "sparse.cxx") -target_link_libraries(sparse PUBLIC dmatrix) - -add_executable(template "template.cxx") -target_link_libraries(template PUBLIC dmatrix) diff --git a/dmatrix/examples/Makefile b/dmatrix/examples/Makefile deleted file mode 100644 index bd314389..00000000 --- a/dmatrix/examples/Makefile +++ /dev/null @@ -1,76 +0,0 @@ - -#Usage: make all - -SHELL = /bin/sh -F2CINC = $(F2CINCLUDE) -F2CLIB = $(F2CLIBRARY) -DMATRIXDIR= ../../dmatrix -CXSPARSE=../../SuiteSparse/CXSparse -LUSOL=../../lusol/csrc - - - -EXAMPLESDIR = . - -SPARSE_LIBS = $(LUSOL)/liblusol.a $(CXSPARSE)/Lib/libcxsparse.a - -DMATRIX_LIBS = $(DMATRIXDIR)/lib/libdmatrix.a - -FLIBS = -llapack -lblas -lf2c - -LDFLAGS = -Wl,--rpath -lgcc_s - -ALL_LIBRARIES = $(DMATRIX_LIBS) $(FLIBS) $(SPARSE_LIBS) -ldl -lm -lgcc_s - -CXX = /usr/bin/g++ -CC = /usr/bin/gcc -CXXFLAGS = -O0 -g -I$(DMATRIXDIR)/include -DLAPACK -DUNIX -DSPARSE_MATRIX -I$(CXSPARSE)/Include -I$(CXSPARSE)/../SuiteSparse_config -I$(LUSOL) -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wimplicit -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -fPIC -DHAVE_MALLOC - -CFLAGS = -O0 -fPIC - - -RICC = ricc -COLON = colon -EXPM = expm -RAND = rand -SPARSE = sparse - - -RICC_O = $(RICC:%=$(EXAMPLESDIR)/%.o) -COLON_O = $(COLON:%=$(EXAMPLESDIR)/%.o) -EXPM_O = $(EXPM:%=$(EXAMPLESDIR)/%.o) -RAND_O = $(RAND:%=$(EXAMPLESDIR)/%.o) -SPARSE_O = $(SPARSE:%=$(EXAMPLESDIR)/%.o) - - -ricc: $(RICC_O) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - -colon: $(COLON_O) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - -expm: $(EXPM_O) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - - -rand: $(RAND_O) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - -sparse: $(SPARSE_O) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - -clean: - - rm -f *.o - -distclean: - rm -f ricc colon expm rand sparse - - -all: ricc colon expm rand sparse - -$(EXAMPLESDIR)/%.o : $(EXAMPLESDIR)/%.cxx - $(CXX) -c $(CXXFLAGS) $< -o $@ - - - diff --git a/dmatrix/examples/Makefile.vc b/dmatrix/examples/Makefile.vc deleted file mode 100755 index 690dbdc1..00000000 --- a/dmatrix/examples/Makefile.vc +++ /dev/null @@ -1,78 +0,0 @@ -CXX = cl - -CC = cl - -LD = link - -CFLAGS = -DWIN32 -DLAPACK -DSPARSE_MATRIX -D_CRT_ERRNO_DEFINED - -BASE = ..\.. - -DMATRIX = $(BASE)\dmatrix - -LUSOL = $(BASE)\LUSOL - -CXSPARSE = $(BASE)\CXSparse - -include ..\..\MicrosoftVisualStudio.inc - - -INCLUDE = -I$(DMATRIX)\include -I$(BASE)\CXSparse\Include -I$(BASE)\LUSOL -I$(VCINCLUDE) -I$(VCSDK) - - -LIBS = $(DMATRIX)\lib\libdmatrix.lib $(DMATRIX)\lib\clapack.lib $(DMATRIX)\lib\blas.lib $(DMATRIX)\lib\libf2c.lib $(LUSOL)\liblusol.lib $(CXSPARSE)\Lib\libcxsparse.lib - -.cxx.obj: - $(CXX) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - -.c.obj: - $(CC) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - - - -all: ricc.exe expm.exe rand.exe colon.exe sparse.exe - - -RICC_SRC = ricc.cxx -RICC_OBJ = ricc.obj - - -ricc.exe: $(RICC_OBJ) $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:ricc.exe $(RICC_OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - -EXPM_SRC = expm.cxx -EXPM_OBJ = expm.obj - -expm.exe: $(EXPM_OBJ) $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:expm.exe $(EXPM_OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - -RAND_SRC = rand.cxx -RAND_OBJ = rand.obj - -rand.exe: $(RAND_OBJ) $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:rand.exe $(RAND_OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - -COLON_SRC = colon.cxx -COLON_OBJ = colon.obj - -colon.exe: $(COLON_OBJ) $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:colon.exe $(COLON_OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - -SPARSE_SRC = sparse.cxx -SPARSE_OBJ = sparse.obj - -sparse.exe: $(SPARSE_OBJ) $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:sparse.exe $(SPARSE_OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - -clean: - del *.obj - -distclean: - del *.exe - - - - - diff --git a/dmatrix/examples/colon.cxx b/dmatrix/examples/colon.cxx deleted file mode 100644 index f0a30863..00000000 --- a/dmatrix/examples/colon.cxx +++ /dev/null @@ -1,130 +0,0 @@ -// colon.cxx - -// V.M. Becerra, September 1996 - -// Program to test some indexing functions of DMatrix - - -#include "dmatrixv.h" - -#include - - -int main() - -{ - - - - DMatrix A( 5, 5 ); - - - - DMatrix B( 4, 5 ); - - - - DMatrix C( 5, 5 ); - - - - DMatrix D(2,2, 1.0, 2.0, - - 3.0, 4.0 ); - - - DMatrix E; - - DMatrix F; - - - A = eye( 5 ); - - - - B = A( colon(1,4), colon() ); - - - - C( colon(1,4), colon(1,4 ) ) = eye(4); - - - - C( colon(5,5), colon(5,5) ) = 10.0; - - - - A.Print("A"); - - - - B.Print("A(1:4,:)"); - - - - C.Print("C"); - - - - printf("\nPress ENTER");getchar(); - - - - D.Print("D"); - - - - D( colon() ).Print("D(:)"); - - - - D( colon(4,-1,1) ).Print("D(4:-1:1)"); - - - - colon(0.0, 1.5, 9.0 ).Print("0:1.5:9.0"); - - - - printf("\nPress ENTER");getchar(); - - - - A(1, colon()) = ones(1, A.GetNoCols() ); - - A(colon(), 2 ) = 2.0*ones(A.GetNoRows(),1); - - - A.Print(" A(1,:) = ones() ; A(:,2)= 2*ones() "); - - printf("\nPress ENTER");getchar(); - - // Now grow the matrix by one column... - - A(colon(),6) = ones(5,1); - - A.Print("A with additional column"); - - - printf("\nPress ENTER");getchar(); - - E = colon(1,16); - - E= reshape(E,4,4); - - E.Print("E"); - - F = colon(1,4); - - F.Print("1:4="); - - E(F).Print("E(1:4)"); - - return 0; - -} - - - - - diff --git a/dmatrix/examples/expm.cxx b/dmatrix/examples/expm.cxx deleted file mode 100644 index 32aa7994..00000000 --- a/dmatrix/examples/expm.cxx +++ /dev/null @@ -1,26 +0,0 @@ -#include "dmatrixv.h" - - -int main(void) -{ - - DMatrix A; - DMatrix W(6,6); - - A.assign(6, 6 , 2.0 , 3.0, -1.0, 3.0, 2.0, -3.0, - 0.5 , 0.2, 3.0, 0.1, 0.4, -1.5, - 0.5 , -0.2, -2.0, -0.1, 0.9, -1.5, - -0.5 , 0.8, 3.0, 0.1, 0.4, -1.5, - 0.1 , 0.9, 2.0, 0.1, 0.4, -1.5, - 0.5 , 0.1, -9.0, 0.9, 0.8, -1.5 - ); - - A.Print("A"); - - W = expm( A ); - - W.Print("expm(A)="); - - return 0; - -} diff --git a/dmatrix/examples/rand.cxx b/dmatrix/examples/rand.cxx deleted file mode 100644 index 4acb1790..00000000 --- a/dmatrix/examples/rand.cxx +++ /dev/null @@ -1,24 +0,0 @@ -#include "dmatrixv.h" - - -int main(void) -{ - - DMatrix A, B; - - - A = randu(10,1); - - A.Print("randu(10,1)"); - - B = randn(10,1); - - B.Print("randn(10,1)"); - - mean(B).Print("mean(B)"); - - Std(B).Print("std(B)"); - - return 0; - -} diff --git a/dmatrix/examples/ricc.cxx b/dmatrix/examples/ricc.cxx deleted file mode 100644 index 675eac7a..00000000 --- a/dmatrix/examples/ricc.cxx +++ /dev/null @@ -1,38 +0,0 @@ -// DMatrix class -// Example consisting of the iterative solution of the -// discrete Riccati algebraic equation -#include "dmatrixv.h" -int main() { - -// Initialize the DMatrix objects - -DMatrix A(3,3, 0.8, 1.0, 0.7 , - -1.0, 0.5, 0.2 , - 0.1, 0.2, 0.4 ); -DMatrix B( 3,2, 0.5, 0.2 , - 0.9, 0.4, - 0.1, -0.5 ); -DMatrix Q = identity(3); -DMatrix R = 0.1*identity(2); -DMatrix S = zeros(3,3); -DMatrix Sn(3,3); -double epsilon = 0.00001; -int iter_max = 200; -int j; -// Recursive loop -for ( j = 1; j<= iter_max; j++ ) -{ - printf("\r iter = %d", j); - // Riccati difference equation - Sn= tra(A)*(S-S*B*inv(tra(B)*S*B+R)*tra(B)*S)*A+Q; - // Check convergence - if ( enorm( Sn - S ) <= epsilon ) break; - // Update S - S = Sn; -} - -S.Print(" Solution S="); -return 0; - -} -// Program ends diff --git a/dmatrix/examples/sparse.cxx b/dmatrix/examples/sparse.cxx deleted file mode 100644 index fc3adc32..00000000 --- a/dmatrix/examples/sparse.cxx +++ /dev/null @@ -1,174 +0,0 @@ -#include "SparseMatrix.h" - -// This file is provided as a template for testing the examples given -// in the DMatrix class manual - -int main(void) -{ - -// Paste the example code within the box below -/* _________________________________________________________ */ - - int I[6] = {1, 1, 2, 2, 3, 3}; - int J[6] = {1, 2, 3, 1, 2, 3}; - double Aij[6] = { - 0.12264700E+04, - 0.82867600E+01, - 0.62150700E+01, - 0.19468000E+03, - -0.23990100E+04, - -0.32849100E+04, - }; - - SparseMatrix A(Aij, 3, 3, 6, I, J); - - SparseMatrix B, C; - - DMatrix b(3,1, -0.187248E+05, - 0.112479E+05, - 0.132356E+05 ); - - DMatrix r(3); - - DMatrix x(3); - - void* LUSOLv; - - - A.Print("A="); - - SparseLUSolve(A, b, x, r); - - x.Print("x"); - r.Print("r"); - - LUSOLv = SparseLUFactor(A); - - SparseLUSolveGivenFactor(LUSOLv, A, b, x, r); - - x.Print("x"); - r.Print("r"); - - B=1.0*A; - - // B(2,2)= 10.0; - B.InsertNonZero(2,2, 10.0); - - B.Print("B="); - - C = A - B; - - C.Print("C=A-B"); - - SparseMatrix D = speye(10); - - D.Print("speye(10)"); - - SparseMatrix E = spones(A); - - E.Print("spones(A)"); - - DMatrix F(4,3); - - F(1,1) = 1; F(1,2)=1; F(1,3)=10.0; - F(2,1) = 2; F(2,2)=2; F(2,3)=20.0; - F(3,1) = 3; F(3,2)=3; F(3,3)=30.0; - F(4,1) = 4; F(4,2)=4; F(4,3)=0.0; - - F.Print("F"); - - SparseMatrix G = spconvert(F); - - G.Print("spconvert(F)"); - - SparseMatrix H; - - H = A*x; - - H.Print("A*x"); - - DMatrix fullA; - - fullA = full(A); - - fullA.Print("full(A)"); - - A.Save("A.dat"); - - SparseMatrix A2; - - A2.Load("A.dat"); - - A2.Print("Read A.dat"); - - SparseMatrix At = tra(A); - - At.Print("tra(A)"); - - SparseMatrix AAt; - - AAt = A*At; - - AAt.Print("A*At"); - - (fullA*tra(fullA)).Print("full A*At"); - - elemProduct(A,A).Print("elemProduct(A,A)"); - - (A^2.0).Print("A^2"); - - SparseMatrix invA; - - invA = inv(A); - - (invA).Print("inv(A)"); - - (inv(fullA)).Print("inv( full(A))"); - - (A%A).Print("A%A"); - - (A/A).Print("A/A"); - - (A||A).Print("A || A"); - - (A&&A).Print("A && A"); - - SparseMatrix S(6,6,0); - - S.set_sub_matrix(A, 4, 6, 4, 6); - - S.Print("S"); - - SparseMatrix Ssub = S.sub_matrix(4,6,4,6); - - Ssub.Print("S(4:6,4:6)"); - - null(A).Print("null(A)"); - - null(fullA).Print("null(fullA)"); - - SVD(A).Print("SVD(A)"); - - SparseMatrix R1 = sprand(10,10,0.1); - - SparseMatrix R2 = sprandn(10,10,0.1); - - R1.Print("sprand(10,10,0.1)"); - - R2.Print("sprandn(10,10,0.1)"); - - fprintf(stderr, "\nrank(R1)=%i\n", rank_sparse(R1)); - - SparseMatrix A1000=sprand(1000,1000,0.02); - SparseMatrix B1000=sprand(1000,1000,0.02); - - SparseMatrix AB1000; - tic(); - AB1000 = A1000*B1000; - toc(); - - -/* _________________________________________________________ */ - - return 0; - -} diff --git a/dmatrix/examples/template.cxx b/dmatrix/examples/template.cxx deleted file mode 100644 index 7a8b6a14..00000000 --- a/dmatrix/examples/template.cxx +++ /dev/null @@ -1,29 +0,0 @@ -#include "dmatrixv.h" - -// This file is provided as a template for testing the examples given -// in the DMatrix class manual - -int main(void) -{ - -// Paste the example code within the box below -/* _________________________________________________________ */ - - int* I[5] = {1, 1, 3, 5, 7}; - int* J[5] = {2, 3, 6, 9, 12}; - double* Aij[5] = {1.0, 2.0, 3.0, 4.0, 5.0} - - SparseMatrix A(5, Aij, I, J, 12, 12, 5); - - DMatrix Adense; - - Adense = A; - - A.Print("A"); - - -/* _________________________________________________________ */ - - return 0; - -} diff --git a/dmatrix/include/Doxyfile b/dmatrix/include/Doxyfile deleted file mode 100644 index 649d6e2a..00000000 --- a/dmatrix/include/Doxyfile +++ /dev/null @@ -1,1417 +0,0 @@ -# Doxyfile 1.5.6 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = "DMatrix and SparseMatrix C++ classes" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = ../doc - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, -# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, -# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, -# and Ukrainian. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentstion. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to FRAME, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. Other possible values -# for this tag are: HIERARCHIES, which will generate the Groups, Directories, -# and Class Hiererachy pages using a tree view instead of an ordered list; -# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which -# disables this behavior completely. For backwards compatibility with previous -# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE -# respectively. - -GENERATE_TREEVIEW = NONE - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = YES - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is enabled by default, which results in a transparent -# background. Warning: Depending on the platform used, enabling this option -# may lead to badly anti-aliased labels on the edges of a graph (i.e. they -# become hard to read). - -DOT_TRANSPARENT = YES - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff --git a/dmatrix/include/SparseMatrix.h b/dmatrix/include/SparseMatrix.h deleted file mode 100644 index 0e16d04e..00000000 --- a/dmatrix/include/SparseMatrix.h +++ /dev/null @@ -1,596 +0,0 @@ -// -// SparseMatrix.hpp -// dmatrix -// -// Created by Philipp Waxweiler on 21.07.20. -// - -#ifndef SparseMatrix_hpp -#define SparseMatrix_hpp - -#include "dmatrixv.h" -#include - -//! SparseMatrix class -/** - A C++ class for sparse numerical linear algebra with interfaces to - a number of CXSparse and LUSOL functions -*/ -class SparseMatrix { -protected: -//! Array to store matrix elements - double *a; -//! Number of matrix rows - int n; -//! Number of matrix columns - int m; -//! Number of allocated elements in a - int asize; -//! Number of non-zero elements - int nz; -//! Array of nonzero row indices - int *RowIndx; -//! Array of nonzero column indices - int *ColIndx; - -public: - - // Interface functions - //! Gets the number of rows from the calling object - /** - \return integer value with the number of rows. - */ - int GetNoRows() const { return n; } - //! Gets the number of columns from the calling object - /** - \return integer value with the number of columns. - */ - int GetNoCols() const { return m; } - //! Gets the number of non-zero elements from the calling object - /** - \return integer value with the number of non-zero elements. - */ - int GetNonZero() const {return nz;} - //! Returns a DMatrix object with the row indices for the non-zero elements - /** - \return Temporary DMatrix object with the row indices for the non-zero elements - */ - DMatrix& GetRowIndxDMatrix(); - //! Returns a DMatrix object with the column indices for the non-zero elements - /** - \return Temporary DMatrix object with the column indices for the non-zero elements - */ - DMatrix& GetColIndxDMatrix(); - //! Returns a int pointer to the start of an array of row indices for the non-zero elements - /** - \return int pointer to the start of the array - */ - int* GetRowIndx_C_Array() const {return RowIndx;} - //! Returns a int pointer to the start of an array of column indices for the non-zero elements - /** - \return int pointer to the start of the array - */ - int* GetColIndx_C_Array() const {return ColIndx;} - //! Returns a double pointer to the start of an array where the non-zero elements are stored - /** - \return double pointer to the start of the array - */ - double *GetPr() const { return a; } - //! Inserts a non-zero value at a specified location of the sparse matrix. The function re-allocates storage as required. - /** - \param i row index (starting from 1) - \param j column index (starting from 1) - \param val non-zero double value to be inserted. - \return void - */ - void InsertNonZero(int i, int j, double val); - //! Saves a sparse matrix in triplet form. The first row of the saved file contains the number of rows, number of columns and the number of non-zeros of the matrix. Each subsequent row contains the row index, the column index and the corresponding nonzero value. - /** - \param fname name of the file to be created - \return void - */ - void Save(const char* fname) const; - //! Saves a sparse sparsity pattern for the sparse matrix, such that the saved matrix contains only zeros and asterisks. - /** - \param fname name of the file to be created - \return void - */ - void SaveSparsityPattern(const char* fname) const; - //! Loads a sparse matrix in triplet form. The first row of the specified file must contain the number of rows, number of columns and the number of non-zeros of the matrix. Each subsequent row must contain the row index, the column index and the corresponding nonzero value, separated by spaces. An error is thrown is the file cannot be opened. - /** - \param fname name of the file to be read - \return void - */ - void Load(const char* fname); - //! This function transposes a sparse matrix and returns the transposed sparse matrix. - /** - \param A sparse matrix to be transposed - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& tra(const SparseMatrix& A); - //! Extracts a specified sub-matrix from a sparse matrix and returns a sparse matrix. - /** - \param istart: start of row range - \param iend: end of row range - \param jstart: start of column range - \param jend: end of column range - \return Temporary SparseMatrix object with the specified sub-matrix - */ - SparseMatrix& sub_matrix(int istart, int iend, int jstart, int jend) const; - //! Extracts a specified column from a sparse matrix and returns a DMatrix object. - /** - \param j: column index - \return Temporary DMatrix object with the specified column - */ - DMatrix& Column(int j) const; - //! Extracts a specified row from a sparse matrix and returns a DMatrix object. - /** - \param i: row index - \return Temporary DMatrix object with the specified row - */ - DMatrix& Row(int i) const; - //! Assigns the elements of a SparseMatrix object to a section of the calling object. - /** - \param istart: start of row range - \param iend: end of row range - \param jstart: start of column range - \param jend: end of column range - \param B: SparseMatrix object whose element values are to be copied into the calling object - \return void - */ - void set_sub_matrix(const SparseMatrix& B, int istart, int iend, int jstart, int jend); - - // Display functions - //! Prints a sparse matrix in triplet format. - /** - \param text: label to identify the sparse matrix to be printed - \return void - */ - void Print(const char* text); - - // Constructors - //! Default constructor. Creates an empty sparse matrix with zero rows and columns. - SparseMatrix(void); // Default constructor - //! Constructor using triplet arrays. - /** - \param aa: array with double non-zero elements - \param nn: number of rows - \param mm: number of columns - \param nnz: number of non-zero elements - \param RowIndxArg: array of int values with the row indices of the nonzero elements (indices start from 1). - \param ColIndxArg: array of int values with the column indices of the nonzero elements (indices start from 1). - */ - SparseMatrix(double* aa, int nn, int mm, int nnz, int* RowIndxArg, int* ColIndxArg); // Constructor using arrays - //! Constructor using DMatrix object. Creates a sparse matrix with the same number of rows and columns as the argument, and copies the non-zero values of the argument into the created sparse matrix. - /** - \param A: DMatrix object - */ - SparseMatrix( const DMatrix& A ); // Constructor using DMatrix object - //! Copy constructor. Creates a copy of the argument. - /** - \param A: SparseMatrix object - */ - SparseMatrix( const SparseMatrix& A); // copy constructor - //! Constructor without element asignment. Creates a SparseMatrix object with storage for a specified number of non-zero values. - /** - \param nn: number of rows. - \param mm: number of columns. - \param nnz: number of non-zero values. - */ - SparseMatrix( int nn, int mm, int nnz); // Constructor without element assigment - - // Destructor - //! Desctructor. - ~SparseMatrix(); - - // Other functions - //! Resizes a SparseMatrix object - /** - \param nnew: new number of rows. - \param mnew: new number of columns. - \param nznew: new number of non-zero values. - \return void - */ - void Resize(int nnew, int mnew, int nznew); - //! Inverts a SparseMatrix object and returns a SparseMatrix object - /** - \param A: SparseMatrix object to be inverted - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& inv(SparseMatrix& A); - //! Transposes a SparseMatrix object. - /** - \return void - */ - void Transpose(); - //! Computes the product of two sparse matrices and returns a SparseMatrix object. The inner matrix dimensions must be consistent, otherwise an error is thrown. - /** - \param A: SparseMatrix object - \param B: SparseMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B); - //! Computes the product of two sparse matrices and returns a SparseMatrix object. The left hand side matrix is transposed. The matrix dimensions must be consistent, otherwise an error is thrown. - /** - \param A: SparseMatrix object - \param B: SparseMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B); - //! Computes the product of two sparse matrices and returns a SparseMatrix object. The right hand side matrix is transposed. The matrix dimensions must be consistent, otherwise an error is thrown. - /** - \param A: SparseMatrix object - \param B: SparseMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& ProductT(SparseMatrix& A, SparseMatrix& B); - //! This function computes and returns the element-wise product of two sparse matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. - /** - \param A is a SparseMatrix object. - \param B is a SparseMatrix object. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B); - //! Converts a DMatrix object into a SparseMatrix object. - /** - \param A: DMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sparse(DMatrix& A); - //! Creates a sparse identity matrix of specified dimension. - /** - \param n: number of rows and columns of the sparse matrix to be created. - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& speye(int n); - //! Creates a sparse matrix with ones and zeros based on the sparsity pattern of a sparse matrix. - /** - \param s: SparseMatrix object - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& spones(const SparseMatrix& s); - //! Creates a SparseMatrix object given triplet information stored in the columns of a DMatrix object. - /** - \param A: DMatrix object. The first column contains the row indices, the second column contains the column indices and the third column contains the non-zero values. - \return A temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& spconvert(DMatrix& A); - //! Creates a DMatrix object given a SparseMatrix object. - /** - \param A: SparseMatrix object. - \return A temporary DMatrix object with the result of the operation - */ - friend DMatrix& full(const SparseMatrix& A); - //! This function returns Z, the orthonormal basis for the null space of a sparse matrix A, such that \f$ Z Z' = I \f$ and \f$ A Z=0 \f$. The number of columns of Z is the nullity of A. - /** - \param A is a SparseMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& null( const SparseMatrix& A ); - //! Returns the singular value decomposition of a sparse matrix \f$ A = U' diag(s) V \f$, where vector s contains the singular values of A. The function uses the LAPACK routine dgesvd_(). - /** - \param A is a SparseMatrix object· - \param U is a pointer to a DMatrix object, which is modified on output to contain the U factor of the decomposition. - \param V is a pointer to a DMatrix object, which is modified on output to contain the V factor of the decomposition. - \return Reference to a temporary DMatrix object with a vector that contains the singular values of matrix A. - */ - friend DMatrix& SVD(const SparseMatrix& A); - friend DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V ); - //! Returns the QR factorisation of a sparse matrix A. The number of rows of matrix A must be greater or equal than the number of columns. - /** - \param A is a SparseMatrix object· - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& QR( const SparseMatrix& A ); - //! Returns the LQ factorisation of a matrix A. The function uses the LAPACK routine dgelqf_(). - /** - \param A is a SparseMatrix object· - \param Q is a pointer to a DMatrix object, which is modified on output to contain the Q factor of the decomposition. - \return Reference to a temporary DMatrix object with the L factor of the decomposition. - */ - friend DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ); - //! This function returns Q, the orthonormal basis for the range of a sparse matrix A, such that \f$ Q Q' = I \f$. The number of columns of Q is the rank of A. - /** - \param A is a SparseMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& orth( const SparseMatrix& A ); - //! This function computes and returns the Schur decomposition of a sparse matrix A, such that \f$ A=Q'U Q \f$, where U is an upper triangular matrix and Q is a unitary matrix. This function uses the LAPACK routine dgees_() - /** - \param A is a SparseMatrix object. - \param U is a pointer to a DMatrix object. - \return Reference to a temporary DMatrix object with the unitary matrix Q. - */ - friend DMatrix& schur(const SparseMatrix& A); - friend DMatrix& schur(const SparseMatrix& A, DMatrix* U ); - //! This function computes the eigenvalues and (optionally) the eigenvectors of a sparse matrix A. This function uses the LAPACK routines dsyev_() and dgeev_. - /** - \param A is a SparseMatrix object. - \param V is a pointer to a DMatrix object. - \return Reference to a temporary DMatrix object with the real part of the eigenvalues in the first column and the complex part of the eigenvalues in the second column. - */ - friend DMatrix& eig(const SparseMatrix& A); - friend DMatrix& eig(const SparseMatrix& A, DMatrix* V ); - //! This function computes and return the Euclidean norm of a sparse matrix A, which is the square root of the sum of its (nonzero) squared elements. - /** - \param A is a SparseMatrix object. - \return the value of the Euclidean norm. - */ - friend double enorm(const SparseMatrix& A); - //! This function computes 2-norm of sparse matrix A, which is computed as the maximum singular value of A. - /** - \param A is a SparseMatrix object. - \return the value of the 2-norm - */ - friend double norm(const SparseMatrix& A); - //! This function computes and returns the element-wise absolute value of a sparse matrix A. - /** - \param A is a SparseMatrix object. - \return a reference to a temporary SparseMatrix object with the result of the operation. - */ - friend SparseMatrix& Abs(const SparseMatrix& A); - //! This function calculates the 2-norm condition number of a sparse matrix, which is the ratio of the maximum singular value to the minimum singular value of the matrix. A large condition number indicates a nearly singular matrix. If the input matrix is not square, an error is thrown. - /** - \param A is a SparseMatrix object. - \return the 2-norm condition number - */ - friend double cond( const SparseMatrix& A ); - //! This function estimates the 1-norm reciprocal condition number of a sparse matrix. The function uses the LAPACK function dgecon. if A is well conditioned, then rcond(A) is near 1. If A is badly conditioned, then rcond(A) is close to the machine numerical precision (very small). If the input matrix is not square, an error is thrown. - /** - \param A is a SparseMatrix object. - \return the reciprocal condition number estimate - */ - friend double rcond( const SparseMatrix& A ); - //! This function returns an estimate of the rank of a sparse matrix, which is the number of linearly independent rows or columns. - /** - \param A is a SparseMatrix object. - \return the rank estimate. - */ - friend int rank_sparse( const SparseMatrix& A ); - //! This function returns a sparse matrix with a given sparsity pattern where each non-zero element is a uniform pseudo-random number in the range (0,1). - /** - \param S is a SparseMatrix object from which the sparsity pattern is taken. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sprand(const SparseMatrix& S); - //! This function returns a sparse matrix with a given density where each non-zero element is a uniform pseudo-random number in the range (0,1). - /** - \param n is the number of rows - \param m is the number of columns - \param density is the desired density of the sparse matrix to be created. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sprand(int n, int m, double density); - //! This function returns a sparse matrix with a given sparsity pattern where each non-zero element is a Gaussian pseudo-random number in the range with zero mean and unit variance. - /** - \param S is a SparseMatrix object from which the sparsity pattern is taken. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sprandn(const SparseMatrix& S); - //! This function returns a sparse matrix with a given density where each non-zero element is a Gaussian pseudo-random number with zero mean and unit variance. - /** - \param n is the number of rows - \param m is the number of columns - \param density is the desired density of the sparse matrix to be created. - \return a temporary SparseMatrix object with the result of the operation - */ - friend SparseMatrix& sprandn(int n, int m, double density); - - //! This function eliminates zero elements from a sparse matrix and deletes unnecessary storage. - /** - \return void - */ - void Compress(); - - // Operators - //! Sparse matrix addition and substitution operator. The sizes of the matrices being added must be the same, otherwise an error is thrown.The left hand side object is replaced with the result of the operation. - /** - \param rval: SparseMatrix object located right hand side of the operator. - \return Reference to the calling SparseMatrix object - */ - SparseMatrix& operator += (const SparseMatrix &rval); - //! Sparse matrix subtraction and substitution operator. The sizes of the matrices being subtracted must be the same, otherwise an error is thrown. The left hand side object is replaced with the result of the operation. - /** - \param rval: SparseMatrix object located right hand side of the operator. - \return Reference to the calling SparseMatrix object - */ - SparseMatrix& operator -= (const SparseMatrix &rval); - //! Sparse matrix product and substitution operator. The inner sizes of the matrices being multiplied must be the consistent, otherwise an error is thrown. The left hand side object is replaced with the result of the operation. - /** - \param rval: SparseMatrix object located right hand side of the operator. - \return Reference to the calling SparseMatrix object - */ - SparseMatrix& operator *= (const SparseMatrix &rval); - //! Computes the product of a sparse matrix (left hand side of the operator) times a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. - /** - \param Arg: double value that will multiply each non-zero element of the sparse matrix. - \return Reference the calling SparseMatrix object - */ - SparseMatrix& operator*= (double Arg); - //! Computes the division of a sparse matrix (left hand side of the operator) by a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. - /** - \param Arg: double value that will divide each non-zero element of the sparse matrix. - \return Reference the calling SparseMatrix object - */ - SparseMatrix& operator/= (double Arg); - //! Sparse matrix addition operator. The row and column sizes of the matrices being added must be the same, otherwise an error is thrown. - /** - \param rval: sparse matrix located at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator+ (const SparseMatrix& rval) const; - //! Sparse matrix subtraction operator. The row and column sizes of the matrices being subtracted must be the same, otherwise an error is thrown. - /** - \param rval: sparse matrix located at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator - (const SparseMatrix& rval) const; - //! Sparse matrix product operator. The inner dimensions of the matrices being multiplied must be the same, otherwise an error is thrown. - /** - \param rval: sparse matrix located at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator* (const SparseMatrix& rval) const; - //! This operator computes the product of a sparse matrix by a dense matrix and returns a sparse matrix object. The inner dimensions of the matrices being multiplied must be the same, otherwise an error is thrown. - /** - \param rval: DMatrix object located at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator* (DMatrix& rval) const; - //! Computes the product of a sparse matrix (left hand side of the operator) times a real scalar (right hand side value). - /** - \param Arg: double value that will multiply each non-zero element of the sparse matrix. - \return Reference to a temporary object with the result of the operation. - */ - SparseMatrix& operator* (double Arg) const; - //! Computes the product of a real value (left hand side of the operator) by a sparse matrix (right hand side of the operator). - /** - \param Arg: double value that will multiply each non-zero element of the sparse matrix. - \param A: SparseMatrix object to be multiplied by a real value. - \return Reference to a temporary object with the result of the operation. - */ - friend SparseMatrix& operator *(double Arg, const SparseMatrix& A); - //! Computes the division of a sparse matrix (left hand side of the operator) by a real scalar (right hand side value). - /** - \param Arg: double value that will divide each non-zero element of the sparse matrix. - \return Reference to a temporary object with the result of the operation. - */ - SparseMatrix& operator/ (double Arg) const; - //! Computes the right division of a sparse matrix (left hand side of the operator) by another sparse matrix (right hand side value). This is conceptually equivalent to multiplying the left object by the inverse of the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The right hand side object must be a square sparse matrix. - /** - \param rval: SparseMatrix object at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator/ (SparseMatrix& rval); - //! Sparse matrix assignment. The size of the left hand side object is modified if necessary, and the values of all non-zero real elements of the right hand side object and copied to the left hand side object. - /** - \param rval: SparseMatrix object at the right hand side of the operator - \return Reference to the calling SparseMatrix object - */ - SparseMatrix& operator= (const SparseMatrix& rval); - //! Elementwise power operator. Returns a SparseMatrix object with the same dimensions of the calling object and each of its elements is computed as the corresponding element of the calling object to the power of the right hand side argument. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A^x). - /** - \param x: double argument at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - SparseMatrix& operator^(double x) const; - //! Concatenates two sparse matrices side by side. The number of rows of the matrices involved must be the same, otherwise an error is thrown. The number of columns of the resulting matrix is the addition of the number of columns of both matrices involved. - /** - \param B: SparseMatrix object at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator||(SparseMatrix& B) const; - //! Stacks the right hand side matrix below the left hand side matrix. The dimensions number of columns of the matrices involved must be the same, otherwise an error is thrown. The number of rows of the resulting matrix is the addition of the number of rows of both matrices involved. - /** - \param B: SparseMatrix object at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator&&(SparseMatrix& B) const; - //! Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row and column indices. Indices start from 1. If the row and column indices refer to a zero (non-allocated) element, a new element with zero value is allocated so that it can be returned as a reference. - /** - \param row: Row index starting from 1. - \param col: Column index starting from 1. - \return Reference to the indexed matrix element. - */ - double& operator() (int row,int col); - //! Matrix indexing. Returns the value of the matrix element located at the position indicated by the row and column indices. Indices start from 1. - /** - \param row: Row index starting from 1. - \param col: Column index starting from 1. - \return double value of the element at the indicated position. - */ - double operator() (int row,int col) const; - //! Computes the left division of a sparse matrix (left hand side of the operator) by another sparse matrix (right hand side value). This is conceptually equivalent to multiplying the inverse of the left object by the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The left hand side object must be a square matrix. - /** - \param B: SparseMatrix object at the right hand side of the operator. - \return Reference to a temporary SparseMatrix object with the result of the operation - */ - SparseMatrix& operator %(SparseMatrix& B); - //! Solves a sparse system of equations \f$ Ax = b \f$ by using sparse LU decomposition. Matrix A must be a square matrix. This function uses LUSOL library functions. - /** - \param A: SparseMatrix object - \param b: SparseMatrix object - \param x: Reference to DMatrix object. Upon return this vector contains the solution to the system of equations. - \param r: Reference to DMatrix object. Upon return this vector contains the residual of the solution, \f$ r=Ax-b \f$. - \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. - \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. - \return void - */ - friend void SparseLUSolve(SparseMatrix& A, DMatrix& b, DMatrix& x, DMatrix& r, int argc, char *argv[]); - //! Finds the sparse LU factor of a sparse matrix A. Matrix A must be a square matrix. This function uses LUSOL library functions. - /** - \param A: SparseMatrix object - \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. - \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. - \return void pointer. - \sa SparseLUSolveGivenFactor() - */ - friend void* SparseLUFactor(SparseMatrix& A, int argc, char *argv[]); - //! Solves a sparse system of equations \f$ Ax = b \f$ by using sparse LU decomposition and a given LU factor. Matrix A must be a square matrix. This function uses LUSOL library functions. - /** - \param LUSOLv: void pointer resulting from a previous call to SparseLUFactor(). - \param A: SparseMatrix object - \param b: SparseMatrix object - \param x: Reference to DMatrix object. Upon return this vector contains the solution to the system of equations. - \param r: Reference to DMatrix object. Upon return this vector contains the residual of the solution, \f$ r=Ax-b \f$. - \param argc: number of extra parameters (plus 1) to be passed to LUSOL. The default value is 1. - \param argv: pointer to array of character strings with the extra parameters passed to LUSOL. The default is NULL. See the LUSOL documentation and source code for more details. - \return void - \sa SparseLUFactor() - */ - friend void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& b, DMatrix& x, DMatrix& r, int argc, char *argv[]); - //! This function prints an error message and throws an exception to be handled by the ErrorHandler class. - /** - \param error_text is a character string with the error message - \return void - */ - friend void sp_error_message(const char *error_text); - - -}; - -// Declaration of all friend functions of SparseMatrix class - -void SparseLUSolve(SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc=1, char *argv[]=NULL); - -void* SparseLUFactor(SparseMatrix& A, int argc=1, char *argv[]=NULL); - -void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc=1, char *argv[]=NULL); - -void sp_error_message(const char *error_text); - -SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B); - -SparseMatrix& ProductT(SparseMatrix& A, SparseMatrix& B); - -SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B); - -SparseMatrix& tra(const SparseMatrix& A); -SparseMatrix& inv(SparseMatrix& A); -SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B); -SparseMatrix& sparse(DMatrix& A); -SparseMatrix& speye(int n); -SparseMatrix& spones(const SparseMatrix& s); -SparseMatrix& spconvert(DMatrix& A); -DMatrix& full(const SparseMatrix& A); -DMatrix& null( const SparseMatrix& A ); -DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V ); -DMatrix& QR( const SparseMatrix& A ); -DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ); -DMatrix& orth( const SparseMatrix& A ); -DMatrix& schur(const SparseMatrix& A, DMatrix* U ); -DMatrix& eig(const SparseMatrix& A, DMatrix* V ); -double enorm(const SparseMatrix& A); -double norm(const SparseMatrix& A); -SparseMatrix& Abs(const SparseMatrix& A); -double cond( const SparseMatrix& A ); -double rcond( const SparseMatrix& A ); -int rank_sparse( const SparseMatrix& A ); -SparseMatrix& sprand(const SparseMatrix& S); -SparseMatrix& sprand(int n, int m, double density); -SparseMatrix& sprandn(const SparseMatrix& S); -SparseMatrix& sprandn(int n, int m, double density); -SparseMatrix& operator *(double Arg, const SparseMatrix& A); - - -#endif /* SparseMatrix_hpp */ diff --git a/dmatrix/include/dmatrixv.h b/dmatrix/include/dmatrixv.h deleted file mode 100644 index 08054663..00000000 --- a/dmatrix/include/dmatrixv.h +++ /dev/null @@ -1,1912 +0,0 @@ -/********************************************************************************************* - -This file is part of the DMatrix library, a C++ tool for numerical linear algebra - -Copyright (C) 2009-2020 Victor M. Becerra - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA, -or visit http://www.gnu.org/licenses/ - -Author: Professor Victor M. Becerra -Address: University of Portsmouth - School of Energy and Electronic Engineering - Portsmouth PO1 3DJ - United Kingdom -e-mail: v.m.becerra@ieee.org - -**********************************************************************************************/ - -/*! \mainpage DMatrix and SparseMatrix classes - \section intro Introduction - The author developed the main features of the DMatrix class between 1994 and 1999. The class makes extensive use of operator overloading in order to facilitate the implementation in C++ of complicated matrix expressions, and it has intefaces to a number of LAPACK routines. In 2008, the class has been tested with current compilers, its functionality was expanded, and the code was published under the GNU Lesser General Public License. The class at present is restricted to dense and real matrices. In 2008, the SparseMatrix class was added to the library to incorporate basic sparse matrix functionality. The SparseMatrix class offers interfaces to some functions available in the CXSparse and LUSOL libraries. - - -The library should compile without problems with the following C++ compilers: GNU C++ version 4.X and Microsoft Visual Studio 2005. - - \section license License - -This work is copyright (c) Victor M. Becerra (2009) - -This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA, or visit http://www.gnu.org/licenses/ - -Author: Dr. Victor M. Becerra, University of Reading, School of Systems Engineering, P.O. Box 225, Reading RG6 6AY, United Kingdom, e-mail: v.m.becerra@ieee.org. - - \section install Installing the library - See the INSTALL file. - \section examples Examples of use - See the source code in the examples directory. -*/ - - -#ifndef DMATRIX_H -#define DMATRIX_H - -#ifndef bool -// typedef int bool; -#endif - -#ifndef N_TEMP_OBJECTS -#define N_TEMP_OBJECTS (40) -#endif - -#ifndef D_TEMP_OBJECTS -#define D_TEMP_OBJECTS (1000000) -#endif - -#ifndef OUTPUT_STREAM -#define OUTPUT_STREAM stderr -#endif - -#ifdef UNIX - - -extern "C" { - - -#include -#include - - -} - - -#else - - -#include -#include - -#ifdef WIN32 -#include -#include -#endif - -#ifndef WIN32 - #ifndef __APPLE__ - #include static long start_clock; - #endif -#endif - -#endif - -#ifdef WIN32 -#define DEC_THREAD __declspec( thread ) -#else -#define DEC_THREAD __thread -#endif - - -#ifndef MATLAB_MEX_FILE - -#define mxCalloc calloc -#define mxFree free - - -#endif /* MATLAB_MEX_FILE */ - - -#include - -#ifndef true -#define true 1 -#endif - -#ifndef false -#define false 0 -#endif - -#include -using std::string; - - -#define RAND_MODULUS 2147483647 /* DO NOT CHANGE THIS VALUE */ -#define RAND_MULTIPLIER 48271 /* DO NOT CHANGE THIS VALUE */ -#define RAND_CHECK 399268537 /* DO NOT CHANGE THIS VALUE */ -#define RAND_STREAMS 256 /* # of streams, DO NOT CHANGE THIS VALUE */ -#define RAND_A256 22925 /* jump multiplier, DO NOT CHANGE THIS VALUE */ -#define RAND_DEFAULT 123456789 /* initial seed, use 0 < RAND_DEFAULT < RAND_MODULUS */ - -//! DMatrix class - -/** - A C++ class for dense and real matrix and vector computations with interfaces to - a number of LAPACK functions -*/ - - -class DMatrix { // define DMatrix class - -protected: -//! Array of doubles to store matrix elements using column major storage - double *a; - //! Number of matrix rows - long n; - //! Number of matrix columns - long m; -//! Number of allocated elements in a - long asize; -/*! Flag to indicate type of allocation. - type = 0 : allocated matrix - type = 1 : non-allocated matrix, uses predefined array for storage -*/ - int atype; -/*! Flag to indicate type of matrix - mtype = 0 : normal matrix - mtype = 1 : colon - reference matrix -*/ - int mtype; - //! Flag to indicate auxiliary (temporary) matrix flag = 1 if temporary matrix, 0 otherwise. - int auxFlag; - //! Flag to indicate that element storage has been allocated - int allocated; -//! Referenced matrix pointer - DMatrix* mt; -//! Row indices - const DMatrix* rowIndx; -//! Column indices - const DMatrix* colIndx; - - // Protected static members -//! Array of Temporary matrices - static DEC_THREAD DMatrix* auxPr; -//! Number of auxiliary matrices - static DEC_THREAD int noAuxArr; -//! Dimension of auxiliary arrays - static DEC_THREAD long dimAux; -//! Index of used auxiliary matrices - static DEC_THREAD int auxIndx; -//! Member function flag to control resetting of auxIndx - static DEC_THREAD int memberFlag; -//! Flag to indicate aux arrays allocation - static DEC_THREAD int initFlag; -//! Machine precision constant - static DEC_THREAD double MACH_EPS; -//! Flag to indicate error condition - static DEC_THREAD int errorFlag; -//! Print level flag, 1: output sent to sderr, 0: no output sent - static DEC_THREAD int print_level; - -//! current state of each stream - static DEC_THREAD long *seed; -//! stream index for pseudo-ramdon number generator - static DEC_THREAD int stream; -//! variable to store start time after tic() call. - static DEC_THREAD time_t start_time; - //! clock_t variable - static DEC_THREAD clock_t start_clock; -//! returns pointer to the i-th temporary object - static DMatrix* GetTempPr(int i); -//! Gets the memberFlag value from the object - static int GetMemberFlag() { return memberFlag; } -//! Sets the memberFlag value - static void SetMemberFlag(int arg) { memberFlag=arg; } -//! Checks the auxiliary objects - static void ChkAuxArrays(); -//! Gets the number of temporary objects - static int GetNoAuxArr() { return noAuxArr; } -//! Gets the dimensions of the array of temporary objects - static long GetDimAux() { return dimAux; } -//! Gets the value of initFlag - static int GetInitFlag() { return initFlag; } -//! Sets the value of initFlag - static void SetInitFlag(int arg) { initFlag = arg ; } -//! Gets the current index of temporary objects - static int GetAuxIndx() { return auxIndx; } -//! Increments the index of temporary objects - static int IncrementAuxIndx() { -#ifdef CHECK_AUX - fprintf(stderr,"\nauxIndx=%d",auxIndx); -#endif - return ++auxIndx; } -//! Decrements the index of temporary objects - static int DecrementAuxIndx() { return --auxIndx ; } -//! Sets the index of temporary objects - static void SetAuxIndx( int i ) { auxIndx = i; } -//! Sets the dimension of each object in the array of temporary objects - static void SetDimAux( long dd ) { dimAux = dd; } -//! Sets the number of auxiliary objects - static void SetNoAuxArr( int nn ) { noAuxArr = nn ; } -//! Sets the errorFlag member to true - static void RiseErrorFlag() { errorFlag = true; } -//! Sets the value of auxFlag - void SetAuxFlag(int arg) { auxFlag = arg; } -//! Gets the value of auxFlag - int GetAuxFlag() { return auxFlag; } - //! Gets the value of start_clock member - static clock_t GetStartTicks(void) { return start_clock; } -//! Sets the value of start_clock member - static void SetStartTicks(clock_t st) { start_clock=st; } - -#ifdef DECLARED_TEMPS - - static DEC_THREAD double axp[N_TEMP_OBJECTS][D_TEMP_OBJECTS]; - -#endif - - -#define MC_EPSILON 2.221e-16 - - //! Cholesky decomposition of a matrix - /** - \param A is a DMatrix object - \param n is the number of columns of the input matrix A. - \param pM (modified), is a DMatrix object which on output contains the Cholesky decomposition of input matrix a. - \return void - \sa CholeskySolution() - */ - - friend void CholeskyDecomp(DMatrix& A, int n, DMatrix& pM); - - //! Cholesky solution using the Cholesky decomposition of a matrix - /** - \param A DMatrix object - \param n is the number of columns of the input matrix A. - \param pM DMatrix object which on output contains the Cholesky decomposition of input matrix a. - \param bM DMatrix object with a vector of right-hand-side values - \param xM (modified) DMatrix object which on return contains the solution to the system of equations - \return void - \sa CholeskyDecomp() - */ - - friend void CholeskySolution(const DMatrix& A, int n, const DMatrix& pM, - const DMatrix& bM, DMatrix& xM); - - //! Allocate memory to store matrix elements - /** - \param size number of double elements to allocate - \return void - \sa DeAllocate() - */ - - void Allocate(long size); - - //! De-allocate memory previously allocated with DMatrix::Allocate(). - /** - \return void - \sa Allocate() - */ - - void DeAllocate(); // De-allocate memory - - - //! Elementwise comparison of matrix elements - /** - \param m2 DMatrix object to be compared with the calling object. - \param op (char) indicates type of operator. Use 1 for >, 2 for >=,. 3 for <, 4 for <=, 5 for ==, 6 for != comparisons - \return A reference to a DMatrix object such that its elements are 1 if the comparison is true, 0 otherwise. - */ - DMatrix& compMat( const DMatrix& m2, char op ) const; - - //! Sets the value of the referenced matrix pointer - /** - \param arg Pointer to DMatrix object - \return void - */ - void SetReferencedDMatrixPointer( DMatrix* arg ) { mt = arg; } - //! Gets the value of the referenced matrix pointer - /** - \return pointer to DMatrix object - */ - DMatrix* GetReferencedDMatrixPointer() { return mt; } - //! Sets the row index pointer - /** - \param arg Pointer to DMatrix object - \return void - */ - void SetRowIndexPointer(const DMatrix* arg ) { rowIndx = arg; } - //! Sets the column index pointer - /** - \param arg Pointer to DMatrix object - \return void - */ - void SetColIndexPointer(const DMatrix* arg ) { colIndx = arg; } - //! Sets the type of matrix - /** - \param arg (int) should be 0 for a normal matrix, or 1 for a colon reference matrix - \return void - */ - void SetMType( int arg ); - //! Gets the type of matrix - /** - \return int value - */ - int GetMType() { return mtype; } - //! Assigns a matrix to the values pointed to by a colon reference matrix - /** - \param A DMatrix object - \return reference to DMatrix object - */ - DMatrix& AssignmentToColonReference( const DMatrix& A ); - //! Assigns a double value to each value pointed to by a colon reference matrix - /** - \param arg is a double value to be assigned. - \return reference to DMatrix object - */ - DMatrix& AssignmentToColonReference( double arg ); - -public: - - - friend class SparseMatrix; - - // Public methods - //! Allocates the array of auxiliary (temporary) objects used by the class - /** Allocates a DMatrix array of size N_TEMP_OBJECTS. Each element is allocated a storage of - size D_TEMP_OBJECTS. These two macros are given default values but may be changed by - the user at compilation time. The purpose of the array of temporary objects is to - to store the intermediate objects resulting from single lines of code that - call various operators and functions returning DMatrix objects. A simple example is as - follows. Consider the C++ statement - D= A*B + C; - where A,B C and D are DMatrix objects. This statement involves two temporary objects: - one to store the result of A*B, and another one to store the result of (A*B)+C; - \return void - */ - static void AllocateAuxArr( void ); - //! De-allocates the array of auxiliary (temporary) objects previously allocated by AllocateAuxArr() - /** - \return void - */ - static void DeAllocateAuxArr( void ); - //! Returns a pseudo-random uniformly distributed number in the range [0,1] - /** - \return double pseudo-random value in the range [0,1] - */ - static double random_uniform(void); - //! Returns a pseudo-random Gaussian distributed number with zero mean and unit variance - /** - \return double Gaussian pseudo-random value - */ - static double random_gaussian(void); - //! Gets a pointer to the array of auxiliary objects - /** - \return DMatrix** pointer - */ - static DMatrix** GetAuxPr(void) { return &auxPr; } - //! Checks if the error flag has been raised. If so, a 1 is returned, 0 otherwise - /** - \return int value - */ - static int isThereError(void) { return errorFlag; } - - // Input / Output functions - - //! Allows the user to enter the elements of a matrix using command line prompts - /** - \return void - */ - void input_matrix(); - - //! Prints the elements of a DMatrix object - /** - \param text is a string that serves as a prompt for the matrix being entered. - \return void - */ - void Print(const char *text) const; - - //! Prints information about a DMatrix object - /** - \param text is a a string that serves as a label for the matrix being printed. - \return void - */ - void PrintInfo(const char *text) const; - //! Reads the elements of a matrix from a file - /** - The file in question should contain the elements of the matrix row by row - The elements should be separated by spaces and each row should be separated by a new line. - The calling object should have the appropriate number of rows and columns. - \param filex pointer to a file already opened using "fopen()". - \return void - */ - void Read(FILE *filex); - //! Saves the elements of a matrix to a file - /** - \param FileName is a string with the desired file name - \return void - */ - void Save( const char * FileName ); - //! Reads the elements of a matrix from a file - /** - The calling object should have the appropriate number of rows and columns. - \param FileName is a string with the file name where the matrix elements are stored. - \return void - */ - void Load( const char * FileName ); - - //! Prints the elements of a matrix elements matrix to a file - /** - \param filex is a pointer to a file already opened using "fopen()". - \return void - */ - void Fprint( FILE *filex ); - - //! Sets the print level - /** - \param plevel desired print level - \return void - */ - static void SetPrintLevel( int plevel ); - - static int PrintLevel(); - - // Modifying member functions - //! Assigns a zero value to each element of a matrix. - /** - \return void - */ - void FillWithZeros( void ); - //! Swaps two rows of a matrix - /** - \param i: first row index - \param j: second row index. - \return void - */ - void SwapRows( int i, int j ); - //! Swaps two columns of a matrix - /** - \param i: first column index - \param j: second column index. - \return void - */ - void SwapColumns( int i, int j ); - //! Transposes a matrix - /** - \return void - */ - void Transpose(void); - //! Assigns values to the diagonal elements of a matrix, while all off-diagonal elements are set to zero. - /** - The dimensions of dd should be consistant with the dimensions of the calling object - \param dd: reference to constant DMatrix object which should contain a vector with the desired diagonal elements - \return void - */ - void diag( const DMatrix& dd ); - //! Assigns values to a column of a matrix, while other columns are left untouched. - /** - \param Col: reference to constant DMatrix object which should contain a vector with the desired column values - \param icol: index to the column that is to be changed - \return void - */ - void SetColumn( const DMatrix& Col, int icol ); - //! Assigns values to a row of a matrix, while other columns are left untouched. - /** - \param Row: reference to constant DMatrix object which should contain a vector with the desired row values - \param irow: index to the row that is to be changed - \return void - */ - void SetRow( const DMatrix& Row, int irow ); - //! Multiples the elements of a specified column of a matrix by a constant scalar value - /** - \param c: index to the column that is to be changed - \param x: scalar value - \return void - */ - void colMult(long c, double x ); - //! Multiples the elements of a specified row of a matrix by a constant scalar value - /** - \param r: index to the row that is to be changed - \param x: scalar value - \return void - */ - void rowMult(long r, double x ); - //! Finds non-zero values of a matrix - /** - \param I: DMatrix object with the row index of each non-zero element - \param J: DMatrix object with the column index of each non-zero element - \return DMatrix object with the same dimensions as the calling object, and with elements which are 0 if the corresponding element of the calling object is 0, 1 otherwise. - */ - DMatrix& find(DMatrix& I, DMatrix& J) const; - //! Finds non-zero values of a matrix - /** - \param I: C++ double array with the row index of each non-zero element - \param J: C++ double array with the column index of each non-zero element - \return DMatrix object with the same dimensions as the calling object, and with elements which are 0 if the corresponding element of the calling object is 0, 1 otherwise. - */ - DMatrix& find(int* I, int* J) const; - - - // Sub-matrix functions - //! Extracts a specified sub-matrix from a matrix - /** - \param r1: start of row range - \param r2: end of row range - \param c1: start of column range - \param c2: end of column range - \return DMatrix object with the specified sub-matrix - */ - DMatrix& sub_matrix(long r1, long r2, long c1, long c2) const ; - //! Assigns the elements of a matrix object to a section of the calling object. - /** - \param row: start of row range - \param col: start of column range - \param A: DMatrix object whose element values are to be copied into the calling object - \return void - */ - void SetSubMatrix(long row, long col, const DMatrix& A); - - // Interface functions - //! Gets the number of rows from the calling object - /** - \return long value with the number of rows. - */ - long getn() {return n;} - //! Gets the number of columns from the calling object - /** - \return long value with the number of columns - */ - long getm() {return m;} - //! Gets the number of rows from the calling object - /** - \return long value with the number of rows. - */ - long getn() const {return n;} - //! Gets the number of columns from the calling object - /** - \return long value with the number of columns - */ - long getm() const {return m;} - //! Gets the number of rows from the calling object - /** - \return long value with the number of rows. - */ - long GetNoRows() { return n; } - //! Gets the number of rows from the calling object - /** - \return long value with the number of rows. - */ - long GetNoRows() const { return n; } - //! Gets the number of columns from the calling object - /** - \return long value with the number of columns - */ - long GetNoCols() { return m; } - //! Gets the number of columns from the calling object - /** - \return long value with the number of columns - */ - long GetNoCols() const { return m; } - //! Gets the pointer to the array where the elements of the matrix are stored - /** - \return double pointer - */ - double *GetPr() { return a; } - //! Gets a pointer to the array where the elements of the matrix are stored (for const objects) - /** - \return double pointer - */ - double *GetConstPr() const { return a; } - //! Gets a pointer to the array where the elements of the matrix are stored - /** - \return double pointer - */ - double* geta() {return a;} - //! Gets the type of element storage of a matrix - /** - \return int value: 0 if the array is allocated, 1 if the storage is done using a previously declared array of doubles. - */ - int getatype() { return atype; } - //! Check if a matrix object is empty, if other words this method checks if the calling object has zero elements - /** - \return int value: 0 if calling object is not empty, 1 otherwise - */ - int isEmpty() { if (n*m == 0) return 1; else return 0; } - - //! Check if a matrix object contains a row or column vector - /** - \return int value: 1 if calling object is a vector, 0 otherwise - */ - int isVector() const { if (n==1 || m==1) return 1; else return 0; } - - // methods to access to matrix elements, columns and rows - //! Returns the value of a specified element of a matrix - /** - \param i: row index (starting from 1) - \param j: column index (starting from 1) - \return double value - */ - double element(long i, long j ); - //! Returns a reference to the specified element of a matrix - /** - \param i: row index (starting from 1) - \param j: column index (starting from 1) - \return double reference - */ - double& elem( long i, long j ) { return a[ (j-1)*n + i-1 ]; } - //! Returns the value of a specified element of a matrix - /** - \param i: row index (starting from 1) - \param j: column index (starting from 1) - \return double value - */ - double elem( long i, long j ) const { return a[(j-1)*n+i-1]; } - //! Returns a DMatrix object containing a speficied column of the calling object - /** - \param icol: column index (starting from 1) - \return DMatrix object with the specified column - */ - DMatrix& Column(long icol ) const; - //! Returns a DMatrix object containing a speficied row of the calling object - /** - \param irow: row index (starting from 1) - \return DMatrix object with the specified row - */ - DMatrix& Row(long irow ) const; - - //! Computes and returns the integer power of a matrix. - /** - \param p: integer value, starting from 0 - \return DMatrix object with the result of the calculation - */ - DMatrix& mpow(int p); - - void initVars(); - // Constructors - - //! Default constructor. Creates an empty matrix. - DMatrix(void); // Default constructor - //! Constructor with dimensions. Creates a matrix with allocated storage given specified numbers of rows and columns. - /** - \param Initn: number of rows - \param Initm: number of columns - */ - DMatrix( long Initn, long Initm); - //! Constructor with dimensions using pre-allocated storage. - /** - \param vDim: Allocated length of array v - \param v: double array to be used as storage by the DMatrix object - \param Initn: number of rows - \param Initm: number of columns - */ - DMatrix( long vDim, double* v, long Initn, long Initm ); - //! Constructor with a single dimension, creates a column vector. - /** - \param Initn: number of rows - */ - DMatrix( long Initn); // Column vector constructor using memory allocation - //! Constructor using a variable list of element values - /** - \param Initn: number of rows - \param Initm: number of columns - \param a11: first element of list doubles, values are entered column by column - */ - DMatrix(long Initn,long Initm,double a11,...); - //! Copy constructor. Creates a new DMatrix object with the same dimensions and element values as a given DMatrix object. - /** - \param A: DMatrix object to be copied - */ - DMatrix( const DMatrix& A); // copy constructor - - - //! Destructor. Destroys a previously created DMatrix object and frees any allocated memory. - ~DMatrix(); - // Resizing and assignment - //! Changes the number of rows and columns of an existing matrix. Allocates new memory if necessary. If the calling object uses preallocated memory and the requested size would exceed that memory, an error is thrown. - /** - \param nnrow: new number of rows - \param nncol: new number of columns - */ - void Resize(long nnrow, long nncol ); - //! Assigns values to the elements of an existing DMatrix object using a variable list of values. Resizes the matrix if necessary. - /** - \param rows: number of rows - \param columns: number of columns - \param a11: first element of the list of double arguments. - */ - void assign(long rows,long columns,double a11,...); // Assignment using variable list - //! Copies values to the elements of a DMatrix object from an existing array. The number of elements of the DMatrix object is assumed to be the number of values to be copied. - /** - \param aptr: pointer to the start of the array of doubles to be copied. - */ - void MemCpyArray(double * aptr ); - - // Operators - //! Matrix addition operator. The sizes of the matrices being added should be the same, otherwise an error is thrown. - /** - \param rval: matrix located at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator+ (const DMatrix& rval) const; - //! Matrix addition and substitution operator. The sizes of the matrices being added should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation. - /** - \param rval: matrix located right hand side of the operator. - \return Reference to the calling object - */ - DMatrix& operator += (const DMatrix &rval); - //! Adds a scalar real value to each element of the matrix. . - /** - \param x: double value to be added - */ - DMatrix& operator+ (double x) const; - //! Matrix subtraction and substitution operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown.The left hand side object elements are replaced with the result of the operation. - /** - \param rval: matrix located right hand side of the operator. - \return Reference to the calling object - */ - DMatrix& operator -= (const DMatrix &rval); - //! Matrix subtraction operator. The sizes of the matrices being subtracted should be the same, otherwise an error is thrown. - /** - \param rval: matrix located at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator- (const DMatrix& rval) const; - //! Subtracts a scalar real value from each element of the matrix. . - /** - \param x: double value to be subtracted - */ - DMatrix& operator- (double x) const; - //! Matrix unary minus operator. Returns an object of the same dimensions as A but with changed element signs. - /** - \param A: matrix located at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& operator- (const DMatrix& A); - //! Matrix product operator. Returns the result of the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown. - /** - \param rval: matrix located at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator* (const DMatrix& rval) const; - //! Matrix product operator with substitution. Computes the matrix product of the calling object (left hand side of the operator) and the right hand side object. The inner dimensions of the objects being multiplied should be consistent, otherwise an error will be thrown. The calling object is modified to store the results of the operation. - /** - \param rval: matrix located at the right hand side of the operator. - \return Reference to the calling DMatrix object - */ - DMatrix& operator *= (const DMatrix &rval); - //! Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value) and replaces the left hand side object with the result of the operation. - /** - \param Arg: double value that will multiply each element of the matrix. - \return Reference the calling DMatrix object - */ - DMatrix& operator* (double Arg) const; - //! Computes the product of a matrix (left hand side of the operator) times a real scalar (right hand side value), and modifies the calling object to store the result of the operation. - /** - \param Arg: double value that will multiply each element of the matrix. - \return Reference to the calling DMatrix object - */ - DMatrix& operator *= (double Arg); - //! Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value). - /** - \param Arg: double value that will divide each element of the matrix. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator/ (double Arg) const; - //! Computes the right division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the left object by the inverse of the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The right hand side object must be a square matrix. - /** - \param rval: DMatrix object at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator/ (const DMatrix& rval) const; - //! Computes the left division of a matrix (left hand side of the operator) by another matrix (right hand side value). This is conceptually equivalent to multiplying the inverse of the left object by the right hand side object but it is computed in a more efficient way. The dimensions of the matrices must be consistent, otherwise an error is returned. The left hand side object must be a square matrix. - /** - \param rval: DMatrix object at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator% (const DMatrix& rval) const; - //! Computes the division of a matrix (left hand side of the operator) by a real scalar (right hand side value) and modifies the left hand side object with the result of the operation. - /** - \param Arg: double value that will divide each element of the matrix. - \return Reference to the calling object - */ - DMatrix& operator /= (double Arg); - //! Matrix assignment. The size of the left hand side object is modified if necessary, and the values of all real elements of the right hand side object and copied to the left hand side object. - /** - \param rval: DMatrix object at the right hand side of the operator - \return Reference to the calling object - */ - DMatrix& operator= (const DMatrix& rval); - //! Matrix assignment to a scalar. The size of the left hand side object is modified to one row by one column if necessary, and the value of the right hand side argument is copied to the single element of the matrix. If the calling object is a "colon reference" matrix, then the right hand side value is copied to each element of the referenced array elements. - /** - \param val: double value at the right hand side of the operator - \return Reference to the calling object - */ - DMatrix& operator = (double val); - //! Matrix assignment to a constant matrix defined as a character string using the bracket notation used in Matlab and Octave. The size of the left hand side object is modified if necessary. For example, the identity matrix of size two by two would be entered as "[1.0 0.0;0.0 1.0]" - /** - \param str: Character string containing the constant matrix defined using Matlab/Octave bracket notation. - \return Reference to the calling object - */ - DMatrix& operator = (const char* str); - //! Concatenates two matrices side by side. The dimensions number of rows of the matrices involved must be the same, otherwise an error is thrown. The number of columns of the resulting matrix is the addition of the number of columns of both matrices involved. - /** - \param B: DMatrix object at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator ||(const DMatrix& B) const; - //! Stacks the right hand side matrix below the left hand side matrix. The dimensions number of columns of the matrices involved must be the same, otherwise an error is thrown. The number of rows of the resulting matrix is the addition of the number of rows of both matrices involved. - /** - \param B: DMatrix object at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator &&(const DMatrix& B) const; - //! Elementwise power operator. Returns a DMatrix object with the same dimensions of the calling object and each of its elements is computed as the corresponding element of the calling object to the power of the right hand side argument. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A^x). - /** - \param x: double argument at the right hand side of the operator. - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator^(double x); - //! Elementwise product operator. Returns a DMatrix object with the same dimensions of the calling objects and each of its elements is computed as the product of the corresponding elements of the calling object and the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the * operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A&B). - /** - \param B: DMatrix object at the right hand side of the operator - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator &(const DMatrix& B) const; - //! Elementwise division operator. Returns a DMatrix object with the same dimensions of the calling objects and each of its elements is computed as the of the corresponding element of the calling object by the corresponding element of the right hand side object. The dimensions of the calling objects must be the same, otherwise an error is thrown. Care must be taken when using this operator as the associations do not work in the same way as with the / operator. It is highly recommended to use parenthesis every time this operator is used. For example use it as follows: (A|B). - /** - \param B: DMatrix object at the right hand side of the operator - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator |(const DMatrix& B) const; - //! Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row and column indices. Indices start from 1. - /** - \param row: Row index starting from 1. - \param col: Column index starting from 1. - \return Reference to the indexed matrix element. - */ - double& operator() (long row,long col); - //! Matrix indexing. Returns a reference to the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of zero or negative indices. The matrix is resized if necessary. - /** - \param row: Row index starting from 1. - \param end: Character string containing the word "end". - \return Reference to the indexed matrix element. - */ - double& operator() (long row,const char* end); - //! Matrix indexing. Returns a reference to the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation. - /** - \param end: Character string containing the word "end". - \param col: Column index starting from 1. - \return Reference to the indexed matrix element. - */ - double& operator() (const char* end,long col); - //! Matrix indexing. Returns the value of the matrix element located at the position indicated by the row and column indices. Indices start from 1. An error in thrown in case of a range violation. - /** - \param row: Row index starting from 1. - \param col: Column index starting from 1. - \return double value of the indexed element. - */ - double operator() (long row,long col) const; - //! Matrix indexing. Returns the value of the matrix element located at the position indicated by the row index and the last column. Indices start from 1. An error in thrown in case of a range violation. - /** - \param row: Row index starting from 1. - \param end: Character string containing the word "end". - \return double value of the indexed matrix element. - */ - double operator() (long row,const char* end) const; - //! Matrix indexing. Returns the value of the matrix element located at the position indicated by the column index and the last row. Indices start from 1. An error in thrown in case of a range violation. - /** - \param end: Character string containing the word "end". - \param col: Column index starting from 1. - \return double value of the indexed matrix element. - */ - double operator() (const char* end,long col) const; - //! Single index matrix indexing. Returns a reference to the matrix element located at the linear position indicated by the index, assuming column major storage. The indexs start from 1. The matrix is resized if necessary. An error is thrown in case of zero or negative indices. - /** - \param index: index value - \return reference to indexed matrix element. - */ - double& operator() (long index ); - //! Access to last linear element. Returns a reference to the last linear matrix element, assuming column major storage. - /** - \param end: Character string containing the word "end". - \return reference to indexed matrix element. - */ - double& operator() (const char* end); - //! Single index matrix indexing. Returns the value of the matrix element located at the linear position indicated by the index, assuming column major storage. The index starts from 1. An error is thrown in case of range error. - /** - \param k: index value - \return Value of indexed matrix element. - */ - double operator() (long k ) const; - //! Access to last linear element. Returns the value of the last linear matrix element, assuming column major storage. - /** - \param end: Character string containing the word "end". - \return value of the last matrix element. - */ - double operator() (const char* end) const; - //! Checks if each element of the DMatrix object on the left hand side is greater than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - /** - \param val: right hand side value - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator > ( double val ) const ; - //! Checks if each element of the DMatrix object on the left hand side is lower than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - /** - \param val: right hand side value - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator < ( double val ) const ; - //! Checks if each element of the DMatrix object on the left hand side is greater or equal than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - /** - \param val: right hand side value - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator >= ( double val ) const ; - //! Checks if each element of the DMatrix object on the left hand side is lower or equal than the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - /** - \param val: right hand side value - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator <= ( double val ) const ; - //! Checks if each element of the DMatrix object on the left hand side is equal to the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - /** - \param val: right hand side value - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator == ( double val ) const ; - //! Checks if each element of the DMatrix object on the left hand side is different from the right hand side value. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. - /** - \param val: right hand side value - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator != ( double val ) const ; - //! Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - /** - \param val: val: right hand side object - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator > ( const DMatrix& val ) const ; - //! Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - /** - \param val: val: right hand side object - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator < ( const DMatrix& val ) const ; - //! Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is greater or equal than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - /** - \param val: val: right hand side object - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator >= ( const DMatrix& val ) const ; - //! Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is lower or equal than the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - /** - \param val: val: right hand side object - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator <= ( const DMatrix& val ) const ; - //! Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is equal to the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - /** - \param val: val: right hand side object - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator == ( const DMatrix& val ) const ; - //! Elementwise matrix comparison. Checks if each element of the matrix on the left hand side is different from the corresponding element of the right hand side matrix. The result is a DMatrix object where each element has the value of 1 if the corresponding comparison was true, 0 otherwise. The dimensions of the two matrices involved must be the same, otherwise an error is thrown. - /** - \param val: val: right hand side object - \return Reference to a temporary DMatrix object with the result of the operation - */ - DMatrix& operator != ( const DMatrix& val ) const ; - - // Indexing functions - //! Submatrix extraction and referencing using arrays of indices. - /** - \param RowIndx is a DMatrix array that contains row index values usually generated using the colon() function. - \param ColIndx is a DMatrix array that contains column index values usually generated using the colon() function. - \return Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object. - */ - DMatrix& operator() (const DMatrix& RowIndx, const DMatrix& ColIndx ); - //! Linear sub-vector extraction and referencing using an array of indices assuming column-major storage - /** - \param RowIndx is a DMatrix array that contains row index values usually generated using the colon() function. - \return Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object - */ - DMatrix& operator() (const DMatrix& RowIndx ); - //! Sub-vector extraction and referencing using an array of row indices for a given column - /** - \param RowIndx is a DMatrix array that contains row index values usually generated using the colon() function. - \param col is a column index - \return Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object - */ - DMatrix& operator() (const DMatrix& RowIndx, long col ); - //! Sub-vector extraction and referencing using an array of column indices for a given row - /** - \param row is a row index. - \param ColIndx is a DMatrix array that contains column index values usually generated using the colon() function. - \return Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object - */ - DMatrix& operator() (long row, const DMatrix& ColIndx); - //! Sub-vector extraction and referencing using an array of row indices for the last column of a matrix. - /** - \param RowIndx is a DMatrix array that contains row index values usually generated using the colon() function. - \param end is a character string containing the word "end". - \return Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object - */ - DMatrix& operator() (const DMatrix& RowIndx,const char* end ); - //! Sub-vector extraction and referencing using an array of column indices for the last column of a matrix - /** - \param end is a character string containing the word "end". - \param ColIndx is a DMatrix array that contains column index values usually generated using the colon() function. - \return Reference to a DMatrix mtype 1 object that maps to the referenced elements of the calling object - */ - DMatrix& operator() (const char* end, const DMatrix& ColIndx); - - // Miscellaneous friend functions - //! This function generates a DMatrix object with a vector starting from a given value, with given increments and ending in a given value. - /** - \param i1 is the first value - \param increment is the increment - \param i2 is the last value - \return Reference to a temporary DMatrix object - */ - friend DMatrix& colon( double i1, double increment, double i2 ); - //! This function generates DMatrix object with a vector starting from a given value, with given increments and ending in a given value. - /** - \param i1 is the first value - \param increment is the increment - \param i2 is the last value - \return Reference to a temporary DMatrix object - */ - friend DMatrix& colon( int i1, int increment, int i2); - //! This function generates DMatrix object with a vector starting from a given value, with unit increments, and ending in a given value. - /** - \param i1 is the first value - \param i2 is the last value - \return Reference to a temporary DMatrix object - */ - friend DMatrix& colon( int i1, int i2 ); - //! This function generates DMatrix object with a vector starting from a given value, with unit increments, and ending in a given value. - /** - \param i1 is the first value - \param i2 is the last value - \return Reference to a temporary DMatrix object - */ - friend DMatrix& colon( double i1, double i2); - //! This function generates a special DMatrix object with one row and one column which is understood by the indexing functions that take a DMatrix object as an argument to mean "all rows" or "all columns". - /** - \return Reference to a temporary DMatrix object - */ - friend DMatrix& colon( void ); - - // Miscellaneous friend functions - //! This function returns a 1 if any alement of DMatrix object that is passed as argument is non-zero, otherwise it returns a zero. - /** - \param A is a DMatrix object. - \return an integer value which is either 1 or 0. - */ - friend int any( const DMatrix& A ); - //! This function calculates the integer matrix power. - /** - \param A is a DMatrix object. - \param p is an integer value which can be positive or negative - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& mpow( DMatrix& A, int p ); - //! This function multiplies a real number by a matrix - /** - \param r is a double value - \param A is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& operator *(double r, const DMatrix& A); - //! This function returns the transpose of a given matrix. - /** - \param A is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& tra(const DMatrix& A); - //! This function returns the inverse of a given square matrix. If the argument is not a square matrix an error is thrown. - /** - \param A is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& inv(const DMatrix& A); - //! This function returns the pseudo-inverse of a given rectangular matrix. - /** - \param A is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& pinv(const DMatrix& A); - //! This function returns the identity matrix with a given number of rows and columns. - /** - \param n is the desired number of rows and columns - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& identity(long n); - //! This function returns a truncated identity matrix with specified numbers of rows and columns. - /** - \param n is the desired number of rows - \param m is the desired number of columns - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& identity(long n, long m); - //! This function returns the identity matrix with a given number of rows and columns. - /** - \param n is the desired number of rows and columns - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& eye(long n); - //! This function returns a truncated identity matrix with specified numbers of rows and columns. - /** - \param n is the desired number of rows - \param m is the desired number of columns - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& eye(long n,long m); - //! This function returns a matrix full of zeros with specified numbers of rows and columns. - /** - \param n is the desired number of rows - \param m is the desired number of columns - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& zeros(long n, long m); - //! This function returns a matrix full of ones with specified numbers of rows and columns. - /** - \param n is the desired number of rows - \param m is the desired number of columns - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& ones(long n, long m); - //! This function returns the exponential matrix of a given square matrix - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& expm(const DMatrix& A); - //! This function returns a matrix with the sine of each element of the input matrix. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& sin(const DMatrix& A); - //! This function returns a matrix with the cosine of each element of the input matrix. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& cos(const DMatrix& A); - //! This function returns a matrix with the tangent of each element of the input matrix. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& tan(const DMatrix& A); - //! This function returns a matrix with the natural exponential of each element of the input matrix. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& exp(const DMatrix& A); - //! This function returns a matrix with the hyperbolic sine of each element of the input matrix. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& sinh(const DMatrix& A); - //! This function returns a matrix with the hyperbolic cosine of each element of the input matrix. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& cosh(const DMatrix& A); - //! This function returns a matrix with the hyperbolic tangent of each element of the input matrix. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& tanh(const DMatrix& A); - //! This function returns a matrix with the natural logarithm of each element of the input matrix. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& log(const DMatrix& A); - //! if A is a matrix this function extracts a column vector with the diagonal values of A. If A is a vector this function returns a matrix having the elements of A in the diagonal - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& diag( const DMatrix& A ); - //! This function returns the product of the first matrix transposed times the second matrix. The number of rows of both matrices must be the same, otherwise an error is thrown. - /** - \param A is a DMatrix object - \param B is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& TProduct(const DMatrix& A,const DMatrix& B); - //! This function returns the product of the first matrix times the second matrix transposed. The number of columns of both matrices must be the same, otherwise an error is thrown. - /** - \param A is a DMatrix object - \param B is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& ProductT(const DMatrix& A,const DMatrix& B); - //! This function returns the product of the first matrix transposed times the second matrix transposed. The number of rows of the first matrix must be the same as the number of columns of the second matrix, otherwise an error is thrown. - /** - \param A is a DMatrix object - \param B is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& TProductT(const DMatrix& A,const DMatrix& B); - //! This function calculates the product of two matrices. The number of columns of the first matrix must be the same as the number of rows of the second matrix, otherwise an error is thrown. - /** - \param A is a DMatrix object - \param B is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& Product(const DMatrix& A,const DMatrix& B); - //! Solves the system of equations \f$ A x = b \f$ using LU factorisation. - /** - \param A is a DMatrix object - \param b is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation (the resulting vector x) - \sa LUFSolve(), LU() - */ - friend DMatrix& LUSolve(const DMatrix& A ,const DMatrix& b ); - //! Solves the system of equations \f$ A x = b \f$ using LU factorisation using a previously found LU factors. - /** - \param ALU is a DMatrix object resulting from a previous call to the LU() function - \param b is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation (the resulting vector x) - \sa LU(), LUSolve() - */ - friend DMatrix& LUFSolve(const DMatrix& ALU ,const DMatrix& b ); - //! Solves the system of equations \f$ A x = b \f$ using Cholesky factorisation. - /** - \param A is a DMatrix object - \param b is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation (the resulting vector x) - \sa CholFSolve(), Chol() - */ - friend DMatrix& CholSolve( const DMatrix& A, const DMatrix &b ); - //! Solves the system of equations \f$ A x = b \f$ using Cholesky factorisation. The function uses a previously found Cholesky factorisation. - /** - \param Achol is a DMatrix object resulting from a previous call to Chol(). - \param b is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation (the resulting vector x) - \sa CholFSolve(), Chol() - */ - friend DMatrix& CholFSolve( const DMatrix& Achol, const DMatrix &b ); - //! Returns the Cholesky factorisation of a matrix A, which must be a positive definite symmetric matrix. - /** - \param A is a DMatrix object· - \return Reference to a temporary DMatrix object with the result of the operation - \sa CholFSolve(), CholSolve() - */ - friend DMatrix& Chol( const DMatrix& A ); - //! Returns the Cholesky root R of a given matrix A, such that A=R'R. A must be a positive definite symmetric matrix. - /** - \param A is a DMatrix object· - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& CholeskyRoot(const DMatrix& A ); - //! Solves the system of equations \f$ A x = b \f$ using QR factorisation. The number of rows of matrix A must be greater or equal than the number of columns. - /** - \param A is a DMatrix object. - \param b is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation (the resulting vector x) - \sa QRFSolve(), QR() - */ - friend DMatrix& QRSolve( const DMatrix& A, const DMatrix &b ); - //! Solves the system of equations \f$ A x = b \f$ using QR factorisation. The function uses a previously found QR factorisation. - /** - \param A is a DMatrix object. - \param b is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation (the resulting vector x) - \sa QRSolve(), QR() - */ - friend DMatrix& QRFSolve( const DMatrix& A, const DMatrix &b ); - //! Returns the QR factorisation of a matrix A. The number of rows of matrix A must be greater or equal than the number of columns. - /** - \param A is a DMatrix object· - \return Reference to a temporary DMatrix object with the result of the operation - \sa QRFSolve(), QRSolve() - */ - friend DMatrix& QR( const DMatrix& A ); - - //! This function solves overdetermined or underdetermined real linear systems \f$ A x = B \f$ using a QR or LQ factorization of A. It is assumed that matrix A has full rank. The function uses the LAPACK routine dgels. - /** - \param A is a DMatrix object - \param B is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation (the resulting vector x) - */ - friend DMatrix& LSMNSolve( const DMatrix& A, const DMatrix& B ); - - //! Returns the LQ factorisation of a matrix A. The function uses the LAPACK routine dgelqf_(). - /** - \param A is a DMatrix object· - \param Q is a pointer to a DMatrix object, which is modified on output to contain the Q factor of the decomposition. - \return Reference to a temporary DMatrix object with the L factor of the decomposition. - */ - friend DMatrix& LQ( const DMatrix& A, DMatrix* Q ); - //! Returns the LU factorisation of a matrix A. - /** - \param A is a DMatrix object· - \return Reference to a temporary DMatrix object with the result of the operation - \sa LUFSolve(), LUSolve() - */ - friend DMatrix& LU( const DMatrix& A ); - //! Returns the singular value decomposition of a matrix \f$ A = U' diag(s) V \f$, where vector s contains the singular values of A. The function uses the LAPACK routine dgesvd_(). - /** - \param A is a DMatrix object· - \param U is a pointer to a DMatrix object, which is modified on output to contain the U factor of the decomposition. - \param V is a pointer to a DMatrix object, which is modified on output to contain the V factor of the decomposition. - \return Reference to a temporary DMatrix object with a vector that contains the singular values of matrix A. - */ - friend DMatrix& SVD( const DMatrix& A); - friend DMatrix& SVD( const DMatrix& A, DMatrix* U, DMatrix* V ); - //! This function returns Q, the orthonormal basis for the range of a matrix A, such that \f$ Q Q' = I \f$. The number of columns of Q is the rank of A. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& orth( const DMatrix& A ); - //! This function returns Z, the orthonormal basis for the null space of a matrix A, such that \f$ Z Z' = I \f$ and \f$ A Z=0 \f$. The number of columns of Z is the nullity of A. - /** - \param A is a DMatrix object - \return Reference to a temporary DMatrix object with the result of the operation - */ - friend DMatrix& null( const DMatrix& A ); - //! This function uses the LAPACK routine dgelss_() to compute the minimum norm solution to a real linear least squares problem: Minimize \f$ || B - A x ||_2 \f$ using the singular value decomposition (SVD) of A. A is a rectangular matrix which may be rank-deficient. - /** - \param A is a DMatrix object. - \param B is a DMatrix object. - \return Reference to a temporary DMatrix object with the result of the operation (the resulting vector x) - \sa SVD() - */ - friend DMatrix& SVDSolve( const DMatrix& A, const DMatrix& B ); - //! This function computes and returns the Schur decomposition of a matrix A, such that \f$ A=Q'U Q \f$, where U is an upper triangular matrix and Q is a unitary matrix. This function uses the LAPACK routine dgees_() - /** - \param A is a DMatrix object. - \param U is a pointer to a DMatrix object. - \return Reference to a temporary DMatrix object with the unitary matrix Q. - */ - friend DMatrix& schur(const DMatrix& A); - friend DMatrix& schur(const DMatrix& A, DMatrix* U ); - //! This function computes the eigenvalues and (optionally) the eigenvectors of a matrix A. This function uses the LAPACK routines dsyev_() and dgeev_. - /** - \param A is a DMatrix object. - \param V is a pointer to a DMatrix object. - \return Reference to a temporary DMatrix object with the real part of the eigenvalues in the first column and the complex part of the eigenvalues in the second column. - */ - friend DMatrix& eig(const DMatrix& A); - friend DMatrix& eig(const DMatrix& A, DMatrix* V ); - //! This function computes and return the Euclidean norm of a matrix A, which is the square root of the sum of its squared elements. - /** - \param A is a DMatrix object. - \return the value of the Euclidean norm. - */ - friend double enorm(const DMatrix& A); - //! This function computes 2-norm of matrix A, which is computed as the maximum singular value of A. - /** - \param A is a DMatrix object. - \return the value of the 2-norm - */ - friend double norm(const DMatrix& A); - //! This function computes infinity norm of matrix A, which is computed as the maximum absolute value row sum. - /** - \param A is a DMatrix object. - \return the value of the infinity norm - */ - friend double InfNorm(const DMatrix& A); - //! This function computes Frobenius norm of matrix A. - /** - \param A is a DMatrix object. - \return the value of the Frobenius norm - */ - friend double Fnorm( const DMatrix& A); - //! This function computes and returns the element-wise absolute value of matrix A. - /** - \param A is a DMatrix object. - \return a reference to a temporary DMatrix object with the result of the operation. - */ - friend DMatrix& Abs(const DMatrix& A); - //! This function finds and returns the element of matrix A with maximum value. It also returns the indices of such element. If more than one element has the same maximum value, the indices of the first element found when searching column by column is returned. - /** - \param A is a DMatrix object. - \param rindx is an optional pointer to an integer which is modified with the row index. - \param cindx is an optional pointer to an integer which is modified with the column index. - \return the value of the element with maximum value. - */ - friend double Max(const DMatrix& A); - friend double Max(const DMatrix& A,int* rindx); - friend double Max(const DMatrix& A,int* rindx, int* cindx); - //! This function finds and returns the element of matrix A with maximum absolute value. It also returns the indices of such element. If more than one element has the same maximum absolute value, the indices of the first element found when searching column by column is returned. - /** - \param A is a DMatrix object. - \param rindx is a pointer to an integer which is modified with the row index. - \param cindx is a pointer to an integer which is modified with the column index. - \return the absolute value of the element with maximum absolute value. - */ - friend double MaxAbs(const DMatrix& A); - friend double MaxAbs(const DMatrix& A, int* rindx, int* cindx); - //! This function finds and returns the element of matrix A with minimum value. It also returns the indices of such element. If more than one element has the same minimum value, the indices of the first element found when searching column by column is returned. - /** - \param A is a DMatrix object. - \param rindx is a pointer to an integer which is modified with the row index. - \param cindx is a pointer to an integer which is modified with the column index. - \return the absolute value of the element with minimum absolute value. - */ - friend double Min(const DMatrix& A); - friend double Min(const DMatrix& A, int* rindx, int* cindx ); - //! This function finds and returns the element of matrix A with minimum absolute value. It also returns the indices of such element. If more than one element has the same minimum absolute value, the indices of the first element found when searching column by column is returned. - /** - \param A is a DMatrix object. - \param rindx is a pointer to an integer which is modified with the row index. - \param cindx is a pointer to an integer which is modified with the column index. - \return the absolute value of the element with minimum absolute value. - */ - friend double MinAbs(const DMatrix& A); - friend double MinAbs(const DMatrix& A, int* rindx, int* cindx); - //! This function sorts the input vector x in ascending order. Optionally, it also returns an integer array of sorted indices. If the input object is not a vector, then an error is thrown. - /** - \param x is a DMatrix object which upon input contains the unsorted vector and upon output contains the sorted vector. - \param indx is a pointer to the first element of the array of sorted indices. - \return void - */ - friend void sort( DMatrix& x); - friend void sort( DMatrix& x, int indx[]); - //! This function sorts the input vector x in ascending order. It also returns a DMatrix object with the sorted indices. If the input object is not a vector, then an error is thrown. - /** - \param x is a DMatrix object which upon input contains the unsorted vector and upon output contains the sorted vector. - \param indx is a DMatrix object which upon output contains the values of the sorted indices. - \return void - */ - friend void sort( DMatrix& x, DMatrix& indx); - //! This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown. - /** - \param x is a DMatrix object. - \param y is a DMatrix object - \return the value of the dot product of x and y. - */ - friend double dotProduct( const DMatrix& x, const DMatrix& y ); - //! This function computes the dot product of two vectors. If any of the input arguments does not contain a vector, or if the vector lengths are not equal, an error is thrown. - /** - \param x is a DMatrix object. - \param y is a DMatrix object - \return the value of the dot product of x and y. - */ - friend double dot(const DMatrix& x, const DMatrix& y) { return dotProduct(x,y); } - //! This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown. - /** - \param x is a DMatrix object. - \param y is a DMatrix object - \return the value of the cross product of x and y. - */ - friend DMatrix& crossProduct(const DMatrix& x, const DMatrix& y); - //! This function computes the cross product of two vectors. If any of the input arguments does not contain a vector, or if the length of any of the vectors is not 3, an error is thrown. - /** - \param x is a DMatrix object. - \param y is a DMatrix object - \return the value of the cross product of x and y. - */ - friend DMatrix& cross(const DMatrix& x, const DMatrix& y) { return crossProduct(x,y); } - //! This function checks if the input matrix is symmetric. If the input matrix is not square, an error is thrown. - /** - \param A is a DMatrix object. - \return 1 if the input matrix is symmetric, 0 otherwise. - */ - friend int isSymmetric( const DMatrix& A ); - //! This function calculates the 2-norm condition number of a matrix, which is the ratio of the maximum singular value to the minimum singular value of the matrix. A large condition number indicates a nearly singular matrix. If the input matrix is not square, an error is thrown. - /** - \param A is a DMatrix object. - \return the 2-norm condition number - */ - friend double cond( const DMatrix& A ); - //! This function estimates the 1-norm reciprocal condition number of a matrix. The function uses the LAPACK function dgecon. if A is well conditioned, then rcond(A) is near 1. If A is badly conditioned, then rcond(A) is close to the machine numerical precision (very small). If the input matrix is not square, an error is thrown. - /** - \param A is a DMatrix object. - \return the reciprocal condition number estimate - */ - friend double rcond( const DMatrix& A ); - //! This function returns an estimate of the rank of a matrix, which is the number of linearly independent rows or columns. - /** - \param A is a DMatrix object. - \return the rank estimate. - */ - friend int rank_matrix( const DMatrix& A ); - //! This function returns the determinant of a square matrix. If the input matrix is not square, an error is thrown. - /** - \param A is a DMatrix object. - \return the determinant of the matrix. - */ - friend double det( const DMatrix& A ); - //! This function returns the trace of a square matrix. If the input matrix is not square, an error is thrown. - /** - \param A is a DMatrix object. - \return the trace of the matrix. - */ - friend double trace( const DMatrix& A ); - //! This function returns a row vector with the mean values of the columns of matrix A. - /** - \param A is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& mean( const DMatrix& A ); - //! This function returns a row vector with the standard deviation of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-1), where n is the number of rows of A. Otherwise, the result is normalised with n. - /** - \param A is a DMatrix object. - \param ntype is the type of normalization, 0 (default) or 1. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& Std( const DMatrix& A); - friend DMatrix& Std( const DMatrix& A, int ntype); - //! Computes the covariance matrix of a data matrix where the N rows correspond to samples and the M columns are variables. The result is returned as an M x M matrix. If ntype=0 (default) then the result is normalised with N-1. Otherwise, if ntype=1, the result is normalised with N. - /** - \param A is a DMatrix object. - \param ntype is the type of normalization, 0 (default) or 1. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& cov( const DMatrix& A); - friend DMatrix& cov( const DMatrix& A, int ntype); - //! Computes the covariance matrix of two vectors X and Y of dimension N. The result is returned as an 1 x 1 DMatrix object. If ntype=0 (default) then the result is normalised with N-1. Otherwise, if ntype=1, the result is normalised with N. - /** - \param X is a DMatrix object. - \param Y is a DMatrix object - \param ntype is the type of normalization, 0 (default) or 1. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& cov(DMatrix& X, DMatrix& Y); - friend DMatrix& cov(DMatrix& X, DMatrix& Y, int ntype ); - //! This function returns a row vector with the variance of each column of matrix A. If ntype is 0 (default) the result is normalised with (n-1), where n is the number of rows of A. Otherwise, the result is normalised with n. - /** - \param A is a DMatrix object. - \param ntype is the type of normalization, 0 (default) or 1. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& var(DMatrix& A); - friend DMatrix& var(DMatrix& A, int ntype); - //! This function returns a row vector with the sum of the elements of each column of matrix A. - /** - \param A is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& sum( const DMatrix& A ); - //! This function returns a row vector with the product of the elements of each column of matrix A. - /** - \param A is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& prod( const DMatrix& A ); - //! This function computes and returns the element-wise product of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. - /** - \param A is a DMatrix object. - \param B is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& elemProduct( const DMatrix& A, const DMatrix& B ); - //! This function computes and returns the element-wise division of two matrices of the same dimensions. If the dimensions of the two input matrices are not the same, an error is thrown. The dimensions of the returned object are the same as the dimensions of the factors. - /** - \param A is a DMatrix object. - \param B is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& elemDivision( const DMatrix& A, const DMatrix& B); - //! This function computes and returns the Kronecker product of two matrices. The row (column) dimension of the returned object is the product of the row (column) dimensions of both factors. - /** - \param A is a DMatrix object. - \param B is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& kronProduct( const DMatrix& A, const DMatrix& B ); - //! This function returns a column vector made by stacking the columns of a matrix one below the other from left to right. - /** - \param A is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& vec( const DMatrix& A ); - //! This function returns a DMatrix object with the same dimensions as the input matrix such that each of its elements is 1 is the corresponding value of the input matrix is positive, -1 if the corresponding value of the input matrix is negative, and 0 if the corresponding value of the input matrix is 0. - /** - \param A is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& MatrixSign( const DMatrix& A ); - //! This function returns a column vector with the linear indices of the non-zero elements of the input matrix A. The linear index is 1 for element (1,1) of the input matrix A, and length(A) for the (nrows,ncols) element of the input matrix A. - /** - \param A is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& find(const DMatrix& A); - //! This function returns an nxm matrix where each element is a uniform pseudo-random number in the range (0,1). - /** - \param n is the desired number of rows of the returned matrix - \param m is the desired number of columns of the returned matrix - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& randu(long n, long m); - //! This function returns an nxm matrix where each element is a Gaussian pseudo-random number in the range with zero mean and variance 1. - /** - \param n is the desired number of rows of the returned matrix - \param m is the desired number of columns of the returned matrix - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& randn(long n, long m); - //! This function returns a linearly spaced vector with N points between the values X1 and X2. - /** - \param X1 is a real number - \param X2 is a real number - \param N is the desired length of the returned vector - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& linspace(double X1, double X2, long N); - //! This function returns the machine numerical precision - static double GetEPS() { return MC_EPSILON ; } - - //! This function prints an error message and throws an exception to be handled by the ErrorHandler class. - /** - \param input_text is the error message - \return void - */ - friend void error_message(const char *input_text); - //! This function, which is to be used in conjunction with function toc(), starts counting elapsed CPU time. - friend void tic(void); - //! This function, which is to be used in conjunction with function tic(), stops counting CPU time, and it prints and returns the elapsed time in seconds since the function tic() was called. - /** - \return the elapsed time in seconds. - */ - friend double toc(); - -#ifdef MATLAB_MEX_FILE - friend void mxArray2DMatrix( DMatrix& A, mxArray* mx ); - - friend void DMatrix2mxArray( char* Name, mxArray* mx, DMatrix& A ); - -#endif - //! This function computes the square root of each element of the input matrix A, and it returns a DMatrix object with the same dimensions as the input matrix. If any element of the input matrix is negative, an error is thrown. - /** - \param A is a DMatrix object. - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& Sqrt(const DMatrix& A); - //! This function extracts and return the triangular upper part of the input matrix A. The returned object has the same dimensions as the input object. - /** - \param A is a DMatrix object - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& triu(const DMatrix& A); - //! This function returns the N-by-M matrix whose elements are taken columnwise from the input matrix A. An error is thrown if A does not have N*M elements. - /** - \param A is a DMatrix object - \param N is the desired number of rows of the reshaped matrix - \param M is the desired number of columns of the reshaped matrix - \return a temporary DMatrix object with the result of the operation - */ - friend DMatrix& reshape(DMatrix& A, long N, long M); - //! This function returns the number of elements of a matrix A. - /** - \param A is a DMatrix object - \return the number of elements of the input matrix. - */ - friend long length(const DMatrix& A); - -}; - - -//! InitializeDMatrixClass class -/** - This is a dummy C++ class intended to initialise the temporary objects of the DMatrix class. -*/ - -class InitializeDMatrixClass{ - - public: - //! This is the default constructor which calls the function DMatrix::AllocateAuxArr(). - InitializeDMatrixClass() { DMatrix::AllocateAuxArr(); } - //! This is the destructor which calls the function DMatrix::DeAllocateAuxArr(). - ~InitializeDMatrixClass() { DMatrix::DeAllocateAuxArr(); } - -}; - - - -/* inline utility functions and prototypes */ -// Swap double -inline void Swap(double *x,double *y) -{double temp = *x; *x = *y; *y = temp;} -// Swap int -inline void Swap(int *x,int *y) -{int temp = *x; *x = *y; *y = temp;} -double MachEps(void); -double ArrayNorm( long n, double* x ); -double factorial(long j); -/* Declaration of all friend functions of DMatrix class */ -void CholeskyDecomp(DMatrix& a, int n, DMatrix& pM); -void CholeskySolution(const DMatrix& a, int n, const DMatrix& pM, - const DMatrix& bM, DMatrix& xM); -void Hessemberg(DMatrix& a ); -DMatrix& operator- (const DMatrix& A); -DMatrix& colon( double i1, double increment, double i2 ); -DMatrix& colon( int i1, int increment, int i2); -DMatrix& colon( int i1, int i2 ); -DMatrix& colon( double i1, double i2); -DMatrix& colon( void ); -int any( const DMatrix& val ); -DMatrix& mpow( DMatrix& A, int p ); -DMatrix& operator *(double Arg, const DMatrix& A); -DMatrix& tra(const DMatrix& A); -DMatrix& inv(const DMatrix& A); -DMatrix& pinv(const DMatrix& A); -DMatrix& identity(long n); -DMatrix& identity(long n, long m); -DMatrix& eye(long n); -DMatrix& eye(long n,long m); -DMatrix& zeros(long n, long m); -DMatrix& ones(long n, long m); -DMatrix& expm(const DMatrix& A); -DMatrix& sin(const DMatrix& A); -DMatrix& cos(const DMatrix& A); -DMatrix& tan(const DMatrix& A); -DMatrix& exp(const DMatrix& A); -DMatrix& log(const DMatrix& A); -DMatrix& diag( const DMatrix& A ); -DMatrix& TProduct(const DMatrix& A,const DMatrix& B); -DMatrix& ProductT(const DMatrix& A,const DMatrix& B); -DMatrix& TProductT(const DMatrix& A,const DMatrix& B); -DMatrix& Product(const DMatrix& A,const DMatrix& B); -DMatrix& LUSolve(const DMatrix& A ,const DMatrix& b ); -DMatrix& LUFSolve(const DMatrix& ALU ,const DMatrix& b ); -DMatrix& CholSolve( const DMatrix& A, const DMatrix &b ); -DMatrix& CholFSolve( const DMatrix& Achol, const DMatrix &b ); -DMatrix& Chol( const DMatrix& A ); -DMatrix& CholeskyRoot(const DMatrix& A ); -DMatrix& QRSolve( const DMatrix& A, const DMatrix &b ); -DMatrix& QRFSolve( const DMatrix& A, const DMatrix &b ); -DMatrix& QR( const DMatrix& A ); -DMatrix& LQ( const DMatrix& A, DMatrix* Q ); -DMatrix& LU( const DMatrix& A ); -DMatrix& SVD( const DMatrix& A, DMatrix* U, DMatrix* V ); -DMatrix& orth( const DMatrix& A ); -DMatrix& null( const DMatrix& A ); -DMatrix& SVDSolve( const DMatrix& A, const DMatrix& B ); -DMatrix& schur(const DMatrix& A, DMatrix* U ); -DMatrix& eig(const DMatrix& A, DMatrix* V ); -double enorm(const DMatrix& A); -double norm(const DMatrix& A); -DMatrix& Abs(const DMatrix& A); -double Max(const DMatrix& A,int* rindx, int* cindx); -double MaxAbs(const DMatrix& A, int* rindx, int* cindx); -double Min(const DMatrix& A, int* rindx, int* cindx ); -double MinAbs(const DMatrix& A, int* rindx, int* cindx); -void sort( DMatrix& A, int indx[]); -void sort( DMatrix& A, DMatrix& indx); -double InfNorm(const DMatrix& A); -double Fnorm( const DMatrix& A); -double dotProduct( const DMatrix& A, const DMatrix& B ); -int isSymmetric( const DMatrix& A ); -double cond( const DMatrix& A ); -double rcond( const DMatrix& A ); -int rank_matrix(const DMatrix& A ); -double det( const DMatrix& A ); -double trace( const DMatrix& A ); -DMatrix& mean( const DMatrix& A ); -DMatrix& Std( const DMatrix& A, int ntype ); -DMatrix& cov( const DMatrix& A, int ntype ); -DMatrix& cov(DMatrix& X, DMatrix& Y, int ntype ); -DMatrix& var(DMatrix& A, int ntype); -DMatrix& sum( const DMatrix& A ); -DMatrix& prod( const DMatrix& A ); -DMatrix& elemProduct( const DMatrix& A, const DMatrix& B ); -DMatrix& elemDivision( const DMatrix& A, const DMatrix& B); -DMatrix& kronProduct( const DMatrix& A, const DMatrix& B ); -DMatrix& vec( const DMatrix& A ); -DMatrix& MatrixSign( const DMatrix& A ); -DMatrix& find(const DMatrix& A); -DMatrix& randu(long n, long m); -DMatrix& randn(long n, long m); -DMatrix& linspace(double X1, double X2, long N); -DMatrix& LSMNSolve( const DMatrix& A, const DMatrix& B ); -void error_message(const char *input_text); -void tic(void); -double toc(); -#ifdef MATLAB_MEX_FILE -void mxArray2DMatrix( DMatrix& A, mxArray* mx ); -void DMatrix2mxArray( const char* Name, mxArray* mx, DMatrix& A ); -#endif -DMatrix& Sqrt(const DMatrix& A); -DMatrix& triu(const DMatrix& A); -DMatrix& reshape(DMatrix& A, long nn, long mm); -long length(const DMatrix& A); -void* my_calloc(size_t num, size_t size ); - - -// =========================================================== - - - -#ifdef LAPACK - - - -extern "C" { - -#include "f2c.h" - -/* CLAPACK real matrix eigenvalues routine */ -int dgeev_(char *jobvl, char *jobvr, integer *n, doublereal * - a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, - integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, - integer *lwork, integer *info); - -/* CLAPACK symmetric real matrix eigenvalues routine */ -int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, - integer *lda, doublereal *w, doublereal *work, integer *lwork, - integer *info); - -/* CLAPACK real matrix singular value decomposition routine */ -int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, - doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * - ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, - integer *info); - -/* CLAPACK real matrix schur decomposition routine */ -int dgees_(char *jobvs, char *sort, L_fp select, integer *n, - doublereal *a, integer *lda, integer *sdim, doublereal *wr, - doublereal *wi, doublereal *vs, integer *ldvs, doublereal *work, - integer *lwork, logical *bwork, integer *info); - -/* CLAPACK rectangular linear system solution routine */ -int dgels_(char *trans, integer *m, integer *n, integer * - nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, - doublereal *work, integer *lwork, integer *info); - -/* CLAPACK reciprocal condition number estimator */ -int dgecon_(char *norm, integer *n, doublereal *a, integer * - lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * - iwork, integer *info); - -/* CLAPACK LU factorization routine */ -int dgetrf_(integer *m, integer *n, doublereal *a, integer * - lda, integer *ipiv, integer *info); - -/* CLAPACK Minimum norm solution by using singular value decomp */ -int dgelss_(integer *m, integer *n, integer *nrhs, - doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * - s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, - integer *info); - - /* CLAPACK LQ factorization routine */ - -int dgelqf_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); - - - - -} /* End of extern "C" block */ - -#endif /* LAPACK */ - - -// =========================================================== - - - -#endif /* DMATRIX_H */ - - - diff --git a/dmatrix/include/f2c.h b/dmatrix/include/f2c.h deleted file mode 100755 index b94ee7c8..00000000 --- a/dmatrix/include/f2c.h +++ /dev/null @@ -1,223 +0,0 @@ -/* f2c.h -- Standard Fortran to C header file */ - -/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." - - - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ - -#ifndef F2C_INCLUDE -#define F2C_INCLUDE - -typedef long int integer; -typedef unsigned long int uinteger; -typedef char *address; -typedef short int shortint; -typedef float real; -typedef double doublereal; -typedef struct { real r, i; } complex; -typedef struct { doublereal r, i; } doublecomplex; -typedef long int logical; -typedef short int shortlogical; -typedef char logical1; -typedef char integer1; -#ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ -typedef long long longint; /* system-dependent */ -typedef unsigned long long ulongint; /* system-dependent */ -#define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) -#define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) -#endif - -#define TRUE_ (1) -#define FALSE_ (0) - -/* Extern is for use with -E */ -#ifndef Extern -#define Extern extern -#endif - -/* I/O stuff */ - -#ifdef f2c_i2 -/* for -i2 */ -typedef short flag; -typedef short ftnlen; -typedef short ftnint; -#else -typedef long int flag; -typedef long int ftnlen; -typedef long int ftnint; -#endif - -/*external read, write*/ -typedef struct -{ flag cierr; - ftnint ciunit; - flag ciend; - char *cifmt; - ftnint cirec; -} cilist; - -/*internal read, write*/ -typedef struct -{ flag icierr; - char *iciunit; - flag iciend; - char *icifmt; - ftnint icirlen; - ftnint icirnum; -} icilist; - -/*open*/ -typedef struct -{ flag oerr; - ftnint ounit; - char *ofnm; - ftnlen ofnmlen; - char *osta; - char *oacc; - char *ofm; - ftnint orl; - char *oblnk; -} olist; - -/*close*/ -typedef struct -{ flag cerr; - ftnint cunit; - char *csta; -} cllist; - -/*rewind, backspace, endfile*/ -typedef struct -{ flag aerr; - ftnint aunit; -} alist; - -/* inquire */ -typedef struct -{ flag inerr; - ftnint inunit; - char *infile; - ftnlen infilen; - ftnint *inex; /*parameters in standard's order*/ - ftnint *inopen; - ftnint *innum; - ftnint *innamed; - char *inname; - ftnlen innamlen; - char *inacc; - ftnlen inacclen; - char *inseq; - ftnlen inseqlen; - char *indir; - ftnlen indirlen; - char *infmt; - ftnlen infmtlen; - char *inform; - ftnint informlen; - char *inunf; - ftnlen inunflen; - ftnint *inrecl; - ftnint *innrec; - char *inblank; - ftnlen inblanklen; -} inlist; - -#define VOID void - -union Multitype { /* for multiple entry points */ - integer1 g; - shortint h; - integer i; - /* longint j; */ - real r; - doublereal d; - complex c; - doublecomplex z; - }; - -typedef union Multitype Multitype; - -/*typedef long int Long;*/ /* No longer used; formerly in Namelist */ - -struct Vardesc { /* for Namelist */ - char *name; - char *addr; - ftnlen *dims; - int type; - }; -typedef struct Vardesc Vardesc; - -struct Namelist { - char *name; - Vardesc **vars; - int nvars; - }; -typedef struct Namelist Namelist; - -#define abs(x) ((x) >= 0 ? (x) : -(x)) -#define dabs(x) (doublereal)abs(x) -#define min(a,b) ((a) <= (b) ? (a) : (b)) -#define max(a,b) ((a) >= (b) ? (a) : (b)) -#define dmin(a,b) (doublereal)min(a,b) -#define dmax(a,b) (doublereal)max(a,b) -#define bit_test(a,b) ((a) >> (b) & 1) -#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) -#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) - -/* procedure parameter types for -A and -C++ */ - -#define F2C_proc_par_types 1 -#ifdef __cplusplus -typedef int /* Unknown procedure type */ (*U_fp)(...); -typedef shortint (*J_fp)(...); -typedef integer (*I_fp)(...); -typedef real (*R_fp)(...); -typedef doublereal (*D_fp)(...), (*E_fp)(...); -typedef /* Complex */ VOID (*C_fp)(...); -typedef /* Double Complex */ VOID (*Z_fp)(...); -typedef logical (*L_fp)(...); -typedef shortlogical (*K_fp)(...); -typedef /* Character */ VOID (*H_fp)(...); -typedef /* Subroutine */ int (*S_fp)(...); -#else -typedef int /* Unknown procedure type */ (*U_fp)(); -typedef shortint (*J_fp)(); -typedef integer (*I_fp)(); -typedef real (*R_fp)(); -typedef doublereal (*D_fp)(), (*E_fp)(); -typedef /* Complex */ VOID (*C_fp)(); -typedef /* Double Complex */ VOID (*Z_fp)(); -typedef logical (*L_fp)(); -typedef shortlogical (*K_fp)(); -typedef /* Character */ VOID (*H_fp)(); -typedef /* Subroutine */ int (*S_fp)(); -#endif -/* E_fp is for real functions when -R is not specified */ -typedef VOID C_f; /* complex function */ -typedef VOID H_f; /* character function */ -typedef VOID Z_f; /* double complex function */ -typedef doublereal E_f; /* real function with -R not specified */ - -/* undef any lower-case symbols that your C compiler predefines, e.g.: */ - -#ifndef Skip_f2c_Undefs -#undef cray -#undef gcos -#undef mc68010 -#undef mc68020 -#undef mips -#undef pdp11 -#undef sgi -#undef sparc -#undef sun -#undef sun2 -#undef sun3 -#undef sun4 -#undef u370 -#undef u3b -#undef u3b2 -#undef u3b5 -#undef unix -#undef vax -#endif -#endif diff --git a/dmatrix/include/helper.h b/dmatrix/include/helper.h deleted file mode 100644 index 1f398a0c..00000000 --- a/dmatrix/include/helper.h +++ /dev/null @@ -1,67 +0,0 @@ -// -// helper.h -// dmatrix -// -// Created by Philipp Waxweiler on 22.07.20. -// - -#ifndef helper_h -#define helper_h - -#ifndef MAX -#define MAX(a, b) ( (a)>(b)? (a):(b) ) -#endif -#ifndef MIN -#define MIN(a, b) ( (a)<(b)? (a):(b) ) -#endif - -#ifdef MATLAB_MEX_FILE - -#define ERROR_MESSAGE error_message - -#define PRINTF mexPrintf - - -#else - -#define ERROR_MESSAGE error_message - -#define PRINTF printf - -#endif - -//! ErrorHandler class -/** - This is a C++ class intended to handle error conditions. -*/ -class ErrorHandler -{ - public: - //! A string of characters which contains the error message - string error_message; - //! A constructor which takes the error message as an argument and assigns it to error_message - /** - \param m is the error message string. - \sa function error_message(). - */ - ErrorHandler(const string m); -}; - -inline long ChkTmpIndx( long taindx ) -{ - if ( taindx >= N_TEMP_OBJECTS ) - - ERROR_MESSAGE(" Temporary arrays error: Increase N_TEMP_OBJECTS"); - -#ifdef DEBUG_TEMPS - - printf("\n Temp Created --> indx: %d", taindx ); - -#endif - - return taindx; -} - - - -#endif /* helper_h */ diff --git a/dmatrix/lib/Makefile b/dmatrix/lib/Makefile deleted file mode 100644 index 68e5926c..00000000 --- a/dmatrix/lib/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -#Usage: make -#add ../lib to LD_LIBRARY_PATH - -SHELL = /bin/sh - - - -F2CINC = $(F2CINCLUDE) -F2CLIB = $(F2CLIBRARY) - -DMATRIXDIR=../../dmatrix -CPPEXAMPLESDIR = $(SNOPTDIR)/cppexamples -CXSPARSE=../../SuiteSparse/CXSparse -LUSOL=../../lusol/csrc - - -# Directory with header files -IPOPTINCDIR = ${prefix}/include/coin -# Directory with libipopt.a -IPOPTLIBDIR = ${exec_prefix}/lib -exec_prefix = ${prefix} - - -PSOPTSRCDIR = ../src - - -CXX = /usr/bin/g++ -CC = /usr/bin/gcc -CXXFLAGS = -O0 -g -Wno-long-long -I$(SNOPTDIR)/cppsrc -I$(DMATRIXDIR)/include -I$(SNOPTDIR)/cppexamples -I$(PSOPTSRCDIR) -DLAPACK -DUNIX -DSPARSE_MATRIX -DUSE_SNOPT -DUSE_IPOPT -I$(CXSPARSE)/Include -I$(LUSOL) -I$(CXSPARSE)/../SuiteSparse_config -I$(IPOPTINCDIR) -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wimplicit -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -fPIC -DHAVE_MALLOC - -CFLAGS = -O0 -fPIC - - -DMATRIXLIB = libdmatrix.a - -$(DMATRIXLIB): $(DMATRIXLIB)($(DMATRIXDIR)/src/dmatrixv.o) - - -$(DMATRIXDIR)/src/%.o : $(DMATRIXDIR)/src/%.cxx $(DMATRIXDIR)/include/%.h - $(CXX) -c $(CXXFLAGS) $< -o $@ - - -clean: - - (rm -f *.o;rm -f ../src/*.o) - -distclean: - - (rm -f *.a) diff --git a/dmatrix/lib/Makefile.vc b/dmatrix/lib/Makefile.vc deleted file mode 100755 index 2ebd7ff8..00000000 --- a/dmatrix/lib/Makefile.vc +++ /dev/null @@ -1,61 +0,0 @@ -CXX = cl - -CC = cl - -AR = lib - -CFLAGS = -DWIN32 -DLAPACK -DSPARSE_MATRIX -DUSE_IPOPT -DUSE_SNOPT -D_CRT_ERRNO_DEFINED - -BASE = ..\.. - -DMATRIX = $(BASE)\dmatrix - -LUSOL = $(BASE)\lusol\csrc - -CXSPARSE = $(BASE)\CXSparse - -ADOLC = C:\ADOL-C-2.1.12\ADOL-C\src - -IPOPT = C:\Ipopt-3.5.4 - -SNOPT = C:\snopt7 - -include ..\..\MicrosoftVisualStudio.inc - -PSOPT = $(BASE)\PSOPT - -INCLUDE = -I$(PSOPT)\src -I$(DMATRIX)\include -I$(BASE)\CXSparse\Include -I$(LUSOL) -I$(SNOPT)\cppsrc -I$(SNOPT)\cppexamples -I$(IPOPT)\include\coin -I$(IPOPT)\Ipopt\src\Interfaces -I$(IPOPT)\Ipopt\src\Common -I$(IPOPT)\BuildTools\headers -I$(IPOPT)\Ipopt\src\LinAlg -I$(ADOLC) -I$(ADOLC)\drivers -I$(ADOLC)\sparse -I$(VCINCLUDE) -I$(WINDOWS_H) - - -all: libdmatrix.lib - -SRC = $(DMATRIX)\src\dmatrixv.cxx \ - - -OBJ = $(DMATRIX)\src\dmatrixv.obj \ - - -.cxx.obj: - $(CXX) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - -.c.obj: - $(CC) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - - - -$(DMATRIX)\src\dmatrixv.obj: $(DMATRIX)\src\dmatrixv.cxx - $(CXX) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - -libdmatrix.lib: $(OBJ) - $(AR) -out:libdmatrix.lib $(OBJ) - - -clean: - del *.obj - -distclean: clean - del libdmatrix.lib - - - - diff --git a/dmatrix/src/SparseMatrix.cxx b/dmatrix/src/SparseMatrix.cxx deleted file mode 100644 index a9e3c7ba..00000000 --- a/dmatrix/src/SparseMatrix.cxx +++ /dev/null @@ -1,2160 +0,0 @@ -// -// SparseMatrix.cpp -// dmatrix -// -// Created by Philipp Waxweiler on 21.07.20. -// - -#include "SparseMatrix.h" -#include -#include "helper.h" - -// =====================================SPARSE MATRIX CLASS IMPLEMENTATION ============================== - - -SparseMatrix::SparseMatrix(void) -{ -// Default constructor - asize = 0; - a = 0; - n = 0; - m = 0; - nz = 0; - - a = NULL; - RowIndx = NULL; - ColIndx = NULL; -} - - -SparseMatrix::SparseMatrix( int nn, int mm, int nzz) -{ - n = nn; - m = mm; - nz= nzz; - asize = nz; - a = new double[nz]; - RowIndx = new int[nz]; - ColIndx = new int[nz]; - - for(int k=0;kFillWithZeros(); - - for (k=0; k< A.GetNonZero(); k++ ) - { - R->elem( rowA[k], colA[k] ) = Aij[k]; - } - - return (*R); - -} - - -void SparseMatrix::InsertNonZero(int i, int j, double val) -{ - int k; - - double* anew; - int* RowNew; - int* ColNew; - int nznew=nz+1; - int eflag = 0; - - anew = new double[nznew]; - RowNew= new int[nznew]; - ColNew= new int[nznew]; - - for (k=0; k< nz; k++) - { - if (RowIndx[k]==i && ColIndx[k]==j) { - a[k]= val; - eflag = 1; - break; - } - } - - if (!eflag) { - memcpy(anew, a, nz*sizeof(double) ); - memcpy(RowNew, RowIndx, nz*sizeof(int) ); - memcpy(ColNew, ColIndx, nz*sizeof(int) ); - - delete a; - delete RowIndx; - delete ColIndx; - - a = anew; - RowIndx = RowNew; - ColIndx = ColNew; - nz = nznew; - asize = nznew; - - RowIndx[nznew-1] = i; - ColIndx[nznew-1] = j; - a[nznew-1] = val; - } - - // Now resize the matrix if necessary - for (k=0;kn) - n = RowIndx[k]; - if (ColIndx[k]>m) - m = ColIndx[k]; - } - -} - - -// Operators - -SparseMatrix& SparseMatrix::operator += (const SparseMatrix &rval) -{ - int i; - - if ( (this->n != rval.n) || (this->m != rval.m) ) - fprintf(stderr,"\nSparseMatrix::operator += error: matrix dimensions do not agree"); - - for (i=0; ia[i] += rval.a[i]; - else - this->InsertNonZero( rval.RowIndx[i], rval.ColIndx[i], rval.a[i] ); - } - this->Compress(); - return (*this); -} - - -SparseMatrix& SparseMatrix::operator+ (const SparseMatrix& Other_matrix) const -{ - SparseMatrix* Result; - - Result = new SparseMatrix; - - (*Result)=(*this); - - return ((*Result)+=Other_matrix); - -} - -SparseMatrix& SparseMatrix::operator -= (const SparseMatrix &rval) -{ - int i; - - if ( (this->n != rval.n) || (this->m != rval.m) ) - fprintf(stderr,"\nSparseMatrix::operator -= error: matrix dimensions do not agree"); - - for (i=0; ia[i] -= rval.a[i]; - else - this->InsertNonZero( rval.RowIndx[i], rval.ColIndx[i], -rval.a[i] ); - } - this->Compress(); - return (*this); -} - - -SparseMatrix& SparseMatrix::operator- (const SparseMatrix& Other_matrix) const -{ - SparseMatrix* Result; - - Result = new SparseMatrix; - - (*Result)=(*this); - - return ((*Result)-=Other_matrix); -} - - -SparseMatrix& SparseMatrix::operator* (DMatrix& A) const -{ - int k; - int i, j, icol, q; - DMatrix x; - DMatrix r(n,1); - SparseMatrix* sp; - - sp = new SparseMatrix( n, A.GetNoCols(), 0 ); - - - for (icol=1; icol<=A.m; icol++) { - x = A(colon(),(long) icol); - r.FillWithZeros(); - for (k = 0; k < nz; k++) { - j = ColIndx[k]; - i = RowIndx[k]; - r(i) += a[k]*x(j); - } - for (q=1; q<=length(r); q++) { - sp->InsertNonZero(q,icol, r(q) ); - } - } - - sp->Compress(); - - return (*sp); - -} - -SparseMatrix& SparseMatrix::operator*= (double Arg) -{ - int i; - for (i=0; inz>=0) return (NULL) ; /* check inputs */ - - m = C->m ; n = C->n ; - nz = C->p[n]; - T = cs_spalloc (m, n, nz, 1, 1) ; /* allocate result */ - Ti = T->i ; Tj = T->p ; Tx = T->x ; - T->nz = nz; - w = (int*) cs_calloc (n, sizeof (int)) ; /* get workspace */ - if (!T || !w) return (cs_done (T, w, NULL, 0)) ; /* out of memory */ - Cp = C->p ; Ci = C->i ; Cx = C->x ; - for (k=0; kn; k++) - { - if (k==C->n) jlim = nz; - else jlim = Cp[k+1]; - for (j=Cp[k]; j=0) - { - Tj[ j ] = k; - Tx[ j ] = Cx[ j ]; - Ti[ j ] = Ci[ j ]; - } - } - - return (cs_done (T, w, NULL, 1)) ; /* success; free w and return T */ - - -} - - - -SparseMatrix& Product(const SparseMatrix& A,const SparseMatrix& B) -{ - - /* cs *cs_multiply (const cs *A, const cs *B) */ - int i; - SparseMatrix *r = new SparseMatrix(A.GetNoRows(), B.GetNoCols(),0); - - int an = A.GetNoRows(); - int am = A.GetNoCols(); - int bn = B.GetNoRows(); - int bm = B.GetNoCols(); - int *ira = A.GetRowIndx_C_Array(); - int *irb = B.GetRowIndx_C_Array(); - int *ica = A.GetColIndx_C_Array(); - int *icb = B.GetColIndx_C_Array(); - int anz = A.GetNonZero(); - int bnz = B.GetNonZero(); - double *a = A.GetPr(); - double *b = B.GetPr(); - int *irr; - int *icr; - - - - - cs* Acs = cs_spalloc( an, am, anz, 1, 1 ); - cs* Bcs = cs_spalloc( bn, bm, bnz, 1, 1 ); - cs* CAcs; - cs* CBcs; - cs* TABcs; - - Acs->nz=anz; - Bcs->nz=bnz; - - for(i=0;ii[i]=ira[i]-1; - Acs->p[i]=ica[i]-1; - Acs->x[i]=a[i]; - } - - for(i=0;ii[i]=irb[i]-1; - Bcs->p[i]=icb[i]-1; - Bcs->x[i]=b[i]; - } - - cs* ABcs; - - CAcs = cs_compress (Acs); - CBcs = cs_compress (Bcs); - ABcs = cs_multiply( CAcs, CBcs ); - - r->Resize(an, bm, ABcs->nzmax); - - TABcs = convert2triplet(ABcs); - - irr = r->GetRowIndx_C_Array(); - icr = r->GetColIndx_C_Array(); - - for(i=0;i< TABcs->nz; i++) { - irr[i]= TABcs->i[i]+1; - icr[i]= TABcs->p[i]+1; - } - - - memcpy( r->GetPr() , ABcs->x, TABcs->nzmax*sizeof(double) ); - - cs_spfree (ABcs); - cs_spfree (TABcs); -/* cs_spfree (Acs);*/ - cs_spfree (Bcs); - cs_spfree (CAcs); - cs_spfree (CBcs); - - - return (*r); - -} - - -// { -// int i, j; -// -// double sum; -// -// SparseMatrix *sp = new SparseMatrix( A.GetNoRows(), B.GetNoCols(), 0 ); -// -// VecElem *row_p = new VecElem; -// VecElem *col_p = new VecElem; -// -// if (A.GetNoCols() != B.GetNoRows()) -// sp_error_message("Inconsistent matrix dimensions in SparseMatrix::operator*"); -// -// -// -// for (i = 1; i <= A.GetNoRows(); i++) { -// for (j = 1; j <= B.GetNoCols(); j++) { -// // row_p = A->rows [i]; -// // col_p = B->cols [j]; -// row_p->index = 0; -// col_p->index = 0; -// row_p->previous = 0; -// col_p->previous = 0; -// sum = 0; -// -// A. Find_Next_NonZero_in_Row(i, row_p); -// B. Find_Next_NonZero_in_Col(j, col_p); -// while ((row_p->index != -1) && (col_p->index != -1)) { -// if (row_p->index == col_p->index) { -// sum += row_p->value * col_p->value; -// A. Find_Next_NonZero_in_Row(i, row_p); -// B. Find_Next_NonZero_in_Col(j, col_p); -// } -// else if (row_p->index < col_p->index) { -// A. Find_Next_NonZero_in_Row(i, row_p); -// } -// else { -// B.Find_Next_NonZero_in_Col(j, col_p); -// } -// } -// if (sum!=0.0) sp->InsertNonZero(i, j, sum); -// } -// } -// -// return (*sp); -// -// } - - - -SparseMatrix& SparseMatrix::operator* (const SparseMatrix& B) const -{ - - return Product(*this,B); - -} - - -SparseMatrix& TProduct(SparseMatrix& A,SparseMatrix& B) -{ - SparseMatrix *sp= new SparseMatrix(A.GetNoRows(),B.GetNoCols(),0); - - A.Transpose(); - - {*sp=Product(A,B);} - - A.Transpose(); - - return (*sp); - -} - - -SparseMatrix& ProductT(SparseMatrix& A,SparseMatrix& B) -{ - - SparseMatrix *sp= new SparseMatrix(A.GetNoCols(),B.GetNoCols(),0); - - B.Transpose(); - - {*sp=Product(A,B);} - - B.Transpose(); - - return (*sp); - - -} - -SparseMatrix& elemProduct(const SparseMatrix A, const SparseMatrix& B) -{ - int i, j, k; - - double sum; - - double *a = A.GetPr(); - - int *RowIndx = A.GetRowIndx_C_Array(); - int *ColIndx = A.GetColIndx_C_Array(); - - SparseMatrix *sp = new SparseMatrix( A.GetNoRows(), B.GetNoCols(), 0 ); - - if (A.GetNoRows() != B.GetNoRows() || A.GetNoCols() != B.GetNoCols()) - sp_error_message("Inconsistent matrix dimensions in SparseMatrix elemProduct()"); - - - - for (k = 0; k < A.GetNonZero(); k++) { - i = RowIndx[k]; - j = ColIndx[k]; - sum = a[k]*B(i,j); - if (sum!=0.0) sp->InsertNonZero(i, j, sum); - } - - return (*sp); -} - - -SparseMatrix& SparseMatrix::operator/= (double Arg) -{ - int i; - - if (Arg==0.0) sp_error_message("Division by zero in SparseMatrix::operator/"); - - for (i=0; iResize(Other_matrix.n, Other_matrix.m, Other_matrix.nz); - memcpy(a, Other_matrix.a, nz*sizeof(double) ); - memcpy(RowIndx, Other_matrix.RowIndx, nz*sizeof(int) ); - memcpy(ColIndx, Other_matrix.ColIndx, nz*sizeof(int) ); - return (*this); -} - -double& SparseMatrix::operator() (int i,int j) -{ - int k; - - int ii; - - int eflag = 0; - - for (k=0; k< nz; k++) - { - if (RowIndx[k]==i && ColIndx[k]==j) { - ii = k; - eflag = 1; - break; - } - - } - - if( !eflag ) { - - for (k=0; kInsertNonZero(i,j,0.0); - ii = nz-1; - } - - return a[ii]; - -} - -double SparseMatrix::operator() (int row,int col) const -{ - int i; - double retval = 0.0; - - if ( (row>n) || (row<0) || (col<0) || (col>m) ) { - error_message("Out of range index in SparseMatrix::operator()"); - } - - for (i=0; i< nz; i++) { - if (RowIndx[i]==row && ColIndx[i]==col) - { - retval = a[i]; - break; - } - } - - return retval; -} - -//double SparseMatrix::operator() (int row,int col) -//{ -// -//} - -void SparseMatrix::Print(const char* text) -{ - int i; - - fprintf(stderr,"\nSparse matrix %s",text); - fprintf(stderr,"\nNumber of rows: %i", n); - fprintf(stderr,"\nNumber of columns: %i", m); - fprintf(stderr,"\nNumber of non-zero elements: %i", nz); - if (n*m!=0) fprintf(stderr,"\nDensity: %f%%", ( ((double) nz*100)/(double) (n*m) ) ); - if (nz>0) fprintf(stderr,"\n(Row,Col)\tValue"); - - for (i=0; iResize(n, n, n); - - for (i=0;inz;i++) { - sp->RowIndx[i]=i+1; - sp->ColIndx[i]=i+1; - sp->a[i]=1.0; - } - - return (*sp); -} - -SparseMatrix& spones(const SparseMatrix& s) -{ -// Returns a sparse identity matrix - SparseMatrix *sp = new SparseMatrix(s); - int i; - - for (i=0;inz;i++) { - sp->a[i]=1.0; - } - - return (*sp); -} - -SparseMatrix& spconvert(DMatrix& A) -{ - int i; - if (A.GetNoCols()!=3) - sp_error_message("Incorrect number of columns of input matrix in spconvert()"); - DMatrix I; - DMatrix J; - DMatrix Aij; - int nzmax = A.GetNoRows(); - - I = A(colon(),1); - J = A(colon(),2); - Aij = A(colon(),3); - - int maxI = (int) Max(I); - int maxJ = (int) Max(J); - - SparseMatrix* sp = new SparseMatrix(maxI, maxJ, nzmax); - - for (i=0; iRowIndx[i] = (int) I(i+1); - sp->ColIndx[i] = (int) J(i+1); - sp->a[i] = Aij(i+1); - } - - sp->Compress(); - - return (*sp); -} - - -void SparseMatrix::Load(const char* fname) -{ - int nrow, ncol, nnz; - - int k; - - FILE *fp; - - if ( (fp = fopen(fname,"r")) == NULL ) - - { sp_error_message( "Error opening file in SparseMatrix::Load()"); } - - - fscanf(fp,"%i", &nrow); - fscanf(fp,"%i", &ncol); - fscanf(fp,"%i", &nnz); - - this->Resize(nrow, ncol, nnz); - - for (k=0;kRowIndx, A.ColIndx, A.nz*sizeof(int) ); - memcpy(sp->ColIndx, A.RowIndx, A.nz*sizeof(int) ); - memcpy(sp->a , A.a, A.nz*sizeof(double) ); - - return (*sp); - -} - -SparseMatrix& inv(SparseMatrix& A) -{ -// Returns the inverse (if it exists) of a sparse matrix A. - int i,j; - - if (A.GetNoCols()!=A.GetNoRows()) - sp_error_message("Sparse matrix must be square in function inv()"); - - void* LUSOLv; - - DMatrix x(A.GetNoRows(),1); - - DMatrix r(A.GetNoRows(),1); - - DMatrix b(A.GetNoRows(),1); - - SparseMatrix *sp = new SparseMatrix(A.GetNoRows(), A.GetNoCols(), 0); - - LUSOLv = SparseLUFactor(A); - - for(j=1; j<=A.GetNoCols(); j++) - { - b.FillWithZeros(); - b(j) = 1.0; - SparseLUSolveGivenFactor(LUSOLv, A, b, x, r); - for(i=1;i<=A.GetNoRows();i++) - { - if (x(i)!=0.0) - sp->InsertNonZero(i,j,x(i)); - } - } - - return (*sp); - -} - -SparseMatrix& SparseMatrix::operator %(SparseMatrix& B) -{ -// Left divition implementation A%B is conceptually equivalent to inv(A)*B -// but it is numerically more efficient - int i,j,k; - - if (this->GetNoCols()!=this->GetNoRows()) - sp_error_message("Sparse matrix must be square in function SparseMatrix::operator%"); - - if (this->GetNoCols()!=B.GetNoRows()) - sp_error_message("Incorrect dimensions in SparseMatrix::operator% "); - - void* LUSOLv; - - DMatrix x(this->GetNoCols(),1); - - DMatrix r(B.GetNoRows(),1); - - DMatrix b(B.GetNoRows(),1); - - SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), B.GetNoCols(), 0); - - LUSOLv = SparseLUFactor(*this); - - for(j=1; j<=B.GetNoCols(); j++) - { - for (k=1;k<=B.GetNoRows();k++) b(k) = B(k,j); - SparseLUSolveGivenFactor(LUSOLv, *this, b, x, r); - for(i=1;i<=this->GetNoRows();i++) - { - if (x(i)!=0.0) - sp->InsertNonZero(i,j,x(i)); - } - } - - return (*sp); - -} - - -SparseMatrix& SparseMatrix::operator/ (SparseMatrix& B) -{ -// Right divition implementation A/B is conceptually equivalent to A*inv(B) -// but it is numerically more efficient - - if (this->GetNoCols()!=this->GetNoRows()) - sp_error_message("Sparse matrix must be square in function SparseMatrix::operator/"); - - if (this->GetNoCols()!=B.GetNoRows()) - sp_error_message("Incorrect dimensions in SparseMatrix::operator/ "); - - SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), B.GetNoCols(), 0); - - B.Transpose(); - - this->Transpose(); - - {*sp = B%(*this);} - - sp->Transpose(); - - B.Transpose(); - - this->Transpose(); - - return (*sp); - -} - -SparseMatrix& SparseMatrix::operator||(SparseMatrix& B) const -{ - // Returns the horizontal concatenation of two sparse matrices - - int i; - - if (this->GetNoRows()!=B.GetNoRows()) - sp_error_message("Number of rows must be equal in SparseMatrix::operator||"); - - SparseMatrix *sp = new SparseMatrix(n, m+B.m, nz+B.nz); - - memcpy(sp->a, a, nz*sizeof(double) ); - memcpy(sp->RowIndx, RowIndx, nz*sizeof(int) ); - memcpy(sp->ColIndx, ColIndx, nz*sizeof(int) ); - - memcpy(sp->a+nz, B.a, B.nz*sizeof(double) ); - memcpy(sp->RowIndx+nz, B.RowIndx, B.nz*sizeof(int) ); - - for(i=0; iColIndx[nz+i] = m + B.ColIndx[i]; - } - - return (*sp); - -} - - - -SparseMatrix& SparseMatrix::operator&&(SparseMatrix& B) const -{ - // Returns the vertical concatenation of two sparse matrices - - int i; - - if (m!=B.m) - sp_error_message("Number of cols must be equal in SparseMatrix::operator&&"); - - SparseMatrix *sp = new SparseMatrix(n + B.n, m, nz+B.nz); - - memcpy(sp->a, a, nz*sizeof(double) ); - memcpy(sp->RowIndx, RowIndx, nz*sizeof(int) ); - memcpy(sp->ColIndx, ColIndx, nz*sizeof(int) ); - - memcpy(sp->a+nz, B.a, B.nz*sizeof(double) ); - memcpy(sp->ColIndx+nz, B.ColIndx, B.nz*sizeof(int) ); - - for(i=0; iRowIndx[nz+i] = n + B.RowIndx[i]; - } - - return (*sp); - -} - -SparseMatrix& SparseMatrix::sub_matrix(int istart, int iend, int jstart, int jend) const -{ - // Returns a submatrix of the calling object - int i,j; - double value; - - if ((istart<1)||(istart>n)||(iend<1)||(iend>n)||(jstart<1)||(jstart>m)||(istart>iend)||(jstart>jend)) - sp_error_message("Index error in SparseMatrix::sub_matrix"); - - int nnew = iend-istart+1; - int mnew = jend-jstart+1; - - SparseMatrix *sp = new SparseMatrix(nnew, mnew, 0); - - for (i=1; i<=nnew; i++) { - for(j=1; j<=mnew; j++) { - value = (*this)(istart+i-1,jstart+j-1); - if ( value!=0.0 ) { - sp->InsertNonZero(i,j,value); - } - } - } - - return (*sp); - - - -} - - -DMatrix& SparseMatrix::Column(int j) const -{ -// Returns a dense column vector (DMatrix object) with the j-th column of the calling -// sparse matrix. - DMatrix* Temp; - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - Temp->Resize( this->GetNoRows(), 1 ); - Temp->FillWithZeros(); - for(int i=0;iResize( 1, this->GetNoCols()); - Temp->FillWithZeros(); - for(int j=0;jn)||(iend<1)||(iend>n)||(jstart<1)||(jstart>m)||(istart>iend)||(jstart>jend)) - sp_error_message("Index error in SparseMatrix::set_sub_matrix"); - - int nn = iend-istart+1; - int mm = jend-jstart+1; - - if (B.n != nn || B.m != mm) - sp_error_message("Range must be consistent with input matrix size in SparseMatrix::set_sub_matrix"); - - for (i=1; i<=nn; i++) { - for(j=1; j<=mm; j++) { - value = B(i,j); - if ( value!=0.0 ) { - this->InsertNonZero(istart+i-1,jstart+j-1,value); - } - } - } - - return; - -} - - - -void SparseMatrix::Transpose() -{ -// Transposes a sparse matrix object - int s; - int *temp = new int[nz]; - - - memcpy(temp, RowIndx, nz*sizeof(int) ); - memcpy(RowIndx, ColIndx, nz*sizeof(int) ); - memcpy(ColIndx, temp, nz*sizeof(int) ); - - s = n; - n = m; - m = s; - - return; - -} - -SparseMatrix& SparseMatrix::operator^(double x) const -{ - // Element-wise power of a sparse matrix - int i; - SparseMatrix *sp = new SparseMatrix(this->GetNoRows(), this->GetNoCols(), this->GetNonZero() ); - - memcpy(sp->RowIndx, this->RowIndx, this->nz*sizeof(int) ); - memcpy(sp->ColIndx, this->ColIndx, this->nz*sizeof(int) ); - for (i=0; inz; i++) - { - sp->a[i] = pow( this->a[i], x ); - } - - return (*sp); - - -} - - - - -MYBOOL isNum(char val) -{ - int ord; - ord = (int) val - 48; - return( (MYBOOL) ((ord >= 0) && (ord <= 9)) ); -} -void SparseLUSolve(SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc, char *argv[]) -{ - -/* Output device */ - FILE *outunit = stderr; - - int diagnostics_level=1; - -/* Overall dimensions allocated */ - int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, - replace = 0, randcol = 0; - MYBOOL ftran = TRUE; - -/* Storage for A, b */ - REAL *Aij, *b, *xexact; - int *iA, *jA; - -/* Storage for LUSOL */ - LUSOLrec *LUSOL = NULL; - -/* Define local storage variables */ - int i , inform, j , k , i1 , - m , lenb, lenx, - n , nelem , nnzero; - REAL Amax , test , - bnorm , rnorm , xnorm, - *rhs , *r , *x; - MYBOOL printsolution = FALSE, success = TRUE; - -/* Create the LUSOL object and set user options */ - LUSOL = LUSOL_create(outunit, 0, LUSOL_PIVMOD_TPP, 0); - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = 10; - i = 1; - n = A.GetNoCols(); - m = A.GetNoRows(); - nnzero = A.GetNonZero(); - - - while((n == 0) && (i < argc)) { - if(strcmp("-p", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > LUSOL_PIVMOD_MAX) - continue; - LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; - } - } - else if(strcmp("-t", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - Amax = atof(argv[i]); - if(Amax < 1 || Amax > 100) - continue; - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; - } - } - else if(strcmp("-m", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < LUSOL_MULT_nz_a || m > 100) - continue; - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); - } - } - else if(strcmp("-s", argv[i]) == 0) - printsolution = TRUE; - else if(strcmp("-b", argv[i]) == 0) - ftran = FALSE; - else if(strcmp("-r", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > 10) - continue; - } - else - m = 1; - srand((unsigned) time( NULL )); - replace = 2*m; - } - } /* end while */ - - - - maxn = A.GetNoCols(); - maxm = A.GetNoRows(); - maxnz= A.GetNonZero(); - -/* Create the arrays */ - - Aij = A.GetPr() - BLAS_BASE; - iA = A.GetRowIndx_C_Array() - BLAS_BASE; - jA = A.GetColIndx_C_Array() - BLAS_BASE; - if(ftran) - lenb = maxm; - else - lenb = maxn; - b = bb.GetPr()-BLAS_BASE; - rhs = (REAL *) calloc(lenb+BLAS_BASE, sizeof(REAL)); - - if(ftran) - lenx = maxn; - else - lenx = maxm; - xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); - r = rr.GetPr() - BLAS_BASE; - x = xx.GetPr() - BLAS_BASE; - - -/* ----------------------------------------------------------------- - Load A into (a, indc, indr). - ----------------------------------------------------------------- */ - - if(!LUSOL_assign(LUSOL, iA, jA, Aij, nnzero, TRUE)) { - fprintf(outunit, "Error: LUSOL failed due to insufficient memory.\n"); - goto x900; - } - -/* ------------------------------------------------------------------ - Factor A = L U. - ------------------------------------------------------------------ */ - nelem = nnzero; - LU1FAC( LUSOL, &inform ); - if (inform > LUSOL_INFORM_SERIOUS) { - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - goto x900; - } - /* Get the largest element in A; we use it below as an estimate - of ||A||_inf, even though it isn't a proper norm. */ - Amax = LUSOL->parmlu[LUSOL_RP_MAXELEM_A]; - -/* ------------------------------------------------------------------ - SOLVE A x = b. - Save b first because lu6sol() overwrites rhs when computing x. - ------------------------------------------------------------------ */ -Resolve: -#if 1 - MEMCOPY(x, b, lenb+BLAS_BASE); - if(ftran) - inform = LUSOL_ftran(LUSOL, x, NULL, FALSE); - else - inform = LUSOL_btran(LUSOL, x, NULL); -#else - MEMCOPY(rhs, b, lenb+BLAS_BASE); - if(ftran) - LU6SOL( LUSOL, LUSOL_SOLVE_Aw_v, rhs, x, NULL, &inform ); - else - LU6SOL( LUSOL, LUSOL_SOLVE_Atv_w, x, rhs, NULL, &inform ); -#endif - if (inform > LUSOL_INFORM_SERIOUS) { - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - goto x900; - } - if(printsolution) { - char* msg; - sprintf(msg,"\nSolution vector="); - blockWriteREAL(outunit, msg, x, 1, lenb); - } - -/* ------------------------------------------------------------------ - Set r = b - Ax. - Find norm of r and x. - ------------------------------------------------------------------ */ - MEMCOPY(r, b, lenb+BLAS_BASE); - for (k = 1; k <= nnzero; k++) { - i = iA[k]; - j = jA[k]; - if(ftran) - r[i] -= Aij[k]*x[j]; - else - r[j] -= Aij[k]*x[i]; - } - bnorm = dnormi( lenb, b ); - rnorm = dnormi( lenb, r ); - xnorm = dnormi( lenx, x ); - -/* ------------------------------------------------------------------ - Report the findings. - ------------------------------------------------------------------ */ - if(randcol > 0) - fprintf(outunit, "\n\nColumn %d was %s\n", - randcol, - (mod(replace,2) == 1 ? "replaced with random data" : "restored")); - if (diagnostics_level>=2) { - fprintf(outunit, "\nLU size statistics (%d reallocations):\n", - LUSOL->expanded_a); - } - test = LUSOL->luparm[LUSOL_IP_NONZEROS_U0]+LUSOL->luparm[LUSOL_IP_NONZEROS_ROW]; - if (diagnostics_level>=2) { - fprintf(outunit, "L0-size = %d U0-size = %d LU-nonzeros = %d Fill-in = %.1fx\n", - LUSOL->luparm[LUSOL_IP_NONZEROS_L0], - LUSOL->luparm[LUSOL_IP_NONZEROS_U0], - (int) test, test/nnzero); - } - test = rnorm / (Amax*xnorm); - if (diagnostics_level>=2) { - fprintf(outunit, "\nAccuracy statistics:\n"); - fprintf(outunit, "%s with a factor tolerance of %g gave a relative error of %g\n", - LUSOL_pivotLabel(LUSOL), LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij], test); - fprintf(outunit, "Amax = %g bnorm = %g rnorm = %g xnorm = %g\n", - Amax, bnorm, rnorm, xnorm); - fprintf(outunit, "\n"); - } - if (test <= 1.0e-8 ) {} - /* fprintf(outunit, "The equations were solved with very high accuracy.\n");*/ - else if (test <= 1.0e-6) {} - // fprintf(outunit, "The equations were solved with reasonably good accuracy.\n"); - else { - if (test <= 1.0e-4) - fprintf(outunit, "SparseLUSolve: Questionable accuracy; the LU factors may not be good enough.\n"); - else - fprintf(outunit, "SparseLUSolve: Poor accuracy; the LU factorization probably failed.\n"); - if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP) - fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance (current is %g).\n", - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]); - else - fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance and/or TRP pivoting.\n"); - } - - /* Check if we should replace a column and resolve */ - if(replace > 0) { - replace--; - if(mod(replace, 2) == 1) { - /* Randomly find a column and replace the data with the data in b */ - rnorm = rand(); - randcol = (int) (n * rnorm / (RAND_MAX+1)) + 1; -#if 1 - MEMCLEAR(x, m+1); - for(i = 1; i < m; i++) - x[i] = Amax * rand() / RAND_MAX; - inform = LUSOL_replaceColumn(LUSOL, randcol, x); -#else - inform = LUSOL_replaceColumn(LUSOL, randcol, b); -#endif - } - else { - /* Set the previously replaced column back and resolve */ - for (k = 1; k <= nnzero; k++) { - i = iA[k]; - j = jA[k]; - if(j == randcol) - x[i] = Aij[k]; - } - inform = LUSOL_replaceColumn(LUSOL, randcol, x); - } - if(inform != LUSOL_INFORM_LUSUCCESS) - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - else - goto Resolve; - } - - -/* Free memory */ -x900: - if(!success) - fprintf(outunit, "Insufficient memory or data file not found.\n"); - - free(xexact); - - LUSOL_free(LUSOL); - - -} - - -void* SparseLUFactor(SparseMatrix& A, int argc, char *argv[]) -{ -/* Output device */ - FILE *outunit = stderr; - -/* Overall dimensions allocated */ - int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, - replace = 0; - MYBOOL ftran = TRUE; - -/* Storage for A, b */ - REAL *Aij, *xexact; - int *iA, *jA; - -/* Storage for LUSOL */ - LUSOLrec *LUSOL = NULL; - -/* Define local storage variables */ - int i , inform, i1 , - m , lenx, - n , nelem , nnzero; - REAL Amax; - - MYBOOL printsolution = FALSE; - -/* Create the LUSOL object and set user options */ - LUSOL = LUSOL_create(outunit, 0, LUSOL_PIVMOD_TPP, 0); - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = 10; - i = 1; - n = A.GetNoCols(); - m = A.GetNoRows(); - nnzero = A.GetNonZero(); - - - while((n == 0) && (i < argc)) { - if(strcmp("-p", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > LUSOL_PIVMOD_MAX) - continue; - LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; - } - } - else if(strcmp("-t", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - Amax = atof(argv[i]); - if(Amax < 1 || Amax > 100) - continue; - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; - } - } - else if(strcmp("-m", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < LUSOL_MULT_nz_a || m > 100) - continue; - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); - } - } - else if(strcmp("-s", argv[i]) == 0) - printsolution = TRUE; - else if(strcmp("-b", argv[i]) == 0) - ftran = FALSE; - else if(strcmp("-r", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > 10) - continue; - } - else - m = 1; - srand((unsigned) time( NULL )); - replace = 2*m; - } - } /* end while */ - - - - maxn = A.GetNoCols(); - maxm = A.GetNoRows(); - maxnz= A.GetNonZero(); - -/* Create the arrays */ - - Aij = A.GetPr() - BLAS_BASE; - iA = A.GetRowIndx_C_Array() - BLAS_BASE; - jA = A.GetColIndx_C_Array() - BLAS_BASE; - - - if(ftran) - lenx = maxn; - else - lenx = maxm; - xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); - -/* ----------------------------------------------------------------- - Load A into (a, indc, indr). - ----------------------------------------------------------------- */ - - if(!LUSOL_assign(LUSOL, iA, jA, Aij, nnzero, TRUE)) { - fprintf(outunit, "Error: LUSOL failed due to insufficient memory.\n"); - goto x900; - } - -/* ------------------------------------------------------------------ - Factor A = L U. - ------------------------------------------------------------------ */ - nelem = nnzero; - LU1FAC( LUSOL, &inform ); - if (inform > LUSOL_INFORM_SERIOUS) { - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - goto x900; - } - -x900: - return ((void*) LUSOL); - -} - -void SparseLUSolveGivenFactor(void* LUSOLv, SparseMatrix& A, DMatrix& bb, DMatrix& xx, DMatrix& rr, int argc, char *argv[]) -{ -/* Output device */ - FILE *outunit = stderr; - - int diagnostics_level=1; - -/* Overall dimensions allocated */ - int maxm = MAXROWS, maxn = MAXCOLS, maxnz = MAXNZ, - replace = 0, randcol = 0; - MYBOOL ftran = TRUE; - -/* Storage for A, b */ - REAL *Aij, *b, *xexact; - int *iA, *jA; - -/* Storage for LUSOL */ - LUSOLrec *LUSOL = (LUSOLrec*) LUSOLv; - -/* Define local storage variables */ - int i , inform, j , k , i1 , - m , lenb, lenx, - n , nnzero; - REAL Amax , test , - bnorm , rnorm , xnorm, - *rhs , *r , *x; - MYBOOL printsolution = FALSE, success = TRUE; - -/* set user options */ - - i = 1; - n = LUSOL->n; - m = LUSOL->m; - nnzero = LUSOL->nelem; - - - while((n == 0) && (i < argc)) { - if(strcmp("-p", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > LUSOL_PIVMOD_MAX) - continue; - LUSOL->luparm[LUSOL_IP_PIVOTTYPE] = m; - } - } - else if(strcmp("-t", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - Amax = atof(argv[i]); - if(Amax < 1 || Amax > 100) - continue; - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij] = Amax; - } - } - else if(strcmp("-m", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < LUSOL_MULT_nz_a || m > 100) - continue; - LUSOL->luparm[LUSOL_IP_SCALAR_NZA] = atoi(argv[i]); - } - } - else if(strcmp("-s", argv[i]) == 0) - printsolution = TRUE; - else if(strcmp("-b", argv[i]) == 0) - ftran = FALSE; - else if(strcmp("-r", argv[i]) == 0) { - i1 = i+1; - if((i1 < argc) && isNum(argv[i1][1])) { - i = i1; - m = atoi(argv[i]); - if(m < 0 || m > 10) - continue; - } - else - m = 1; - srand((unsigned) time( NULL )); - replace = 2*m; - } - } /* end while */ - - - - maxn = LUSOL->n; - maxm = LUSOL->m; - maxnz= LUSOL->nelem; - -/* Create the arrays */ - - Aij = A.GetPr() - BLAS_BASE; - iA = A.GetRowIndx_C_Array() - BLAS_BASE; - jA = A.GetColIndx_C_Array() - BLAS_BASE; - - if(ftran) - lenb = maxm; - else - lenb = maxn; - b = bb.GetPr()-BLAS_BASE; - rhs = (REAL *) calloc(lenb+BLAS_BASE, sizeof(REAL)); - - if(ftran) - lenx = maxn; - else - lenx = maxm; - xexact = (REAL *) calloc(lenx+BLAS_BASE, sizeof(REAL)); - r = rr.GetPr() - BLAS_BASE; - x = xx.GetPr() - BLAS_BASE; - - - /* Get the largest element in A; we use it below as an estimate - of ||A||_inf, even though it isn't a proper norm. */ - Amax = LUSOL->parmlu[LUSOL_RP_MAXELEM_A]; - -/* ------------------------------------------------------------------ - SOLVE A x = b. - Save b first because lu6sol() overwrites rhs when computing x. - ------------------------------------------------------------------ */ -Resolve: -#if 1 - MEMCOPY(x, b, lenb+BLAS_BASE); - if(ftran) - inform = LUSOL_ftran(LUSOL, x, NULL, FALSE); - else - inform = LUSOL_btran(LUSOL, x, NULL); -#else - MEMCOPY(rhs, b, lenb+BLAS_BASE); - if(ftran) - LU6SOL( LUSOL, LUSOL_SOLVE_Aw_v, rhs, x, NULL, &inform ); - else - LU6SOL( LUSOL, LUSOL_SOLVE_Atv_w, x, rhs, NULL, &inform ); -#endif - if (inform > LUSOL_INFORM_SERIOUS) { - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - goto x900; - } - if(printsolution) { - char* msg; - sprintf(msg,"\nSolution vector="); - blockWriteREAL(outunit, msg , x, 1, lenb); - } - -/* ------------------------------------------------------------------ - Set r = b - Ax. - Find norm of r and x. - ------------------------------------------------------------------ */ - MEMCOPY(r, b, lenb+BLAS_BASE); - for (k = 1; k <= nnzero; k++) { - i = iA[k]; - j = jA[k]; - if(ftran) - r[i] -= Aij[k]*x[j]; - else - r[j] -= Aij[k]*x[i]; - } - bnorm = dnormi( lenb, b ); - rnorm = dnormi( lenb, r ); - xnorm = dnormi( lenx, x ); - -/* ------------------------------------------------------------------ - Report the findings. - ------------------------------------------------------------------ */ - if(randcol > 0) - fprintf(outunit, "\n\nColumn %d was %s\n", - randcol, - (mod(replace,2) == 1 ? "replaced with random data" : "restored")); - if (diagnostics_level>=2) { - fprintf(outunit, "\nLU size statistics (%d reallocations):\n", - LUSOL->expanded_a); - } - test = LUSOL->luparm[LUSOL_IP_NONZEROS_U0]+LUSOL->luparm[LUSOL_IP_NONZEROS_ROW]; - if (diagnostics_level>=2) { - fprintf(outunit, "L0-size = %d U0-size = %d LU-nonzeros = %d Fill-in = %.1fx\n", - LUSOL->luparm[LUSOL_IP_NONZEROS_L0], - LUSOL->luparm[LUSOL_IP_NONZEROS_U0], - (int) test, test/nnzero); - } - test = rnorm / (Amax*xnorm); - if (diagnostics_level>=2) { - fprintf(outunit, "\nAccuracy statistics:\n"); - fprintf(outunit, "%s with a factor tolerance of %g gave a relative error of %g\n", - LUSOL_pivotLabel(LUSOL), LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij], test); - fprintf(outunit, "Amax = %g bnorm = %g rnorm = %g xnorm = %g\n", - Amax, bnorm, rnorm, xnorm); - fprintf(outunit, "\n"); - } - if (test <= 1.0e-8 ) {} - /* fprintf(outunit, "The equations were solved with very high accuracy.\n");*/ - else if (test <= 1.0e-6) {} - // fprintf(outunit, "The equations were solved with reasonably good accuracy.\n"); - else { - if (test <= 1.0e-4) - fprintf(outunit, "SparseLUSolve: Questionable accuracy; the LU factors may not be good enough.\n"); - else - fprintf(outunit, "SparseLUSolve: Poor accuracy; the LU factorization probably failed.\n"); - if(LUSOL->luparm[LUSOL_IP_PIVOTTYPE] == LUSOL_PIVMOD_TRP) - fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance (current is %g).\n", - LUSOL->parmlu[LUSOL_RP_FACTORMAX_Lij]); - else - fprintf(outunit, "SparseLUSolve: Try a smaller factor tolerance and/or TRP pivoting.\n"); - } - - /* Check if we should replace a column and resolve */ - if(replace > 0) { - replace--; - if(mod(replace, 2) == 1) { - /* Randomly find a column and replace the data with the data in b */ - rnorm = rand(); - randcol = (int) (n * rnorm / (RAND_MAX+1)) + 1; -#if 1 - MEMCLEAR(x, m+1); - for(i = 1; i < m; i++) - x[i] = Amax * rand() / RAND_MAX; - inform = LUSOL_replaceColumn(LUSOL, randcol, x); -#else - inform = LUSOL_replaceColumn(LUSOL, randcol, b); -#endif - } - else { - /* Set the previously replaced column back and resolve */ - for (k = 1; k <= nnzero; k++) { - i = iA[k]; - j = jA[k]; - if(j == randcol) - x[i] = Aij[k]; - } - inform = LUSOL_replaceColumn(LUSOL, randcol, x); - } - if(inform != LUSOL_INFORM_LUSUCCESS) - fprintf(outunit, "Error:\n%s\n", LUSOL_informstr(LUSOL, inform)); - else - goto Resolve; - } - - -/* Free memory */ -x900: - if(!success) - fprintf(outunit, "Insufficient memory or data file not found.\n"); - - free(xexact); - -} - -void sp_error_message(const char *error_text) -{ - error_message( error_text ); -} - - -DMatrix& null( const SparseMatrix& A ) -{ - DMatrix* Af = new DMatrix; - DMatrix* r = new DMatrix; - - *Af = full(A); - - *r = null(*Af); - - delete Af; - - return(*r); -} - -DMatrix& SVD(const SparseMatrix& A, DMatrix* U, DMatrix* V) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = SVD(*Af, U, V); - - delete Af; - - return *s; - -} - -DMatrix& QR( const SparseMatrix& A ) -{ - - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = QR(*Af); - - delete Af; - - return *s; - - -} - -DMatrix& LQ( const SparseMatrix& A, DMatrix* Q ) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = LQ(*Af, Q); - - delete Af; - - return *s; - - -} - - -DMatrix& orth( const SparseMatrix& A ) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = orth(*Af); - - delete Af; - - return *s; - -} - -DMatrix& schur(const SparseMatrix& A, DMatrix* U ) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = schur(*Af, U); - - delete Af; - - return *s; - -} - -DMatrix& eig(const SparseMatrix& A, DMatrix* V ) -{ - DMatrix* Af= new DMatrix; - DMatrix* s= new DMatrix; - - *Af = full(A); - - *s = eig(*Af, V); - - delete Af; - - return *s; - - -} - -double enorm(const SparseMatrix& A) -{ - int i; - double r = 0; - for (i=0;inz; i++) - R->a[i] = fabs(R->a[i]); - - return *R; -} - -double cond( const SparseMatrix& A ) -{ - double r; - - DMatrix* Af= new DMatrix; - - *Af = full(A); - - r = cond(*Af); - - delete Af; - - return r; - -} - -double rcond( const SparseMatrix& A ) -{ - double r; - - DMatrix* Af= new DMatrix; - - *Af = full(A); - - r = rcond(*Af); - - delete Af; - - return r; - -} - -int rank_sparse( const SparseMatrix& A ) -{ - int r; - - DMatrix* Af= new DMatrix; - - *Af = full(A); - - r = rank_matrix(*Af); - - delete Af; - - return r; - -} - -SparseMatrix& sprand(const SparseMatrix& S) -{ - int i; - - SparseMatrix* R= new SparseMatrix(S); - - for (i=0; inz; i++) - R->a[i] = DMatrix::random_uniform(); - - return *R; -} - -SparseMatrix& sprand(int n, int m, double density) -{ - int i, j; - - double r1; - - int nzguess = (int) density*n*m; - - SparseMatrix* R= new SparseMatrix(n,m,nzguess); - - for (i=1; i<=n; i++) - { - for(j=1; j<=m; j++) - { - r1 = DMatrix::random_uniform(); - - if (r1 < density) - { - R->InsertNonZero(i,j, DMatrix::random_uniform()); - } - } - } - - return *R; - -} - -SparseMatrix& sprandn(const SparseMatrix& S) -{ - int i; - - SparseMatrix* R= new SparseMatrix(S); - - for (i=0; inz; i++) - R->a[i] = DMatrix::random_gaussian(); - - return *R; -} - -SparseMatrix& sprandn(int n, int m, double density) -{ - int i, j; - - double r1; - - int nzguess = (int) density*n*m; - - SparseMatrix* R= new SparseMatrix(n,m,nzguess); - - for (i=1; i<=n; i++) - { - for(j=1; j<=m; j++) - { - r1 = DMatrix::random_uniform(); - - if (r1 < density) - { - R->InsertNonZero(i,j, DMatrix::random_gaussian()); - } - } - } - - return *R; -} diff --git a/dmatrix/src/dmatrixv.cxx b/dmatrix/src/dmatrixv.cxx deleted file mode 100644 index 600d554b..00000000 --- a/dmatrix/src/dmatrixv.cxx +++ /dev/null @@ -1,7295 +0,0 @@ -/********************************************************************************************* - -This file is part of the DMatrix library, a C++ tool for numerical linear algebra - -Copyright (C) 2009-2020 Victor M. Becerra - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA, -or visit http://www.gnu.org/licenses/ - -Author: Professor Victor M. Becerra -Address: University of Portsmouth - School of Energy and Electronic Engineering - Portsmouth PO1 3DJ - United Kingdom -e-mail: v.m.becerra@ieee.org - -**********************************************************************************************/ - -#ifdef UNIX - - -extern "C" { - - -#include -#include -#include -#include -#include - -} - -#else - -#ifdef WIN32 -#include -#include -#include -#else -#include -#include -#include -#endif - -#endif - - -#ifdef SPARSE_MATRIX -extern "C" { - -#include "commonlib.h" -#include "myblas.h" -#include "lusol.h" -#include "lusolio.h" -#include "lusolmain.h" - -} - -#endif - - -extern "C" { - -#include - -} - - -#ifdef UNIX - -#include "dmatrixv.h" - -#ifdef MATLAB_MEX_FILE - -#include "mex.h" - -#endif /*MEX*/ - -#else - -#include "dmatrixv.h" - -#ifdef MATLAB_MEX_FILE - -extern "C" { - -#include "mex.h" - -} - -#endif - -#endif - - -#include "helper.h" - -DMatrix* DMatrix::GetTempPr(int i) { - - - auxPr[i].mtype = 0; - auxPr[i].mt = NULL; - auxPr[i].rowIndx = NULL; - auxPr[i].colIndx = NULL; - return &auxPr[i]; - -} - - - -/* Definition of static member variables of class DMatrix */ - - -DEC_THREAD DMatrix* DMatrix::auxPr = NULL; // Pointer to auxiliary arrays - -DEC_THREAD int DMatrix::initFlag = 0; // To be allocated in AllocateAuxArr() */ - -DEC_THREAD int DMatrix::noAuxArr=N_TEMP_OBJECTS;// Number of auxiliary arrays - -DEC_THREAD long DMatrix::dimAux=D_TEMP_OBJECTS; // Dimension of auxiliary arrays - -DEC_THREAD int DMatrix::auxIndx=-1; // Index of used auxiliary arrays - -DEC_THREAD int DMatrix::memberFlag = 0; // Member function flag - -DEC_THREAD int DMatrix::errorFlag = 0; // Error flag - -DEC_THREAD int DMatrix::print_level = 1; // Print level - -DEC_THREAD clock_t DMatrix::start_clock = 0; - -DEC_THREAD double DMatrix::MACH_EPS = 0; - -DEC_THREAD time_t DMatrix::start_time = 0; - -DEC_THREAD long* DMatrix::seed = NULL; - -// long DMatrix::seed[RAND_STREAMS] = {RAND_DEFAULT}; - -long generate_seed(time_t *timer); - - -DEC_THREAD int DMatrix::stream = 0; // stream index - - -#ifdef OTISS_CASE - -DEC_THREAD double DMatrix::axp[N_TEMP_OBJECTS][D_TEMP_OBJECTS]; - -#endif - - -char* num2str(double num); - -long generate_seed(time_t *timer) -{ - - long seed; - tm* st = localtime(timer); - - seed = st->tm_yday*365*24*3600; - seed += st->tm_hour*3600; - seed += st->tm_min*60; - seed += st->tm_sec; - - seed *=37; - - return seed; -} - - -/* Declaration of Dummy object to allocate and de-allocate */ -/* auxiliary arrays */ - -#ifndef MATLAB_MEX_FILE -// #ifndef DECLARED_TEMPS - -InitializeDMatrixClass Dummy; - -// #endif -#endif - -#define NR_END 1 - -#define FREE_ARG char* - -void DMatrix::initVars() -{ - a = NULL; - n = 0; - m = 0; - asize = 0; - atype = 0; - mtype = 0; - auxFlag = 0; - allocated = 0; - DMatrix* mt = NULL; - rowIndx = NULL; - colIndx = NULL; -} - - -DMatrix::DMatrix(void) -// Default constructor -{ - - initVars(); - - SetReferencedDMatrixPointer( NULL ); - SetRowIndexPointer(NULL); - SetColIndexPointer(NULL); - SetMType(0); - allocated = false; - -} - - - -DMatrix::DMatrix(long Initn, long Initm) -// Matrix constructor using memory allocation -{ - - initVars(); - - n=Initn; - - m=Initm; - - asize = n*m; - - if ( Initm<0 || Initn<0 ) { - - ERROR_MESSAGE("Attempt to create a matrix with \ - negative dimension in \ - DMatrix::DMatrix(long,long)"); - } - - if (Initm!=0 && Initn!=0) { - - DMatrix::Allocate(asize); - - memset(a, 0, asize*sizeof(double) ); - - - } - - - SetReferencedDMatrixPointer( NULL ); - SetRowIndexPointer(NULL); - SetColIndexPointer(NULL); - SetMType(0); - -} - -DMatrix::DMatrix( long vDim, double* v, long Initn, long Initm ) -// Matrix constructor using pre-allocated array or pointer -{ - - initVars(); - - n = Initn; - - m = Initm; - - a = v; - - if ( Initm<0 || Initn<0 ) { - - ERROR_MESSAGE("Attempt to create a matrix with \ - negative dimension in \ - DMatrix::DMatrix(long, double*, long,long)"); - } - if ( n*m>vDim ) { - - ERROR_MESSAGE("Error in DMatrix::DMatrix(long,double*,long,long):\ - increase dimensions of pre-allocated array or pointer"); - fprintf(stderr, "Requested size %ld elements", n*m ); - fprintf(stderr, "Pre-allocated size %ld elements", vDim ); - } - - asize = vDim; - - atype = 1; - auxFlag=0; - - SetReferencedDMatrixPointer( NULL ); - SetRowIndexPointer(NULL); - SetColIndexPointer(NULL); - SetMType(0); - allocated = false; - -} - - - -DMatrix::DMatrix( long Initn) -{ -// Matrix constructor with Initn rows and only one column - - if ( Initn <0 ) { - - ERROR_MESSAGE("Attempt to create a matrix with \ - negative dimension in \ - DMatrix::DMatrix(long)"); - } - - initVars(); - - n=Initn; - - m=1; - - asize = n; - - if ( Initn!=0) { - - DMatrix::Allocate(n); - - memset(a, 0, n*sizeof(double) ); - - } - - atype = 0; - auxFlag = 0; - - - SetReferencedDMatrixPointer( NULL ); - SetRowIndexPointer(NULL); - SetColIndexPointer(NULL); - SetMType(0); - -} - - -DMatrix::DMatrix(long rows,long columns,double a11,...) -{ -// Matrix constructor with assigment - - long i,j; - - initVars(); - - n = rows; - - m = columns; - - asize = n*m; - - atype = 0; - - - Allocate(asize); - - va_list List; - - va_start(List,a11); - - elem(1,1) = a11; - - for (i=1; i<=n; i++) { - - for (j=1; j<=m; j++) { - - if (i*j != 1) { - - elem(i,j) = va_arg(List, double); - - } - - } - - } - - va_end(List); - - - SetReferencedDMatrixPointer( NULL ); - SetRowIndexPointer(NULL); - SetColIndexPointer(NULL); - SetMType(0); - auxFlag=0; - -} - - - -DMatrix::DMatrix( const DMatrix& A) -// copy constructor -{ - - initVars(); - - n=A.n; - - m=A.m; - - asize = n*m; - - DMatrix::Allocate(asize); - - memcpy( a, A.a , n*m*sizeof(double) ); - - atype = 0; - - - SetReferencedDMatrixPointer( NULL ); - SetRowIndexPointer(NULL); - SetColIndexPointer(NULL); - SetMType(0); - auxFlag=0; - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - -} - -void DMatrix::PrintInfo(const char *str) const -{ - fprintf(stderr,"\nInformation about DMatrix object: %s", str); - fprintf(stderr,"\nNumber of Rows :\t\t%ld",GetNoRows() ); - fprintf(stderr,"\nNumber of Columns :\t\t%ld",GetNoCols() ); - fprintf(stderr,"\nAllocation type :\t\t%d",atype); - fprintf(stderr,"\nAllocation size :\t\t%ld",asize); -} - - -void DMatrix::AllocateAuxArr( void ) -{ -// Routine to allocate the temporary objects at program start - - int i; - - - // const DEC_THREAD double DMatrix::MACH_EPS = MachEps(); - - DMatrix::MACH_EPS = MachEps(); - - DMatrix::start_time = time(NULL); - - DMatrix::seed = (long*) my_calloc(RAND_STREAMS, sizeof(long)); - - for (i=0;iResize( A.GetNoRows(), A.GetNoCols() ); - - *Temp = A; - - if (A.GetNoRows()*A.GetNoCols() != nnrow*nncol) { - - error_message("reshape(): The number of elements must be preserved"); - - } - - Temp->Resize(nnrow,nncol); - - return (*Temp); - -} - - -void DMatrix::Resize( long nnrow, long nncol ) -{ -// Resizes the row and column dimensions of a DMatrix object -// additional memory is allocated if necessary - long i; - - if (nnrow==0 || nncol==0) { - n = nnrow; - m = nncol; - if (atype==0 && auxFlag!=1) { - DMatrix::DeAllocate(); - asize = 0; - } - return; - } - - if (n==nnrow && m==nncol ) return; - - if ( n*m == nnrow*nncol) - { - n = nnrow; - m = nncol; - return; - } - - if (nnrow < 0 || nncol < 0 ) { error_message("Negative arguments in Resize()"); } - - if (asize >= nnrow*nncol && atype==1 ) - { - for (i=nnrow*nncol+1;i<=asize;i++) { - a[i-1]=0.0; - } - n=nnrow; - m=nncol; - - return; - } - - - if ( a!=NULL && atype!=1 && auxFlag!=1 ) - { - - double* atemp = (double *) my_calloc( n*m, sizeof(double) ); - - if (!atemp) { - ERROR_MESSAGE("\nError allocating double array in DMatrix::Resize()"); - } - - memcpy( atemp, a, n*m*sizeof(double) ); - - DMatrix::DeAllocate(); - - asize = nnrow*nncol; - - DMatrix::Allocate(asize); - - memcpy( a, atemp, std::min( n*m, asize )*sizeof(double) ); - - n = nnrow; - - m = nncol; - - mxFree( atemp ) ; - - return; - - } - - if ( a!=NULL && auxFlag==1 ) { - - if (nnrow*nncol <= dimAux ) - { - n = nnrow; - m = nncol; - } - - else { - ERROR_MESSAGE("\nError resizing Temporary array in DMatrix::Resize()"); - } - - } - - - if ( a==NULL && atype==0 ) - { - n = nnrow; - m = nncol; - asize = nnrow*nncol; - DMatrix::Allocate(asize); - return; - } - - - if ( atype == 1 && nnrow*nncol > asize ) - { - - ERROR_MESSAGE("Size error in DMatrix::Resize"); - - } - - -} - - -DMatrix& DMatrix::Column( long icol ) const -{ -// Extracts one column from a DMatrix object -// Eg. C = A.Column(1); - - DMatrix* Temp; - - int i; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n , 1 ); - - for ( i= 1; i<= n ; i++ ) { - - (*Temp)(i) = elem( i, icol ); - - } - return *Temp; - -} - -DMatrix& DMatrix::Row( long irow ) const -{ -// Extracts one row from a DMatrix object -// Eg. R = A.Row( 1 ); - - DMatrix* Temp; - - int i; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( 1 , m ); - - for ( i= 1; i<= m ; i++ ) { - - (*Temp)(1,i) = elem( irow, i ); - - } - - return *Temp; - -} - -void DMatrix::SwapRows( int i , int j ) -{ -// Swaps two rows of a DMatrix object -// Eg. A.SwapRows( 1,2 ); - - - if ( (i<1) || (i>n) || (j<1) || (j>n) ) - { - - error_message( "Range error in SwapRows() "); - - } - - for (long ii = 1; ii<= m; ii++ ) { - - Swap( &elem(i,ii) , &elem( j, ii ) ); - - } - -} - -void DMatrix::SwapColumns( int i , int j ) -{ -// Swaps two columns of a DMatrix object -// Eg. A.SwapColumns( 1,2 ); - - if ( (i<1) || (i>m) || (j<1) || (j>m) ) - { - - error_message( "Range error in SwapColumns() "); - - } - - for (long ii = 1; ii<= n; ii++ ) { - - Swap( &elem(ii, i) , &elem(ii, j) ); - - } - -} - -void DMatrix::diag( const DMatrix& dd ) -{ -// Assigns values to the diagonal of a DMatrix object -// Eg. A.diag( V ); - - int i; - - FillWithZeros(); - - if ( n!=m || dd.GetNoRows()!=n || dd.GetNoCols()!=1 ) { - - error_message( "Dimension error in DMatrix::diag() "); - - } - - for ( i=1; i<= n; i++ ) { - - elem( i, i ) = dd(i); - - } - -} - -void DMatrix::SetColumn( const DMatrix& dd, int icol ) -{ -// Sets values to a column of a DMatrix object -// Eg. A.SetColumn( 1, C ); - - int i; - - if ( dd.GetNoRows()!=n || dd.GetNoCols()!=1 ) { - - error_message( "Dimension error in DMatrix::SetColumn() "); - - } - - for ( i=1; i<= n; i++ ) { - - elem( i, icol ) = dd(i); - - } - -} - -void DMatrix::SetRow( const DMatrix& dd, int irow ) -{ -// Sets values to a row of a DMatrix object -// Eg. A.SetRow( 1, R ); - - int i; - - if ( dd.GetNoRows()!=m || dd.GetNoCols()!=1 ) { - - error_message( "Dimension error in DMatrix::SetRow() "); - - } - - for ( i=1; i<= m; i++ ) { - - elem( irow, i ) = dd(i); - - } - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - -} - -void DMatrix::rowMult( long r, double x ) -{ -// Multiplies a row of a DMatrix object by a scalar -// Eg. A.rowMult( 1, 10.0 ); - - int i; - - if ( r < 1 || r> n ) { - - error_message( "Range error in DMatrix::rowMult() "); - - } - - for ( i=1; i<= m; i++ ) { - - elem( r, i ) *= x; - - } - -} - -void DMatrix::colMult( long c, double x ) -{ -// Multiplies a column of a DMatrix object by a scalar -// Eg. A.colMult( 1, 10.0 ); - - int i; - - if ( c < 1 || c> m ) { - - error_message( "Range error in DMatrix::colMult() "); - - } - - for ( i=1; i<= n; i++ ) { - - elem( i ,c ) *= x; - - } - -} - -void DMatrix::assign(long rows,long columns,double a11,...) -{ -// Assign values to a DMatrix object. -// the object is resized if necessary -// Eg. A.assign( 2,2 , 1.0, 0.0, -// -1.0, 4.0 ); - - long i,j; - - DMatrix::Resize(rows, columns); - - va_list List; - - va_start(List,a11); - - elem(1,1) = a11; - - for (i=1; i<=n; i++) { - - for (j=1; j<=m; j++) { - - if (i*j != 1) { - - elem(i,j) = va_arg(List, double); - - } - - } - - } - - va_end(List); - -} - - - - -void DMatrix::MemCpyArray(double * aptr ) -{ -// Copies the elements of an array to the array used for -// matrix storage in a DMatrix object -// Eg. double v[4] = { 1.0, 2.0, 4.0 , 9.0 } -// DMatrix A(2,2); -// ... -// A.MemCpyArray( v ); - - memcpy( a, aptr, n*m*sizeof(double) ); - -} - -void DMatrix::input_matrix() -{ -// Reads a matrix from the standard input - long i,j; - - for (i=1;i<=n;i++) - - { - - for (j=1;j<=m;j++) - - { - - PRINTF("Input DMatrix(%ld,%ld):",i,j); - - scanf("%lf", &elem( i, j) ); - - } - - } - -} - - -void DMatrix::SetPrintLevel( int plevel ) -{ - print_level=plevel; - return; -} - - -int DMatrix::PrintLevel() { - return print_level; -} - - - -void DMatrix::Print(const char* text) const -{ -// Prints a matrix -// Eg. A.Print(" A = "); - - - long i,j; - if (print_level) { -#ifndef MATLAB_MEX_FILE - fprintf(OUTPUT_STREAM,"\n%s\n",text); - for (i=1;i<=n;i++) - { - for (j=1;j<=m;j++) - { - fprintf(OUTPUT_STREAM," %s ", num2str(elem(i,j)) ); - fprintf(OUTPUT_STREAM,"\t"); - } - fprintf(OUTPUT_STREAM,"\n"); - } -#else - mexPrintf("\n%s\n",text); - for (i=1;i<=n;i++) - { - for (j=1;j<=m;j++) - { - mexPrintf(" %s ", num2str(elem(i,j)) ); - mexPrintf("\t"); - } - mexPrintf("\n"); - } -#endif - } - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - -} - - -void error_message(const char *error_text) -{ -// Error handling routine - - string m1; - string m2; - - m1 = "\n**** Run time error"; - m1 += "\n**** To trace this error, set up your debugger to break at"; - m1 += "\n**** function 'error_message', then do a backtrace."; - m1 += "\n**** A diagnostic message is given below:"; - m2 = error_text; - m2 = "\n**** ====> " + m2 + " <====\n\n"; - - if ( DMatrix::PrintLevel() ) { -#ifndef MATLAB_MEX_FILE - fprintf(OUTPUT_STREAM,"%s", m1.c_str()); - fprintf(OUTPUT_STREAM,"%s", m2.c_str()); - FILE* err_file = fopen("error_message.txt","w"); - fprintf(err_file,"%s", m1.c_str() ); - fprintf(err_file,"%s", m2.c_str() ); - fclose(err_file); -#else - mexPrintf("\n%s\n",m1.c_str()); - mexPrintf("%s\n",m2.c_str()); -#endif - } - - DMatrix::RiseErrorFlag(); - - throw ErrorHandler(m1+m2); - - -} - -ErrorHandler::ErrorHandler(const string m) -{ - error_message = m; -} - -DMatrix& DMatrix::operator+ (const DMatrix& Other_matrix) const -{ -// Matrix addition operator: Adds two matrices -// Example C = D + E; where C,D,E are DMatrix objects - - long i; - - const double* OtherPr = Other_matrix.GetConstPr(); - - DMatrix* Temp; - - long nelem = n*m; - - if (m != Other_matrix.m || n != Other_matrix.n) - - { ERROR_MESSAGE("Incoherent matrix dimensions in addition"); } - - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - - for (i=0; i< nelem; i++) - { - - Temp->GetPr()[i] = a[i] + OtherPr[i]; - - } - - return *Temp; - -} - - -DMatrix& DMatrix::operator+ (double arg) const -{ -// Matrix + scalar operator: Adds scalar to each element of the matrix. -// Example C = D + f; where C,D are DMatrix objects and f is a double - - long i; - - - DMatrix* Temp; - - long nelem = n*m; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - - for (i=0; i< nelem; i++) - { - - Temp->GetPr()[i] = a[i] + arg; - - } - - return *Temp; - -} - -DMatrix& DMatrix::operator- (double arg) const -{ -// Matrix - scalar operator: Subtracts scalar to each element of the matrix. -// Example C = D - f; where C,D are DMatrix objects and f is a double - - long i; - - - - DMatrix* Temp; - - long nelem = n*m; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - - for (i=0; i< nelem; i++) - { - - Temp->GetPr()[i] = a[i] - arg; - - } - - return *Temp; - -} - - - - -DMatrix& DMatrix::operator += (const DMatrix &rval) -{ -// Matrix addition with substitution -// Eg. A += B; ***** Equivalent to A = A+B; ****** - - long nelem = n*m; - - if(m != rval.m || n != rval.n ) - { - - ERROR_MESSAGE("Bad dimensions in DMatrix op. +="); - - } - - for (long i=0; i< nelem; i++ ) - { - - a[i] += rval.a[i]; - - } - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - - return *this; - -} - - - - -DMatrix& DMatrix::operator- (const DMatrix& Other_matrix) const -{ -// Matrix substraction operator: substracts two matrices -// Example C = D - E; where C,D,E are DMatrix objects - - long i; - - long nelem = n*m; - - const double *OtherPr = Other_matrix.GetConstPr(); - - DMatrix* Temp; - - if (m != Other_matrix.m || n != Other_matrix.n) - - { ERROR_MESSAGE("Incoherent matrix dimensions in substraction"); } - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - for (i=0; i< nelem; i++) - { - - Temp->GetPr()[i] = a[i] - OtherPr[i]; - - } - - return *Temp; -} - -DMatrix& DMatrix::operator -= (const DMatrix &rval) -{ -// Matrix substraction with substitution -// Eg. A -= B; ***** Equivalent to A = A-B; ****** - - long nelem = n*m; - - if(n != rval.GetNoRows() || m != rval.GetNoCols() ) - { - - ERROR_MESSAGE("Bad dimensions in DMatrix op. +="); - - } - - for (long i=0; i< nelem; i++ ) - { - - a[i] -= rval.GetConstPr()[i]; - - } - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - - return *this; - -} - - -DMatrix& operator- (const DMatrix& A) -{ -// Matrix unary minus operator -// Eg. C = -A; - - - long nelem = A.GetNoRows()*A.GetNoCols(); - const double *Apr = A.GetConstPr(); - DMatrix* Temp; - - - - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.GetNoRows(), A.GetNoCols() ); - - - for(long i=0; i< nelem; i++) - { - - Temp->GetPr()[i] = -Apr[i]; - - } - - return *Temp; - -} - - - -DMatrix& DMatrix::operator* (const DMatrix& B) const -{ -// Matrix product operator, multiplies two matrices -// Eg. C = A*B; - - return Product( *this, B ); - -} - -DMatrix& Product(const DMatrix& A, const DMatrix& B) -{ -// Matrix product optimised for vector columnwise storage - - long i,j,k,na,nb,mb; - - long rowA, colB; - - double sum; - - DMatrix *Temp; - - na=A.n; - - mb=B.m; - - nb=B.n; - - const double* apr = A.GetConstPr(); - - const double* bpr = B.GetConstPr(); - - if (A.m != nb ) - - { ERROR_MESSAGE("Incoherent matrix dimensions in product"); } - - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n, mb ); - - for (i=0; i< na; i++) - { - - - for (j=0; jelem(i+1,j+1) = sum; - - } - - } - - return *Temp; - -} - -DMatrix& crossProduct(const DMatrix& x, const DMatrix& y) -{ - - if ( !x.isVector() || !y.isVector() ) - error_message("Both arguments must be vectors in crossProduct()"); - - if (length(x) != 3 ) { - error_message("length of first argument is not 3 in crossProduct()"); - } - - if (length(y) != 3 ) { - error_message("length of second argument is not 3 in crossProduct()"); - } - - DMatrix *Temp; - - DMatrix A(3,3); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - - Temp->Resize( x.n, x.m ); - - A.FillWithZeros(); - - A(1,2) = -x(3); A(1,3)= x(2); - A(2,1) = x(3); A(2,3)=-x(1); - A(3,1) = -x(2); A(3,2)= x(1); - - (*Temp) = A*y; - - return *Temp; - -} - - -DMatrix& DMatrix::operator*= (const DMatrix& Other_matrix) -{ -// Matrix product operator with substitution -// Eg. C *= A; ***** Equivalent to C = C*A ******* - - long i,j,k,na,nb,mb; - - double sum; - - DMatrix* Temp; - - na=n; - - mb=Other_matrix.m; - - nb=Other_matrix.n; - - if (m != nb ) - - { ERROR_MESSAGE("wrong matrix dimensions in op. *="); } - - - double *pr; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( na, mb ); - - pr = Temp->GetPr(); - - for (i=1; i<=na; i++) - { - - for (j=1; j<=mb; j++) - { - - sum=0.0; - - for (k=1; k<=nb; k++) - { - - sum += elem(i,k)*Other_matrix.elem(k,j); - - } - - - Temp->elem(i,j) = sum; - - } - - } - - memcpy(a,pr, n*m*sizeof(double)); - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - - return *this; - -} - - - - - -DMatrix& DMatrix::operator* (double Arg) const -{ -// Matrix by scalar product. -// Eg. C = A*x, where C & A are DMatrix objects and x is a double - long i; - - long nelem = n*m; - - DMatrix* Temp; - - double *pr; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - pr = Temp->GetPr(); - - for( i=0; i< nelem; i++ ) - { - - pr[i] = a[i]*Arg; - - } - - return *Temp; - -} - - -DMatrix& DMatrix::operator*= (double Arg) -{ -// Matrix by scalar product with substitution -// Eg. C *= x, where C is a DMatrix object and x is a double -// Equivalent to: C = C*x; - - long i; - - long nelem = n*m; - - for( i=0; i< nelem; i++ ) - { - - a[i] *= Arg; - - } - - return *this; - -} - -DMatrix& DMatrix::operator/ (const DMatrix& rval) const -{ -// Right division implementation, B/A == B*inv(A) - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, rval.m ); - - *Temp = tra( tra(rval)%tra(*this) ); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - - -DMatrix& DMatrix::operator/ (double Arg) const -{ -// Matrix scalar division. -// Eg. C = A/x, where C & A are DMatrix objects and x is a double - - long i; - - long nelem = n*m; - - DMatrix* Temp; - - double *pr; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - pr = Temp->GetPr(); - - for( i=0; i< nelem; i++ ) - { - - pr[i] = a[i]/Arg; - - } - - return *Temp; - -} - - -DMatrix& DMatrix::operator/= (double Arg) -{ -// Matrix by scalar division with substitution -// Eg. C /= x, where C is a DMatrix object and x is a double -// Equivalent to: C = C/x; - - long i; - - long nelem = n*m; - - for( i=0; i< nelem; i++ ) - { - - a[i] /= Arg; - - } - - return *this; - -} - - -DMatrix& operator *(double Arg, const DMatrix& A) -{ -// Scalar by Matrix product. -// Eg. C = x*A, where C & A are DMatrix objects and x is a double - - - long i,n,m,nelem; - - const double * Apr = A.GetConstPr(); - - n=A.GetNoRows(); - - m=A.GetNoCols(); - - nelem = n*m; - - DMatrix* Temp; - - double *pr; - - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - pr = Temp->GetPr(); - - - for (i=0; i< nelem; i++ ) - { - - pr[i] = Apr[i]*Arg; - - } - - return *Temp; - -} - - -DMatrix& DMatrix::operator < ( double val ) const -{ -// Relational < operator -// Elementwise comparision -// A DMatrix object is returned contaning zeros and ones -// Eg D = C < x ; where D and C are DMatrix objects and x is a double - - long nelem = n*m; - - long i; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - for ( i=0; i< nelem; i++ ) - { - - if ( a[i] < val ) Temp->a[i] = 1.0; - - else Temp->a[i] = 0.0; - - } - - return *Temp; - -} - -DMatrix& DMatrix::operator <= ( double val ) const -{ -// Relational <= operator -// Elementwise comparision -// A DMatrix object is returned contaning zeros and ones -// Eg D = C <= x ; where D and C are DMatrix objects and x is a double - - long nelem = n*m; - - long i; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - for ( i=0; i< nelem; i++ ) - { - - if ( a[i] <= val ) Temp->a[i] = 1.0; - - else Temp->a[i] = 0.0; - - } - - return *Temp; - -} - -DMatrix& DMatrix::operator > ( double val ) const -{ -// Relational > operator -// Elementwise comparision -// A DMatrix object is returned contaning zeros and ones -// Eg D = C > x ; where D and C are DMatrix objects and x is a double - - long nelem = n*m; - - long i; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - for ( i=0; i< nelem; i++ ) - { - - if ( a[i] > val ) Temp->a[i] = 1.0; - - else Temp->a[i] = 0.0; - - } - - return *Temp; - -} - -DMatrix& DMatrix::operator >= ( double val ) const -{ -// Relational >= operator -// Elementwise comparision -// A DMatrix object is returned contaning zeros and ones -// Eg D = C >= x ; where D and C are DMatrix objects and x is a double - - long nelem = n*m; - - long i; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - for ( i=0; i< nelem; i++ ) - { - - if ( a[i] >= val ) Temp->a[i] = 1.0; - - else Temp->a[i] = 0.0; - - } - - return *Temp; - -} - -DMatrix& DMatrix::operator == ( double val ) const -{ -// Relational == operator -// Elementwise comparision -// A DMatrix object is returned contaning zeros and ones -// Eg D = ( C == x ); where D and C are DMatrix objects and x is a double - - long nelem = n*m; - - long i; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - for ( i=0; i< nelem; i++ ) - { - - if ( a[i] == val ) Temp->a[i] = 1.0; - - else Temp->a[i] = 0.0; - - } - - return *Temp; - -} - - - -DMatrix& DMatrix::operator = (const char* str) -{ - char cnumber[20]; - long rowcount = 1; - long colcount = 0; - long i = 0; - double value; - if ( str[0]!='[') { - -// fprintf(stderr,"\n1: str[0] = %c", str[0]); - error_message("Input error in function DMatrix::operator = (const char* str)"); - } - - int pos = 1; - int j = 0; - int dotcount = 0; - - - bool nflag = false; - - // First pass to find out the number of rows and columns. - - while(1) { - if (str[pos]==' ') { - pos++; - } - while ( str[pos]=='1' || str[pos]=='2' ||str[pos]=='3' || str[pos]=='4' ||str[pos]=='5' || str[pos]=='6' ||str[pos]=='7' || str[pos]=='8' || str[pos]=='9' || str[pos] == '0' || str[pos] == '.' || str[pos]=='-' || str[pos]=='+' || str[pos]=='e' || str[pos]=='E' ) - { - cnumber[j] = str[pos]; - j++; - pos++; - if (str[pos]=='.') { - dotcount++; - } - if (dotcount > 1) { - error_message("Input error in function DMatrix::operator = (const char* str)"); - } - nflag = true; - } - if( nflag && dotcount ) { - cnumber[j]='\0'; - } - if( nflag && dotcount==0 ) { - cnumber[j] = '.'; - cnumber[j+1]='\0'; - } - if ( nflag && rowcount==1 ) { - colcount++; - } - j = 0; - dotcount = 0; - if (str[pos]==';') { - rowcount++; - } - else if (str[pos]==']') { - break; - } - else if (str[pos] != ' ' && str[pos]!=',') { - error_message("Input error in function DMatrix::operator = (const char* str)"); - } - if (nflag) { - nflag = false; - } - pos++; - } - - this->Resize(rowcount,colcount); - - pos = 1; - j = 0; - dotcount = 0; - - nflag = false; - - // Second pass to actually fill the values - - rowcount= 1; - colcount= 0; - - - while(1) { - if (str[pos]==' ' || str[pos]==',') { - pos++; - } - while ( str[pos]=='1' || str[pos]=='2' ||str[pos]=='3' || str[pos]=='4' ||str[pos]=='5' || str[pos]=='6' ||str[pos]=='7' || str[pos]=='8' || str[pos]=='9' || str[pos] == '0' || str[pos] == '.' || str[pos]=='-' || str[pos]=='+' || str[pos]=='e' || str[pos]=='E') - { - cnumber[j] = str[pos]; - j++; - pos++; - if (str[pos]=='.') { - dotcount++; - } - if (dotcount > 1) { - error_message("Input error in function DMatrix::operator = (const char* str)"); - } - nflag = true; - } - if( nflag && dotcount ) { - cnumber[j]='\0'; - } - if( nflag && dotcount==0 ) { - cnumber[j] = '.'; - cnumber[j+1]='\0'; - } - if ( nflag ) { - colcount++; - } - j = 0; - dotcount = 0; - if (nflag) { - sscanf(cnumber, "%lf", &value); - this->elem(rowcount,colcount) = value; - i++; - nflag = false; - } - - if (str[pos]==';') { - rowcount++; - colcount = 0; - } - else if (str[pos]==']') { - break; - } - else if (str[pos] != ' ' && str[pos] !=',' ) { - error_message("Input error in function DMatrix::operator = (const char* str)"); - } - if (nflag) { - nflag = false; - } - pos++; - } - - return (*this); -} - -DMatrix& DMatrix::operator != ( double val ) const -{ -// Relational != operator -// Elementwise comparision -// A DMatrix object is returned contaning zeros and ones -// Eg D = ( C != x ); where D and C are DMatrix objects and x is a double - - long nelem = n*m; - - long i; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - for ( i=0; i< nelem; i++ ) - { - - if ( a[i] != val ) Temp->a[i] = 1.0; - - else Temp->a[i] = 0.0; - - } - - return *Temp; - -} - - -DMatrix& DMatrix::compMat( const DMatrix& mtx, char op ) const -{ -// Elementwise matrix comparision function - - long nelem = n*m; - - long i; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - if ( n!=mtx.n || m!=mtx.m ) error_message("\n Dimension error in operator function DMatrix::compMat()"); - - for ( i=0; i< nelem; i++ ) - { - switch( op ) { - case 1: - if ( a[i] > mtx.a[i] ) Temp->a[i] = 1.0; - else Temp->a[i] = 0.0; break; - case 2: - if ( a[i] >= mtx.a[i] ) Temp->a[i] = 1.0; - else Temp->a[i] = 0.0; break; - case 3: - if ( a[i] < mtx.a[i] ) Temp->a[i] = 1.0; - else Temp->a[i] = 0.0; break; - case 4: - if ( a[i] <= mtx.a[i] ) Temp->a[i] = 1.0; - else Temp->a[i] = 0.0; break; - case 5: - if ( a[i] == mtx.a[i] ) Temp->a[i] = 1.0; - else Temp->a[i] = 0.0; break; - case 6: - if ( a[i] != mtx.a[i] ) Temp->a[i] = 1.0; - else Temp->a[i] = 0.0; break; - - } /* end switch */ - - } /* end for */ - - return *Temp; - -} - -DMatrix& DMatrix::operator > ( const DMatrix& mtx ) const -{ - return this->compMat( mtx, 1 ); -} - -DMatrix& DMatrix::operator >= ( const DMatrix& mtx ) const -{ - return this->compMat( mtx, 2 ); -} - -DMatrix& DMatrix::operator < ( const DMatrix& mtx ) const -{ - return this->compMat( mtx, 3 ); -} - -DMatrix& DMatrix::operator <= ( const DMatrix& mtx ) const -{ - return this->compMat( mtx, 4 ); -} - -DMatrix& DMatrix::operator == ( const DMatrix& mtx ) const -{ - return this->compMat( mtx, 5 ); -} - -DMatrix& DMatrix::operator != ( const DMatrix& mtx ) const -{ - return this->compMat( mtx, 6 ); -} - -void DMatrix::SetMType( int arg ) -{ - if (arg !=0 && arg !=1) { - ERROR_MESSAGE("Incorrect argument value in DMatrix::SetMType"); - } - mtype = arg; -} - - -int any( const DMatrix& mtx ) -{ - int retval; - if (MaxAbs( mtx ) > 0.0) retval = 1; - else retval = 0; - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - return retval; -} - -DMatrix& tra(const DMatrix& A) -{ -// Matrix transposition, friend implementation -// Eg. C = tra(A); - long i,j,n,m; - - n=A.n; - - m=A.m; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( m, n ); - - - for (i=1;i<=n;i++) - { - - for( j=1;j<=m;j++) - { - - Temp->elem(j,i) = A.elem(i,j); - - } - - } - - return *Temp; - -} - -void DMatrix::Transpose(void) -{ -// Transposes and modifies a matrix -// Eg. A.Transpose(); - - int i,j,tmp; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( m, n ); - - for (i=1;i<=n;i++) - { - - for( j=1;j<=m;j++) - { - - Temp->elem(j,i) = elem(i,j); - - } - - } - - tmp = n; - n = m; - m = tmp; - - memcpy( a, Temp->a, n*m*sizeof(double) ); - - -} - - - -DMatrix& TProduct(const DMatrix& A, const DMatrix& B) -{ -// Returns the product tra(A)*B -// Eg. C = Tproduct(A,B); - - long i,j,k,na,nb,mb; - - double sum; - - DMatrix *Temp; - - na=A.m; - - mb=B.m; - - nb=B.n; - - if (A.n != nb ) - - { ERROR_MESSAGE("Incoherent matrix dimensions in TProduct()"); } - - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.m, mb ); - - for (i=1; i<=na; i++) - { - - for (j=1; j<=mb; j++) - { - - sum=0.0; - - for (k=1; k<=nb; k++) - { - - sum += A.elem(k,i)*B.elem(k,j); - - } - - Temp->elem(i,j) = sum; - - } - - } - - return *Temp; - -} - -DMatrix& ProductT(const DMatrix& A, const DMatrix& B) -{ -// Returns the product A*tra(B) -// Eg. C = productT(A,B); - - - long i,j,k,na,nb,mb; - - double sum; - - DMatrix *Temp; - - na=A.n; - - mb = B.n; - - nb= B.m; - - if (A.m != nb ) - - { ERROR_MESSAGE("Incoherent matrix dimensions in ProductT"); } - - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n, mb ); - - for (i=1; i<=na; i++) - { - - for (j=1; j<=mb; j++) - { - - sum=0.0; - - for (k=1; k<=nb; k++) - { - - sum += A.elem(i,k)*B.elem(j,k); - - } - - Temp->elem(i,j) = sum; - - } - - } - - return *Temp; - -} - -DMatrix& TProductT(const DMatrix& A, const DMatrix& B) -{ -// Matrix TProductT optimised for vector storage -// Returns the product tra(A)*tra(B) -// Eg. C = TProductT(A,B); - - long i,j,k; - - long colA, rowB; - - double sum; - - DMatrix *Temp; - - const double* apr = A.GetConstPr(); - - const double* bpr = B.GetConstPr(); - - if (A.n != B.m ) - - { ERROR_MESSAGE("Incoherent matrix dimensions in TProductT()"); } - - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.m, B.n ); - - for (i=0; i< A.m; i++) - { - - - for (j=0; jelem(i+1,j+1) = sum; - - } - - } - - return *Temp; - -} - -DMatrix& inv(const DMatrix& A) -{ -// Matrix inversion -// Uses Gauss-Jordan elimination -// Eg. C = inv(A); - - long i,p,k,n,m; - - double* a; - - double pivot; - - DMatrix* Temp; - - n=A.n; - - m=A.m; - - if (n!=m) ERROR_MESSAGE("matrix must be square in inv()"); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - memcpy( Temp->a, A.a, A.n*A.m*sizeof(double) ); - - a = Temp->a; - - for (p=0;pelem(i,k)=Temp->elem(i,k)-Temp->elem(i,p)*Temp->elem(p,k)/Temp->elem(p,p); - a[k*n+i] += -a[p*n+i]*a[k*n+p]/pivot; - - } - - } - - } - - } - - for (i=0;ielem(i,p)=-Temp->elem(i,p)/Temp->elem(p,p); - a[p*n+i] = -a[p*n+i]/pivot; - -// Temp->elem(p,i)=Temp->elem(p,i)/Temp->elem(p,p); - a[i*n+p]=a[i*n+p]/pivot; - - - } - - } - - - if (a[p*n+p]==0.0) ERROR_MESSAGE("singular matrix"); - -// Temp->elem(p,p)=1/Temp->elem(p,p); - a[p*n+p]=1/pivot; - - - } - - return *Temp; - -} - - - -DMatrix& DMatrix::operator= (const DMatrix& Other_matrix) -{ -// Matrix Assignment operator -// Eg. A = B; - - - if ( GetMType() == 1 ) { - - return (AssignmentToColonReference( Other_matrix )); - - } - - else { - - if (n > 0 && m>0) { - - if (n != Other_matrix.n || m != Other_matrix.m) - - this->Resize(Other_matrix.n,Other_matrix.m); - - } - - else { - - n = Other_matrix.n; - - m = Other_matrix.m; - if (atype==0 && auxFlag!=1) - DMatrix::Allocate(n*m); - - } - - memcpy( a, Other_matrix.a, n*m*sizeof(double) ); - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - - return *this; - - } /* End if */ - -} - - - -void DMatrix::DeAllocate() -/* free the arrays allocated with Allocate() */ -{ - - if (n!=0 && m!=0 ) { - - if (allocated==true) { - mxFree((FREE_ARG) (a) ); - allocated=false; - } - - } - -} - - -void DMatrix::Read(FILE *filex) -{ - - long i,j; - - for (i=1;i<=n;i++) { - - for (j=1;j<=m;j++) { - - fscanf(filex,"%lf",&elem(i,j)); - - } - } - -} - - - -DMatrix& identity(long ndim) -{ - - long i; - - double *pr; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( ndim, ndim ); - - pr = Temp->GetPr(); - - memset(pr, 0, ndim*ndim*sizeof(double) ); - - for( i=0; iResize( ndim, mdim ); - - pr = Temp->GetPr(); - - memset(pr, 0, ndim*mdim*sizeof(double) ); - - for( i=0; iResize(ndim,ndim); - - Temp->FillWithZeros(); - - for(i=1;i<=ndim;i++) { - - (*Temp)(i,i) = (*v)(i); - - } - - } - - else { - - ndim = MIN( A.GetNoRows(), A.GetNoCols() ); - - Temp->Resize( ndim , 1 ); - - for( i=0; ia[ i ] = A( i+1, i+1 ); - - } - - } /* End if */ - - return *Temp; - - -} - -DMatrix& vec(const DMatrix& A ) -{ - - long i; - - int ndim = A.n*A.m; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( ndim , 1 ); - - for( i=0; ia[ i ] = A.a[i]; - - } - - return *Temp; - -} - -void DMatrix::FillWithZeros( void ) -{ - - memset( a , 0, n*m*sizeof(double) ); - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - -} - - -DMatrix& zeros(long nrows, long ncols) -{ - - - long nelem = nrows*ncols; - - double *pr; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( nrows, ncols ); - - pr = Temp->GetPr(); - - memset(pr, 0, nelem*sizeof(double) ); - - return *Temp; - -} - -DMatrix& ones(long nrows, long ncols) -{ - - long i; - - long nelem = nrows*ncols; - - double *pr; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( nrows, ncols ); - - pr = Temp->GetPr(); - - for ( i=0; i< nelem; i++ ) { - - pr[i] = 1.0; - - } - - return *Temp; - -} - - - -DMatrix& expm(const DMatrix& B) -#ifdef EXPM_RECURSIVE -{ - long k; - - int e; - - long nrow = B.getn(); - - long ncol = B.getm(); - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - - DMatrix *E, *A; - - E = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - A = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - E->Resize(nrow, ncol); - A-> Resize(nrow,ncol); - - *A = eye(nrow); - - *E = eye(nrow); - - - for(k=1; k<=EXPM_RECURSIVE; k++) { - - *E *= B; - - *A += (*E)/factorial(k); - - } - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return (*A); - -} - -#else -{ - // Uses pade approximation method to find - // the exponential matrix. - - - double c; - - long q, p, s, k; - - int e; - - long nrow = B.getn(); - - long ncol = B.getm(); - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - - DMatrix *E, *X, *cX, *D, *A; - - E = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - X = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - cX = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - D = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - A = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - E->Resize(nrow, ncol); - X-> Resize(nrow,ncol); - cX->Resize(nrow,ncol); - D-> Resize(nrow,ncol); - A-> Resize(nrow,ncol); - - *A = B; - - - - if ( nrow!= ncol ) { - - ERROR_MESSAGE("expm: Matrix must be square"); - - } - - - frexp( InfNorm(*A), &e ); - - s = MAX( 0 , e+1 ); - - (*A) /= pow(2.0, (double) s); -// DMatrix::SetAuxIndx( -1 ); - - *X = *A; -// DMatrix::SetAuxIndx( -1 ); - - c = 0.5; - - *E = *A; -// DMatrix::SetAuxIndx( -1 ); - *E *= c; -// DMatrix::SetAuxIndx( -1 ); - *E += identity( nrow ); - -// DMatrix::SetAuxIndx( -1 ); - - (*D) = *A; -// DMatrix::SetAuxIndx( -1 ); - (*D) *= -c; -// DMatrix::SetAuxIndx( -1 ); - (*D) += identity( nrow ); -// DMatrix::SetAuxIndx( -1 ); - - q = 6; - - p = 1; - - for (k =2; k<=q; k++ ) - { - - c = c*(q-k+1) / (k*(2*q-k+1)); - - *X = (*A)*(*X); - -// DMatrix::SetAuxIndx( -1 ); - - *cX = c*(*X); - -// DMatrix::SetAuxIndx( -1 ); - - (*E) += (*cX); - -// DMatrix::SetAuxIndx( -1 ); - - if (p) - { - - (*D) += (*cX); -// DMatrix::SetAuxIndx( -1 ); - - } - - else - { - - (*D) -= (*cX); -// DMatrix::SetAuxIndx( -1 ); - - } - - if ( p == 0 ) p =1; - - else { p = 0; } - - } - - (*E) = (*D)%(*E); - -// DMatrix::SetAuxIndx( -1 ); - - for (k =1; k<= s; k++ ) - { - - (*E) *= (*E); -// DMatrix::SetAuxIndx( -1 ); - - } - - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *E; - -} - -#endif - - -DMatrix& sin(const DMatrix& A) -{ - // Element-wise sin of a matrix - - long i; - - long nrow = A.getn(); - - long ncol = A.getm(); - - int localFlag = 0; - - double* temp_pr; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize(nrow, ncol); - - temp_pr = Temp->GetPr(); - - for( i =0; i< nrow*ncol; i++) - { - - temp_pr[i] = sin( A.a[i] ); - - } - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& cos(const DMatrix& A) -{ - // Element-wise cosine of a matrix - - long i; - - long nrow = A.getn(); - - long ncol = A.getm(); - - int localFlag = 0; - - double* temp_pr; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize(nrow, ncol); - - temp_pr = Temp->GetPr(); - - for( i =0; i< nrow*ncol; i++) - { - - temp_pr[i] = cos( A.a[i] ); - - } - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& tan(const DMatrix& A) -{ - // Element-wise tangent of a matrix - - long i; - - long nrow = A.getn(); - - long ncol = A.getm(); - - int localFlag = 0; - - double* temp_pr; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize(nrow, ncol); - - temp_pr = Temp->GetPr(); - - for( i =0; i< nrow*ncol; i++) - { - - temp_pr[i] = tan( A.a[i] ); - - } - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& exp(const DMatrix& A) -{ - // Element-wise exponential of a matrix - - long i; - - long nrow = A.getn(); - - long ncol = A.getm(); - - int localFlag = 0; - - double* temp_pr; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize(nrow, ncol); - - temp_pr = Temp->GetPr(); - - for( i =0; i< nrow*ncol; i++) - { - - temp_pr[i] = exp( A.a[i] ); - - } - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - - -DMatrix& tanh(const DMatrix& A) -{ - // Element-wise hyperbolic tangent of a real matrix - - long i; - - long nrow = A.getn(); - - long ncol = A.getm(); - - int localFlag = 0; - - double* temp_pr; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize(nrow, ncol); - - temp_pr = Temp->GetPr(); - - for( i =0; i< nrow*ncol; i++) - { - - temp_pr[i] = tanh( A.a[i] ); - - } - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& sinh(const DMatrix& A) -{ - // Element-wise hyperbolic sine of a real matrix - - long i; - - long nrow = A.getn(); - - long ncol = A.getm(); - - int localFlag = 0; - - double* temp_pr; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize(nrow, ncol); - - temp_pr = Temp->GetPr(); - - for( i =0; i< nrow*ncol; i++) - { - - temp_pr[i] = sinh( A.a[i] ); - - } - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& cosh(const DMatrix& A) -{ - // Element-wise hyperbolic cosine of a real matrix - - long i; - - long nrow = A.getn(); - - long ncol = A.getm(); - - int localFlag = 0; - - double* temp_pr; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize(nrow, ncol); - - temp_pr = Temp->GetPr(); - - for( i =0; i< nrow*ncol; i++) - { - - temp_pr[i] = cosh( A.a[i] ); - - } - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - - -DMatrix& log(const DMatrix& A) -{ - // Element-wise natural logarithm of a matrix - // Elements of A must be positive - - long i; - - long nrow = A.getn(); - - long ncol = A.getm(); - - int localFlag = 0; - - double* temp_pr; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize(nrow, ncol); - - temp_pr = Temp->GetPr(); - - for( i =0; i< nrow*ncol; i++) - { - - if (A.a[i]<0.0) error_message("Attempt to compute the natural logarithm of a negative number in log(const DMatrix&)"); - - temp_pr[i] = log( A.a[i] ); - - } - - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - - - -DMatrix& DMatrix::operator ||(const DMatrix& B) const -{ // Creates a matrix by putting a matrix beside other matrix - - - long i,j; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - if (n==0 || m==0) { - - Temp->Resize( B.n, B.m); - - *Temp = B; - - return *Temp; - - } - - if (n!=B.n) ERROR_MESSAGE("Wrong matrix dimensions in operator ||"); - - - - Temp->Resize( n, m + B.m ); - - for (i=1;i<=n;i++) { - - for (j=1;j<=m;j++) { - - Temp->elem(i,j) = elem( i, j ); - - } - - } - - for (i=1;i<=n;i++) { - - for (j=(m+1);j<=(m+B.m);j++) { - - Temp->elem(i,j) = B.elem( i, j-m ); - - } - - } - - return *Temp; - -} - - - - -DMatrix& DMatrix::operator &&(const DMatrix& B) const -{ // Creates a matrix by putting a matrix below other matrix - - long i,j; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - - if (n==0 || m==0) { - - Temp->Resize( B.n, B.m); - - *Temp = B; - - return *Temp; - - } - - - if (m!=B.m) ERROR_MESSAGE("Wrong matrix dimensions in operator &&"); - - - Temp->Resize( n+B.n , m ); - - for (i=1;i<=n;i++) { - - for (j=1;j<=m;j++) { - - - Temp->elem( i, j ) = elem( i, j ); - - } - - } - - for (i=(n+1);i<=(n+B.n);i++) { - - for (j=1;j<=m;j++) { - - Temp->elem( i, j ) = B.elem( i-n, j ); - - } - - } - - return *Temp; - -} - - - - - - - -double enorm(const DMatrix& A) // euclidean norm function -{ - - return ( ArrayNorm( A.n*A.m, A.a ) ); - -} - - - -#ifdef LAPACK -double norm(const DMatrix& A) // matrix norm function -{ - if ( A.n > 1 || A.m > 1 ) - return Max( SVD( A ) ); - else - return enorm( A ); -} -#endif /* LAPACK */ - -double Fnorm(const DMatrix& A) // F-norm function -{ - - return sqrt( trace( TProduct(A,A) ) ); - -} - -DMatrix& DMatrix::operator &(const DMatrix& B) const -{ - return elemProduct(*this,B); -} - -DMatrix& elemProduct( const DMatrix& A, const DMatrix& B ) -{ - - // element by element matrix product - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n, A.m ); - - if ( (A.n != B.n) || (A.m != B.m) ) { - - error_message( "Dimension error in elemProduct()"); - - } - - for ( long i=0; i< A.n*A.m; i++ ) { - - - Temp->a[i] = A.a[i] * B.a[i] ; - - } - - return *Temp; - -} - -DMatrix& DMatrix::operator |(const DMatrix& B) const -{ - return elemDivision(*this,B); -} - - -DMatrix& elemDivision( const DMatrix& A, const DMatrix& B ) -{ - - // element by element matrix division - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n, A.m ); - - if ( (A.n != B.n) || (A.m != B.m) ) { - - error_message( "Dimension error in elemDivision()"); - - } - - for ( long i=0; i< A.n*A.m; i++ ) { - - - Temp->a[i] = A.a[i] / B.a[i] ; - - } - - return *Temp; - -} - - - - -DMatrix& kronProduct( const DMatrix& A, const DMatrix& B ) -{ - - // kronecker product of two matrices - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n*B.n, A.m*B.m ); - - for (long i = 1; i<= A.n; i++ ) { - - for (long j = 1; j<= A.m; j++ ) { - - Temp->SetSubMatrix( (i-1)*B.n + 1, (j-1)*B.m + 1 , - - A.elem(i,j)*B ); - - } - - } - - return (*Temp); - -} - -DMatrix& MatrixSign( const DMatrix& A ) -{ - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n, A.m ); - - for (long i= 0; i< A.n*A.m; i++ ) { - - if ( A.a[i] > 0 ) { - - Temp->a[ i ] = 1.0; - - } - else { - - if ( A.a[i] < 0 ) { - - Temp->a[ i ] = -1.0; - - } - else Temp->a[ i ] = 0.0; - - } - - } - - return *Temp; - -} - -double dotProduct(const DMatrix& A, const DMatrix& B) -{ -// dot Product between vectors - - long i; - - double sum; - - long nelem = A.n*A.m; - - if ( !A.isVector() || !B.isVector() ) - error_message("A and B must be vectors in dotProduct()"); - - if ( A.n*A.m != B.n*B.m ) error_message("dotProduct() dimension error"); - - sum=0.0; - - - for( i=1 ; i<= nelem; i++ ) - { - - sum += A(i)*B(i); - - } - - return sum; - -} - -double trace(const DMatrix& A) // matrix trace function -{ - - long i; - - double sum; - - long n = A.n; - - if ( A.n != A.m ) error_message("trace() dimension error"); - - sum=0.0; - - - for( i=1 ; i<= n; i++ ) - { - - sum += A(i,i); - - } - - return sum; - -} - - -DMatrix& sum(const DMatrix& A) // matrix sum function -{ -// Returns a row vector containing the sum of values of each column - - long i, j; - - double sum; - - DMatrix* Temp; - - sum=0.0; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( 1, A.m ); - - - for ( j = 1; j<=A.m; j++ ) { - - - for( i=1 ; i<= A.n; i++ ) - { - - sum += A.elem(i,j); - - } - - Temp->elem(1,j) = sum; - - sum=0; - - } - - return *Temp; - -} - -DMatrix& mean(const DMatrix& A) // matrix mean function -{ - - DMatrix* Temp; - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - *Temp = ( sum( A )/( (double) A.n ) ); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return (*Temp); - -} - -DMatrix& prod(const DMatrix& A) // matrix prod function -{ -// Returns a row vector containing the product of elements of each column - - long i, j; - - double sum; - - DMatrix* Temp; - - sum=1.0; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( 1, A.m ); - - - for ( j = 1; j<=A.m; j++ ) { - - - for( i=1 ; i<= A.n; i++ ) - { - - sum *= A.elem(i,j); - - } - - Temp->elem(1,j) = sum; - - sum=1.0; - - } - - return *Temp; - -} - - -DMatrix& Std(const DMatrix& A, int ntype) -{ -// matrix standard deviation function -// Computes the standard deviation of each column of A -// The result is returned as a row vector - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - long i , j ; - - long n = A.n; - - long m = A.m; - - DMatrix* Temp; - - DMatrix* ave; - - const double *Apr = A.GetConstPr(); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ave = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( 1 ,m ); - - ave->Resize( 1, m ); - - Temp->FillWithZeros(); - - *ave = mean( A ); - - if ( m == 1 || n == 1) { - - m = MAX(m,n); - - (*Temp)(1,1) = enorm( A - ((sum(A))/m)(1,1) ); - - } - else { - - *Temp = zeros( ave->GetNoRows(), ave->GetNoCols() ); - - for( i=1; i<= ave->GetNoCols(); i++ ) { - - (*Temp)(i) = 0.0; - - for(j=1; j<= A.GetNoRows(); j++) { - - (*Temp)(i) += pow( A(j,i) - (*ave)(i) , 2.0); - - } - - (*Temp)(i) = sqrt((*Temp)(i)); - - } - - - } - - if ( n == 1 ) Temp->FillWithZeros(); - - else { - - if (ntype==0) { - - *Temp /= sqrt((double) (n-1)); - - } - - else { - - *Temp /= sqrt( (double) (n) ); - - } - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& Std(const DMatrix& A) { - return Std(A, 0); -} - -DMatrix& cov(const DMatrix& A, int ntype) -{ -// Computes the covariance matrix of a data matrix where -// the N rows correspond to samples and the M columns are variables -// The result is returned as an M x M matrix. If ntype=0 (default) -// then the result is normalised with N-1. Otherwise, if ntype=1, the -// result is normalised with N. - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - long i , j , k; - - long n = A.n; - - long m = A.m; - - DMatrix* Temp; - - DMatrix* ave; - - DMatrix* As; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - As = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ave = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( m ,m ); - - ave->Resize( 1, m ); - - As->Resize( n, m ); - - Temp->FillWithZeros(); - - *ave = mean( A ); - - *As = A; - - for (j=1; j<=m; j++ ) { - - (*As)(colon(), j ) = (*As)(colon(),j) - (*ave)(j); - - } - - for (k=1; k<=n; k++) { - - for (i=1; i<= m; i++ ) { - - for (j=1; j<=m; j++ ) { - - Temp->elem(i,j) += As->elem(k,i)*As->elem(k,j); - - } - - } - - } - - if (n > 1) { - - if (ntype == 0) { - - *Temp = (*Temp)/( (double) (n-1) ); - - } - - else { - - *Temp = (*Temp)/( (double) (n) ); - - } - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& cov(const DMatrix& A) { - return cov(A, 0); -} - -DMatrix& cov( DMatrix& X, DMatrix& Y, int ntype) -{ -// Covariance of two vectors -// This is equivalent to cov( [x(:) y(:)], ntype ); -// See the description of cov(DMatrix& A, int ntype) above - - return cov( ( X(colon()) || Y(colon()) ), ntype ); - -} - - - -DMatrix& var(DMatrix& x, int ntype) -{ -// Variance of the colunms of a matrix -// Returns a row vector (a DMatrix object reference) with -// the values of the variance of each column of the input matrix A. - - return tra(diag( cov( x, ntype ) )); - -} - - -DMatrix& Abs(const DMatrix& A) // matrix absolute value function -{ -// Returns a matrix containing the abs values of each element of A - - long i; - - long nelem = A.n*A.m; - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n , A.m ); - - for ( i = 0; i< nelem; i++ ) Temp->a[i] = fabs( A.a[i] ); - - return *Temp; - -} - -void DMatrix::SetSubMatrix( long row, long col, const DMatrix& A ) -{ - - - if ( row+A.n-1> n || col+A.m-1> m ) - { - - error_message("Range error in SetSubMatrix()"); - - } - - for( int i = 1; i<= A.n; i++) { - - for( int j=1; j<= A.m; j++) { - - elem(row+i-1, col+j-1) = A(i,j); - - } - - } - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - -} - -DMatrix& DMatrix::sub_matrix(long r1, long r2, long c1, long c2) const -{ - - long i,j; - if(r1<1||r1>r2||r2>n||c1<1||c1>c2||c2>m) { - printf("\n r1 = %ld", r1); - printf("\n r2 = %ld", r2); - printf("\n c1 = %ld", c1); - printf("\n c2 = %ld", c2); - printf("\n n = %ld", n); - printf("\n m = %ld", m); - ERROR_MESSAGE("index error in DMatrix::sub_matrix"); - - } - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( r2-r1+1 , c2-c1+1 ); - - for (i=1; i<=r2-r1+1; i++) { - - for (j=1; j<=c2-c1+1; j++) { - - Temp->elem(i,j)=elem(i+r1-1,j+c1-1); - - } - - } - - return *Temp; - -} - - - - -double& DMatrix::operator() (long row, long col ) -{ - - - if (row > n || col > m ) - - DMatrix::Resize(row,col); - - if (row < 0 || col < 0) - - ERROR_MESSAGE("negative index error in A(row,col)"); - - return elem( row, col ); - -} - -double& DMatrix::operator() (long row, const char* end ) -{ - - long col = this->getm(); - - if (row > n || col > m ) - - DMatrix::Resize(row,col); - - if (row < 0 || col < 0) - - ERROR_MESSAGE("negative index error in A(row,col)"); - - return elem( row, col ); - -} - -double& DMatrix::operator() (const char* end, long col ) -{ - - long row = this->getn(); - - if (row > n || col > m ) - - DMatrix::Resize(row,col); - - if (row < 0 || col < 0) - - ERROR_MESSAGE("negative index error in A(row,col)"); - - return elem( row, col ); - -} - - - -double DMatrix::operator() (long row, long col ) const -{ - - if (row > n || row < 1 || col > m || col < 1) - - ERROR_MESSAGE("index error in A(row,col)"); - - return elem( row, col ); - -} - -double DMatrix::operator() (long row,const char* end ) const -{ - - long col = this->getm(); - - if (row > n || row < 1 || col > m || col < 1) - - ERROR_MESSAGE("index error in A(row,col)"); - - return elem( row, col ); - -} - -double DMatrix::operator() (const char* end, long col ) const -{ - - long row = this->getn(); - - if (row > n || row < 1 || col > m || col < 1) - - ERROR_MESSAGE("index error in A(row,col)"); - - return elem( row, col ); - -} - - - -double DMatrix::element(long row, long col) -{ - - if (row > n || row < 1 || col > m || col < 1) - - ERROR_MESSAGE("index error in DMatrix::element(row,col)"); - - return elem( row, col ); - -} - - -double& DMatrix::operator() (long index ) -{ - - - if (index > asize && (n==1 || m==1) ) - { - if (n==1) - { - DMatrix::Resize(1,index); - } - else if (m==1) - { - DMatrix::Resize(index,1); - } - } - - if ( (n==0 || m==0) ) - { - DMatrix::Resize(index,1); - } - - if (index > asize && (n>1 && m>1) ) - { - ERROR_MESSAGE("Non-vector matrix cannot be resized in call to A(I) in LHS"); - } - - if (index > asize || index < 1 ) ERROR_MESSAGE("Index error in operator()(long)"); - - - return a[ index - 1 ]; - - -} - - -double& DMatrix::operator() (const char* end ) -{ - - long index = (this->getn())*(this->getm()); - - if (index > asize && (n==1 || m==1) ) - { - if (n==1) - { - DMatrix::Resize(1,index); - } - else if (m==1) - { - DMatrix::Resize(index,1); - } - } - - if ( (n==0 || m==0) ) - { - DMatrix::Resize(index,1); - } - - if (index > asize && (n>1 && m>1) ) - { - ERROR_MESSAGE("Non-vector matrix cannot be resized in call to A(I) in LHS"); - } - - if (index > asize || index < 1 ) ERROR_MESSAGE("Index error in operator()(long)"); - - return a[ index - 1 ]; - - -} - - -double DMatrix::operator() (const char* end) const -{ - - long index = (this->getn())*(this->getm()); - - if (index > asize || index < 1 ) ERROR_MESSAGE("Index error in operator()(long)"); - - return a[ index - 1 ]; - -} - -double DMatrix::operator() (long index ) const -{ - - if (index > asize || index < 1 ) ERROR_MESSAGE("Index error in operator()(long)"); - - return a[ index - 1 ]; - -} - - - - -DMatrix::~DMatrix() -{ - - if (atype==0 && a!=NULL ) - { - - DMatrix::DeAllocate(); - - } - - -} - - -void DMatrix::Save(const char * FileName ) -{ - - long i,j; - - FILE *fp; - - if ( (fp = fopen(FileName,"w")) == NULL ) - - { ERROR_MESSAGE( "Error opening file in DMatrix::Save()"); } - - - for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { - - fprintf(fp,"%g\t",elem(i,j)); } fprintf(fp,"\n"); } - - fclose(fp); - -} - -void DMatrix::Load(const char * FileName ) -{ - - long i,j; - - FILE *fp; - - if ( (fp = fopen(FileName,"r")) == NULL ) - - { ERROR_MESSAGE( "Error opening file in DMatrix::Load()"); } - - - for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { - - fscanf(fp,"%lf", &elem(i,j)); } } - - - fclose(fp); - - -} - - -void DMatrix::Fprint( FILE *fp ) -{ - - long i,j; - - for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { - - fprintf(fp,"%f\t",elem(i,j)); } fprintf(fp,"\n"); } - - -} - -double Max(const DMatrix & A) { - return Max(A, nullptr, nullptr); -} - -double Max(const DMatrix & A, int* rindx, int* cindx ) -{ - - double mx; - const double *Apr = A.GetConstPr(); - - int ri, ci; - - long inx; - - mx = Apr[0]; - - inx = 0; - - for (long i=1; i mx) { mx = Apr[i]; inx = i; } - - } - - ci = (inx)/A.n + 1; - - ri = (inx+1) - (ci-1)*A.n; - - - if ( rindx != NULL ) *rindx = ri; - if ( cindx != NULL ) *cindx = ci; - - - return mx; - -} - -double InfNorm(const DMatrix & A ) -{ - - // Infinity norm of matrix - return Max( sum( Abs(tra(A)) ) ); - -} - - - -double Min(const DMatrix & A, int* rindx, int* cindx ) -{ - - double mx; - - int ri, ci; - - long inx; - - - const double *Apr = A.GetConstPr(); - - mx = Apr[0]; - - inx = 0; - - for (long i=1; i mx) { mx = fabs(Apr[i]); inx = i; } - - } - - ci = (inx)/A.n + 1; - - ri = (inx+1) - (ci-1)*A.n; - - if ( rindx != NULL ) *rindx = ri; - - if ( cindx != NULL ) *cindx = ci; - - return mx; - -} - -double MinAbs(const DMatrix & A, int* rindx, int* cindx ) -{ - - double mx; - - int ri, ci; - - long inx; - - const double *Apr = A.GetConstPr(); - - mx = fabs(Apr[0]); - - inx = 0; - - for (long i=1; i v) { - a[j]=a[j-inc]; - if ( indx!=NULL ) indx[j]=indx[j-inc]; - j -= inc; - if (j <= inc) break; - } - a[j]=v; - if ( indx!=NULL ) indx[j]=vi; - - } - } while (inc > 1); - - -} - - - -void sort( DMatrix & A, DMatrix& indx ) -{ - /* Sorts vector A in ascending order */ - /* Returns the array of sorted indices */ - - double *a; - long n = MAX(A.n, A.m); - - if ( A.n!=1 && A.m != 1 ) { - - error_message("Argument must be a column or row vector in sort() "); - - } - - - unsigned long i,j,inc; - int vi; - double v; - inc=1; - - a = A.a - 1; - - indx.Resize(A.n,A.m); - - if (1) { for( i=1; i<= n; i++ ) indx(i) = i; } - - - do { - inc *= 3; - inc++; - } while (inc <= n); - do { - inc /= 3; - for (i=inc+1;i<=n;i++) { - v=a[i]; - vi=(int) indx(i); - j=i; - while (a[j-inc] > v) { - a[j]=a[j-inc]; - indx(j)=indx(j-inc); - j -= inc; - if (j <= inc) break; - } - a[j]=v; - indx(j)=vi; - - } - } while (inc > 1); - - -} - - -DMatrix& DMatrix::operator^(double x) -{ -// Elementwise matrix power operator A^p -// Example: C = A^2; - - - int i; - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - Temp->FillWithZeros(); - - for (i=0; ia[i] = pow(this->a[i], x); - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& DMatrix::mpow(int p) -{ -// Integer matrix power function A^p -// Example: C = A.mpow(2); - - int i; - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix inverse; - - if (n!=m) ERROR_MESSAGE("Matrix must be square in mpow()"); - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - Temp->FillWithZeros(); - - for (i=1; i<=n; i++) { - - Temp->elem(i,i) = 1.0; - - } - - if (p<0) { - inverse = inv(*this); - } - - for (i=1; i<=abs(p); i++) { - - if ( p>0 ) { - *Temp = (*Temp)*(*this); - } - else if (p<0) { - *Temp = (*Temp)*inverse; - } - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - -} - -DMatrix& mpow(DMatrix& A, int p) -{ -// Integer power function A^p, friend implementation -// Example: C = mpow(A,2); - return A.mpow( p ); - -} - -void DMatrix::Allocate(long size) -{ - /* Memory allocation function */ - - - - a = (double *) my_calloc( size, sizeof(double) ); - - if (!a) ERROR_MESSAGE("allocation failure in DMatrix::Allocate()"); - - // a = a-nl+NR_END; - - asize = size; - - allocated = true; - -} - - - -// extern "C" char *gcvt( double, int, char*); - - -char* num2str(double num) -{ - - - static char str[20]; -#ifndef MEX_OR_XPC - int sig = 10; - gcvt( num, sig, str); -#endif - - return str; - -} - -/* ***************************************** */ -/* */ -/* DATA INTERFACE BETWEEN MATLAB AND DMATRIX */ -/* */ -/* ***************************************** */ - -#ifdef MATLAB_MEX_FILE - - -void mxArray2DMatrix( DMatrix& A, mxArray* mx ) -{ - - long nrow, ncol; - - nrow = mxGetM( mx ); - - ncol = mxGetN( mx ); - - A.Resize( nrow, ncol ); - - memcpy( A.geta(), mxGetPr(mx), nrow*ncol*sizeof(double) ); - -} - -void DMatrix2mxArray(mxArray* mx, DMatrix& A) -{ - - - mx = mxCreateDoubleMatrix( A.getn(), A.getm(), mxREAL ); - - memcpy( mxGetPr(mx), A.geta(), A.getn()*A.getm()*sizeof(double) ); - -} - -#endif - - -#define TINY 1.0e-20; - -void LU_Decomposition(DMatrix& a, int n, DMatrix& indx, double *d, DMatrix& vv) -{ - int i,imax,j,k,l; - double mc,dum,sum; - - *d=1.0; - - for (i=1;i<=n;i++) { - - mc = 0.0; - - for(l=1;l<=n;l++) { - - if( fabs( a(l,i)) > mc ) mc = fabs(a(l,i)); - - } - - if (mc == 0.0) error_message("Singular matrix in routine LU_Decomposition"); - - vv(i)=1.0/mc; - - } - - for (j=1;j<=n;j++) { - - for (i=1;i= mc ) { - - mc=dum; - - imax=i; - - } - - } - - if (j != imax) { - - a.SwapRows(j,imax); - - *d = -(*d); - - vv(imax)=vv(j); - - } - - indx(j)=imax; - - if (a(j,j) == 0.0) a(j,j)=TINY; - - if (j != n) { - - dum=1.0/(a(j,j)); - - for (i=j+1;i<=n;i++) a(i,j) *= dum; - - } - - } - -} -#undef TINY - - - - -void LU_Back_Substitution(const DMatrix& a, int n, - const DMatrix& indx, DMatrix& b) -{ - - int i,ii=0,ip,j; - double sum; - - for (i=1;i<=n;i++) { - - ip= (int) indx(i); - - sum=b(ip); - - b(ip)=b(i); - - if (ii) - - for (j=ii;j<=i-1;j++) sum -= a(i,j)*b(j); - - else if (sum) ii=i; - - b(i)=sum; - - } - - for (i=n;i>=1;i--) { - - sum=b(i); - - for (j=i+1;j<=n;j++) sum -= a(i,j)*b(j); - - b(i)=sum/a(i,i); - - } -} - - -DMatrix& LUSolve( const DMatrix& A, const DMatrix &b ) -{ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *ALU; - DMatrix *xx; - DMatrix *vv; - DMatrix *indx; - DMatrix *rr; - - int nn = A.GetNoRows(); - double dd; - int i,j; - - if ( nn !=A.GetNoCols() ) { - - error_message("\n Matrix must be square in LUSolve "); - - } - - ALU = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - xx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - vv = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - indx= DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - rr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ALU->Resize( nn , A.GetNoCols() ); - xx-> Resize( nn , 1 ); - vv-> Resize( nn , 1 ); - indx->Resize( nn, 1 ); - rr-> Resize( nn , b.GetNoCols() ); - - - *ALU = A; - - LU_Decomposition(*ALU, nn, *indx, &dd, *vv); - - for ( i=1; i<= b.GetNoCols(); i++ ) { - - for( j=1; j<= nn; j++ ) (*xx)(j) = b(j,i); - - LU_Back_Substitution(*ALU, nn, *indx, *xx ); - - for( j=1; j<= nn; j++ ) (*rr)(j,i) = (*xx)(j); - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *rr; - -} - -DMatrix& LUFSolve( const DMatrix& ALU, const DMatrix &b ) -{ - - /* Solution to A x = b by LU factorization */ - /* Alu obtained from ALU = LU( A ) */ - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *xx; - DMatrix *indx; - DMatrix *rr; - - int nn = ALU.GetNoRows(); - - int i; - int j; - - if ( nn != ALU.GetNoCols()-1 ) { - - error_message("\n Dimension Error in LUFSolve "); - - } - - xx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - indx= DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - rr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - - xx-> Resize( nn , 1 ); - rr-> Resize( nn, b.GetNoCols() ); - - for ( i = 1; i<= nn; i++ ) { - - (*indx)( i ) = ALU( i, ALU.GetNoCols() ); - - } - - - for ( i=1; i<= b.GetNoCols(); i++ ) { - - for( j=1; j<=nn; j++ ) (*xx)(j) = b(j,i); - - LU_Back_Substitution( ALU, nn, *indx, *xx ); - - for( j=1; j<=nn; j++ ) (*rr)(j,i) = (*xx)(j); - - } - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *rr; - -} - -double det( const DMatrix& A ) -{ - /* Determinant of a matrix */ - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - - DMatrix *ALU; - DMatrix *vv; - DMatrix *indx; - - int nn = A.GetNoRows(); - double dd; - int i; - - ALU = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - vv = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - indx= DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ALU->Resize( nn , A.GetNoCols() ); - vv-> Resize( nn , 1 ); - indx->Resize( nn, 1 ); - - if ( nn !=A.GetNoCols() ) { - - error_message("\n Matrix must be square in det() "); - - } - - - *ALU = A; - - - LU_Decomposition(*ALU, nn, *indx, &dd, *vv); - - for ( i = 1; i<= nn; i++ ) { - - dd*= (*ALU)(i,i); - - } - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return dd; - -} - - -DMatrix& LU( const DMatrix& A ) -{ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - - DMatrix *ALU; - DMatrix *vv; - DMatrix* indx; - - int nn = A.GetNoRows(); - int i,j; - double dd; - - ALU = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - vv = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - indx= DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ALU->Resize( nn , A.GetNoCols() + 1 ); - vv-> Resize( nn , 1 ); - indx->Resize( nn, 1 ); - - if ( nn !=A.GetNoCols() ) { - - error_message("\n Matrix must be square in LU() "); - - } - - - for ( i=1; i<= nn; i++ ) { - - for ( j= 1; j<=nn; j++ ) { - - (*ALU)(i,j) = A(i,j); - - } - - } - - LU_Decomposition(*ALU, nn, *indx, &dd, *vv); - - for ( i = 1; i<= nn; i++ ) { - /* Stores indx vector in last column of ALU */ - (*ALU)( i, nn + 1 )= (*indx)(i); - } - - if( !localFlag ) DMatrix::SetMemberFlag( 0 ); - - return *ALU; - -} - - -DMatrix& DMatrix::operator % (const DMatrix& rval) const -{ - - // Left division implementation, B%A == inv(B)*A - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( m, rval.m ); - -if ( n == m ) { - - int i, j; - - double dd; - - DMatrix* Alu; - - DMatrix* indx; - - DMatrix* vv; - - DMatrix* xx; - - - Alu = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - indx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - vv = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - xx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Alu ->Resize( n, m ); - - indx->Resize( n, 1); - - vv->Resize( n, 1 ); - - xx->Resize( n, 1 ); - - for( i=0; i< n*n; i++ ) Alu->GetPr()[i] = this->GetConstPr()[i]; - - LU_Decomposition(*Alu, n, *indx, &dd, *vv); - - - for( i = 1; i<= rval.m; i++ ) { - - for ( j=1; j<=n ; j++ ) (*xx)(j) = rval(j,i); - - LU_Back_Substitution(*Alu, n, *indx, *xx ); - - for ( j=1; j<=n; j++ ) (*Temp)(j,i) = (*xx)(j); - - } - -} - -else { - -#ifdef LAPACK - - *Temp = LSMNSolve( *this, rval ); - -#else - - error_message(" Dimension error in DMatrix:: operator %"); - -#endif - -} - -if(!localFlag) DMatrix::SetMemberFlag( 0 ); - -return *Temp; - -} - - -void CholeskyDecomp(DMatrix& a, int n, DMatrix& pM) -{ - int i,j,k; - - double sum; - - double *p = pM.GetPr()-1; - - for (i=1;i<=n;i++) { - - for (j=i;j<=n;j++) { - - sum = a.elem(i,j); - - for (k=i-1;k>=1;k--) { - - sum -= a.elem(i,k)*a.elem(j,k); - - } - - if (i == j) { - - if (sum <= 0.0) - - error_message("CholeskyDecomp() failed"); - - p[i]=sqrt(sum); - - } else a.elem(j,i)=sum/p[i]; - - } - - } - -} - - -void CholeskySolution(const DMatrix& a, int n, const DMatrix& pM, const DMatrix& bM, DMatrix& xM) -{ - int i,k; - - double sum; - - const double *p = pM.GetConstPr()-1; - - const double *b = bM.GetConstPr()-1; - - double *x = xM.GetPr()-1; - - for (i=1;i<=n;i++) { - - sum = b[i]; - - for (k=i-1;k>=1;k--) { - - sum -= a.elem(i,k)*x[k]; - - } - - x[i]=sum/p[i]; - - } - - for (i=n;i>=1;i--) { - - sum = x[i]; - - for (k=i+1;k<=n;k++) { - - - sum -= a.elem(k,i)*x[k]; - - } - - x[i]=sum/p[i]; - - } - -} - - -DMatrix& CholSolve( const DMatrix& A, const DMatrix &b ) -{ - - /* Ax = b solution using Cholesky factorization */ - /* A must be a positive definite symmetric matrix */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Achol; - DMatrix *xx; - DMatrix *pp; - DMatrix *rr; - DMatrix *bb; - - int nn = A.GetNoRows(); - - int i,j; - - Achol = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - xx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - pp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - rr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - bb = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Achol->Resize( nn , A.GetNoCols() ); - xx ->Resize( nn , 1 ); - pp ->Resize( nn , 1 ); - rr ->Resize( nn , b.GetNoCols() ); - bb ->Resize( nn , 1 ); - - if ( nn !=A.GetNoCols() ) { - - error_message("\n Matrix must be square in CholSolve() "); - - } - - *Achol = A; - - CholeskyDecomp( *Achol , nn, *pp ); - - for ( i=1; i<= b.GetNoCols(); i++) { - - for( j=1; j<= nn; j++ ) (*bb)(j) = b(j,i); - - CholeskySolution( *Achol, nn, *pp, *bb, *xx); - - for( j=1; j<= nn; j++ ) (*rr)(j,i) = (*xx)(j); - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *rr; - -} - -DMatrix& Chol( const DMatrix& A ) -{ - - /* Cholesky factorization */ - /* A must be a positive definite symmetric matrix */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Achol; - DMatrix *pp; - - int nn = A.GetNoRows(); - - int i, j; - - Achol = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - pp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Achol->Resize( nn , A.GetNoCols()+1 ); - pp ->Resize( nn , 1 ); - - if ( nn !=A.GetNoCols() ) { - - error_message("\n Matrix must be square in Chol() "); - - } - - for ( i = 1; i<= nn; i++ ) { - - for ( j =1 ; j<= nn; j++ ) { - - (*Achol)(i,j) = A(i,j); - - } - - } - - CholeskyDecomp( *Achol , nn, *pp ); - - for ( i = 1; i<= nn; i++ ) { - - (*Achol)( i, nn + 1 ) = (*pp)(i); - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Achol; - -} - -DMatrix& CholeskyRoot( const DMatrix& A ) -{ - - /* Cholesky Root */ - /* A must be a positive definite symmetric matrix */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Achol; - DMatrix *Acholrtn; - DMatrix *pp; - - int nn = A.GetNoRows(); - - int i, j; - - Achol = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - Acholrtn = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - pp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Achol->Resize( nn , A.GetNoCols()+1 ); - Acholrtn->Resize( nn, nn ); - pp ->Resize( nn , 1 ); - - if ( nn !=A.GetNoCols() ) { - - error_message("\n Matrix must be square in Chol() "); - - } - - for ( i = 1; i<= nn; i++ ) { - - for ( j =1 ; j<= nn; j++ ) { - - (*Achol)(i,j) = A(i,j); - - } - - } - - CholeskyDecomp( *Achol , nn, *pp ); - - - Acholrtn->FillWithZeros(); - - for(i = 1; i<= nn; i++ ) { - - for( j = 1; j< i; j++ ) { - - (*Acholrtn)(i,j) = (*Achol)(i,j); - - } - - - } - - for(i=1; i<= nn; i++) (*Acholrtn)(i,i) = (*pp)(i); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Acholrtn; - -} - - - - - -DMatrix& CholFSolve( const DMatrix& Achol, const DMatrix &b ) -{ - - /* Ax = b solution using Cholesky factorization */ - /* A must be a positive definite symmetric matrix */ - /* Achol obtained from Achol = CHOL( A ); */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *xx; - DMatrix *pp; - DMatrix *rr; - DMatrix *bb; - - int nn = Achol.GetNoRows(); - - int i,j; - - xx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - pp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - rr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - bb = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - xx ->Resize( nn , 1 ); - pp ->Resize( nn , 1 ); - rr ->Resize( nn , b.GetNoCols() ); - bb ->Resize( nn , 1 ); - - if ( nn !=Achol.GetNoCols()-1 ) { - - error_message("\n Dimension error in CholFSolve() "); - - } - - /* Extract pp from last column of Achol */ - - for (i=1; i<=nn; i++ ) { - - (*pp)(i) = Achol( i, nn+1 ); - - } - - for (i=1; i<= b.GetNoCols(); i++ ) { - - for ( j=1; j<=nn; j++ ) (*bb)(j) = b(j,i); - - CholeskySolution( Achol, nn, *pp, *bb, *xx); - - for ( j=1; j<=nn; j++ ) (*rr)(j,i) = (*xx)(j); - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *rr; - -} - - - -void Householder(int j, int k,double *aux,double *d) -{ - double s; - - if(j > k) error_message("Dim error in Householder"); - - if(j == k) s = fabs(aux[j]); - - else s = ArrayNorm(k-j+1,aux+j); - - if(s==0.) - { - *d=0.; - for(int i=j;i<=k;i++) aux[i]=0.; - return; - } - double h,w; - - w = sqrt((1. + fabs(aux[j])/s)*.5); - - if(aux[j] >= 0.) - { h = 2.*s*w; *d = -s; } - else - { h = -2.*s*w; *d = s;} - - aux[j] = (w); - - for(int i = j+1;i <= k;i++) - - aux[i] = (aux[i]/h); - -} - -void HouseholderApplyLeft(int ri, int rf,int ci,int cf, - DMatrix& a,double *aux) -{ - int k; - for(int l = ci;l <= cf;l++) - { - double s = 0.; - for(k = ri;k <= rf;k++)s += aux[k]*a.elem(k,l); - s += s; - for(k = ri;k <= rf;k++) - { - double *temp = &a.elem(k,l); - *temp = (*temp - s*aux[k]); - } - } -} - -char QRFactorization(int m,int n,DMatrix& a,double *d, - double *aux, double* nrm) -{ - if(m < n) - error_message("nrows < ncols in QRFactorization"); - const double SIN_TINY = 10.*DMatrix::GetEPS(); - int i,j; - for(j = 1;j <= n;j++) - { - for(i = 1;i <= m;i++) - aux[i] = a.elem(i,j); - nrm[j] = ArrayNorm(n,aux+1); - } - char sing = 0; - for(j = 1;j <= n;j++) - { - for(i = j;i <= m;i++) - aux[i] = a.elem(i,j); - Householder(j,m,aux,&d[j]); - if(fabs(d[j]) <= SIN_TINY*nrm[j] || nrm[j] == 0.) - { - sing = 1; - d[j] = 0.; - error_message("\nSingular matrix in QRDec"); - for(i = j;i <= m;i++) - { aux[i] = a.elem(i,j) = 0.;} - aux[j] = a.elem(i,j) = 1.; - } - else - for(i = j;i <= m;i++) - a.elem(i,j)=aux[i]; - HouseholderApplyLeft(j,m,j+1,n,a,aux); - } - return sing; -} - -void QRSolution(int m,int n,const DMatrix& a, - double *d,double *b,double *x) -{ - int j,k,i; - double s; - if(m < n) error_message("nrows < ncols in QRSolution"); - for(j=1;j<=n;j++) - { - s=0.; - for(k = j;k <= m;k++) - s -= a.elem(k,j)*b[k]; - s += s; - for(k = j;k <= m;k++) - b[k] = (b[k] + s*a.elem(k,j)); - } - for(i = n;i >= 1;i--) - { - if(d[i]==0.) - { - error_message("\nSingular matrix in QRSolution!"); - x[i]=0.; - } - else - { - s = b[i]; - for(k = i+1;k <= n;k++) - s -= a.elem(i,k)*x[k]; - x[i] = (s/d[i]); - } - } -} - - -DMatrix& QRSolve( const DMatrix& A, const DMatrix &b ) -{ - - /* Ax = b solution using QR decomposition */ - /* A must have nRows >= nCols */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - int i; - - DMatrix *Aqr; - DMatrix *xx; - DMatrix *aux; - DMatrix *nrm; - DMatrix *dd; - DMatrix *bb; - DMatrix *xout; - - int nn = A.GetNoRows(); - int mm = A.GetNoCols(); - - - Aqr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - xx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - aux = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - dd = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - nrm = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - bb = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - xout = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Aqr ->Resize( nn , A.GetNoCols() ); - xx ->Resize( mm , 1 ); - aux ->Resize( nn+1 , 1 ); - dd ->Resize( mm , 1 ); - nrm ->Resize( mm + 1 , 1 ); - bb ->Resize( nn , 1 ); - xout ->Resize( A.m, b.m ); - - - memcpy(Aqr->a, A.a, A.n*A.m*sizeof(double)); - - QRFactorization(A.GetNoRows(),A.GetNoCols(),*Aqr,dd->GetPr()-1, - aux->GetPr()-1, nrm->GetPr()-1 ); - - for( i=1; i<=b.m; i++ ) { - - memcpy( bb->a, b.a+(i-1)*b.n, b.n*sizeof(double) ); - - QRSolution(A.GetNoRows(),A.GetNoCols(),*Aqr, - dd->GetPr()-1,bb->GetPr()-1,xx->GetPr()-1 ); - - memcpy( xout->a + (i-1)*xout->n, xx->a, xout->n*sizeof(double) ); - - } - - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *xout; - -} - -DMatrix& QRFSolve( const DMatrix& Aqr, const DMatrix &b ) -{ - - /* Ax = b solution using QR decomposition */ - /* Aqr is obtained from Aqr = QR( A ) */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - int i; - - DMatrix *xx; - DMatrix *dd; - DMatrix *bb; - DMatrix *xout; - - int nn = Aqr.GetNoRows(); - int mm = Aqr.GetNoCols() - 1; - - - xx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - dd = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - bb = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - xout = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - xx ->Resize( mm , 1 ); - dd ->Resize( mm+1 , 1 ); - bb ->Resize( nn , 1 ); - xout ->Resize( mm , b.m ); - - - /* Extract dd from Aqr */ - - for ( i=1; i<=mm; i++ ) { - - (*dd)(i) = Aqr( i, mm + 1 ); - - } - - - for( i=1; i<=b.m; i++ ) { - - memcpy( bb->a, b.a+(i-1)*b.n, b.n*sizeof(double) ); - - QRSolution( nn , mm, Aqr, - dd->GetPr()-1,bb->GetPr()-1,xx->GetPr()-1 ); - - memcpy( xout->a + (i-1)*xout->n, xx->a, xout->n*sizeof(double) ); - - } - - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *xout; - -} - - -DMatrix& QR( const DMatrix& A ) -{ - - /* QR decomposition */ - /* A must have nRows>nCols */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Aqr; - DMatrix *aux; - DMatrix *nrm; - DMatrix *dd; - - int i,j; - - int nn = A.GetNoRows(); - int mm = A.GetNoCols(); - - - Aqr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - aux = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - nrm = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - dd = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Aqr ->Resize( nn , mm + 1 ); - aux ->Resize( nn +1 , 1 ); - nrm ->Resize( mm +1 , 1 ); - dd ->Resize( mm , 1 ); - - for ( i = 1; i<= nn; i ++ ) { - - for ( j = 1; j<= mm; j++ ) { - - (*Aqr)( i, j ) = A( i, j ); - - } - - } - - QRFactorization(A.GetNoRows(),A.GetNoCols(),*Aqr,dd->GetPr()-1, - aux->GetPr()-1, nrm->GetPr()-1 ); - - for ( i = 1; i<= mm; i ++ ) { - - (*Aqr)( i, mm + 1 ) = (*dd)(i); - - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Aqr; - -} - - -#ifdef LAPACK - -DMatrix& LQ( const DMatrix& A, DMatrix* Q ) -{ - - /* LQ decomposition */ - - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix *Alq; - DMatrix *wk; - DMatrix *tau; - DMatrix *H; - DMatrix *v; - - - int i,j; - - integer nn = A.GetNoRows(); - integer mm = A.GetNoCols(); - - integer nt = min( nn, mm ); - - integer nw = 10 * nn; - - integer info; - - - Alq = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wk = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - tau = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - H = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - v = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - - Alq ->Resize( nn , mm ); - wk ->Resize( 10*nn , 1 ); - tau ->Resize( nt, 1 ); - Q ->Resize( mm, mm ); - H ->Resize( mm, mm ); - v ->Resize( mm, 1 ); - - for ( i = 1; i<= nn; i ++ ) { - - for ( j = 1; j<= mm; j++ ) { - - (*Alq)( i, j ) = A( i, j ); - - - } - - } - - - /* int dgelqf_(integer *m, integer *n, doublereal *a, integer * - lda, doublereal *tau, doublereal *work, integer *lwork, integer *info) - */ - - - dgelqf_(&nn, &mm, Alq->GetPr(), &nn, tau->GetPr(), wk->GetPr(), &nw, &info ); - - - *Q = identity(mm); - - - for(i=1; i<=nn; i++ ) { - - v->FillWithZeros(); - - (*v)(i) = 1.0; - - for(j=i+1; j<=mm; j++ ) { - (*v)(j) = (*Alq)(i,j); - (*Alq)(i,j) = 0; - } - - *H = ProductT(*v,*v); - *H *= -(*tau)(i); - *H += identity(mm); - - (*Q) *= (*H); - - } - - *Q = -tra(*Q); - - *Alq = - (*Alq); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Alq; - -} - -#endif - - - - -#ifdef LAPACK - -DMatrix& SVD( const DMatrix& A, DMatrix* U, DMatrix* V ) -{ - - // This function computes the singular values of A - // It calls dgesvd_(), which is part of CLAPACK, a - // public domain numerical linear algebra library - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - char JOBU; - char JOBVT; - - integer M = A.GetNoRows(); - integer N = A.GetNoCols(); - - integer LDA = M; - integer LDU = M; - integer LDVT = N; - integer LWORK; - integer INFO; - - int nrows = A.GetNoRows(); - int ncols = A.GetNoCols(); - - double* upr; - - double* vtpr; - - DMatrix * a; - DMatrix * s; - DMatrix * wk; - - - s = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - a = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wk = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - s ->Resize( MIN( nrows, ncols) , 1 ); - a ->Resize( nrows, ncols ); - - - if ( U == NULL ) { - - JOBU = 'N'; - upr = NULL; - - } - - else { - - JOBU = 'A'; - - U->Resize( LDU , M ); - - upr = U->GetPr(); - - } - - if ( V == NULL ) { - - JOBVT = 'N'; - - vtpr = NULL; - - } - - else { - - JOBVT = 'A'; - V->Resize( LDVT , N ); - vtpr = V->GetPr(); - - } - - memcpy( a->a, A.a, A.n*A.m*sizeof(double) ); - - - LWORK = DMatrix::GetDimAux(); - - -/* Subroutine int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, - doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * - ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, - integer *info) -*/ - - dgesvd_( &JOBU, &JOBVT, &M, &N, - a->GetPr(), &LDA, s->GetPr(), upr, - &LDU, vtpr , &LDVT, wk->GetPr(), &LWORK, &INFO); - - if ( V != NULL ) V->Transpose(); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *s; - - -} - -#endif /* LAPACK */ - -#ifdef LAPACK -double cond( const DMatrix& A ) -{ - /* Condition number of a matrix */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix* ww; - - double sigmaMax; - - double sigmaMin; - - - ww = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ww->Resize( MIN( A.n, A.m ) , 1 ); - - *ww = SVD( A ); - - sigmaMax = Max( *ww ); - - sigmaMin = Min( *ww ); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return (sigmaMax/sigmaMin); - -} -#endif /* LAPACK */ - -#ifdef LAPACK -int rank_matrix( const DMatrix& A ) -{ - /* rank of a matrix */ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix* ww; - - double tol; - double eps = DMatrix::GetEPS(); - - int i, sum; - - ww = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ww->Resize( MIN( A.GetNoCols(), A.GetNoRows() ) , 1 ); - - *ww = SVD( A ); - - sum = 0; - - tol = MAX( A.n, A.m )* Max( *ww ) * eps; - - for ( i = 1; i <= MIN(A.n, A.m) ; i++) - - sum += (*ww)(i) > tol ? (1) : (0) ; - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return sum; - -} -#endif /* LAPACK */ - -#ifdef LAPACK -DMatrix& pinv(const DMatrix& A) -{ - - int localFlag = 0; - - double tol; - - double eps = DMatrix::GetEPS(); - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - - int nrows = A.GetNoRows(); - int ncols = A.GetNoCols(); - - DMatrix * ww; - DMatrix * uu; - DMatrix * vv; - DMatrix * dd; - DMatrix * rr; - - ww = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - uu = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - vv = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - dd = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - rr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ww ->Resize( MIN(nrows,ncols), 1 ); - uu ->Resize( nrows, nrows ); - vv ->Resize( ncols, ncols ); - dd ->Resize( MIN(nrows,ncols), MIN(nrows,ncols) ); - rr ->Resize( ncols, nrows ); - - dd->FillWithZeros(); - - *ww = SVD( A, uu , vv ); - - - tol = MAX( nrows, ncols )* Max( *ww )* eps; - - - for( int i=1; i<= ww->GetNoRows(); i++ ) { - - if( (*ww)(i) > tol ) (*dd)(i,i) = 1.0/(*ww)(i); - - else (*dd)(i,i) = 0.0; - - } - - - *uu = uu->sub_matrix(1,nrows, 1, MIN(nrows,ncols) ); - *vv = vv->sub_matrix(1,ncols, 1, MIN(nrows,ncols) ); - (*rr) = (*vv)*ProductT( *dd , *uu ); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return (*rr); - -} -#endif /* LAPACK */ - - - - -#ifdef LAPACK -DMatrix& orth( const DMatrix& A ) -{ - // Q = orth( A ) is the orthonormal basis for the range of A - // Q*Q' == I, the number of columns of Q is the rank of A - - int localFlag = 0; - - double tol; - - double eps = DMatrix::GetEPS(); - - int r; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - - int nrows = A.GetNoRows(); - int ncols = A.GetNoCols(); - - DMatrix * ww; - DMatrix * uu; - DMatrix * vv; - - ww = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - uu = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - vv = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ww ->Resize( MIN( nrows, ncols ) , 1 ); - uu ->Resize( nrows, ncols ); - vv ->Resize( ncols, ncols ); - - *ww = SVD( A, uu , vv ); - - - tol = MAX( nrows, ncols )* Max( *ww )* eps; - - r = (int) ( sum( *ww > tol ) )(1,1); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return uu->sub_matrix( 1, uu->GetNoRows(), 1, r ); - - -} -#endif /* LAPACK */ - - -#ifdef LAPACK -DMatrix& null( const DMatrix& A ) -{ - // Z = null( A ) is the orthonormal basis of the null space of A - // Z*Z' == I, A*Z == 0, the number of columns of Z is the - // nullity of A - - int localFlag = 0; - - int count = 0; - - double tol; - - double eps = DMatrix::GetEPS(); - - int r, i; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - - int nrows = A.GetNoRows(); - int ncols = A.GetNoCols(); - - DMatrix * ww; - DMatrix * uu; - DMatrix * vv; - DMatrix * Temp; - - ww = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - uu = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - vv = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - ww ->Resize( MIN(ncols,nrows) , 1 ); - uu ->Resize( nrows, ncols ); - vv ->Resize( ncols, ncols ); - - *ww = SVD( A, uu , vv ); - - tol = MAX( nrows, ncols )* Max( *ww )* eps; - - r = (int) ( sum( *ww > tol ) )(1,1); - - - if ( r == ncols ) { - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - vv->Resize( 0, 0 ); - - return *vv; - - } - - else { - - for( i= 1; i<= ncols; i++ ) { - - Temp->Resize( ncols, r ); - - if ( (*ww)(i) < tol ) { - - count ++; - Temp->SetColumn( vv->Column(i), count ); - - } - } - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *Temp; - - } - -} -#endif /* LAPACK */ - - -#ifdef LAPACK -DMatrix& SVDSolve( const DMatrix& A, const DMatrix& B ) -{ -/* - * This function calls CLAPACK's routine DGELSS to compute - * the minimum norm solution to a real linear least - * squares problem: - * - * Minimize 2-norm(| b - A*x |). - * - * using the singular value decomposition (SVD) of A. A is an M-by-N - * matrix which may be rank-deficient. - */ - - int localFlag = 0; - - double eps = DMatrix::GetEPS(); - - integer N = A.GetNoCols(); - - integer M = A.GetNoRows(); - - integer NRHS = B.GetNoCols(); - - integer LDA = A.GetNoRows(); - - integer LDB = B.GetNoRows(); - - integer LWORK; - - integer RANK; - - integer INFO; - - double RCOND; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix * ww; - DMatrix * aa; - DMatrix * bb; - DMatrix * wk; - DMatrix * xx; - - ww = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - aa = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - bb = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wk = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - xx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - - ww ->Resize( MIN(M,N), 1 ); - aa ->Resize( M, N ); - bb ->Resize( B.n, B.m ); - xx ->Resize( N, NRHS ); - - RCOND = MAX( N, M )* eps; - LWORK = DMatrix::GetDimAux(); - - - memcpy( aa->a, A.a, A.n*A.m*sizeof(double) ); - - memcpy( bb->a, B.a, B.n*B.m*sizeof(double ) ); - - - dgelss_( &M, &N, &NRHS, aa->a, &LDA, bb->a, &LDB, ww->a, - - &RCOND, &RANK, wk->a, &LWORK, &INFO ); - - *xx = bb->sub_matrix( 1, N, 1, NRHS ); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *xx; - -} -#endif /*LAPACK*/ - - -#ifdef LAPACK -DMatrix& schur( const DMatrix& A, DMatrix* U ) -{ - - // This function computes the Schur decomposition of A - // It calls dgees_(), which is part of CLAPACK, a - // public domain numerical linear algebra library - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - long nrows = A.GetNoRows(); - long ncols = A.GetNoCols(); - - char JOBVS; - char SORT = 'N'; - integer N = A.GetNoCols(); - integer LDA = A.GetNoRows(); - integer SDIM = 0; - integer LDVS = N; - integer LWORK = DMatrix::GetDimAux(); - integer INFO; - - DMatrix * a; - DMatrix * wr; - DMatrix * wi; - DMatrix * wk; - - double *vs; - - if ( nrows != ncols ) error_message("Matrix must be square in schur()"); - - - a = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wk = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wi = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - a ->Resize( nrows, ncols ); - wr ->Resize( nrows, 1 ); - wi ->Resize( nrows, 1 ); - - if ( U == NULL ) - { - - JOBVS = 'N'; - vs = NULL; - - } - - else { - - JOBVS = 'V'; - - U ->Resize( nrows, ncols ); - - vs = U->GetPr(); - - } - - memcpy( a->a, A.a, A.n*A.m*sizeof(double) ); - - - dgees_(&JOBVS, &SORT, NULL, &N, - a->GetPr() , &LDA, &SDIM, wr->GetPr(), - wi->GetPr(), vs , &LDVS, wk->GetPr(), - &LWORK, NULL, &INFO); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return *a; - -} - -#endif /* LAPACK */ - - -#ifdef LAPACK - -DMatrix& LSMNSolve( const DMatrix& A, const DMatrix& B ) -{ - - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - char TRANS = 'N'; - integer N = A.GetNoCols(); - integer M = A.GetNoRows(); - integer NRHS = B.GetNoCols(); - integer LDA = M; - integer LDB; - integer LWORK = DMatrix::GetDimAux(); - integer INFO; - - integer MN = MAX( M, N ); - - LDB = MAX( 1, MN ); - - DMatrix * a; - DMatrix * b; - DMatrix * wk; - - - a = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - b = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wk = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - a ->Resize( M, N ); - b ->Resize( LDB, NRHS ); - - b->FillWithZeros(); - - memcpy( a->a, A.a, A.n*A.m*sizeof(double) ); - - b->SetSubMatrix( 1,1, B ); - - - - dgels_(&TRANS, &M, &N, - &NRHS, a->GetPr(), &LDA, b->GetPr(), &LDB, - wk->GetPr(), &LWORK, &INFO ); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - *b = b->sub_matrix(1,N,1,NRHS); - - return *b; -} - -#endif /* LAPACK */ - - -int isSymmetric( const DMatrix & A ) -{ - - int i, j; - - int isflag = 1; - - if ( A.GetNoRows() != A.GetNoCols() ) { - - error_message( "Matrix must be square in isSymmetric()" ); - - } - - for ( i = 1; i<= A.GetNoRows( ) && isflag!=0 ; i++ ) { - - for ( j = i; j<= A.GetNoRows( ) && isflag!=0; j++ ) { - - - if ( A(i,j) == A(j,i) ) isflag = 1; - else isflag = 0; - - } - - } - - return isflag; - -} - - - -#ifdef LAPACK - -DMatrix& eig( const DMatrix & A, DMatrix* V ) -{ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix::SetMemberFlag( 1 ); - - DMatrix* a; - - DMatrix* wr; - - DMatrix* wi; - - DMatrix* wk; - - DMatrix* vx; - - DMatrix* vz; - - int nn; - - int i,j; - - nn = A.GetNoRows(); - - char JOBZ; - char UPLO = 'U'; - integer LDA = nn; - integer INFO; - char JVL= 'N'; - char JVR; - integer N = nn; - integer LDVL = nn; - integer LDVR = nn; - integer LWORK = DMatrix::GetDimAux(); - double VL; - double* vpr; - - - - - - a = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wr = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wi = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wk = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - vz = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - a ->Resize( nn , nn ); - wr ->Resize( nn , 1 ); - wi ->Resize( nn , 1 ); - wk ->Resize( 5*nn, 1 ); - vz ->Resize( nn , nn ); - - if (V!=NULL) { - V ->Resize( nn , 2*nn ); - vpr = vz->GetPr(); - } - - else { - vx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - vpr = vx->GetPr(); - } - - - memcpy( a->GetPr(), A.GetConstPr(), nn*nn*sizeof(double) ); - - wi->FillWithZeros(); - - if ( isSymmetric( A ) ) { - - - if ( V==NULL ) JOBZ = 'N'; - - else JOBZ = 'V'; - -/* dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, - integer *lda, doublereal *w, doublereal *work, integer *lwork, - integer *info) -*/ dsyev_(&JOBZ, &UPLO, &N, a->GetPr(), - &LDA, wr->GetPr(), wk->GetPr(), &LWORK, - &INFO); - -// memcpy( vpr , a->GetPr(), nn*nn*sizeof(double) ); - memcpy( V->GetPr() , a->GetPr(), nn*nn*sizeof(double) ); - - } - - else { - - if ( V==NULL ) { JVR = 'N'; } - - else { JVR = 'V'; } - -// DGEEV computes for an N-by-N real nonsymmetric matrix A, the -// eigenvalues and, optionally, the left and/or right eigenvectors. -// DGEEV is part of CLAPACK a public domain, numerical linear -// algebra package - - dgeev_( &JVL, &JVR, &N , a->GetPr(), - &LDA, wr->GetPr(), wi->GetPr(), &VL, - &LDVL , vpr , &LDVR, wk->GetPr(), - &LWORK, &INFO); - - if ( V!= NULL ) { - for ( j=1; j<= nn; j++) { - - if( (*wi)(j) == 0.0 ) { - - V->SetColumn( vz->Column(j), j ); - V->SetColumn( zeros(nn,1), j+nn ); - - } - - else { - - V->SetColumn( vz->Column(j) , j ); - V->SetColumn(vz->Column(j+1), j+nn ); - V->SetColumn( vz->Column(j), j+1 ); - V->SetColumn( (-1.0)*(vz->Column(j+1)), j+nn+1 ); - j++; - - } /* End else */ - - } /* End for */ - - } /* End if */ - - } - - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - return (*wr || *wi); - -} - -#endif /* LAPACK */ - - -#ifdef LAPACK - -double rcond( const DMatrix& A ) -{ - - int localFlag = 0; - - if (DMatrix::GetMemberFlag()) localFlag = 1; - - DMatrix* atmp; - DMatrix* wk; - integer N = A.GetNoCols(); - integer M = A.GetNoRows(); - integer LDA = A.GetNoRows(); - integer INFO; -// integer *IPIV = new integer [ MIN( N, M ) ]; - integer *IPIV = (integer*) my_calloc( MIN(N,M), sizeof(integer) ); - char NORM = '1'; - double ANORM; - double RCOND; - - atmp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - wk = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - if ( N!= M ) error_message( "\n Matrix must be square in rcond()"); - - ANORM = InfNorm( tra( A ) ); - - atmp ->Resize( N, N ); - memcpy( atmp->a, A.a, N*N*sizeof(double) ); - - dgetrf_(&M, &N, atmp->a, &LDA, IPIV, &INFO ); - - dgecon_(&NORM,&N,atmp->a,&LDA,&ANORM,&RCOND,wk->a,IPIV,&INFO ); - - if(!localFlag) DMatrix::SetMemberFlag( 0 ); - - delete[] IPIV; - - return (RCOND); - -} -#endif /* LAPACK */ - - -double MachEps(void) -{ - // Function to compute machine precision - double meps = 1.,eps = 2.; - while(eps != 1.) - { - meps /= 2.; - eps = 1. + meps; - } - - return 2.0*meps; -} - - - -double ArrayNorm(long n,double *x) -{ -// Euclidean norm implementation with over or underflow protection -// - const double maxDouble = 1.7e+308; - const double minDouble = 8.e-307; - double aux, xmax = 0.,xmin = maxDouble; - - for(long j = 0;j < n;j++) - { - aux = fabs(x[j]); - if(xmax < aux)xmax = aux; - if(xmin > aux)xmin = aux; - } - - if(xmax == 0.)return xmax; - - if (xmin == 0.)xmin = minDouble; - - long double longaux = - (long double)xmax/(long double)xmin; - - aux = sqrt(maxDouble/((double)n)); - - if(xmax < aux && - xmax > minDouble/DMatrix::GetEPS() && - longaux < 1./DMatrix::GetEPS() ) - - { - double norm = 0.; - for(long i = 0;i < n;i++) - { - aux = x[i]; - norm += aux*aux; - } - return sqrt(norm); - } - else - { - long double norm = 0.; - - for(long i = 0;i < n;i++) - { - longaux = x[i]; - norm += longaux*longaux; - } - - if(norm < maxDouble && norm > minDouble) - return sqrt(norm); - - longaux = (long double)xmax*(long double)n; - - norm /= longaux; // avoids overflow - - norm /= longaux; - - norm = longaux*sqrt(norm); // renormalises - - // avoids overflow - - if(norm > maxDouble) norm = maxDouble; - - return norm; - - } -} - - -// Indexing functions - -DMatrix& DMatrix::operator() (const DMatrix& RowIndx, const DMatrix& ColIndx ) -{ - - long nrows; - long ncols; - - long ii; - long jj; - - int rflag = 0; - int cflag = 0; - - DMatrix* RtVal; - - if ( RowIndx(1) == -1 ) rflag = 1; - if ( ColIndx(1) == -1 ) cflag = 1; - - - if( !rflag ) nrows = RowIndx.GetNoRows(); - else nrows = GetNoRows(); - if( !cflag ) ncols = ColIndx.GetNoRows(); - else ncols = GetNoCols(); - - RtVal = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - RtVal->SetMType( 1 ); - RtVal->SetReferencedDMatrixPointer( this ); - RtVal->SetRowIndexPointer( &RowIndx ); - RtVal->SetColIndexPointer( &ColIndx ); - RtVal->Resize( nrows, ncols ); - - - for (long i = 1; i<=nrows; i++ ) { - - if( !rflag ) ii = (long) RowIndx(i); - else ii = i; - - for (long j = 1; j<=ncols; j++ ) { - - if (!cflag) jj = (long) ColIndx(j); - else jj=j; - - RtVal->elem(i,j) = elem(ii,jj); - - } - - } - - return (*RtVal); -} - -DMatrix& DMatrix::operator() (const DMatrix& RowIndx ) -{ - - long nrows; - - long ii; - - int flag = 0; - - DMatrix* RtVal; - - if (RowIndx(1)==-1.0) flag = 1; - - if (!flag) nrows = RowIndx.GetNoRows(); - else nrows = GetNoRows()*GetNoCols(); - - - RtVal = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - RtVal->SetMType( 1 ); - RtVal->SetReferencedDMatrixPointer( this ); - RtVal->SetRowIndexPointer( &RowIndx ); - RtVal->SetColIndexPointer( NULL ); - RtVal->Resize( nrows, 1 ); - - for ( long i = 1; i<=nrows; i++ ) { - - if( !flag ) ii= (long) RowIndx(i); - else ii = i; - - RtVal->a[i-1] = a[ii-1]; - - } - - return (*RtVal); - -} - -DMatrix& DMatrix::operator() (const DMatrix& RowIndx, long col ) -{ - - DMatrix* ColIndx; - - if (col > this->GetNoCols()) { - this->Resize(this->GetNoRows(), col); - } - - - ColIndx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - ColIndx->SetMType( 0 ); - ColIndx->Resize( 1 , 1 ); - - ColIndx->elem( 1,1 ) = (double) col; - - return (this->operator()(RowIndx,*ColIndx) ); - -} - -DMatrix& DMatrix::operator() (const DMatrix& RowIndx, const char* end ) -{ - long col = this->getm(); - - DMatrix* ColIndx; - - ColIndx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - ColIndx->SetMType( 0 ); - ColIndx->Resize( 1 , 1 ); - - ColIndx->elem( 1,1 ) = (double) col; - - return (this->operator()(RowIndx,*ColIndx) ); - -} - - -DMatrix& DMatrix::operator() (const char* end, const DMatrix& ColIndx ) -{ - long row = this->getn(); - - DMatrix* RowIndx; - - RowIndx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - RowIndx->SetMType( 0 ); - RowIndx->Resize( 1 , 1 ); - - RowIndx->elem( 1,1 ) = (double) row; - - return (this->operator()(*RowIndx,ColIndx) ); - -} - -DMatrix& DMatrix::operator() (long row, const DMatrix& ColIndx ) -{ - DMatrix* RowIndx; - - if (row > this->GetNoRows()) { - this->Resize(row, this->GetNoRows()); - } - - RowIndx = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - RowIndx->SetMType( 0 ); - RowIndx->Resize( 1 , 1 ); - - RowIndx->elem( 1,1 ) = (double) row; - - return (this->operator()(*RowIndx,ColIndx) ); - -} - - -DMatrix& DMatrix::operator = ( double val ) -{ - - - if ( GetMType()==1 ) { - - return ( AssignmentToColonReference( val ) ); - - } - - else { - -// if ( n==0 || m == 0) -// { -// Resize(1,1); -// } -// long nelem = GetNoRows()*GetNoCols(); -// for (long i=0; i< nelem; i++ ) { -// a[ i ] = val; -// } - Resize(1,1); - a[0] = val; - - return (*this); - - } - -} - -DMatrix& DMatrix::AssignmentToColonReference(double val ) -{ - long ii, jj; - - int rflag = 0; - int cflag = 0; - - if ( (*rowIndx)(1) == -1.0 ) rflag = 1; - if ( (*colIndx)(1) == -1.0 ) cflag = 1; - - - for (long i = 1; i<=GetNoRows(); i++ ) { - - if ( !rflag ) ii = (long) (*rowIndx)(i); - - else ii = i; - - for (long j = 1; j<=GetNoCols(); j++ ) { - - if (!cflag) jj = (long) (*colIndx)(j); - else jj= j; - - mt->elem(ii,jj) = val; - - } - - } - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - - return (*this); - -} - - -DMatrix& DMatrix::AssignmentToColonReference( const DMatrix& RightMt ) -{ - - long ii,jj; - - int rflag = 0; - int cflag = 0; - - if ( (*rowIndx)(1) == -1.0 ) rflag = 1; - if (colIndx!=NULL) { - if ( (*colIndx)(1) == -1.0 ) cflag = 1; - } - - if (GetNoRows() != RightMt.GetNoRows() || - GetNoCols() != RightMt.GetNoCols() ) - { - ERROR_MESSAGE("Dimensions error in AssignmentToColonReference()"); - } - - if ( Max(*rowIndx)>mt->GetNoRows() ) - { - mt->Resize( (long) Max(*rowIndx) , mt->GetNoCols() ); - } - - if (colIndx!=NULL) { - if ( Max(*colIndx)>mt->GetNoCols() ) - { - mt->Resize( mt->GetNoRows() , (long) Max(*colIndx) ); - } - } - - - for (long i = 1; i<=GetNoRows(); i++ ) { - - if (!rflag) ii = (long) (*rowIndx)(i); - else ii = i; - - for (long j = 1; j<=GetNoCols(); j++ ) { - if (colIndx!=NULL) { - if (!cflag) jj = (long) (*colIndx)(j); - else jj = j; - } else {jj=1;} - mt->elem(ii,jj) = RightMt.elem(i,j); - - } - - - } - - if( !DMatrix::GetMemberFlag() ) DMatrix::SetAuxIndx( -1 ); - - return (*this); - -} - - -DMatrix& colon( int i1, int increment, int i2) -{ - DMatrix* Temp; - - long val; - - int nrows = abs( ( (i2-i1)/increment+1 ) ); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( nrows, 1 ); - - val = i1; - - for( long i=1; i<= nrows; i++) { - - Temp->elem(i,1) = val; - - val += increment; - - } - - return (*Temp); - -} - -DMatrix& colon( int i1, int i2 ) -{ - DMatrix* Temp; - - long val; - - long increment = 1; - - long nrows = abs( ( (i2-i1)/increment+1 ) ); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( nrows, 1 ); - - val = i1; - - for( long i=1; i<= nrows; i++) { - - Temp->elem(i,1) = val; - - val += increment; - - } - - return (*Temp); - -} - -DMatrix& colon( double i1, double i2) -{ - - DMatrix* Temp; - - double val; - - double increment = 1.0; - - long nrows = (int) fabs( ( (i2-i1)/increment )+1.0 ); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( nrows, 1 ); - - val = i1; - - for( long i=1; i<= nrows; i++) { - - Temp->elem(i,1) = val; - - val += increment; - - } - - - return (*Temp); - -} - -DMatrix& colon( double i1, double increment, double i2) -{ - - DMatrix* Temp; - - double val; - - long nrows = (int) fabs( ( (i2-i1)/increment+1.0 ) ); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( nrows, 1 ); - - val = i1; - - for( long i=1; i<= nrows; i++) { - - Temp->elem(i,1) = val; - - val += increment; - - } - - return (*Temp); -} - - -DMatrix& colon( void ) -{ - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( 1, 1 ); - - Temp->elem(1,1) = -1.0; - - return (*Temp); - -} - - - -DMatrix& Sqrt( const DMatrix& A) { - - // Elementwise square root of a matrix - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n, A.m ); - - for (long i= 0; i< A.n*A.m; i++ ) { - - if (A.a[i]<0) { error_message("sqrt(): Attempt to find square root of negative number\n...Complex numbers are not supported in this version of DMatrix"); - } - Temp->a[i] = sqrt(A.a[i]); - - } - - return (*Temp); - -} - -DMatrix& triu( const DMatrix& A) { - - // Upper triangular part of a matrix - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( A.n, A.m ); - - Temp->FillWithZeros(); - - for (long i= 1; i<= A.n; i++ ) { - for (long j= i; j<= A.m; j++ ) { - Temp->elem(i,j) = A.elem(i,j); - } - } - - return (*Temp); - - -} - - -double factorial(long j) -{ - - double retval = 1; - - int k; - - if( j>1 ) { - - for(k=2;k<=j;k++) - retval=retval*k; - - } - - return (retval); - -} - - -DMatrix & eye(long n) -{ - return identity(n); -} - -DMatrix & eye(long n, long m) -{ - return identity(n,m); -} - - long length(const DMatrix& A) - { - int retval; - retval = A.GetNoRows()*A.GetNoCols(); - return retval; - } - -DMatrix& find(const DMatrix& A) -{ -// Returns a vector with the linear indices of the non-zero elements -// of the input matrix A. - int i; - int icount = 0; - DMatrix* Temp; - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - Temp->Resize( length(A), 1 ); - Temp->FillWithZeros(); - - for (i=1; i<=length(A); i++) - { - if (A(i) != 0.0) - { - icount++; - Temp->elem(icount,1) = i; - } - } - Temp->Resize(icount,1); - return (*Temp); -} - -DMatrix& DMatrix::find(DMatrix& I, DMatrix& J) const -{ -// Finds vector indices I and J of the non-zero elements of the calling DMatrix object, and -// returns a DMatrix object as a column vector with the non-zero elements of the calling object. - int i, j; - int icount = 0; - DMatrix* Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - Temp->Resize(n*m,1); - Temp->FillWithZeros(); - I.Resize( n, 1 ); - J.Resize( m, 1 ); - I.FillWithZeros(); - J.FillWithZeros(); - - for (i=1; i<=n; i++) - { - for (j=1; j<=m; j++) - { - if (this->elem(i,j) != 0.0) - { - icount++; - I(icount) = i; - J(icount) = j; - (*Temp)(icount)= this->elem(i,j); - } - } - } - I.Resize(icount,1); - J.Resize(icount,1); - Temp->Resize(icount,1); - return (*Temp); -} - -DMatrix& DMatrix::find(int* I, int* J) const -{ -// Finds array indices I and J of the non-zero elements of the calling DMatrix object, and -// returns a DMatrix object as a column vector with the non-zero elements of the calling object. -// Arrays I and J should be preallocated with size A.n*A.m - - - int i, j; - int icount = 0; - DMatrix* Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - Temp->Resize(n*m,1); - Temp->FillWithZeros(); - - for (i=1; i<=n; i++) - { - for (j=1; j<=m; j++) - { - if (this->elem(i,j) != 0.0) - { - I[icount] = i; - J[icount] = j; - icount++; - (*Temp)(icount)= this->elem(i,j); - } - } - } - Temp->Resize(icount,1); - return (*Temp); -} - - -double DMatrix::random_uniform(void) - -// returns a pseudo-random real number uniformly distributed -// between 0.0 and 1.0. - -{ - const long Q = RAND_MODULUS / RAND_MULTIPLIER; - const long R = RAND_MODULUS % RAND_MULTIPLIER; - long t; - - t = RAND_MULTIPLIER * (seed[stream] % Q) - R * (seed[stream] / Q); - if (t > 0) - seed[stream] = t; - else - seed[stream] = t + RAND_MODULUS; - return ((double) seed[stream] / RAND_MODULUS); -} - - -double DMatrix::random_gaussian(void) -// Returns a Gaussian random number with zero mean and unit variance -// The method uses the approximation of the normal idf due to Odeh and Evans, -// J. Applied Statistics, 1974, vol 23, pp 96-97. - -{ - double p0 = 0.322232431088; - double q0 = 0.099348462606; - double p1 = 1.0; - double q1 = 0.588581570495; - double p2 = 0.342242088547; - double q2 = 0.531103462366; - double p3 = 0.204231210245e-1; - double q3 = 0.103537752850; - double p4 = 0.453642210148e-4; - double q4 = 0.385607006340e-2; - double u1, t, p, q, out; - - u1 = DMatrix::random_uniform(); - if (u1 < 0.5) - t = sqrt(-2.0 * log(u1)); - else - t = sqrt(-2.0 * log(1.0 - u1)); - p = p0 + t * (p1 + t * (p2 + t * (p3 + t * p4))); - q = q0 + t * (q1 + t * (q2 + t * (q3 + t * q4))); - if (u1 < 0.5) - out = (p / q) - t; - else - out = t - (p / q); - return out; -} - - - -DMatrix& randu(long n, long m) -// Returns an nxm matrix where each element is a uniform random -// number in the range (0,1). -// -{ - - long i; - - double *pr; - - DMatrix* Temp; - - double dummy = DMatrix::random_uniform(); - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - pr = Temp->GetPr(); - - for (i=0; i< n*m; i++) { - - pr[i] = DMatrix::random_uniform(); - - } - - return *Temp; -} - -DMatrix& randn(long n, long m) -// Returns an nxm matrix where each element is a Gaussian random -// number with zero mean and unit variance. -// -{ - - long i; - - double *pr; - - double dummy = DMatrix::random_gaussian(); - - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( n, m ); - - pr = Temp->GetPr(); - - for (i=0; i< n*m; i++) { - - pr[i] = DMatrix::random_gaussian(); - - } - - return *Temp; -} - -void tic(void) -{ -// Chronometer starts - DMatrix::SetStartTicks(clock()); - -} - -double toc() -{ -// Chronometer stops - - clock_t stop_ticks = clock(); - clock_t elapsed_ticks; - double elapsed_time; - - elapsed_ticks= stop_ticks-DMatrix::GetStartTicks(); - - elapsed_time = ((double) elapsed_ticks/CLOCKS_PER_SEC); - - if (1) { - - if (DMatrix::PrintLevel() ) { - fprintf(stderr,"\n Elapsed time is %e seconds\n", elapsed_time ); - } - - } - - return (elapsed_time); - -} - -DMatrix& linspace(double X1, double X2, long N) -{ - long i; - DMatrix* Temp; - - Temp = DMatrix::GetTempPr(ChkTmpIndx(DMatrix::IncrementAuxIndx())); - - Temp->Resize( 1, N ); - - if (N<1) { - error_message("Length error in linspace()"); - } - - for (i=1; i<= N; i++) { - - (*Temp)(i) = X1 + ((double) (i-1))*(X2-X1)/( (double) (N-1) ); - - } - - return *Temp; - -} - - -void* my_calloc(size_t num, size_t size ) -{ - void* pointer; - pointer = mxCalloc(num, size); - if (pointer==NULL) { - error_message("Memory allocation error in my_calloc()"); - } - return pointer; -} diff --git a/PSOPT/doc/PSOPT_Manual_R4.pdf b/doc/PSOPT_Manual_R4.pdf similarity index 100% rename from PSOPT/doc/PSOPT_Manual_R4.pdf rename to doc/PSOPT_Manual_R4.pdf diff --git a/examples/.DS_Store b/examples/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..fe5f73ab319b6dcf6b6167b52bc823d0b9ba3e0c GIT binary patch literal 8196 zcmeHLU2GIp6h5ad?ac7gDS~uXpqp+gs71P^v?2w!KTxY}+R&D^6j^3>MmjP(Q+H;& zw53|*MUxtzP$BxFiHWICM0he$UW~?{2Sq^*4?g&yFFqQLCZ2omEUDY>6N!>AcQg0g zx#ygF@A>XGbN37YU}w&V1JnY5L>H6lTB=qlOwX(2Ta3D+bP$zS6GJ~ zAp#)+Ap#)+Ap#)+cLD-*X0sxdIQNA%tV0As1nx=%*!v+$7n6xVE(pnA9aQlYfMf-A z^FnRP1GrB#kcmJp2+3V(Op!fc;EF+tfx?~iQD#mu5y%B0g*%{d2MlJ$AVWbuJNZSq zIbcG_unrLj5m<=;du%E}2OFlqD$d^(NKvN?Sun{Y4L)lxPw*A!f__q+CWFIdYLoO* zd2cFZyD1v^v(%Jrd45yVbu25dSW{UgNs6SbSDqT0bn`>L?&rKtJv+hf26cZj6|{%x z`@yZYo;qro`J}q3%XNI+a?C7uwhWU@j*nW7;pRKtoMU)=oFSo*Bw3P^YVF+Io;~{- zqiwD8jnTP%&5txj<4t?x^YgN_r6GQx_he>fcJA!_a~A|M7`$Dex(KO@biZn_wm01+ zf-QT!5bTXYu(GmN>wQA$8?(}`Gi1%0NwwOeSbOPqFl$azT%&2%&Se}gsn(=*JDsz2 z-|Vn$X6%jm<{6*0j(Kj@@8X6@Rn2+k5tHn!X|tQG$#o+eX<*8?T*o_VW<8RzM3V?X zURt+#TmAhHHSK-$vF>Z@H&m-N8x`dkq2&11)0UYX$y$QlswV*0?k<^$pmP=XB<}81P&#}EuQ;r+7x_;MSvl!}SN#>eZ zou*ANO;^^W+K?pPyRt;IWwYDkR z=(Gq~eKP3W->zt5X*ZLh5WN~~47w8?ns$QC+^2i~z?A9Gsy?OZd31GJk0gyVZHHmd zs$z+q0zVFetg`b-gL-Izb{K?lFdz?$a2{TRw_ypcz=!Y&dGx@$748w20nu}X3)VrK94Wpi+Bzf z@jSkP7w{s!gO~6Fyo^`yBm5Yz;^+7Uev3cgk7Au=1?u*T`$CO3sa1-)!E;)6Vm0bU z4)-YC|0{LBUnlr_&!)}WV>@>>x3zcN+Sj6;Tuv#@BS92SpaMboR{o2XZ11(meaf~{ z%pM{BnP((MBDG3bMGVwjQ1Xtlp_?j4a6MlwY;dca- za0AwI_SIty8}MP=jd5(o7Ce9liH9B7g?-qM12{-roWSFF0+Xl{7f*98PT>sB;#r(0 zPQHXM6C+>2R|8JIiErV%xKzZz-U9c8#P>@vaC#`~*sgPm^o+e#bbjcNp+m={BgbEU z&{R;jOFw$cho6@PthZm6iy>-R{(q?S_y60UC>$X~AVlDfMF1>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX new file mode 100755 index 0000000000000000000000000000000000000000..8ed0bd0ba2f87bec2b73e50f458c707c086685c2 GIT binary patch literal 9072 zcmeHN&u`pB6dpGlSe2@~g%-+BnW`$KrM5STLV!y{Hen;u?22xssH-sYt|y79cWte0 zNI8`Q2vl)L;$MIR;)s+(xpApDv?p$e3kZpG4~XxL$6b4&5)$H2X`b|U-Z$^fo0-p! zlzHRZ_kRELQO1lJ#@Hcf9m*<lmWg?@!+(M3w@BjG#|`$=YJxSa3KQEUc|H&h7Wl2q7@BIbM$Cu4uKt2(FG zSFdIHzEpm~py$32XGP&W9ev=BJnoNnLO7=LeWmgdrzC`@b7Y?Emw5XE%6W6SyIk;q zpAv65f2t+ENM(#1@41OP8ULVsW*&k(Ip=v-v7NjZ8|#~IuQu27XNm-+bpew^DjE6m zHBtX5#%?%dn2c4aeSlO=86vqli5Lg?INIn%{D8p6&~%_Ak1M5lo`4qT1N>J)uZ;;k z0=3h4YzKbd_O1sWFv+t}TF0gDoQ)a3vGUQGZ^XslK3tqbp9z(7)(*1@lx(^EM_xH} z4z_wkuoydw{ZpRl_mt)(UdSik591T0FeYokdIsmuTMY|~^80d~ONDsDGw^3qj=y|8 zPQ=i9Qw>2hV`reWp0j4g|H}#!zgjc{ngPv#WE1dL;jy=d*pjgysblBJz9o3&2Ma73K8<^3w%5E)}U> z(N?&s@Vg4v74{WAsqm-3`5h}v_VX0J2fQ<5upfRs!O2f^ScUa`4f}Kflm9d{{~mzw zCVq1KEo>8gx!jt;zFc zgUK4G-bSTOa|yHc6sTl#;S49M2hLg-4m(a*!F57FHGo5esZ}G8rP)i2gQw|AiNh2J uMWEOs7OqC81rt;RR1H=vYt#U;1thL~MUfPc5COVhk%xhS2}pz3AOHZbPDWP% literal 0 HcmV?d00001 diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList new file mode 100644 index 00000000..5d472b44 --- /dev/null +++ b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList @@ -0,0 +1 @@ +/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX_dependency_info.dat b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX_dependency_info.dat new file mode 100644 index 0000000000000000000000000000000000000000..722f91c4b5a9753b2d1787240d73c7408b42da08 GIT binary patch literal 28350 zcmd^HU2oeq6wULVwtrAyFB^(VHQIQ?o?1BTu&qIiCIj*o&=hTJmPk#MQ~TeK`X(h0 z*aq+(4tofYR7K9mr5Nd+OJBYF=Id|QpYDG8^#1mTEP3(5eE-Xjs|WM_^6jhZ>t(e3 z;_A!zeNkj7XH}}Cjvu*7M8t|BUMX1#S?TyjJc~>fqKwxWtG24lb$rYC-Th-!bpK%e zpZl9%`^$^h(c(JN$ss=KGS1RX{dIrVmB^!NlaNF6moMpYb)&ad&KcheC;^q{O0LRt zQ7JHwBF#kkR909T#d&LZU^$e6!wZt6x?mOGBb`XjS%Snrh;zOxkqk0+l-L^NW`~0A z41XM1$z+vE=uKIQTs;f)*3kapcw#z3F3OI@CR6;N10cdf;GpC--5ty3ktqm1rO={$ zPPqu7L1rPyX{7eakfxrJ`>oht`XN)f`|26!21EvR1# zIx}*XnH@HOdq#@tvnmhbWZwO>c_R#glB&|}IRGO4+inO{s(mR~2%DQ`GTEq80G?>U zQ<*|vDZ9H_pL6qyorkd5S0&@nhv}m<4+GGJdMf_;#`>UC#`i4kJ7PCt%Z^zUop{w> z8Jb!=V{#WS7SZeIP1EISAAp*cPkpIwb0~d^m}z+ZW}ee@yxyl-YFcbJiXZc)$F?$E zHywX4JFkult%@pM-`}ktVsT=5k(o=YTXqm1Ot(VEZ=%I_25F`8ri=1(vU+@Ue~LE8 zG)qiVZgbpSymGhsUGPf3lBSu*viS7<@@e_D#W25Y{LPUHp0n*j^f8r(+N6)EuCBhK z=xqM|=Bb}0^*<0!RtOX2)SudBe4<1=5}8kB;KX~@?hx6!z>sW zU>xY;0F-A%fL$uey3rKgL`B1O-F6_amwvr}l-Ce|l z(QV~h)VkYX3nP0B)u>flX&OelMF6q0Svej?zeNC{zw1WT2_idKSPH(GF)pZ5Zdns8>Tb7=}@AO{G!muE)_ZqWeKOQpIiiu^EO#4VPFH z>@f>K5gaDNv;&w3ZtTIfW61xZZVX90mIWx1AM1e&$VU#iuzKVG3ywz$R)`8+lvbDt z<e4KW)0{NRxYj+J@aR1#D?Gtup>J&rf*1w;0v%bIrpXS%Y|SJtU)*0 zf@_nF9R6L)%Ey7XwpsgMJ4NZ4_4ui3%$!y8X3hxH- z&1R{APh|rbfi63T@TzG%2Qe{JnMuoE`<)MmkvX`2LC1oE82a0GZ`E=B@IRyp@98O2L^w?189LcP{O zF;ck}E}7a%NJy}Box^7ocuw|621r)Hi-{(IOb3@ttrM3LsI(4*5ui;nSUNp zfw=x47X_3X7Skb;Rqih{XacP>Y&zBMaVrX~_Tef5yjgZmiAh$+X(&%2(m51G05}c% z2_ebqI2|IO(C8dyq5zx@Cs1ONRnnb$AdqMuLh=bWnWZ3r@?SH1Hp8c&{_xN{e**^N L=T4gsp}zVPBALx} literal 0 HcmV?d00001 diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh new file mode 100755 index 00000000..d6607e99 --- /dev/null +++ b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo "GCC_VERSION=$GCC_VERSION" ; echo "ARCHS=$ARCHS" diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml new file mode 100644 index 00000000..ee59dbc2 --- /dev/null +++ b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml @@ -0,0 +1 @@ +{"case-sensitive":"false","roots":[],"version":0} \ No newline at end of file diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.xcodeproj/project.pbxproj b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.xcodeproj/project.pbxproj new file mode 100644 index 00000000..edf2da1c --- /dev/null +++ b/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.xcodeproj/project.pbxproj @@ -0,0 +1,113 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + + 2C18F0B615DC1E0300593670 = {isa = PBXBuildFile; fileRef = 2C18F0B415DC1DC700593670; }; + 2C18F0B415DC1DC700593670 = {isa = PBXFileReference; fileEncoding = 4; explicitFileType = sourcecode.cpp.cpp; path = CMakeCXXCompilerId.cpp; sourceTree = ""; }; + 08FB7794FE84155DC02AAC07 = { + isa = PBXGroup; + children = ( + 2C18F0B415DC1DC700593670, + ); + name = CompilerIdCXX; + sourceTree = ""; + }; + 8DD76FA90486AB0100D96B5E = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB928508733DD80010E9CD; + buildPhases = ( + 2C18F0B515DC1DCE00593670, + 2C8FEB8E15DC1A1A00E56A5D, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CompilerIdCXX; + productName = CompilerIdCXX; + productType = "com.apple.product-type.tool"; + }; + 08FB7793FE84155DC02AAC07 = { + isa = PBXProject; + buildConfigurationList = 1DEB928908733DD80010E9CD; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 08FB7794FE84155DC02AAC07; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8DD76FA90486AB0100D96B5E, + ); + }; + 2C8FEB8E15DC1A1A00E56A5D = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"GCC_VERSION=$GCC_VERSION\" ; echo \"ARCHS=$ARCHS\""; + showEnvVarsInLog = 0; + }; + 2C18F0B515DC1DCE00593670 = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2C18F0B615DC1E0300593670, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1DEB928608733DD80010E9CD = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + PRODUCT_NAME = CompilerIdCXX; + }; + name = Debug; + }; + 1DEB928A08733DD80010E9CD = { + isa = XCBuildConfiguration; + buildSettings = { + ONLY_ACTIVE_ARCH = YES; + CODE_SIGNING_REQUIRED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; + SYMROOT = .; + + + + + SDKROOT = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk"; + }; + name = Debug; + }; + 1DEB928508733DD80010E9CD = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB928608733DD80010E9CD, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 1DEB928908733DD80010E9CD = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB928A08733DD80010E9CD, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + }; + rootObject = 08FB7793FE84155DC02AAC07; +} diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/BuildDescriptionCacheIndex-5b7f4da6c739b1aa859fd167c37a6781 b/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/BuildDescriptionCacheIndex-5b7f4da6c739b1aa859fd167c37a6781 new file mode 100644 index 0000000000000000000000000000000000000000..aeff5f24af49ab0aa10d00c6061e6581608cca9c GIT binary patch literal 44 ycmcc200eRC{M;rUQAkZqv@|j?H!?6zOiQ##F|ssEOHNElGB8g~O))YzF#-TCJPkMi literal 0 HcmV?d00001 diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/build.db b/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/build.db new file mode 100644 index 0000000000000000000000000000000000000000..d0586f09e9887f178697428a9ba851c05cc69e5d GIT binary patch literal 90112 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 literal 0 HcmV?d00001 diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/eea9247203afa8d296fcadb07eed2742-desc.xcbuild b/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/eea9247203afa8d296fcadb07eed2742-desc.xcbuild new file mode 100644 index 0000000000000000000000000000000000000000..1e47b91783db5d7a6ca84cd85616a8a9bcb4f039 GIT binary patch literal 52438 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 AO8@`> literal 0 HcmV?d00001 diff --git a/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/eea9247203afa8d296fcadb07eed2742-manifest.xcbuild b/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/eea9247203afa8d296fcadb07eed2742-manifest.xcbuild new file mode 100644 index 00000000..b9df8165 --- /dev/null +++ b/examples/CMakeFiles/3.17.3/CompilerIdCXX/XCBuildData/eea9247203afa8d296fcadb07eed2742-manifest.xcbuild @@ -0,0 +1,58 @@ +client: + name: basic + version: 0 + file-system: default + +targets: + "": [""] + +nodes: + "/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX": {"is-mutated":true} + +commands: + "": {"tool":"phony","inputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","",""],"outputs":[""]} + "": {"tool":"stale-file-removal","expectedOutputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml"],"roots":["/tmp/CompilerIdCXX.dst","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX"],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--Barrier-ChangeAlternatePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--Barrier-ChangePermissions": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--Barrier-CodeSign": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--Barrier-CopyAside": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--Barrier-RegisterExecutionPolicyException": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--Barrier-StripSymbols": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--Barrier-Validate": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--CopySwiftPackageResourcesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--GeneratedFilesTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--HeadermapTaskProducer": {"tool":"phony","inputs":["","","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--InfoPlistTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--ModuleMapTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--ProductPostprocessingTaskProducer": {"tool":"phony","inputs":["","","","","","","","","","",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--ProductStructureTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--SanitizerTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--StubBinaryTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--SwiftStandardLibrariesTaskProducer": {"tool":"phony","inputs":["","",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--TestTargetPostprocessingTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--TestTargetTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--VersionPlistTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--XCFrameworkTaskProducer": {"tool":"phony","inputs":["",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--begin-compiling": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--end": {"tool":"phony","inputs":["","","","","","","","","","","","","","","","","","","","","","","","","","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o","","","","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml"],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--entry": {"tool":"phony","inputs":["","","","",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--generated-headers": {"tool":"phony","inputs":[""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--immediate": {"tool":"phony","inputs":["","","",""],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--modules-ready": {"tool":"phony","inputs":["","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o","","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh"],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--phase0-compile-sources": {"tool":"phony","inputs":["","","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o","","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList"],"outputs":[""]} + "Gate target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d--phase1-run-script": {"tool":"phony","inputs":["","","","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh"],"outputs":[""]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::CompileC /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CMakeCXXCompilerId.cpp normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler": {"tool":"shell","description":"CompileC /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CMakeCXXCompilerId.cpp normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler","inputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CMakeCXXCompilerId.cpp","","",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o"],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang","-x","c++","-target","x86_64-apple-macos10.15","-fmessage-length=0","-fdiagnostics-show-note-include-stack","-fmacro-backtrace-limit=0","-Wno-trigraphs","-fpascal-strings","-Os","-Wno-missing-field-initializers","-Wno-missing-prototypes","-Wno-return-type","-Wno-non-virtual-dtor","-Wno-overloaded-virtual","-Wno-exit-time-destructors","-Wno-missing-braces","-Wparentheses","-Wswitch","-Wno-unused-function","-Wno-unused-label","-Wno-unused-parameter","-Wno-unused-variable","-Wunused-value","-Wno-empty-body","-Wno-uninitialized","-Wno-unknown-pragmas","-Wno-shadow","-Wno-four-char-constants","-Wno-conversion","-Wno-constant-conversion","-Wno-int-conversion","-Wno-bool-conversion","-Wno-enum-conversion","-Wno-float-conversion","-Wno-non-literal-null-conversion","-Wno-objc-literal-conversion","-Wno-shorten-64-to-32","-Wno-newline-eof","-Wno-c++11-extensions","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk","-fasm-blocks","-fstrict-aliasing","-Wdeprecated-declarations","-Winvalid-offsetof","-g","-fvisibility=hidden","-fvisibility-inlines-hidden","-Wno-sign-conversion","-Wno-infinite-recursion","-Wno-move","-Wno-comma","-Wno-block-capture-autoreleasing","-Wno-strict-prototypes","-Wno-range-loop-analysis","-Wno-semicolon-before-method-body","-iquote","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap","-I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap","-I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap","-iquote","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap","-I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/include","-I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources-normal/x86_64","-I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources/x86_64","-I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources","-F/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","-MMD","-MT","dependencies","-MF","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.d","--serialize-diagnostics","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.dia","-c","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CMakeCXXCompilerId.cpp","-o","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o"],"env":{"LANG":"en_US.US-ASCII"},"working-directory":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","deps":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.d"],"deps-style":"makefile","signature":"575eeddcf1e77c40b57bc7c025485950"} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::CreateBuildDirectory /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX": {"tool":"create-build-directory","description":"CreateBuildDirectory /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","inputs":[],"outputs":["","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::Ld /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX normal x86_64": {"tool":"shell","description":"Ld /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX normal x86_64","inputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList","",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX",""],"args":["/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++","-target","x86_64-apple-macos10.15","-isysroot","/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk","-L/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","-F/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","-filelist","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList","-Xlinker","-object_path_lto","-Xlinker","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX_lto.o","-Xlinker","-dependency_info","-Xlinker","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX_dependency_info.dat","-o","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX"],"env":{},"working-directory":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","deps":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX_dependency_info.dat"],"deps-style":"dependency-info","signature":"4162175b94ba6f83159e75e0eb27b593"} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::PhaseScriptExecution Run Script /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh": {"tool":"shell","description":"PhaseScriptExecution Run Script /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh","inputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh","",""],"outputs":[""],"args":["/bin/sh","-c","/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh"],"env":{"ACTION":"build","AD_HOC_CODE_SIGNING_ALLOWED":"YES","ALTERNATE_GROUP":"staff","ALTERNATE_MODE":"u+w,go-w,a+rX","ALTERNATE_OWNER":"Philipp","ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES":"NO","ALWAYS_SEARCH_USER_PATHS":"YES","ALWAYS_USE_SEPARATE_HEADERMAPS":"NO","APPLE_INTERNAL_DEVELOPER_DIR":"/AppleInternal/Developer","APPLE_INTERNAL_DIR":"/AppleInternal","APPLE_INTERNAL_DOCUMENTATION_DIR":"/AppleInternal/Documentation","APPLE_INTERNAL_LIBRARY_DIR":"/AppleInternal/Library","APPLE_INTERNAL_TOOLS":"/AppleInternal/Developer/Tools","APPLICATION_EXTENSION_API_ONLY":"NO","APPLY_RULES_IN_COPY_FILES":"NO","APPLY_RULES_IN_COPY_HEADERS":"NO","ARCHS":"x86_64","ARCHS_STANDARD":"x86_64","ARCHS_STANDARD_32_64_BIT":"x86_64 i386","ARCHS_STANDARD_32_BIT":"i386","ARCHS_STANDARD_64_BIT":"x86_64","ARCHS_STANDARD_INCLUDING_64_BIT":"x86_64","AVAILABLE_PLATFORMS":"appletvos appletvsimulator iphoneos iphonesimulator macosx watchos watchsimulator","BITCODE_GENERATION_MODE":"marker","BUILD_ACTIVE_RESOURCES_ONLY":"NO","BUILD_COMPONENTS":"headers build","BUILD_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","BUILD_LIBRARY_FOR_DISTRIBUTION":"NO","BUILD_ROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","BUILD_STYLE":"","BUILD_VARIANTS":"normal","BUILT_PRODUCTS_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","BUNDLE_CONTENTS_FOLDER_PATH":"Contents/","BUNDLE_CONTENTS_FOLDER_PATH_deep":"Contents/","BUNDLE_EXECUTABLE_FOLDER_NAME_deep":"MacOS","BUNDLE_EXECUTABLE_FOLDER_PATH":"Contents/MacOS","BUNDLE_FORMAT":"deep","BUNDLE_FRAMEWORKS_FOLDER_PATH":"Contents/Frameworks","BUNDLE_PLUGINS_FOLDER_PATH":"Contents/PlugIns","BUNDLE_PRIVATE_HEADERS_FOLDER_PATH":"Contents/PrivateHeaders","BUNDLE_PUBLIC_HEADERS_FOLDER_PATH":"Contents/Headers","CACHE_ROOT":"/var/folders/g1/tcdfsqxs5ln1cqsk61gv1gr80000gn/C/com.apple.DeveloperTools/11.5-11E608c/Xcode","CCHROOT":"/var/folders/g1/tcdfsqxs5ln1cqsk61gv1gr80000gn/C/com.apple.DeveloperTools/11.5-11E608c/Xcode","CHMOD":"/bin/chmod","CHOWN":"/usr/sbin/chown","CLANG_MODULES_BUILD_SESSION_FILE":"/var/folders/g1/tcdfsqxs5ln1cqsk61gv1gr80000gn/C/org.llvm.clang/ModuleCache.noindex/Session.modulevalidation","CLASS_FILE_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/JavaClasses","CLEAN_PRECOMPS":"YES","CLONE_HEADERS":"NO","CODESIGNING_FOLDER_PATH":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX","CODE_SIGNING_ALLOWED":"YES","CODE_SIGNING_REQUIRED":"NO","CODE_SIGN_IDENTITY_NO":"Apple Development","CODE_SIGN_IDENTITY_YES":"-","CODE_SIGN_INJECT_BASE_ENTITLEMENTS":"YES","COLOR_DIAGNOSTICS":"NO","COMBINE_HIDPI_IMAGES":"NO","COMPILER_INDEX_STORE_ENABLE":"Default","COMPOSITE_SDK_DIRS":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompositeSDKs","COMPRESS_PNG_FILES":"NO","CONFIGURATION":"Debug","CONFIGURATION_BUILD_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","CONFIGURATION_TEMP_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug","COPYING_PRESERVES_HFS_DATA":"NO","COPY_HEADERS_RUN_UNIFDEF":"NO","COPY_PHASE_STRIP":"YES","COPY_RESOURCES_FROM_STATIC_FRAMEWORKS":"YES","CP":"/bin/cp","CREATE_INFOPLIST_SECTION_IN_BINARY":"NO","CURRENT_ARCH":"undefined_arch","CURRENT_VARIANT":"normal","DEAD_CODE_STRIPPING":"NO","DEBUGGING_SYMBOLS":"YES","DEBUG_INFORMATION_FORMAT":"dwarf","DEFAULT_COMPILER":"com.apple.compilers.llvm.clang.1_0","DEFAULT_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","DEFAULT_KEXT_INSTALL_PATH":"/System/Library/Extensions","DEFINES_MODULE":"NO","DEPLOYMENT_LOCATION":"NO","DEPLOYMENT_POSTPROCESSING":"NO","DEPLOYMENT_TARGET_CLANG_ENV_NAME":"MACOSX_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_CLANG_FLAG_NAME":"mmacosx-version-min","DEPLOYMENT_TARGET_LD_ENV_NAME":"MACOSX_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_LD_FLAG_NAME":"macosx_version_min","DEPLOYMENT_TARGET_SETTING_NAME":"MACOSX_DEPLOYMENT_TARGET","DEPLOYMENT_TARGET_SUGGESTED_VALUES":"10.6 10.7 10.8 10.9 10.10 10.11 10.12 10.13 10.14 10.15","DERIVED_FILES_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources","DERIVED_FILE_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources","DERIVED_SOURCES_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources","DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","DEVELOPER_FRAMEWORKS_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_FRAMEWORKS_DIR_QUOTED":"/Applications/Xcode.app/Contents/Developer/Library/Frameworks","DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","DEVELOPMENT_LANGUAGE":"English","DONT_GENERATE_INFOPLIST_FILE":"NO","DO_HEADER_SCANNING_IN_JAM":"NO","DSTROOT":"/tmp/CompilerIdCXX.dst","DT_TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","DWARF_DSYM_FILE_NAME":"CompilerIdCXX.dSYM","DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT":"NO","DWARF_DSYM_FOLDER_PATH":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","EMBEDDED_CONTENT_CONTAINS_SWIFT":"NO","EMBEDDED_PROFILE_NAME":"embedded.provisionprofile","EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE":"NO","ENABLE_BITCODE":"NO","ENABLE_DEFAULT_HEADER_SEARCH_PATHS":"YES","ENABLE_HARDENED_RUNTIME":"NO","ENABLE_HEADER_DEPENDENCIES":"YES","ENABLE_ON_DEMAND_RESOURCES":"NO","ENABLE_PREVIEWS":"NO","ENABLE_TESTABILITY":"NO","ENABLE_TESTING_SEARCH_PATHS":"NO","EXCLUDED_INSTALLSRC_SUBDIRECTORY_PATTERNS":".DS_Store .svn .git .hg CVS","EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES":"*.nib *.lproj *.framework *.gch *.xcode* *.xcassets (*) .DS_Store CVS .svn .git .hg *.pbproj *.pbxproj","EXECUTABLE_NAME":"CompilerIdCXX","EXECUTABLE_PATH":"CompilerIdCXX","FILE_LIST":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects/LinkFileList","FIXED_FILES_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/FixedFiles","FRAMEWORK_FLAG_PREFIX":"-framework","FRAMEWORK_SEARCH_PATHS":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX ","FRAMEWORK_VERSION":"A","FULL_PRODUCT_NAME":"CompilerIdCXX","GCC3_VERSION":"3.3","GCC_DYNAMIC_NO_PIC":"NO","GCC_INLINES_ARE_PRIVATE_EXTERN":"YES","GCC_PFE_FILE_C_DIALECTS":"c objective-c c++ objective-c++","GCC_SYMBOLS_PRIVATE_EXTERN":"YES","GCC_TREAT_WARNINGS_AS_ERRORS":"NO","GCC_VERSION":"com.apple.compilers.llvm.clang.1_0","GCC_VERSION_IDENTIFIER":"com_apple_compilers_llvm_clang_1_0","GENERATE_MASTER_OBJECT_FILE":"NO","GENERATE_PKGINFO_FILE":"NO","GENERATE_PROFILING_CODE":"NO","GENERATE_TEXT_BASED_STUBS":"NO","GID":"20","GROUP":"staff","HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT":"YES","HEADERMAP_INCLUDES_FRAMEWORK_ENTRIES_FOR_ALL_PRODUCT_TYPES":"YES","HEADERMAP_INCLUDES_NONPUBLIC_NONPRIVATE_HEADERS":"YES","HEADERMAP_INCLUDES_PROJECT_HEADERS":"YES","HEADERMAP_USES_FRAMEWORK_PREFIX_ENTRIES":"YES","HEADERMAP_USES_VFS":"NO","HEADER_SEARCH_PATHS":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/include ","HIDE_BITCODE_SYMBOLS":"YES","HOME":"/Users/Philipp","ICONV":"/usr/bin/iconv","INFOPLIST_EXPAND_BUILD_SETTINGS":"YES","INFOPLIST_OUTPUT_FORMAT":"same-as-input","INFOPLIST_PREPROCESS":"NO","INLINE_PRIVATE_FRAMEWORKS":"NO","INSTALLHDRS_COPY_PHASE":"NO","INSTALLHDRS_SCRIPT_PHASE":"NO","INSTALL_DIR":"/tmp/CompilerIdCXX.dst/usr/local/bin","INSTALL_GROUP":"staff","INSTALL_MODE_FLAG":"u+w,go-w,a+rX","INSTALL_OWNER":"Philipp","INSTALL_PATH":"/usr/local/bin","INSTALL_ROOT":"/tmp/CompilerIdCXX.dst","IOS_UNZIPPERED_TWIN_PREFIX_PATH":"/System/iOSSupport","IS_MACCATALYST":"NO","IS_UIKITFORMAC":"NO","JAVAC_DEFAULT_FLAGS":"-J-Xms64m -J-XX:NewSize=4M -J-Dfile.encoding=UTF8","JAVA_APP_STUB":"/System/Library/Frameworks/JavaVM.framework/Resources/MacOS/JavaApplicationStub","JAVA_ARCHIVE_CLASSES":"YES","JAVA_ARCHIVE_TYPE":"JAR","JAVA_COMPILER":"/usr/bin/javac","JAVA_FRAMEWORK_RESOURCES_DIRS":"Resources","JAVA_JAR_FLAGS":"cv","JAVA_SOURCE_SUBDIR":".","JAVA_USE_DEPENDENCIES":"YES","JAVA_ZIP_FLAGS":"-urg","JIKES_DEFAULT_FLAGS":"+E +OLDCSO","KASAN_DEFAULT_CFLAGS":"-DKASAN=1 -fsanitize=address -mllvm -asan-globals-live-support -mllvm -asan-force-dynamic-shadow","KEEP_PRIVATE_EXTERNS":"NO","LD_DEPENDENCY_INFO_FILE":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/undefined_arch/CompilerIdCXX_dependency_info.dat","LD_GENERATE_MAP_FILE":"NO","LD_MAP_FILE_PATH":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-LinkMap-normal-undefined_arch.txt","LD_NO_PIE":"NO","LD_QUOTE_LINKER_ARGUMENTS_FOR_COMPILER_DRIVER":"YES","LEGACY_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer","LEX":"lex","LIBRARY_DEXT_INSTALL_PATH":"/Library/DriverExtensions","LIBRARY_FLAG_NOSPACE":"YES","LIBRARY_FLAG_PREFIX":"-l","LIBRARY_KEXT_INSTALL_PATH":"/Library/Extensions","LIBRARY_SEARCH_PATHS":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX ","LINKER_DISPLAYS_MANGLED_NAMES":"NO","LINK_FILE_LIST_normal_x86_64":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList","LINK_WITH_STANDARD_LIBRARIES":"YES","LLVM_TARGET_TRIPLE_OS_VERSION":"macos10.15","LLVM_TARGET_TRIPLE_OS_VERSION_NO":"macos10.15","LLVM_TARGET_TRIPLE_OS_VERSION_YES":"macos10.15","LLVM_TARGET_TRIPLE_VENDOR":"apple","LOCALIZED_STRING_MACRO_NAMES":"NSLocalizedString CFCopyLocalizedString","LOCALIZED_STRING_SWIFTUI_SUPPORT":"YES","LOCAL_ADMIN_APPS_DIR":"/Applications/Utilities","LOCAL_APPS_DIR":"/Applications","LOCAL_DEVELOPER_DIR":"/Library/Developer","LOCAL_LIBRARY_DIR":"/Library","LOCROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","LOCSYMROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","MACH_O_TYPE":"mh_execute","MACOSX_DEPLOYMENT_TARGET":"10.15","MAC_OS_X_PRODUCT_BUILD_VERSION":"19G73","MAC_OS_X_VERSION_ACTUAL":"101506","MAC_OS_X_VERSION_MAJOR":"101500","MAC_OS_X_VERSION_MINOR":"1506","METAL_LIBRARY_FILE_BASE":"default","METAL_LIBRARY_OUTPUT_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/","NATIVE_ARCH":"x86_64","NATIVE_ARCH_32_BIT":"i386","NATIVE_ARCH_64_BIT":"x86_64","NATIVE_ARCH_ACTUAL":"x86_64","NO_COMMON":"YES","OBJECT_FILE_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects","OBJECT_FILE_DIR_normal":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal","OBJROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","ONLY_ACTIVE_ARCH":"YES","OS":"MACOS","OSAC":"/usr/bin/osacompile","PACKAGE_TYPE":"com.apple.package-type.mach-o-executable","PASCAL_STRINGS":"YES","PATH":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/libexec:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/usr/local/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/local/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands","PATH_PREFIXES_EXCLUDED_FROM_HEADER_DEPENDENCIES":"/usr/include /usr/local/include /System/Library/Frameworks /System/Library/PrivateFrameworks /Applications/Xcode.app/Contents/Developer/Headers /Applications/Xcode.app/Contents/Developer/SDKs /Applications/Xcode.app/Contents/Developer/Platforms","PER_ARCH_OBJECT_FILE_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/undefined_arch","PER_VARIANT_OBJECT_FILE_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal","PKGINFO_FILE_PATH":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/PkgInfo","PLATFORM_DEVELOPER_APPLICATIONS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","PLATFORM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","PLATFORM_DEVELOPER_LIBRARY_DIR":"/Applications/Xcode.app/Contents/Developer/Library","PLATFORM_DEVELOPER_SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs","PLATFORM_DEVELOPER_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Tools","PLATFORM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","PLATFORM_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform","PLATFORM_DISPLAY_NAME":"macOS","PLATFORM_FAMILY_NAME":"macOS","PLATFORM_NAME":"macosx","PLATFORM_PREFERRED_ARCH":"x86_64","PLATFORM_PRODUCT_BUILD_VERSION":"11E608c","PLIST_FILE_OUTPUT_FORMAT":"same-as-input","PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR":"YES","PRECOMP_DESTINATION_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/PrefixHeaders","PRESERVE_DEAD_CODE_INITS_AND_TERMS":"NO","PRODUCT_MODULE_NAME":"CompilerIdCXX","PRODUCT_NAME":"CompilerIdCXX","PRODUCT_SETTINGS_PATH":"","PRODUCT_TYPE":"com.apple.product-type.tool","PROFILING_CODE":"NO","PROJECT":"CompilerIdCXX","PROJECT_DERIVED_FILE_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/DerivedSources","PROJECT_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","PROJECT_FILE_PATH":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.xcodeproj","PROJECT_NAME":"CompilerIdCXX","PROJECT_TEMP_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build","PROJECT_TEMP_ROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","RECURSIVE_SEARCH_PATHS_FOLLOW_SYMLINKS":"YES","REMOVE_CVS_FROM_RESOURCES":"YES","REMOVE_GIT_FROM_RESOURCES":"YES","REMOVE_HEADERS_FROM_EMBEDDED_BUNDLES":"YES","REMOVE_HG_FROM_RESOURCES":"YES","REMOVE_SVN_FROM_RESOURCES":"YES","REZ_COLLECTOR_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/ResourceManagerResources","REZ_EXECUTABLE":"YES","REZ_OBJECTS_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/ResourceManagerResources/Objects","REZ_SEARCH_PATHS":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX ","SCAN_ALL_SOURCE_FILES_FOR_INCLUDES":"NO","SCRIPT_INPUT_FILE_COUNT":"0","SCRIPT_INPUT_FILE_LIST_COUNT":"0","SCRIPT_OUTPUT_FILE_COUNT":"0","SCRIPT_OUTPUT_FILE_LIST_COUNT":"0","SDKROOT":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk","SDK_DIR":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk","SDK_DIR_macosx10_15":"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk","SDK_NAME":"macosx10.15","SDK_NAMES":"macosx10.15","SDK_PRODUCT_BUILD_VERSION":"19E258","SDK_VERSION":"10.15","SDK_VERSION_ACTUAL":"101504","SDK_VERSION_MAJOR":"101500","SDK_VERSION_MINOR":"1504","SED":"/usr/bin/sed","SEPARATE_STRIP":"NO","SEPARATE_SYMBOL_EDIT":"NO","SET_DIR_MODE_OWNER_GROUP":"YES","SET_FILE_MODE_OWNER_GROUP":"NO","SHALLOW_BUNDLE":"NO","SHARED_DERIVED_FILE_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/DerivedSources","SHARED_PRECOMPS_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/SharedPrecompiledHeaders","SKIP_INSTALL":"NO","SOURCE_ROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","SRCROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","STRINGS_FILE_OUTPUT_ENCODING":"UTF-16","STRIP_BITCODE_FROM_COPIED_FILES":"NO","STRIP_INSTALLED_PRODUCT":"YES","STRIP_PNG_TEXT":"NO","STRIP_STYLE":"all","STRIP_SWIFT_SYMBOLS":"YES","SUPPORTED_PLATFORMS":"macosx","SUPPORTS_TEXT_BASED_API":"NO","SWIFT_PLATFORM_TARGET_PREFIX":"macos","SWIFT_RESPONSE_FILE_PATH_normal_x86_64":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.SwiftFileList","SYMROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","SYSTEM_ADMIN_APPS_DIR":"/Applications/Utilities","SYSTEM_APPS_DIR":"/Applications","SYSTEM_CORE_SERVICES_DIR":"/System/Library/CoreServices","SYSTEM_DEMOS_DIR":"/Applications/Extras","SYSTEM_DEVELOPER_APPS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications","SYSTEM_DEVELOPER_BIN_DIR":"/Applications/Xcode.app/Contents/Developer/usr/bin","SYSTEM_DEVELOPER_DEMOS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities/Built Examples","SYSTEM_DEVELOPER_DIR":"/Applications/Xcode.app/Contents/Developer","SYSTEM_DEVELOPER_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library","SYSTEM_DEVELOPER_GRAPHICS_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Graphics Tools","SYSTEM_DEVELOPER_JAVA_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Java Tools","SYSTEM_DEVELOPER_PERFORMANCE_TOOLS_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Performance Tools","SYSTEM_DEVELOPER_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes","SYSTEM_DEVELOPER_TOOLS":"/Applications/Xcode.app/Contents/Developer/Tools","SYSTEM_DEVELOPER_TOOLS_DOC_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/documentation/DeveloperTools","SYSTEM_DEVELOPER_TOOLS_RELEASENOTES_DIR":"/Applications/Xcode.app/Contents/Developer/ADC Reference Library/releasenotes/DeveloperTools","SYSTEM_DEVELOPER_USR_DIR":"/Applications/Xcode.app/Contents/Developer/usr","SYSTEM_DEVELOPER_UTILITIES_DIR":"/Applications/Xcode.app/Contents/Developer/Applications/Utilities","SYSTEM_DEXT_INSTALL_PATH":"/System/Library/DriverExtensions","SYSTEM_DOCUMENTATION_DIR":"/Library/Documentation","SYSTEM_KEXT_INSTALL_PATH":"/System/Library/Extensions","SYSTEM_LIBRARY_DIR":"/System/Library","TAPI_VERIFY_MODE":"ErrorsOnly","TARGETNAME":"CompilerIdCXX","TARGET_BUILD_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","TARGET_NAME":"CompilerIdCXX","TARGET_TEMP_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build","TEMP_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build","TEMP_FILES_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build","TEMP_FILE_DIR":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build","TEMP_ROOT":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","TEST_FRAMEWORK_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks","TEST_LIBRARY_SEARCH_PATHS":" /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib","TOOLCHAINS":"com.apple.dt.toolchain.XcodeDefault","TOOLCHAIN_DIR":"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain","TREAT_MISSING_BASELINES_AS_TEST_FAILURES":"NO","UID":"501","UNSTRIPPED_PRODUCT":"NO","USER":"Philipp","USER_APPS_DIR":"/Users/Philipp/Applications","USER_LIBRARY_DIR":"/Users/Philipp/Library","USE_DYNAMIC_NO_PIC":"YES","USE_HEADERMAP":"YES","USE_HEADER_SYMLINKS":"NO","USE_LLVM_TARGET_TRIPLES":"YES","USE_LLVM_TARGET_TRIPLES_FOR_CLANG":"YES","USE_LLVM_TARGET_TRIPLES_FOR_LD":"YES","USE_LLVM_TARGET_TRIPLES_FOR_TAPI":"YES","VALIDATE_DEVELOPMENT_ASSET_PATHS":"YES_ERROR","VALIDATE_PRODUCT":"NO","VALIDATE_WORKSPACE":"YES_ERROR","VALID_ARCHS":"i386 x86_64","VERBOSE_PBXCP":"NO","VERSION_INFO_BUILDER":"Philipp","VERSION_INFO_FILE":"CompilerIdCXX_vers.c","VERSION_INFO_STRING":"\"@(#)PROGRAM:CompilerIdCXX PROJECT:CompilerIdCXX-\"","WRAP_ASSET_PACKS_IN_SEPARATE_DIRECTORIES":"NO","XCODE_APP_SUPPORT_DIR":"/Applications/Xcode.app/Contents/Developer/Library/Xcode","XCODE_PRODUCT_BUILD_VERSION":"11E608c","XCODE_VERSION_ACTUAL":"1150","XCODE_VERSION_MAJOR":"1100","XCODE_VERSION_MINOR":"1150","XPCSERVICES_FOLDER_PATH":"/XPCServices","YACC":"yacc","_BOOL_":"NO","_BOOL_NO":"NO","_BOOL_YES":"YES","_DEVELOPMENT_TEAM_IS_EMPTY":"YES","_IS_EMPTY_":"YES","_MACOSX_DEPLOYMENT_TARGET_IS_EMPTY":"NO","arch":"undefined_arch","variant":"normal"},"allow-missing-inputs":true,"always-out-of-date":true,"working-directory":"/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX","control-enabled":false,"signature":"8110e96639ee1b895b67610d12bef2fe"} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::RegisterExecutionPolicyException /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX": {"tool":"register-execution-policy-exception","description":"RegisterExecutionPolicyException /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX","inputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX","",""],"outputs":[""]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh"]} + "target-CompilerIdCXX-7a699b010f4bd318f236ad8891cdf68a3f938c03aee3f24af46a5caa592e362d-::WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml": {"tool":"auxiliary-file","description":"WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml","inputs":["",""],"outputs":["/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml"]} + diff --git a/examples/CMakeFiles/CMakeList.txt b/examples/CMakeFiles/CMakeList.txt new file mode 100644 index 00000000..ddb5bdc2 --- /dev/null +++ b/examples/CMakeFiles/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(CMakeFiles LANGUAGES CXX) + +add_executable(${PROJECT_NAME} CMakeFiles.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/CMakeFiles/CMakeOutput.log b/examples/CMakeFiles/CMakeOutput.log new file mode 100644 index 00000000..ccf1d1ab --- /dev/null +++ b/examples/CMakeFiles/CMakeOutput.log @@ -0,0 +1,135 @@ +The system is: Darwin - 19.6.0 - x86_64 +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: +Build flags: +Id flags: + +The output was: +0 +Command line invocation: + /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild + +note: Using new build system +note: Planning build +note: Constructing build description +warning: Traditional headermap style is no longer supported; please migrate to using separate headermaps and set 'ALWAYS_SEARCH_USER_PATHS' to NO. (in target 'CompilerIdCXX' from project 'CompilerIdCXX') +CreateBuildDirectory /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + builtin-create-build-directory /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/all-product-headers.yaml + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX.hmap + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-non-framework-target-headers.hmap + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList + +CompileC /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CMakeCXXCompilerId.cpp normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + export LANG=en_US.US-ASCII + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -target x86_64-apple-macos10.15 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -Wno-trigraphs -fpascal-strings -Os -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-float-conversion -Wno-non-literal-null-conversion -Wno-objc-literal-conversion -Wno-shorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -fasm-blocks -fstrict-aliasing -Wdeprecated-declarations -Winvalid-offsetof -g -fvisibility=hidden -fvisibility-inlines-hidden -Wno-sign-conversion -Wno-infinite-recursion -Wno-move -Wno-comma -Wno-block-capture-autoreleasing -Wno-strict-prototypes -Wno-range-loop-analysis -Wno-semicolon-before-method-body -iquote /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-generated-files.hmap -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-own-target-headers.hmap -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-all-target-headers.hmap -iquote /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/CompilerIdCXX-project-headers.hmap -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/include -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources-normal/x86_64 -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources/x86_64 -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/DerivedSources -F/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX -MMD -MT dependencies -MF /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.d --serialize-diagnostics /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.dia -c /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CMakeCXXCompilerId.cpp -o /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CMakeCXXCompilerId.o + +Ld /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX normal x86_64 (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -target x86_64-apple-macos10.15 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -L/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX -F/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX -filelist /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX.LinkFileList -Xlinker -object_path_lto -Xlinker /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX_lto.o -Xlinker -dependency_info -Xlinker /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Objects-normal/x86_64/CompilerIdCXX_dependency_info.dat -o /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX + +WriteAuxiliaryFile /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh + +PhaseScriptExecution Run\ Script /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + /bin/sh -c /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX.build/Debug/CompilerIdCXX.build/Script-2C8FEB8E15DC1A1A00E56A5D.sh +GCC_VERSION=com.apple.compilers.llvm.clang.1_0 +ARCHS=x86_64 + +RegisterExecutionPolicyException /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX + builtin-RegisterExecutionPolicyException /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX +note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'CompilerIdCXX' from project 'CompilerIdCXX') + +** BUILD SUCCEEDED ** + + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CompilerIdCXX" + +The CXX compiler identification is AppleClang, found in "/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/3.17.3/CompilerIdCXX/CompilerIdCXX" + +Determining if the CXX compiler works passed with the following output: +Change Dir: /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp + +Run Build Command(s):/usr/bin/xcodebuild -project CMAKE_TRY_COMPILE.xcodeproj build -target cmTC_ed568 -configuration Debug -hideShellScriptEnvironment && Command line invocation: + /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -project CMAKE_TRY_COMPILE.xcodeproj build -target cmTC_ed568 -configuration Debug -hideShellScriptEnvironment + +User defaults from command line: + HideShellScriptEnvironment = YES + +Prepare build +note: Using legacy build system +=== BUILD TARGET cmTC_ed568 OF PROJECT CMAKE_TRY_COMPILE WITH CONFIGURATION Debug === + +Check dependencies + +Write auxiliary files +/bin/mkdir -p /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64 +write-file /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64/cmTC_ed568.LinkFileList + +CompileC CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64/testCXXCompiler.o testCXXCompiler.cxx normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -target x86_64-apple-macos10.15 -fmessage-length=0 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-float-conversion -Wno-non-literal-null-conversion -Wno-objc-literal-conversion -Wno-shorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -DCMAKE_INTDIR=\"Debug\" -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -fasm-blocks -fstrict-aliasing -Wdeprecated-declarations -Winvalid-offsetof -g -Wno-sign-conversion -Wno-infinite-recursion -Wno-move -Wno-comma -Wno-block-capture-autoreleasing -Wno-strict-prototypes -Wno-range-loop-analysis -Wno-semicolon-before-method-body -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/Debug/include -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/DerivedSources-normal/x86_64 -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/DerivedSources/x86_64 -I/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/DerivedSources -F/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/Debug -MMD -MT dependencies -MF /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64/testCXXCompiler.d --serialize-diagnostics /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64/testCXXCompiler.dia -c /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/testCXXCompiler.cxx -o /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64/testCXXCompiler.o + +Ld Debug/cmTC_ed568 normal x86_64 + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -target x86_64-apple-macos10.15 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -L/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/Debug -F/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/Debug -filelist /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64/cmTC_ed568.LinkFileList -Xlinker -object_path_lto -Xlinker /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64/cmTC_ed568_lto.o -Xlinker -no_deduplicate -Wl,-search_paths_first -Wl,-headerpad_max_install_names -Xlinker -dependency_info -Xlinker /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/Objects-normal/x86_64/cmTC_ed568_dependency_info.dat -o /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/Debug/cmTC_ed568 + +ProcessProductPackaging "" CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/cmTC_ed568.xcent + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp + + +Entitlements: + +{ + "com.apple.security.get-task-allow" = 1; +} + + + builtin-productPackagingUtility -entitlements -format xml -o /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/cmTC_ed568.xcent + +CodeSign Debug/cmTC_ed568 + cd /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp + +Signing Identity: "-" + + /usr/bin/codesign --force --sign - --entitlements /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMAKE_TRY_COMPILE.build/Debug/cmTC_ed568.build/cmTC_ed568.xcent --timestamp=none /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/Debug/cmTC_ed568 + +** BUILD SUCCEEDED ** + + + + diff --git a/examples/CMakeFiles/CMakeTmp/CMakeCache.txt b/examples/CMakeFiles/CMakeTmp/CMakeCache.txt new file mode 100644 index 00000000..414c5f7f --- /dev/null +++ b/examples/CMakeFiles/CMakeTmp/CMakeCache.txt @@ -0,0 +1,258 @@ +# This is the CMakeCache file. +# For build in directory: /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp +# It was generated by CMake: /usr/local/Cellar/cmake/3.17.3/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Semicolon separated list of supported configuration types, only +// supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything +// else will be ignored. +CMAKE_CONFIGURATION_TYPES:STRING=Debug;Release;MinSizeRel;RelWithDebInfo + +//Flags used by the CXX compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the CXX compiler during DEBUG builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the CXX compiler during RELEASE builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//No help, variable specified on the command line. +CMAKE_CXX_STANDARD_LIBRARIES:UNINITIALIZED= + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_INSTALL_NAME_TOOL:FILEPATH=/usr/bin/install_name_tool + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Build architectures for OSX +CMAKE_OSX_ARCHITECTURES:STRING= + +//Minimum OS X version to target for deployment (at runtime); newer +// APIs weak linked. Set to empty string for default value. +CMAKE_OSX_DEPLOYMENT_TARGET:STRING= + +//The product will be built against the headers and libraries located +// inside the indicated SDK. +CMAKE_OSX_SYSROOT:PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=CMAKE_TRY_COMPILE + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Value Computed by CMake +CMAKE_TRY_COMPILE_BINARY_DIR:STATIC=/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp + +//Value Computed by CMake +CMAKE_TRY_COMPILE_SOURCE_DIR:STATIC=/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//No help, variable specified on the command line. +EXE_LINKER_FLAGS:UNINITIALIZED=-v -Wl,-v + + +######################## +# INTERNAL cache entries +######################## + +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=17 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=3 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.17.3/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.17.3/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/local/Cellar/cmake/3.17.3/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Xcode +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp +//ADVANCED property for variable: CMAKE_INSTALL_NAME_TOOL +CMAKE_INSTALL_NAME_TOOL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/local/Cellar/cmake/3.17.3/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +CMAKE_SUPPRESS_DEVELOPER_WARNINGS:INTERNAL=FALSE +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/examples/CMakeFiles/CMakeTmp/CMakeFiles/TargetDirectories.txt b/examples/CMakeFiles/CMakeTmp/CMakeFiles/TargetDirectories.txt new file mode 100644 index 00000000..4e543cda --- /dev/null +++ b/examples/CMakeFiles/CMakeTmp/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,2 @@ +/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMakeFiles/cmTC_735dc.dir +/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/CMakeFiles/ALL_BUILD.dir diff --git a/examples/CMakeFiles/CMakeTmp/CMakeFiles/cmake.check_cache b/examples/CMakeFiles/CMakeTmp/CMakeFiles/cmake.check_cache new file mode 100644 index 00000000..3dccd731 --- /dev/null +++ b/examples/CMakeFiles/CMakeTmp/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/examples/CMakeFiles/CMakeTmp/CMakeLists.txt b/examples/CMakeFiles/CMakeTmp/CMakeLists.txt new file mode 100644 index 00000000..d3852b20 --- /dev/null +++ b/examples/CMakeFiles/CMakeTmp/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.17.3.0) +project(CMAKE_TRY_COMPILE CXX) +set_property(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "") +set(CMAKE_VERBOSE_MAKEFILE 1) +set(CMAKE_CXX_FLAGS "") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_DEFINITIONS}") +set(CMAKE_CXX_FLAGS_DEBUG "-g") +set(CMAKE_EXE_LINKER_FLAGS "") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${EXE_LINKER_FLAGS}") +include_directories(${INCLUDE_DIRECTORIES}) +set(CMAKE_SUPPRESS_REGENERATION 1) +link_directories(${LINK_DIRECTORIES}) +add_definitions([==[-v -Wl,-v]==]) +cmake_policy(SET CMP0065 NEW) +cmake_policy(SET CMP0083 OLD) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp") +add_executable(cmTC_735dc "/usr/local/Cellar/cmake/3.17.3/share/cmake/Modules/CMakeCXXCompilerABI.cpp") +target_link_libraries(cmTC_735dc ${LINK_LIBRARIES}) diff --git a/examples/CMakeFiles/CMakeTmp/cmake_install.cmake b/examples/CMakeFiles/CMakeTmp/cmake_install.cmake new file mode 100644 index 00000000..b72a93a9 --- /dev/null +++ b/examples/CMakeFiles/CMakeTmp/cmake_install.cmake @@ -0,0 +1,44 @@ +# Install script for directory: /Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/Users/Philipp/Documents/Codes/Forks/psopt/PSOPT/examples/CMakeFiles/CMakeTmp/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 00000000..fc776ecb --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,47 @@ +cmake_minimum_required (VERSION 3.10) +project(PSOPT_EXAMPLES LANGUAGES CXX) + +add_subdirectory(alpine/) +add_subdirectory(bioreactor/) +add_subdirectory(brac1/) +add_subdirectory(breakwell/) +add_subdirectory(bryden/) +add_subdirectory(brymr/) +add_subdirectory(catmix/) +add_subdirectory(chain/) +add_subdirectory(climb/) +add_subdirectory(coulomb/) +add_subdirectory(cracking/) +add_subdirectory(crane/) +add_subdirectory(dae_i3/) +add_subdirectory(delay1/) +add_subdirectory(glider/) +add_subdirectory(goddard/) +add_subdirectory(heat/) +add_subdirectory(hyper/) +add_subdirectory(ipc/) +add_subdirectory(isop/) +add_subdirectory(lambert/) +add_subdirectory(launch/) +add_subdirectory(lowthr/) +add_subdirectory(lts/) +add_subdirectory(manutec/) +add_subdirectory(missile/) +add_subdirectory(moon/) +add_subdirectory(mpec/) +add_subdirectory(notorious/) +add_subdirectory(obstacle/) +add_subdirectory(param2/) +add_subdirectory(predator/) +add_subdirectory(rayleigh/) +add_subdirectory(reorientation/) +add_subdirectory(shutt/) +add_subdirectory(sing5/) +add_subdirectory(stc1/) +add_subdirectory(steps/) +add_subdirectory(twoburn/) +add_subdirectory(twolink/) +add_subdirectory(twophro/) +add_subdirectory(twophsc/) +add_subdirectory(user/) +add_subdirectory(zpm/) \ No newline at end of file diff --git a/PSOPT/examples/Makefile.inc b/examples/Makefile.inc similarity index 100% rename from PSOPT/examples/Makefile.inc rename to examples/Makefile.inc diff --git a/PSOPT/examples/Makefile_linux.inc b/examples/Makefile_linux.inc similarity index 100% rename from PSOPT/examples/Makefile_linux.inc rename to examples/Makefile_linux.inc diff --git a/examples/alpine/CMakeList.txt b/examples/alpine/CMakeList.txt new file mode 100644 index 00000000..196e611a --- /dev/null +++ b/examples/alpine/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(alpine LANGUAGES CXX) + +add_executable(${PROJECT_NAME} alpine.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/alpine/Makefile b/examples/alpine/Makefile similarity index 100% rename from PSOPT/examples/alpine/Makefile rename to examples/alpine/Makefile diff --git a/PSOPT/examples/alpine/Makefile.vc b/examples/alpine/Makefile.vc similarity index 100% rename from PSOPT/examples/alpine/Makefile.vc rename to examples/alpine/Makefile.vc diff --git a/PSOPT/examples/alpine/alpine.cxx b/examples/alpine/alpine.cxx similarity index 100% rename from PSOPT/examples/alpine/alpine.cxx rename to examples/alpine/alpine.cxx diff --git a/PSOPT/examples/alpine/alpine.txt b/examples/alpine/alpine.txt similarity index 100% rename from PSOPT/examples/alpine/alpine.txt rename to examples/alpine/alpine.txt diff --git a/PSOPT/examples/alpine/alpine_control1.pdf b/examples/alpine/alpine_control1.pdf similarity index 100% rename from PSOPT/examples/alpine/alpine_control1.pdf rename to examples/alpine/alpine_control1.pdf diff --git a/PSOPT/examples/alpine/alpine_control2.pdf b/examples/alpine/alpine_control2.pdf similarity index 100% rename from PSOPT/examples/alpine/alpine_control2.pdf rename to examples/alpine/alpine_control2.pdf diff --git a/PSOPT/examples/alpine/alpine_controls.pdf b/examples/alpine/alpine_controls.pdf similarity index 100% rename from PSOPT/examples/alpine/alpine_controls.pdf rename to examples/alpine/alpine_controls.pdf diff --git a/PSOPT/examples/alpine/alpine_state1.pdf b/examples/alpine/alpine_state1.pdf similarity index 100% rename from PSOPT/examples/alpine/alpine_state1.pdf rename to examples/alpine/alpine_state1.pdf diff --git a/PSOPT/examples/alpine/alpine_state2.pdf b/examples/alpine/alpine_state2.pdf similarity index 100% rename from PSOPT/examples/alpine/alpine_state2.pdf rename to examples/alpine/alpine_state2.pdf diff --git a/PSOPT/examples/alpine/alpine_state3.pdf b/examples/alpine/alpine_state3.pdf similarity index 100% rename from PSOPT/examples/alpine/alpine_state3.pdf rename to examples/alpine/alpine_state3.pdf diff --git a/PSOPT/examples/alpine/alpine_state4.pdf b/examples/alpine/alpine_state4.pdf similarity index 100% rename from PSOPT/examples/alpine/alpine_state4.pdf rename to examples/alpine/alpine_state4.pdf diff --git a/PSOPT/examples/alpine/alpine_states.pdf b/examples/alpine/alpine_states.pdf similarity index 100% rename from PSOPT/examples/alpine/alpine_states.pdf rename to examples/alpine/alpine_states.pdf diff --git a/PSOPT/examples/alpine/constraint_summary.txt b/examples/alpine/constraint_summary.txt similarity index 100% rename from PSOPT/examples/alpine/constraint_summary.txt rename to examples/alpine/constraint_summary.txt diff --git a/PSOPT/examples/alpine/mesh_statistics.txt b/examples/alpine/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/alpine/mesh_statistics.txt rename to examples/alpine/mesh_statistics.txt diff --git a/PSOPT/examples/alpine/mesh_statistics_alpine.tex b/examples/alpine/mesh_statistics_alpine.tex similarity index 100% rename from PSOPT/examples/alpine/mesh_statistics_alpine.tex rename to examples/alpine/mesh_statistics_alpine.tex diff --git a/PSOPT/examples/alpine/psopt_solution_alpine.txt b/examples/alpine/psopt_solution_alpine.txt similarity index 100% rename from PSOPT/examples/alpine/psopt_solution_alpine.txt rename to examples/alpine/psopt_solution_alpine.txt diff --git a/PSOPT/examples/alpine/psopt_solution_summary.txt b/examples/alpine/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/alpine/psopt_solution_summary.txt rename to examples/alpine/psopt_solution_summary.txt diff --git a/examples/bioreactor/CMakeList.txt b/examples/bioreactor/CMakeList.txt new file mode 100644 index 00000000..daefbb1d --- /dev/null +++ b/examples/bioreactor/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(bioreactor LANGUAGES CXX) + +add_executable(${PROJECT_NAME} bioreactor.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/bioreactor/Makefile b/examples/bioreactor/Makefile similarity index 100% rename from PSOPT/examples/bioreactor/Makefile rename to examples/bioreactor/Makefile diff --git a/PSOPT/examples/bioreactor/Makefile.vc b/examples/bioreactor/Makefile.vc similarity index 100% rename from PSOPT/examples/bioreactor/Makefile.vc rename to examples/bioreactor/Makefile.vc diff --git a/PSOPT/examples/bioreactor/bioreactor.cxx b/examples/bioreactor/bioreactor.cxx similarity index 100% rename from PSOPT/examples/bioreactor/bioreactor.cxx rename to examples/bioreactor/bioreactor.cxx diff --git a/PSOPT/examples/bioreactor/bioreactor.txt b/examples/bioreactor/bioreactor.txt similarity index 100% rename from PSOPT/examples/bioreactor/bioreactor.txt rename to examples/bioreactor/bioreactor.txt diff --git a/PSOPT/examples/bioreactor/bioreactor_controls.pdf b/examples/bioreactor/bioreactor_controls.pdf similarity index 100% rename from PSOPT/examples/bioreactor/bioreactor_controls.pdf rename to examples/bioreactor/bioreactor_controls.pdf diff --git a/PSOPT/examples/bioreactor/bioreactor_states.pdf b/examples/bioreactor/bioreactor_states.pdf similarity index 100% rename from PSOPT/examples/bioreactor/bioreactor_states.pdf rename to examples/bioreactor/bioreactor_states.pdf diff --git a/PSOPT/examples/bioreactor/constraint_summary.txt b/examples/bioreactor/constraint_summary.txt similarity index 100% rename from PSOPT/examples/bioreactor/constraint_summary.txt rename to examples/bioreactor/constraint_summary.txt diff --git a/PSOPT/examples/bioreactor/mesh_statistics.txt b/examples/bioreactor/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/bioreactor/mesh_statistics.txt rename to examples/bioreactor/mesh_statistics.txt diff --git a/PSOPT/examples/bioreactor/psopt_solution_bioreactor.txt b/examples/bioreactor/psopt_solution_bioreactor.txt similarity index 100% rename from PSOPT/examples/bioreactor/psopt_solution_bioreactor.txt rename to examples/bioreactor/psopt_solution_bioreactor.txt diff --git a/examples/brac1/CMakeList.txt b/examples/brac1/CMakeList.txt new file mode 100644 index 00000000..0788df50 --- /dev/null +++ b/examples/brac1/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(brac1 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} brac1.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/brac1/Makefile b/examples/brac1/Makefile similarity index 100% rename from PSOPT/examples/brac1/Makefile rename to examples/brac1/Makefile diff --git a/PSOPT/examples/brac1/Makefile.vc b/examples/brac1/Makefile.vc similarity index 100% rename from PSOPT/examples/brac1/Makefile.vc rename to examples/brac1/Makefile.vc diff --git a/PSOPT/examples/brac1/brac1.cxx b/examples/brac1/brac1.cxx similarity index 100% rename from PSOPT/examples/brac1/brac1.cxx rename to examples/brac1/brac1.cxx diff --git a/PSOPT/examples/brac1/brac1.txt b/examples/brac1/brac1.txt similarity index 100% rename from PSOPT/examples/brac1/brac1.txt rename to examples/brac1/brac1.txt diff --git a/PSOPT/examples/brac1/brac1_H.pdf b/examples/brac1/brac1_H.pdf similarity index 100% rename from PSOPT/examples/brac1/brac1_H.pdf rename to examples/brac1/brac1_H.pdf diff --git a/PSOPT/examples/brac1/brac1_control.pdf b/examples/brac1/brac1_control.pdf similarity index 100% rename from PSOPT/examples/brac1/brac1_control.pdf rename to examples/brac1/brac1_control.pdf diff --git a/PSOPT/examples/brac1/brac1_costates.pdf b/examples/brac1/brac1_costates.pdf similarity index 100% rename from PSOPT/examples/brac1/brac1_costates.pdf rename to examples/brac1/brac1_costates.pdf diff --git a/PSOPT/examples/brac1/brac1_hamiltonian.pdf b/examples/brac1/brac1_hamiltonian.pdf similarity index 100% rename from PSOPT/examples/brac1/brac1_hamiltonian.pdf rename to examples/brac1/brac1_hamiltonian.pdf diff --git a/PSOPT/examples/brac1/brac1_states.pdf b/examples/brac1/brac1_states.pdf similarity index 100% rename from PSOPT/examples/brac1/brac1_states.pdf rename to examples/brac1/brac1_states.pdf diff --git a/PSOPT/examples/brac1/constraint_summary.txt b/examples/brac1/constraint_summary.txt similarity index 100% rename from PSOPT/examples/brac1/constraint_summary.txt rename to examples/brac1/constraint_summary.txt diff --git a/PSOPT/examples/brac1/mesh_statistics.txt b/examples/brac1/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/brac1/mesh_statistics.txt rename to examples/brac1/mesh_statistics.txt diff --git a/PSOPT/examples/brac1/psopt_solution_brac1.txt b/examples/brac1/psopt_solution_brac1.txt similarity index 100% rename from PSOPT/examples/brac1/psopt_solution_brac1.txt rename to examples/brac1/psopt_solution_brac1.txt diff --git a/PSOPT/examples/brac1/psopt_solution_saved.txt b/examples/brac1/psopt_solution_saved.txt similarity index 100% rename from PSOPT/examples/brac1/psopt_solution_saved.txt rename to examples/brac1/psopt_solution_saved.txt diff --git a/PSOPT/examples/brac1/psopt_solution_summary.txt b/examples/brac1/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/brac1/psopt_solution_summary.txt rename to examples/brac1/psopt_solution_summary.txt diff --git a/examples/breakwell/CMakeList.txt b/examples/breakwell/CMakeList.txt new file mode 100644 index 00000000..0c7d5d0f --- /dev/null +++ b/examples/breakwell/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(breakwell LANGUAGES CXX) + +add_executable(${PROJECT_NAME} breakwell.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/breakwell/Makefile b/examples/breakwell/Makefile similarity index 100% rename from PSOPT/examples/breakwell/Makefile rename to examples/breakwell/Makefile diff --git a/PSOPT/examples/breakwell/Makefile.vc b/examples/breakwell/Makefile.vc similarity index 100% rename from PSOPT/examples/breakwell/Makefile.vc rename to examples/breakwell/Makefile.vc diff --git a/PSOPT/examples/breakwell/breakwell.cxx b/examples/breakwell/breakwell.cxx similarity index 100% rename from PSOPT/examples/breakwell/breakwell.cxx rename to examples/breakwell/breakwell.cxx diff --git a/PSOPT/examples/breakwell/breakwell.txt b/examples/breakwell/breakwell.txt similarity index 100% rename from PSOPT/examples/breakwell/breakwell.txt rename to examples/breakwell/breakwell.txt diff --git a/PSOPT/examples/breakwell/breakwell_control.pdf b/examples/breakwell/breakwell_control.pdf similarity index 100% rename from PSOPT/examples/breakwell/breakwell_control.pdf rename to examples/breakwell/breakwell_control.pdf diff --git a/PSOPT/examples/breakwell/breakwell_costates.pdf b/examples/breakwell/breakwell_costates.pdf similarity index 100% rename from PSOPT/examples/breakwell/breakwell_costates.pdf rename to examples/breakwell/breakwell_costates.pdf diff --git a/PSOPT/examples/breakwell/breakwell_states.pdf b/examples/breakwell/breakwell_states.pdf similarity index 100% rename from PSOPT/examples/breakwell/breakwell_states.pdf rename to examples/breakwell/breakwell_states.pdf diff --git a/PSOPT/examples/breakwell/brymr.txt b/examples/breakwell/brymr.txt similarity index 100% rename from PSOPT/examples/breakwell/brymr.txt rename to examples/breakwell/brymr.txt diff --git a/PSOPT/examples/breakwell/brymr_controls.pdf b/examples/breakwell/brymr_controls.pdf similarity index 100% rename from PSOPT/examples/breakwell/brymr_controls.pdf rename to examples/breakwell/brymr_controls.pdf diff --git a/PSOPT/examples/breakwell/brymr_states.pdf b/examples/breakwell/brymr_states.pdf similarity index 100% rename from PSOPT/examples/breakwell/brymr_states.pdf rename to examples/breakwell/brymr_states.pdf diff --git a/PSOPT/examples/breakwell/constraint_summary.txt b/examples/breakwell/constraint_summary.txt similarity index 100% rename from PSOPT/examples/breakwell/constraint_summary.txt rename to examples/breakwell/constraint_summary.txt diff --git a/PSOPT/examples/breakwell/error_message.txt b/examples/breakwell/error_message.txt similarity index 100% rename from PSOPT/examples/breakwell/error_message.txt rename to examples/breakwell/error_message.txt diff --git a/PSOPT/examples/breakwell/mesh_statistics.txt b/examples/breakwell/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/breakwell/mesh_statistics.txt rename to examples/breakwell/mesh_statistics.txt diff --git a/PSOPT/examples/breakwell/psopt_solution_breakwell.txt b/examples/breakwell/psopt_solution_breakwell.txt similarity index 100% rename from PSOPT/examples/breakwell/psopt_solution_breakwell.txt rename to examples/breakwell/psopt_solution_breakwell.txt diff --git a/PSOPT/examples/breakwell/psopt_solution_brymr.txt b/examples/breakwell/psopt_solution_brymr.txt similarity index 100% rename from PSOPT/examples/breakwell/psopt_solution_brymr.txt rename to examples/breakwell/psopt_solution_brymr.txt diff --git a/examples/bryden/CMakeList.txt b/examples/bryden/CMakeList.txt new file mode 100644 index 00000000..8fc914b5 --- /dev/null +++ b/examples/bryden/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(bryden LANGUAGES CXX) + +add_executable(${PROJECT_NAME} bryden.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/bryden/Makefile b/examples/bryden/Makefile similarity index 100% rename from PSOPT/examples/bryden/Makefile rename to examples/bryden/Makefile diff --git a/PSOPT/examples/bryden/Makefile.vc b/examples/bryden/Makefile.vc similarity index 100% rename from PSOPT/examples/bryden/Makefile.vc rename to examples/bryden/Makefile.vc diff --git a/PSOPT/examples/bryden/bryden.txt b/examples/bryden/bryden.txt similarity index 100% rename from PSOPT/examples/bryden/bryden.txt rename to examples/bryden/bryden.txt diff --git a/PSOPT/examples/bryden/bryden_control.pdf b/examples/bryden/bryden_control.pdf similarity index 100% rename from PSOPT/examples/bryden/bryden_control.pdf rename to examples/bryden/bryden_control.pdf diff --git a/PSOPT/examples/bryden/bryden_lambda.pdf b/examples/bryden/bryden_lambda.pdf similarity index 100% rename from PSOPT/examples/bryden/bryden_lambda.pdf rename to examples/bryden/bryden_lambda.pdf diff --git a/PSOPT/examples/bryden/bryden_states.pdf b/examples/bryden/bryden_states.pdf similarity index 100% rename from PSOPT/examples/bryden/bryden_states.pdf rename to examples/bryden/bryden_states.pdf diff --git a/PSOPT/examples/bryden/bryson_denham.cxx b/examples/bryden/bryson_denham.cxx similarity index 100% rename from PSOPT/examples/bryden/bryson_denham.cxx rename to examples/bryden/bryson_denham.cxx diff --git a/PSOPT/examples/bryden/constraint_summary.txt b/examples/bryden/constraint_summary.txt similarity index 100% rename from PSOPT/examples/bryden/constraint_summary.txt rename to examples/bryden/constraint_summary.txt diff --git a/PSOPT/examples/bryden/mesh_statistics.txt b/examples/bryden/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/bryden/mesh_statistics.txt rename to examples/bryden/mesh_statistics.txt diff --git a/PSOPT/examples/bryden/psopt_solution_bryden.txt b/examples/bryden/psopt_solution_bryden.txt similarity index 100% rename from PSOPT/examples/bryden/psopt_solution_bryden.txt rename to examples/bryden/psopt_solution_bryden.txt diff --git a/examples/brymr/CMakeList.txt b/examples/brymr/CMakeList.txt new file mode 100644 index 00000000..23dbe126 --- /dev/null +++ b/examples/brymr/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(brymr LANGUAGES CXX) + +add_executable(${PROJECT_NAME} brymr.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/brymr/Makefile b/examples/brymr/Makefile similarity index 100% rename from PSOPT/examples/brymr/Makefile rename to examples/brymr/Makefile diff --git a/PSOPT/examples/brymr/Makefile.vc b/examples/brymr/Makefile.vc similarity index 100% rename from PSOPT/examples/brymr/Makefile.vc rename to examples/brymr/Makefile.vc diff --git a/PSOPT/examples/brymr/brymr.txt b/examples/brymr/brymr.txt similarity index 100% rename from PSOPT/examples/brymr/brymr.txt rename to examples/brymr/brymr.txt diff --git a/PSOPT/examples/brymr/brymr_controls.pdf b/examples/brymr/brymr_controls.pdf similarity index 100% rename from PSOPT/examples/brymr/brymr_controls.pdf rename to examples/brymr/brymr_controls.pdf diff --git a/PSOPT/examples/brymr/brymr_states.pdf b/examples/brymr/brymr_states.pdf similarity index 100% rename from PSOPT/examples/brymr/brymr_states.pdf rename to examples/brymr/brymr_states.pdf diff --git a/PSOPT/examples/brymr/bryson_max_range.cxx b/examples/brymr/bryson_max_range.cxx similarity index 100% rename from PSOPT/examples/brymr/bryson_max_range.cxx rename to examples/brymr/bryson_max_range.cxx diff --git a/PSOPT/examples/brymr/constraint_summary.txt b/examples/brymr/constraint_summary.txt similarity index 100% rename from PSOPT/examples/brymr/constraint_summary.txt rename to examples/brymr/constraint_summary.txt diff --git a/PSOPT/examples/brymr/mesh_statistics.txt b/examples/brymr/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/brymr/mesh_statistics.txt rename to examples/brymr/mesh_statistics.txt diff --git a/PSOPT/examples/brymr/psopt_solution_brymr.txt b/examples/brymr/psopt_solution_brymr.txt similarity index 100% rename from PSOPT/examples/brymr/psopt_solution_brymr.txt rename to examples/brymr/psopt_solution_brymr.txt diff --git a/examples/catmix/CMakeList.txt b/examples/catmix/CMakeList.txt new file mode 100644 index 00000000..27944dcf --- /dev/null +++ b/examples/catmix/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(catmix LANGUAGES CXX) + +add_executable(${PROJECT_NAME} catmix.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/catmix/Makefile b/examples/catmix/Makefile similarity index 100% rename from PSOPT/examples/catmix/Makefile rename to examples/catmix/Makefile diff --git a/PSOPT/examples/catmix/Makefile.vc b/examples/catmix/Makefile.vc similarity index 100% rename from PSOPT/examples/catmix/Makefile.vc rename to examples/catmix/Makefile.vc diff --git a/PSOPT/examples/catmix/catmix.cxx b/examples/catmix/catmix.cxx similarity index 100% rename from PSOPT/examples/catmix/catmix.cxx rename to examples/catmix/catmix.cxx diff --git a/PSOPT/examples/catmix/catmix.txt b/examples/catmix/catmix.txt similarity index 100% rename from PSOPT/examples/catmix/catmix.txt rename to examples/catmix/catmix.txt diff --git a/PSOPT/examples/catmix/catmix_control.pdf b/examples/catmix/catmix_control.pdf similarity index 100% rename from PSOPT/examples/catmix/catmix_control.pdf rename to examples/catmix/catmix_control.pdf diff --git a/PSOPT/examples/catmix/catmix_states.pdf b/examples/catmix/catmix_states.pdf similarity index 100% rename from PSOPT/examples/catmix/catmix_states.pdf rename to examples/catmix/catmix_states.pdf diff --git a/PSOPT/examples/catmix/mesh_statistics.txt b/examples/catmix/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/catmix/mesh_statistics.txt rename to examples/catmix/mesh_statistics.txt diff --git a/PSOPT/examples/catmix/psopt_solution_catmix.txt b/examples/catmix/psopt_solution_catmix.txt similarity index 100% rename from PSOPT/examples/catmix/psopt_solution_catmix.txt rename to examples/catmix/psopt_solution_catmix.txt diff --git a/examples/chain/CMakeList.txt b/examples/chain/CMakeList.txt new file mode 100644 index 00000000..24517d7b --- /dev/null +++ b/examples/chain/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(chain LANGUAGES CXX) + +add_executable(${PROJECT_NAME} chain.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/chain/Makefile b/examples/chain/Makefile similarity index 100% rename from PSOPT/examples/chain/Makefile rename to examples/chain/Makefile diff --git a/PSOPT/examples/chain/Makefile.vc b/examples/chain/Makefile.vc similarity index 100% rename from PSOPT/examples/chain/Makefile.vc rename to examples/chain/Makefile.vc diff --git a/PSOPT/examples/chain/chain.cxx b/examples/chain/chain.cxx similarity index 100% rename from PSOPT/examples/chain/chain.cxx rename to examples/chain/chain.cxx diff --git a/PSOPT/examples/chain/chain.txt b/examples/chain/chain.txt similarity index 100% rename from PSOPT/examples/chain/chain.txt rename to examples/chain/chain.txt diff --git a/PSOPT/examples/chain/chain_control.pdf b/examples/chain/chain_control.pdf similarity index 100% rename from PSOPT/examples/chain/chain_control.pdf rename to examples/chain/chain_control.pdf diff --git a/PSOPT/examples/chain/chain_state.pdf b/examples/chain/chain_state.pdf similarity index 100% rename from PSOPT/examples/chain/chain_state.pdf rename to examples/chain/chain_state.pdf diff --git a/PSOPT/examples/chain/constraint_summary.txt b/examples/chain/constraint_summary.txt similarity index 100% rename from PSOPT/examples/chain/constraint_summary.txt rename to examples/chain/constraint_summary.txt diff --git a/PSOPT/examples/chain/mesh_statistics.txt b/examples/chain/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/chain/mesh_statistics.txt rename to examples/chain/mesh_statistics.txt diff --git a/PSOPT/examples/chain/psopt_solution_chain.txt b/examples/chain/psopt_solution_chain.txt similarity index 100% rename from PSOPT/examples/chain/psopt_solution_chain.txt rename to examples/chain/psopt_solution_chain.txt diff --git a/examples/climb/CMakeList.txt b/examples/climb/CMakeList.txt new file mode 100644 index 00000000..a803b1df --- /dev/null +++ b/examples/climb/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(climb LANGUAGES CXX) + +add_executable(${PROJECT_NAME} climb.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/climb/Makefile b/examples/climb/Makefile similarity index 100% rename from PSOPT/examples/climb/Makefile rename to examples/climb/Makefile diff --git a/PSOPT/examples/climb/Makefile.vc b/examples/climb/Makefile.vc similarity index 100% rename from PSOPT/examples/climb/Makefile.vc rename to examples/climb/Makefile.vc diff --git a/PSOPT/examples/climb/alpha.pdf b/examples/climb/alpha.pdf similarity index 100% rename from PSOPT/examples/climb/alpha.pdf rename to examples/climb/alpha.pdf diff --git a/PSOPT/examples/climb/climb.cxx b/examples/climb/climb.cxx similarity index 100% rename from PSOPT/examples/climb/climb.cxx rename to examples/climb/climb.cxx diff --git a/PSOPT/examples/climb/climb.txt b/examples/climb/climb.txt similarity index 100% rename from PSOPT/examples/climb/climb.txt rename to examples/climb/climb.txt diff --git a/PSOPT/examples/climb/climb_altitude.pdf b/examples/climb/climb_altitude.pdf similarity index 100% rename from PSOPT/examples/climb/climb_altitude.pdf rename to examples/climb/climb_altitude.pdf diff --git a/PSOPT/examples/climb/climb_fpa.pdf b/examples/climb/climb_fpa.pdf similarity index 100% rename from PSOPT/examples/climb/climb_fpa.pdf rename to examples/climb/climb_fpa.pdf diff --git a/PSOPT/examples/climb/climb_velocity.pdf b/examples/climb/climb_velocity.pdf similarity index 100% rename from PSOPT/examples/climb/climb_velocity.pdf rename to examples/climb/climb_velocity.pdf diff --git a/PSOPT/examples/climb/constraint_summary.txt b/examples/climb/constraint_summary.txt similarity index 100% rename from PSOPT/examples/climb/constraint_summary.txt rename to examples/climb/constraint_summary.txt diff --git a/PSOPT/examples/climb/error_message.txt b/examples/climb/error_message.txt similarity index 100% rename from PSOPT/examples/climb/error_message.txt rename to examples/climb/error_message.txt diff --git a/PSOPT/examples/climb/mesh_statistics.tex b/examples/climb/mesh_statistics.tex similarity index 100% rename from PSOPT/examples/climb/mesh_statistics.tex rename to examples/climb/mesh_statistics.tex diff --git a/PSOPT/examples/climb/mesh_statistics.txt b/examples/climb/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/climb/mesh_statistics.txt rename to examples/climb/mesh_statistics.txt diff --git a/PSOPT/examples/climb/psopt_solution_climb.txt b/examples/climb/psopt_solution_climb.txt similarity index 100% rename from PSOPT/examples/climb/psopt_solution_climb.txt rename to examples/climb/psopt_solution_climb.txt diff --git a/PSOPT/examples/climb/weight.pdf b/examples/climb/weight.pdf similarity index 100% rename from PSOPT/examples/climb/weight.pdf rename to examples/climb/weight.pdf diff --git a/examples/coulomb/CMakeList.txt b/examples/coulomb/CMakeList.txt new file mode 100644 index 00000000..049a8305 --- /dev/null +++ b/examples/coulomb/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(coulomb LANGUAGES CXX) + +add_executable(${PROJECT_NAME} coulomb.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/coulomb/Makefile b/examples/coulomb/Makefile similarity index 100% rename from PSOPT/examples/coulomb/Makefile rename to examples/coulomb/Makefile diff --git a/PSOPT/examples/coulomb/Makefile.vc b/examples/coulomb/Makefile.vc similarity index 100% rename from PSOPT/examples/coulomb/Makefile.vc rename to examples/coulomb/Makefile.vc diff --git a/PSOPT/examples/coulomb/coulomb.cxx b/examples/coulomb/coulomb.cxx similarity index 100% rename from PSOPT/examples/coulomb/coulomb.cxx rename to examples/coulomb/coulomb.cxx diff --git a/PSOPT/examples/coulomb/coulomb.txt b/examples/coulomb/coulomb.txt similarity index 100% rename from PSOPT/examples/coulomb/coulomb.txt rename to examples/coulomb/coulomb.txt diff --git a/PSOPT/examples/coulomb/coulomb_control.pdf b/examples/coulomb/coulomb_control.pdf similarity index 100% rename from PSOPT/examples/coulomb/coulomb_control.pdf rename to examples/coulomb/coulomb_control.pdf diff --git a/PSOPT/examples/coulomb/coulomb_states.pdf b/examples/coulomb/coulomb_states.pdf similarity index 100% rename from PSOPT/examples/coulomb/coulomb_states.pdf rename to examples/coulomb/coulomb_states.pdf diff --git a/PSOPT/examples/coulomb/psopt_solution_coulomb.txt b/examples/coulomb/psopt_solution_coulomb.txt similarity index 100% rename from PSOPT/examples/coulomb/psopt_solution_coulomb.txt rename to examples/coulomb/psopt_solution_coulomb.txt diff --git a/examples/cracking/CMakeList.txt b/examples/cracking/CMakeList.txt new file mode 100644 index 00000000..7f8a7d57 --- /dev/null +++ b/examples/cracking/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(cracking LANGUAGES CXX) + +add_executable(${PROJECT_NAME} cracking.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/cracking/Makefile b/examples/cracking/Makefile similarity index 100% rename from PSOPT/examples/cracking/Makefile rename to examples/cracking/Makefile diff --git a/PSOPT/examples/cracking/Makefile.vc b/examples/cracking/Makefile.vc similarity index 100% rename from PSOPT/examples/cracking/Makefile.vc rename to examples/cracking/Makefile.vc diff --git a/PSOPT/examples/cracking/constraint_summary.txt b/examples/cracking/constraint_summary.txt similarity index 100% rename from PSOPT/examples/cracking/constraint_summary.txt rename to examples/cracking/constraint_summary.txt diff --git a/PSOPT/examples/cracking/cracking.cxx b/examples/cracking/cracking.cxx similarity index 100% rename from PSOPT/examples/cracking/cracking.cxx rename to examples/cracking/cracking.cxx diff --git a/PSOPT/examples/cracking/cracking.txt b/examples/cracking/cracking.txt similarity index 100% rename from PSOPT/examples/cracking/cracking.txt rename to examples/cracking/cracking.txt diff --git a/PSOPT/examples/cracking/cracking_states.pdf b/examples/cracking/cracking_states.pdf similarity index 100% rename from PSOPT/examples/cracking/cracking_states.pdf rename to examples/cracking/cracking_states.pdf diff --git a/PSOPT/examples/cracking/error_message.txt b/examples/cracking/error_message.txt similarity index 100% rename from PSOPT/examples/cracking/error_message.txt rename to examples/cracking/error_message.txt diff --git a/PSOPT/examples/cracking/mesh_statistics.txt b/examples/cracking/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/cracking/mesh_statistics.txt rename to examples/cracking/mesh_statistics.txt diff --git a/PSOPT/examples/cracking/psopt_solution_cracking.txt b/examples/cracking/psopt_solution_cracking.txt similarity index 100% rename from PSOPT/examples/cracking/psopt_solution_cracking.txt rename to examples/cracking/psopt_solution_cracking.txt diff --git a/examples/crane/CMakeList.txt b/examples/crane/CMakeList.txt new file mode 100644 index 00000000..618b3875 --- /dev/null +++ b/examples/crane/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(crane LANGUAGES CXX) + +add_executable(${PROJECT_NAME} crane.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/crane/Makefile b/examples/crane/Makefile similarity index 100% rename from PSOPT/examples/crane/Makefile rename to examples/crane/Makefile diff --git a/PSOPT/examples/crane/Makefile.vc b/examples/crane/Makefile.vc similarity index 100% rename from PSOPT/examples/crane/Makefile.vc rename to examples/crane/Makefile.vc diff --git a/PSOPT/examples/crane/constraint_summary.txt b/examples/crane/constraint_summary.txt similarity index 100% rename from PSOPT/examples/crane/constraint_summary.txt rename to examples/crane/constraint_summary.txt diff --git a/PSOPT/examples/crane/crane.cxx b/examples/crane/crane.cxx similarity index 100% rename from PSOPT/examples/crane/crane.cxx rename to examples/crane/crane.cxx diff --git a/PSOPT/examples/crane/crane.txt b/examples/crane/crane.txt similarity index 100% rename from PSOPT/examples/crane/crane.txt rename to examples/crane/crane.txt diff --git a/PSOPT/examples/crane/crane_controls.pdf b/examples/crane/crane_controls.pdf similarity index 100% rename from PSOPT/examples/crane/crane_controls.pdf rename to examples/crane/crane_controls.pdf diff --git a/PSOPT/examples/crane/crane_states.pdf b/examples/crane/crane_states.pdf similarity index 100% rename from PSOPT/examples/crane/crane_states.pdf rename to examples/crane/crane_states.pdf diff --git a/PSOPT/examples/crane/crane_states13.pdf b/examples/crane/crane_states13.pdf similarity index 100% rename from PSOPT/examples/crane/crane_states13.pdf rename to examples/crane/crane_states13.pdf diff --git a/PSOPT/examples/crane/crane_states46.pdf b/examples/crane/crane_states46.pdf similarity index 100% rename from PSOPT/examples/crane/crane_states46.pdf rename to examples/crane/crane_states46.pdf diff --git a/PSOPT/examples/crane/mesh_statistics.txt b/examples/crane/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/crane/mesh_statistics.txt rename to examples/crane/mesh_statistics.txt diff --git a/PSOPT/examples/crane/psopt_solution_crane.txt b/examples/crane/psopt_solution_crane.txt similarity index 100% rename from PSOPT/examples/crane/psopt_solution_crane.txt rename to examples/crane/psopt_solution_crane.txt diff --git a/examples/dae_i3/CMakeList.txt b/examples/dae_i3/CMakeList.txt new file mode 100644 index 00000000..b62e90ba --- /dev/null +++ b/examples/dae_i3/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(dae_i3 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} dae_i3.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/dae_i3/Makefile b/examples/dae_i3/Makefile similarity index 100% rename from PSOPT/examples/dae_i3/Makefile rename to examples/dae_i3/Makefile diff --git a/PSOPT/examples/dae_i3/Makefile.vc b/examples/dae_i3/Makefile.vc similarity index 100% rename from PSOPT/examples/dae_i3/Makefile.vc rename to examples/dae_i3/Makefile.vc diff --git a/PSOPT/examples/dae_i3/dae_i3.cxx b/examples/dae_i3/dae_i3.cxx similarity index 100% rename from PSOPT/examples/dae_i3/dae_i3.cxx rename to examples/dae_i3/dae_i3.cxx diff --git a/PSOPT/examples/dae_i3/dae_i3.txt b/examples/dae_i3/dae_i3.txt similarity index 100% rename from PSOPT/examples/dae_i3/dae_i3.txt rename to examples/dae_i3/dae_i3.txt diff --git a/PSOPT/examples/dae_i3/error_message.txt b/examples/dae_i3/error_message.txt similarity index 100% rename from PSOPT/examples/dae_i3/error_message.txt rename to examples/dae_i3/error_message.txt diff --git a/PSOPT/examples/dae_i3/lambda.pdf b/examples/dae_i3/lambda.pdf similarity index 100% rename from PSOPT/examples/dae_i3/lambda.pdf rename to examples/dae_i3/lambda.pdf diff --git a/PSOPT/examples/dae_i3/mesh_statistics.txt b/examples/dae_i3/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/dae_i3/mesh_statistics.txt rename to examples/dae_i3/mesh_statistics.txt diff --git a/PSOPT/examples/dae_i3/psopt_solution_dae_i3.txt b/examples/dae_i3/psopt_solution_dae_i3.txt similarity index 100% rename from PSOPT/examples/dae_i3/psopt_solution_dae_i3.txt rename to examples/dae_i3/psopt_solution_dae_i3.txt diff --git a/PSOPT/examples/dae_i3/x1.pdf b/examples/dae_i3/x1.pdf similarity index 100% rename from PSOPT/examples/dae_i3/x1.pdf rename to examples/dae_i3/x1.pdf diff --git a/PSOPT/examples/dae_i3/x2.pdf b/examples/dae_i3/x2.pdf similarity index 100% rename from PSOPT/examples/dae_i3/x2.pdf rename to examples/dae_i3/x2.pdf diff --git a/examples/delay1/CMakeList.txt b/examples/delay1/CMakeList.txt new file mode 100644 index 00000000..3c66e126 --- /dev/null +++ b/examples/delay1/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(delay1 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} delay1.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/delay1/Makefile b/examples/delay1/Makefile similarity index 100% rename from PSOPT/examples/delay1/Makefile rename to examples/delay1/Makefile diff --git a/PSOPT/examples/delay1/Makefile.vc b/examples/delay1/Makefile.vc similarity index 100% rename from PSOPT/examples/delay1/Makefile.vc rename to examples/delay1/Makefile.vc diff --git a/PSOPT/examples/delay1/constraint_summary.txt b/examples/delay1/constraint_summary.txt similarity index 100% rename from PSOPT/examples/delay1/constraint_summary.txt rename to examples/delay1/constraint_summary.txt diff --git a/PSOPT/examples/delay1/delay1.cxx b/examples/delay1/delay1.cxx similarity index 100% rename from PSOPT/examples/delay1/delay1.cxx rename to examples/delay1/delay1.cxx diff --git a/PSOPT/examples/delay1/delay1.txt b/examples/delay1/delay1.txt similarity index 100% rename from PSOPT/examples/delay1/delay1.txt rename to examples/delay1/delay1.txt diff --git a/PSOPT/examples/delay1/delay1_controls.pdf b/examples/delay1/delay1_controls.pdf similarity index 100% rename from PSOPT/examples/delay1/delay1_controls.pdf rename to examples/delay1/delay1_controls.pdf diff --git a/PSOPT/examples/delay1/delay1_states.pdf b/examples/delay1/delay1_states.pdf similarity index 100% rename from PSOPT/examples/delay1/delay1_states.pdf rename to examples/delay1/delay1_states.pdf diff --git a/PSOPT/examples/delay1/mesh_statistics.txt b/examples/delay1/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/delay1/mesh_statistics.txt rename to examples/delay1/mesh_statistics.txt diff --git a/PSOPT/examples/delay1/psopt_solution_delay1.txt b/examples/delay1/psopt_solution_delay1.txt similarity index 100% rename from PSOPT/examples/delay1/psopt_solution_delay1.txt rename to examples/delay1/psopt_solution_delay1.txt diff --git a/examples/genCMake.sh b/examples/genCMake.sh new file mode 100644 index 00000000..8674a410 --- /dev/null +++ b/examples/genCMake.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -uxe +function create_cmake() { + local f="CMakeLists-generator.txt" + for d in $(ls -d */ | tr -d '/'); do + cat "$f" | sed -e "s/__MYDIR__/$d/g" > "$d/CMakeList.txt" + done +} +create_cmake diff --git a/examples/glider/CMakeList.txt b/examples/glider/CMakeList.txt new file mode 100644 index 00000000..72676351 --- /dev/null +++ b/examples/glider/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(glider LANGUAGES CXX) + +add_executable(${PROJECT_NAME} glider.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/glider/Makefile b/examples/glider/Makefile similarity index 100% rename from PSOPT/examples/glider/Makefile rename to examples/glider/Makefile diff --git a/PSOPT/examples/glider/Makefile.vc b/examples/glider/Makefile.vc similarity index 100% rename from PSOPT/examples/glider/Makefile.vc rename to examples/glider/Makefile.vc diff --git a/PSOPT/examples/glider/constraint_summary.txt b/examples/glider/constraint_summary.txt similarity index 100% rename from PSOPT/examples/glider/constraint_summary.txt rename to examples/glider/constraint_summary.txt diff --git a/PSOPT/examples/glider/control.pdf b/examples/glider/control.pdf similarity index 100% rename from PSOPT/examples/glider/control.pdf rename to examples/glider/control.pdf diff --git a/PSOPT/examples/glider/glider.cxx b/examples/glider/glider.cxx similarity index 100% rename from PSOPT/examples/glider/glider.cxx rename to examples/glider/glider.cxx diff --git a/PSOPT/examples/glider/hang_glider.txt b/examples/glider/hang_glider.txt similarity index 100% rename from PSOPT/examples/glider/hang_glider.txt rename to examples/glider/hang_glider.txt diff --git a/PSOPT/examples/glider/mesh_statistics.txt b/examples/glider/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/glider/mesh_statistics.txt rename to examples/glider/mesh_statistics.txt diff --git a/PSOPT/examples/glider/psopt_solution_hang_glider.txt b/examples/glider/psopt_solution_hang_glider.txt similarity index 100% rename from PSOPT/examples/glider/psopt_solution_hang_glider.txt rename to examples/glider/psopt_solution_hang_glider.txt diff --git a/PSOPT/examples/glider/traj.pdf b/examples/glider/traj.pdf similarity index 100% rename from PSOPT/examples/glider/traj.pdf rename to examples/glider/traj.pdf diff --git a/PSOPT/examples/glider/velocities.pdf b/examples/glider/velocities.pdf similarity index 100% rename from PSOPT/examples/glider/velocities.pdf rename to examples/glider/velocities.pdf diff --git a/examples/goddard/CMakeList.txt b/examples/goddard/CMakeList.txt new file mode 100644 index 00000000..5dd1803e --- /dev/null +++ b/examples/goddard/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(goddard LANGUAGES CXX) + +add_executable(${PROJECT_NAME} goddard.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/goddard/Makefile b/examples/goddard/Makefile similarity index 100% rename from PSOPT/examples/goddard/Makefile rename to examples/goddard/Makefile diff --git a/PSOPT/examples/goddard/Makefile.vc b/examples/goddard/Makefile.vc similarity index 100% rename from PSOPT/examples/goddard/Makefile.vc rename to examples/goddard/Makefile.vc diff --git a/PSOPT/examples/goddard/constraint_summary.txt b/examples/goddard/constraint_summary.txt similarity index 100% rename from PSOPT/examples/goddard/constraint_summary.txt rename to examples/goddard/constraint_summary.txt diff --git a/PSOPT/examples/goddard/error_message.txt b/examples/goddard/error_message.txt similarity index 100% rename from PSOPT/examples/goddard/error_message.txt rename to examples/goddard/error_message.txt diff --git a/PSOPT/examples/goddard/goddard.cxx b/examples/goddard/goddard.cxx similarity index 100% rename from PSOPT/examples/goddard/goddard.cxx rename to examples/goddard/goddard.cxx diff --git a/PSOPT/examples/goddard/goddard.txt b/examples/goddard/goddard.txt similarity index 100% rename from PSOPT/examples/goddard/goddard.txt rename to examples/goddard/goddard.txt diff --git a/PSOPT/examples/goddard/goddard_control.pdf b/examples/goddard/goddard_control.pdf similarity index 100% rename from PSOPT/examples/goddard/goddard_control.pdf rename to examples/goddard/goddard_control.pdf diff --git a/PSOPT/examples/goddard/goddard_sigma.pdf b/examples/goddard/goddard_sigma.pdf similarity index 100% rename from PSOPT/examples/goddard/goddard_sigma.pdf rename to examples/goddard/goddard_sigma.pdf diff --git a/PSOPT/examples/goddard/goddard_states.pdf b/examples/goddard/goddard_states.pdf similarity index 100% rename from PSOPT/examples/goddard/goddard_states.pdf rename to examples/goddard/goddard_states.pdf diff --git a/PSOPT/examples/goddard/mesh_statistics.txt b/examples/goddard/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/goddard/mesh_statistics.txt rename to examples/goddard/mesh_statistics.txt diff --git a/PSOPT/examples/goddard/psopt_solution_goddard.txt b/examples/goddard/psopt_solution_goddard.txt similarity index 100% rename from PSOPT/examples/goddard/psopt_solution_goddard.txt rename to examples/goddard/psopt_solution_goddard.txt diff --git a/examples/heat/CMakeList.txt b/examples/heat/CMakeList.txt new file mode 100644 index 00000000..17806396 --- /dev/null +++ b/examples/heat/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(heat LANGUAGES CXX) + +add_executable(${PROJECT_NAME} heat.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/heat/Makefile b/examples/heat/Makefile similarity index 100% rename from PSOPT/examples/heat/Makefile rename to examples/heat/Makefile diff --git a/PSOPT/examples/heat/Makefile.vc b/examples/heat/Makefile.vc similarity index 100% rename from PSOPT/examples/heat/Makefile.vc rename to examples/heat/Makefile.vc diff --git a/PSOPT/examples/heat/constraint_summary.txt b/examples/heat/constraint_summary.txt similarity index 100% rename from PSOPT/examples/heat/constraint_summary.txt rename to examples/heat/constraint_summary.txt diff --git a/PSOPT/examples/heat/heat.cxx b/examples/heat/heat.cxx similarity index 100% rename from PSOPT/examples/heat/heat.cxx rename to examples/heat/heat.cxx diff --git a/PSOPT/examples/heat/heat.txt b/examples/heat/heat.txt similarity index 100% rename from PSOPT/examples/heat/heat.txt rename to examples/heat/heat.txt diff --git a/PSOPT/examples/heat/heat_control.pdf b/examples/heat/heat_control.pdf similarity index 100% rename from PSOPT/examples/heat/heat_control.pdf rename to examples/heat/heat_control.pdf diff --git a/PSOPT/examples/heat/heat_state1.pdf b/examples/heat/heat_state1.pdf similarity index 100% rename from PSOPT/examples/heat/heat_state1.pdf rename to examples/heat/heat_state1.pdf diff --git a/PSOPT/examples/heat/heat_stateN.pdf b/examples/heat/heat_stateN.pdf similarity index 100% rename from PSOPT/examples/heat/heat_stateN.pdf rename to examples/heat/heat_stateN.pdf diff --git a/PSOPT/examples/heat/heat_surf.pdf b/examples/heat/heat_surf.pdf similarity index 100% rename from PSOPT/examples/heat/heat_surf.pdf rename to examples/heat/heat_surf.pdf diff --git a/PSOPT/examples/heat/mesh_statistics.txt b/examples/heat/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/heat/mesh_statistics.txt rename to examples/heat/mesh_statistics.txt diff --git a/PSOPT/examples/heat/psopt_solution_heat.txt b/examples/heat/psopt_solution_heat.txt similarity index 100% rename from PSOPT/examples/heat/psopt_solution_heat.txt rename to examples/heat/psopt_solution_heat.txt diff --git a/examples/hyper/CMakeList.txt b/examples/hyper/CMakeList.txt new file mode 100644 index 00000000..6d70dd5a --- /dev/null +++ b/examples/hyper/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(hyper LANGUAGES CXX) + +add_executable(${PROJECT_NAME} hyper.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/hyper/Makefile b/examples/hyper/Makefile similarity index 100% rename from PSOPT/examples/hyper/Makefile rename to examples/hyper/Makefile diff --git a/PSOPT/examples/hyper/Makefile.vc b/examples/hyper/Makefile.vc similarity index 100% rename from PSOPT/examples/hyper/Makefile.vc rename to examples/hyper/Makefile.vc diff --git a/PSOPT/examples/hyper/constraint_summary.txt b/examples/hyper/constraint_summary.txt similarity index 100% rename from PSOPT/examples/hyper/constraint_summary.txt rename to examples/hyper/constraint_summary.txt diff --git a/PSOPT/examples/hyper/hyper.txt b/examples/hyper/hyper.txt similarity index 100% rename from PSOPT/examples/hyper/hyper.txt rename to examples/hyper/hyper.txt diff --git a/PSOPT/examples/hyper/hyper_H.pdf b/examples/hyper/hyper_H.pdf similarity index 100% rename from PSOPT/examples/hyper/hyper_H.pdf rename to examples/hyper/hyper_H.pdf diff --git a/PSOPT/examples/hyper/hyper_control.pdf b/examples/hyper/hyper_control.pdf similarity index 100% rename from PSOPT/examples/hyper/hyper_control.pdf rename to examples/hyper/hyper_control.pdf diff --git a/PSOPT/examples/hyper/hyper_lambda.pdf b/examples/hyper/hyper_lambda.pdf similarity index 100% rename from PSOPT/examples/hyper/hyper_lambda.pdf rename to examples/hyper/hyper_lambda.pdf diff --git a/PSOPT/examples/hyper/hyper_state.pdf b/examples/hyper/hyper_state.pdf similarity index 100% rename from PSOPT/examples/hyper/hyper_state.pdf rename to examples/hyper/hyper_state.pdf diff --git a/PSOPT/examples/hyper/hypersensitive.cxx b/examples/hyper/hypersensitive.cxx similarity index 100% rename from PSOPT/examples/hyper/hypersensitive.cxx rename to examples/hyper/hypersensitive.cxx diff --git a/PSOPT/examples/hyper/mesh_statistics.txt b/examples/hyper/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/hyper/mesh_statistics.txt rename to examples/hyper/mesh_statistics.txt diff --git a/PSOPT/examples/hyper/psopt_solution_hyper.txt b/examples/hyper/psopt_solution_hyper.txt similarity index 100% rename from PSOPT/examples/hyper/psopt_solution_hyper.txt rename to examples/hyper/psopt_solution_hyper.txt diff --git a/examples/ipc/CMakeList.txt b/examples/ipc/CMakeList.txt new file mode 100644 index 00000000..3f05648b --- /dev/null +++ b/examples/ipc/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(ipc LANGUAGES CXX) + +add_executable(${PROJECT_NAME} ipc.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/ipc/Makefile b/examples/ipc/Makefile similarity index 100% rename from PSOPT/examples/ipc/Makefile rename to examples/ipc/Makefile diff --git a/PSOPT/examples/ipc/Makefile.vc b/examples/ipc/Makefile.vc similarity index 100% rename from PSOPT/examples/ipc/Makefile.vc rename to examples/ipc/Makefile.vc diff --git a/PSOPT/examples/ipc/interior_point.cxx b/examples/ipc/interior_point.cxx similarity index 100% rename from PSOPT/examples/ipc/interior_point.cxx rename to examples/ipc/interior_point.cxx diff --git a/PSOPT/examples/ipc/ipc.txt b/examples/ipc/ipc.txt similarity index 100% rename from PSOPT/examples/ipc/ipc.txt rename to examples/ipc/ipc.txt diff --git a/PSOPT/examples/ipc/ipc_control.pdf b/examples/ipc/ipc_control.pdf similarity index 100% rename from PSOPT/examples/ipc/ipc_control.pdf rename to examples/ipc/ipc_control.pdf diff --git a/PSOPT/examples/ipc/ipc_state.pdf b/examples/ipc/ipc_state.pdf similarity index 100% rename from PSOPT/examples/ipc/ipc_state.pdf rename to examples/ipc/ipc_state.pdf diff --git a/PSOPT/examples/ipc/mesh_statistics.txt b/examples/ipc/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/ipc/mesh_statistics.txt rename to examples/ipc/mesh_statistics.txt diff --git a/PSOPT/examples/ipc/psopt_solution_ipc.txt b/examples/ipc/psopt_solution_ipc.txt similarity index 100% rename from PSOPT/examples/ipc/psopt_solution_ipc.txt rename to examples/ipc/psopt_solution_ipc.txt diff --git a/examples/isop/CMakeList.txt b/examples/isop/CMakeList.txt new file mode 100644 index 00000000..8df34414 --- /dev/null +++ b/examples/isop/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(isop LANGUAGES CXX) + +add_executable(${PROJECT_NAME} isop.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/isop/Makefile b/examples/isop/Makefile similarity index 100% rename from PSOPT/examples/isop/Makefile rename to examples/isop/Makefile diff --git a/PSOPT/examples/isop/Makefile.vc b/examples/isop/Makefile.vc similarity index 100% rename from PSOPT/examples/isop/Makefile.vc rename to examples/isop/Makefile.vc diff --git a/PSOPT/examples/isop/constraint_summary.txt b/examples/isop/constraint_summary.txt similarity index 100% rename from PSOPT/examples/isop/constraint_summary.txt rename to examples/isop/constraint_summary.txt diff --git a/PSOPT/examples/isop/isop_control.pdf b/examples/isop/isop_control.pdf similarity index 100% rename from PSOPT/examples/isop/isop_control.pdf rename to examples/isop/isop_control.pdf diff --git a/PSOPT/examples/isop/isop_state.pdf b/examples/isop/isop_state.pdf similarity index 100% rename from PSOPT/examples/isop/isop_state.pdf rename to examples/isop/isop_state.pdf diff --git a/PSOPT/examples/isop/isoperimetric.cxx b/examples/isop/isoperimetric.cxx similarity index 100% rename from PSOPT/examples/isop/isoperimetric.cxx rename to examples/isop/isoperimetric.cxx diff --git a/PSOPT/examples/isop/isoperimetric.txt b/examples/isop/isoperimetric.txt similarity index 100% rename from PSOPT/examples/isop/isoperimetric.txt rename to examples/isop/isoperimetric.txt diff --git a/PSOPT/examples/isop/mesh_statistics.txt b/examples/isop/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/isop/mesh_statistics.txt rename to examples/isop/mesh_statistics.txt diff --git a/PSOPT/examples/isop/psopt_solution_isoperimetric.txt b/examples/isop/psopt_solution_isoperimetric.txt similarity index 100% rename from PSOPT/examples/isop/psopt_solution_isoperimetric.txt rename to examples/isop/psopt_solution_isoperimetric.txt diff --git a/examples/lambert/CMakeList.txt b/examples/lambert/CMakeList.txt new file mode 100644 index 00000000..2a407e37 --- /dev/null +++ b/examples/lambert/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(lambert LANGUAGES CXX) + +add_executable(${PROJECT_NAME} lambert.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/lambert/Makefile b/examples/lambert/Makefile similarity index 100% rename from PSOPT/examples/lambert/Makefile rename to examples/lambert/Makefile diff --git a/PSOPT/examples/lambert/Makefile.vc b/examples/lambert/Makefile.vc similarity index 100% rename from PSOPT/examples/lambert/Makefile.vc rename to examples/lambert/Makefile.vc diff --git a/PSOPT/examples/lambert/constraint_summary.txt b/examples/lambert/constraint_summary.txt similarity index 100% rename from PSOPT/examples/lambert/constraint_summary.txt rename to examples/lambert/constraint_summary.txt diff --git a/PSOPT/examples/lambert/lambert.cxx b/examples/lambert/lambert.cxx similarity index 100% rename from PSOPT/examples/lambert/lambert.cxx rename to examples/lambert/lambert.cxx diff --git a/PSOPT/examples/lambert/lambert.txt b/examples/lambert/lambert.txt similarity index 100% rename from PSOPT/examples/lambert/lambert.txt rename to examples/lambert/lambert.txt diff --git a/PSOPT/examples/lambert/lambert_xy.pdf b/examples/lambert/lambert_xy.pdf similarity index 100% rename from PSOPT/examples/lambert/lambert_xy.pdf rename to examples/lambert/lambert_xy.pdf diff --git a/PSOPT/examples/lambert/mesh_statistics.txt b/examples/lambert/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/lambert/mesh_statistics.txt rename to examples/lambert/mesh_statistics.txt diff --git a/PSOPT/examples/lambert/psopt_solution_lambert.txt b/examples/lambert/psopt_solution_lambert.txt similarity index 100% rename from PSOPT/examples/lambert/psopt_solution_lambert.txt rename to examples/lambert/psopt_solution_lambert.txt diff --git a/examples/launch/CMakeList.txt b/examples/launch/CMakeList.txt new file mode 100644 index 00000000..bfc4f14f --- /dev/null +++ b/examples/launch/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(launch LANGUAGES CXX) + +add_executable(${PROJECT_NAME} launch.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/launch/Makefile b/examples/launch/Makefile similarity index 100% rename from PSOPT/examples/launch/Makefile rename to examples/launch/Makefile diff --git a/PSOPT/examples/launch/Makefile.vc b/examples/launch/Makefile.vc similarity index 100% rename from PSOPT/examples/launch/Makefile.vc rename to examples/launch/Makefile.vc diff --git a/PSOPT/examples/launch/constraint_summary.txt b/examples/launch/constraint_summary.txt similarity index 100% rename from PSOPT/examples/launch/constraint_summary.txt rename to examples/launch/constraint_summary.txt diff --git a/PSOPT/examples/launch/launch.cxx b/examples/launch/launch.cxx similarity index 100% rename from PSOPT/examples/launch/launch.cxx rename to examples/launch/launch.cxx diff --git a/PSOPT/examples/launch/launch.txt b/examples/launch/launch.txt similarity index 100% rename from PSOPT/examples/launch/launch.txt rename to examples/launch/launch.txt diff --git a/PSOPT/examples/launch/launch_altitude.pdf b/examples/launch/launch_altitude.pdf similarity index 100% rename from PSOPT/examples/launch/launch_altitude.pdf rename to examples/launch/launch_altitude.pdf diff --git a/PSOPT/examples/launch/launch_control.pdf b/examples/launch/launch_control.pdf similarity index 100% rename from PSOPT/examples/launch/launch_control.pdf rename to examples/launch/launch_control.pdf diff --git a/PSOPT/examples/launch/launch_position.pdf b/examples/launch/launch_position.pdf similarity index 100% rename from PSOPT/examples/launch/launch_position.pdf rename to examples/launch/launch_position.pdf diff --git a/PSOPT/examples/launch/launch_speed.pdf b/examples/launch/launch_speed.pdf similarity index 100% rename from PSOPT/examples/launch/launch_speed.pdf rename to examples/launch/launch_speed.pdf diff --git a/PSOPT/examples/launch/mesh_statistics.txt b/examples/launch/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/launch/mesh_statistics.txt rename to examples/launch/mesh_statistics.txt diff --git a/PSOPT/examples/launch/psopt_solution_launch.txt b/examples/launch/psopt_solution_launch.txt similarity index 100% rename from PSOPT/examples/launch/psopt_solution_launch.txt rename to examples/launch/psopt_solution_launch.txt diff --git a/PSOPT/examples/launch/psopt_solution_summary.txt b/examples/launch/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/launch/psopt_solution_summary.txt rename to examples/launch/psopt_solution_summary.txt diff --git a/examples/lowthr/CMakeList.txt b/examples/lowthr/CMakeList.txt new file mode 100644 index 00000000..7df990dd --- /dev/null +++ b/examples/lowthr/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(lowthr LANGUAGES CXX) + +add_executable(${PROJECT_NAME} lowthr.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/lowthr/Makefile b/examples/lowthr/Makefile similarity index 100% rename from PSOPT/examples/lowthr/Makefile rename to examples/lowthr/Makefile diff --git a/PSOPT/examples/lowthr/Makefile.vc b/examples/lowthr/Makefile.vc similarity index 100% rename from PSOPT/examples/lowthr/Makefile.vc rename to examples/lowthr/Makefile.vc diff --git a/PSOPT/examples/lowthr/T0.dat b/examples/lowthr/T0.dat similarity index 100% rename from PSOPT/examples/lowthr/T0.dat rename to examples/lowthr/T0.dat diff --git a/PSOPT/examples/lowthr/U0.dat b/examples/lowthr/U0.dat similarity index 100% rename from PSOPT/examples/lowthr/U0.dat rename to examples/lowthr/U0.dat diff --git a/PSOPT/examples/lowthr/X0.dat b/examples/lowthr/X0.dat similarity index 100% rename from PSOPT/examples/lowthr/X0.dat rename to examples/lowthr/X0.dat diff --git a/PSOPT/examples/lowthr/constraint_summary.txt b/examples/lowthr/constraint_summary.txt similarity index 100% rename from PSOPT/examples/lowthr/constraint_summary.txt rename to examples/lowthr/constraint_summary.txt diff --git a/PSOPT/examples/lowthr/low_thrust.cxx b/examples/lowthr/low_thrust.cxx similarity index 100% rename from PSOPT/examples/lowthr/low_thrust.cxx rename to examples/lowthr/low_thrust.cxx diff --git a/PSOPT/examples/lowthr/lowthr_u1.pdf b/examples/lowthr/lowthr_u1.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_u1.pdf rename to examples/lowthr/lowthr_u1.pdf diff --git a/PSOPT/examples/lowthr/lowthr_u2.pdf b/examples/lowthr/lowthr_u2.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_u2.pdf rename to examples/lowthr/lowthr_u2.pdf diff --git a/PSOPT/examples/lowthr/lowthr_u3.pdf b/examples/lowthr/lowthr_u3.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_u3.pdf rename to examples/lowthr/lowthr_u3.pdf diff --git a/PSOPT/examples/lowthr/lowthr_x1.pdf b/examples/lowthr/lowthr_x1.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_x1.pdf rename to examples/lowthr/lowthr_x1.pdf diff --git a/PSOPT/examples/lowthr/lowthr_x2.pdf b/examples/lowthr/lowthr_x2.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_x2.pdf rename to examples/lowthr/lowthr_x2.pdf diff --git a/PSOPT/examples/lowthr/lowthr_x3.pdf b/examples/lowthr/lowthr_x3.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_x3.pdf rename to examples/lowthr/lowthr_x3.pdf diff --git a/PSOPT/examples/lowthr/lowthr_x4.pdf b/examples/lowthr/lowthr_x4.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_x4.pdf rename to examples/lowthr/lowthr_x4.pdf diff --git a/PSOPT/examples/lowthr/lowthr_x5.pdf b/examples/lowthr/lowthr_x5.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_x5.pdf rename to examples/lowthr/lowthr_x5.pdf diff --git a/PSOPT/examples/lowthr/lowthr_x6.pdf b/examples/lowthr/lowthr_x6.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_x6.pdf rename to examples/lowthr/lowthr_x6.pdf diff --git a/PSOPT/examples/lowthr/lowthr_x7.pdf b/examples/lowthr/lowthr_x7.pdf similarity index 100% rename from PSOPT/examples/lowthr/lowthr_x7.pdf rename to examples/lowthr/lowthr_x7.pdf diff --git a/PSOPT/examples/lowthr/lowthrust.txt b/examples/lowthr/lowthrust.txt similarity index 100% rename from PSOPT/examples/lowthr/lowthrust.txt rename to examples/lowthr/lowthrust.txt diff --git a/PSOPT/examples/lowthr/mesh_statistics.tex b/examples/lowthr/mesh_statistics.tex similarity index 100% rename from PSOPT/examples/lowthr/mesh_statistics.tex rename to examples/lowthr/mesh_statistics.tex diff --git a/PSOPT/examples/lowthr/mesh_statistics.txt b/examples/lowthr/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/lowthr/mesh_statistics.txt rename to examples/lowthr/mesh_statistics.txt diff --git a/PSOPT/examples/lowthr/psopt_solution_lowthrust.txt b/examples/lowthr/psopt_solution_lowthrust.txt similarity index 100% rename from PSOPT/examples/lowthr/psopt_solution_lowthrust.txt rename to examples/lowthr/psopt_solution_lowthrust.txt diff --git a/PSOPT/examples/lowthr/psopt_solution_summary.txt b/examples/lowthr/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/lowthr/psopt_solution_summary.txt rename to examples/lowthr/psopt_solution_summary.txt diff --git a/PSOPT/examples/lowthr/trajectory.pdf b/examples/lowthr/trajectory.pdf similarity index 100% rename from PSOPT/examples/lowthr/trajectory.pdf rename to examples/lowthr/trajectory.pdf diff --git a/examples/lts/CMakeList.txt b/examples/lts/CMakeList.txt new file mode 100644 index 00000000..619a5058 --- /dev/null +++ b/examples/lts/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(lts LANGUAGES CXX) + +add_executable(${PROJECT_NAME} lts.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/lts/Makefile b/examples/lts/Makefile similarity index 100% rename from PSOPT/examples/lts/Makefile rename to examples/lts/Makefile diff --git a/PSOPT/examples/lts/Makefile.vc b/examples/lts/Makefile.vc similarity index 100% rename from PSOPT/examples/lts/Makefile.vc rename to examples/lts/Makefile.vc diff --git a/PSOPT/examples/lts/constraint_summary.txt b/examples/lts/constraint_summary.txt similarity index 100% rename from PSOPT/examples/lts/constraint_summary.txt rename to examples/lts/constraint_summary.txt diff --git a/PSOPT/examples/lts/lts.cxx b/examples/lts/lts.cxx similarity index 100% rename from PSOPT/examples/lts/lts.cxx rename to examples/lts/lts.cxx diff --git a/PSOPT/examples/lts/lts.txt b/examples/lts/lts.txt similarity index 100% rename from PSOPT/examples/lts/lts.txt rename to examples/lts/lts.txt diff --git a/PSOPT/examples/lts/lts_control.pdf b/examples/lts/lts_control.pdf similarity index 100% rename from PSOPT/examples/lts/lts_control.pdf rename to examples/lts/lts_control.pdf diff --git a/PSOPT/examples/lts/lts_states.pdf b/examples/lts/lts_states.pdf similarity index 100% rename from PSOPT/examples/lts/lts_states.pdf rename to examples/lts/lts_states.pdf diff --git a/PSOPT/examples/lts/mesh_statistics.txt b/examples/lts/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/lts/mesh_statistics.txt rename to examples/lts/mesh_statistics.txt diff --git a/PSOPT/examples/lts/psopt_solution_lts.txt b/examples/lts/psopt_solution_lts.txt similarity index 100% rename from PSOPT/examples/lts/psopt_solution_lts.txt rename to examples/lts/psopt_solution_lts.txt diff --git a/examples/manutec/CMakeList.txt b/examples/manutec/CMakeList.txt new file mode 100644 index 00000000..de5e693a --- /dev/null +++ b/examples/manutec/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(manutec LANGUAGES CXX) + +add_executable(${PROJECT_NAME} manutec.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/manutec/Makefile b/examples/manutec/Makefile similarity index 100% rename from PSOPT/examples/manutec/Makefile rename to examples/manutec/Makefile diff --git a/PSOPT/examples/manutec/Makefile.vc b/examples/manutec/Makefile.vc similarity index 100% rename from PSOPT/examples/manutec/Makefile.vc rename to examples/manutec/Makefile.vc diff --git a/PSOPT/examples/manutec/constraint_summary.txt b/examples/manutec/constraint_summary.txt similarity index 100% rename from PSOPT/examples/manutec/constraint_summary.txt rename to examples/manutec/constraint_summary.txt diff --git a/PSOPT/examples/manutec/controls.pdf b/examples/manutec/controls.pdf similarity index 100% rename from PSOPT/examples/manutec/controls.pdf rename to examples/manutec/controls.pdf diff --git a/PSOPT/examples/manutec/manutec.cxx b/examples/manutec/manutec.cxx similarity index 100% rename from PSOPT/examples/manutec/manutec.cxx rename to examples/manutec/manutec.cxx diff --git a/PSOPT/examples/manutec/manutec.txt b/examples/manutec/manutec.txt similarity index 100% rename from PSOPT/examples/manutec/manutec.txt rename to examples/manutec/manutec.txt diff --git a/PSOPT/examples/manutec/mesh_statistics.txt b/examples/manutec/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/manutec/mesh_statistics.txt rename to examples/manutec/mesh_statistics.txt diff --git a/PSOPT/examples/manutec/mesh_statistics_manutec.tex b/examples/manutec/mesh_statistics_manutec.tex similarity index 100% rename from PSOPT/examples/manutec/mesh_statistics_manutec.tex rename to examples/manutec/mesh_statistics_manutec.tex diff --git a/PSOPT/examples/manutec/positions.pdf b/examples/manutec/positions.pdf similarity index 100% rename from PSOPT/examples/manutec/positions.pdf rename to examples/manutec/positions.pdf diff --git a/PSOPT/examples/manutec/psopt_solution_manutec.txt b/examples/manutec/psopt_solution_manutec.txt similarity index 100% rename from PSOPT/examples/manutec/psopt_solution_manutec.txt rename to examples/manutec/psopt_solution_manutec.txt diff --git a/PSOPT/examples/manutec/psopt_solution_summary.txt b/examples/manutec/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/manutec/psopt_solution_summary.txt rename to examples/manutec/psopt_solution_summary.txt diff --git a/PSOPT/examples/manutec/velocities.pdf b/examples/manutec/velocities.pdf similarity index 100% rename from PSOPT/examples/manutec/velocities.pdf rename to examples/manutec/velocities.pdf diff --git a/examples/missile/CMakeList.txt b/examples/missile/CMakeList.txt new file mode 100644 index 00000000..c720dc99 --- /dev/null +++ b/examples/missile/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(missile LANGUAGES CXX) + +add_executable(${PROJECT_NAME} missile.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/missile/Makefile b/examples/missile/Makefile similarity index 100% rename from PSOPT/examples/missile/Makefile rename to examples/missile/Makefile diff --git a/PSOPT/examples/missile/Makefile.vc b/examples/missile/Makefile.vc similarity index 100% rename from PSOPT/examples/missile/Makefile.vc rename to examples/missile/Makefile.vc diff --git a/PSOPT/examples/missile/constraint_summary.txt b/examples/missile/constraint_summary.txt similarity index 100% rename from PSOPT/examples/missile/constraint_summary.txt rename to examples/missile/constraint_summary.txt diff --git a/PSOPT/examples/missile/mesh_statistics.txt b/examples/missile/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/missile/mesh_statistics.txt rename to examples/missile/mesh_statistics.txt diff --git a/PSOPT/examples/missile/missile.cxx b/examples/missile/missile.cxx similarity index 100% rename from PSOPT/examples/missile/missile.cxx rename to examples/missile/missile.cxx diff --git a/PSOPT/examples/missile/missile.pdf b/examples/missile/missile.pdf similarity index 100% rename from PSOPT/examples/missile/missile.pdf rename to examples/missile/missile.pdf diff --git a/PSOPT/examples/missile/missile.txt b/examples/missile/missile.txt similarity index 100% rename from PSOPT/examples/missile/missile.txt rename to examples/missile/missile.txt diff --git a/PSOPT/examples/missile/missile_alpha.pdf b/examples/missile/missile_alpha.pdf similarity index 100% rename from PSOPT/examples/missile/missile_alpha.pdf rename to examples/missile/missile_alpha.pdf diff --git a/PSOPT/examples/missile/missile_alt.pdf b/examples/missile/missile_alt.pdf similarity index 100% rename from PSOPT/examples/missile/missile_alt.pdf rename to examples/missile/missile_alt.pdf diff --git a/PSOPT/examples/missile/missile_alt_vs_x.pdf b/examples/missile/missile_alt_vs_x.pdf similarity index 100% rename from PSOPT/examples/missile/missile_alt_vs_x.pdf rename to examples/missile/missile_alt_vs_x.pdf diff --git a/PSOPT/examples/missile/missile_gamma.pdf b/examples/missile/missile_gamma.pdf similarity index 100% rename from PSOPT/examples/missile/missile_gamma.pdf rename to examples/missile/missile_gamma.pdf diff --git a/PSOPT/examples/missile/missile_speed.pdf b/examples/missile/missile_speed.pdf similarity index 100% rename from PSOPT/examples/missile/missile_speed.pdf rename to examples/missile/missile_speed.pdf diff --git a/PSOPT/examples/missile/psopt_solution_missile.txt b/examples/missile/psopt_solution_missile.txt similarity index 100% rename from PSOPT/examples/missile/psopt_solution_missile.txt rename to examples/missile/psopt_solution_missile.txt diff --git a/PSOPT/examples/missile/psopt_solution_summary.txt b/examples/missile/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/missile/psopt_solution_summary.txt rename to examples/missile/psopt_solution_summary.txt diff --git a/examples/moon/CMakeList.txt b/examples/moon/CMakeList.txt new file mode 100644 index 00000000..5027c5ba --- /dev/null +++ b/examples/moon/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(moon LANGUAGES CXX) + +add_executable(${PROJECT_NAME} moon.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/moon/Makefile b/examples/moon/Makefile similarity index 100% rename from PSOPT/examples/moon/Makefile rename to examples/moon/Makefile diff --git a/PSOPT/examples/moon/Makefile.vc b/examples/moon/Makefile.vc similarity index 100% rename from PSOPT/examples/moon/Makefile.vc rename to examples/moon/Makefile.vc diff --git a/PSOPT/examples/moon/constraint_summary.txt b/examples/moon/constraint_summary.txt similarity index 100% rename from PSOPT/examples/moon/constraint_summary.txt rename to examples/moon/constraint_summary.txt diff --git a/PSOPT/examples/moon/mesh_statistics.txt b/examples/moon/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/moon/mesh_statistics.txt rename to examples/moon/mesh_statistics.txt diff --git a/PSOPT/examples/moon/moon.cxx b/examples/moon/moon.cxx similarity index 100% rename from PSOPT/examples/moon/moon.cxx rename to examples/moon/moon.cxx diff --git a/PSOPT/examples/moon/moon.txt b/examples/moon/moon.txt similarity index 100% rename from PSOPT/examples/moon/moon.txt rename to examples/moon/moon.txt diff --git a/PSOPT/examples/moon/moon_control.pdf b/examples/moon/moon_control.pdf similarity index 100% rename from PSOPT/examples/moon/moon_control.pdf rename to examples/moon/moon_control.pdf diff --git a/PSOPT/examples/moon/moon_states.pdf b/examples/moon/moon_states.pdf similarity index 100% rename from PSOPT/examples/moon/moon_states.pdf rename to examples/moon/moon_states.pdf diff --git a/PSOPT/examples/moon/psopt_solution_moon.txt b/examples/moon/psopt_solution_moon.txt similarity index 100% rename from PSOPT/examples/moon/psopt_solution_moon.txt rename to examples/moon/psopt_solution_moon.txt diff --git a/examples/mpec/CMakeList.txt b/examples/mpec/CMakeList.txt new file mode 100644 index 00000000..219b8d59 --- /dev/null +++ b/examples/mpec/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(mpec LANGUAGES CXX) + +add_executable(${PROJECT_NAME} mpec.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/mpec/Makefile b/examples/mpec/Makefile similarity index 100% rename from PSOPT/examples/mpec/Makefile rename to examples/mpec/Makefile diff --git a/PSOPT/examples/mpec/Makefile.vc b/examples/mpec/Makefile.vc similarity index 100% rename from PSOPT/examples/mpec/Makefile.vc rename to examples/mpec/Makefile.vc diff --git a/PSOPT/examples/mpec/error_message.txt b/examples/mpec/error_message.txt similarity index 100% rename from PSOPT/examples/mpec/error_message.txt rename to examples/mpec/error_message.txt diff --git a/PSOPT/examples/mpec/mesh_statistics.txt b/examples/mpec/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/mpec/mesh_statistics.txt rename to examples/mpec/mesh_statistics.txt diff --git a/PSOPT/examples/mpec/mpec.cxx b/examples/mpec/mpec.cxx similarity index 100% rename from PSOPT/examples/mpec/mpec.cxx rename to examples/mpec/mpec.cxx diff --git a/PSOPT/examples/mpec/mpec.txt b/examples/mpec/mpec.txt similarity index 100% rename from PSOPT/examples/mpec/mpec.txt rename to examples/mpec/mpec.txt diff --git a/PSOPT/examples/mpec/p.pdf b/examples/mpec/p.pdf similarity index 100% rename from PSOPT/examples/mpec/p.pdf rename to examples/mpec/p.pdf diff --git a/PSOPT/examples/mpec/psopt_solution_mpec.txt b/examples/mpec/psopt_solution_mpec.txt similarity index 100% rename from PSOPT/examples/mpec/psopt_solution_mpec.txt rename to examples/mpec/psopt_solution_mpec.txt diff --git a/PSOPT/examples/mpec/q.pdf b/examples/mpec/q.pdf similarity index 100% rename from PSOPT/examples/mpec/q.pdf rename to examples/mpec/q.pdf diff --git a/PSOPT/examples/mpec/s.pdf b/examples/mpec/s.pdf similarity index 100% rename from PSOPT/examples/mpec/s.pdf rename to examples/mpec/s.pdf diff --git a/PSOPT/examples/mpec/y.pdf b/examples/mpec/y.pdf similarity index 100% rename from PSOPT/examples/mpec/y.pdf rename to examples/mpec/y.pdf diff --git a/examples/notorious/CMakeList.txt b/examples/notorious/CMakeList.txt new file mode 100644 index 00000000..e727df38 --- /dev/null +++ b/examples/notorious/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(notorious LANGUAGES CXX) + +add_executable(${PROJECT_NAME} notorious.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/notorious/Makefile b/examples/notorious/Makefile similarity index 100% rename from PSOPT/examples/notorious/Makefile rename to examples/notorious/Makefile diff --git a/PSOPT/examples/notorious/Makefile.vc b/examples/notorious/Makefile.vc similarity index 100% rename from PSOPT/examples/notorious/Makefile.vc rename to examples/notorious/Makefile.vc diff --git a/PSOPT/examples/notorious/error_message.txt b/examples/notorious/error_message.txt similarity index 100% rename from PSOPT/examples/notorious/error_message.txt rename to examples/notorious/error_message.txt diff --git a/PSOPT/examples/notorious/mesh_statistics.txt b/examples/notorious/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/notorious/mesh_statistics.txt rename to examples/notorious/mesh_statistics.txt diff --git a/PSOPT/examples/notorious/notorious.cxx b/examples/notorious/notorious.cxx similarity index 100% rename from PSOPT/examples/notorious/notorious.cxx rename to examples/notorious/notorious.cxx diff --git a/PSOPT/examples/notorious/notorious.txt b/examples/notorious/notorious.txt similarity index 100% rename from PSOPT/examples/notorious/notorious.txt rename to examples/notorious/notorious.txt diff --git a/PSOPT/examples/notorious/psopt_solution_notorious.txt b/examples/notorious/psopt_solution_notorious.txt similarity index 100% rename from PSOPT/examples/notorious/psopt_solution_notorious.txt rename to examples/notorious/psopt_solution_notorious.txt diff --git a/PSOPT/examples/notorious/psopt_solution_slm.txt b/examples/notorious/psopt_solution_slm.txt similarity index 100% rename from PSOPT/examples/notorious/psopt_solution_slm.txt rename to examples/notorious/psopt_solution_slm.txt diff --git a/PSOPT/examples/notorious/slm.txt b/examples/notorious/slm.txt similarity index 100% rename from PSOPT/examples/notorious/slm.txt rename to examples/notorious/slm.txt diff --git a/examples/obstacle/CMakeList.txt b/examples/obstacle/CMakeList.txt new file mode 100644 index 00000000..dc65529a --- /dev/null +++ b/examples/obstacle/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(obstacle LANGUAGES CXX) + +add_executable(${PROJECT_NAME} obstacle.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/obstacle/Makefile b/examples/obstacle/Makefile similarity index 100% rename from PSOPT/examples/obstacle/Makefile rename to examples/obstacle/Makefile diff --git a/PSOPT/examples/obstacle/Makefile.vc b/examples/obstacle/Makefile.vc similarity index 100% rename from PSOPT/examples/obstacle/Makefile.vc rename to examples/obstacle/Makefile.vc diff --git a/PSOPT/examples/obstacle/constraint_summary.txt b/examples/obstacle/constraint_summary.txt similarity index 100% rename from PSOPT/examples/obstacle/constraint_summary.txt rename to examples/obstacle/constraint_summary.txt diff --git a/PSOPT/examples/obstacle/mesh_statistics.txt b/examples/obstacle/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/obstacle/mesh_statistics.txt rename to examples/obstacle/mesh_statistics.txt diff --git a/PSOPT/examples/obstacle/obstacle.cxx b/examples/obstacle/obstacle.cxx similarity index 100% rename from PSOPT/examples/obstacle/obstacle.cxx rename to examples/obstacle/obstacle.cxx diff --git a/PSOPT/examples/obstacle/obstacle.txt b/examples/obstacle/obstacle.txt similarity index 100% rename from PSOPT/examples/obstacle/obstacle.txt rename to examples/obstacle/obstacle.txt diff --git a/PSOPT/examples/obstacle/obstacle_xy.pdf b/examples/obstacle/obstacle_xy.pdf similarity index 100% rename from PSOPT/examples/obstacle/obstacle_xy.pdf rename to examples/obstacle/obstacle_xy.pdf diff --git a/PSOPT/examples/obstacle/psopt_solution_obstacle.txt b/examples/obstacle/psopt_solution_obstacle.txt similarity index 100% rename from PSOPT/examples/obstacle/psopt_solution_obstacle.txt rename to examples/obstacle/psopt_solution_obstacle.txt diff --git a/examples/param2/CMakeList.txt b/examples/param2/CMakeList.txt new file mode 100644 index 00000000..f46d57a4 --- /dev/null +++ b/examples/param2/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(param2 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} param2.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/param2/param2.cxx b/examples/param2/param2.cxx similarity index 100% rename from PSOPT/examples/param2/param2.cxx rename to examples/param2/param2.cxx diff --git a/PSOPT/examples/param2/x1.pdf b/examples/param2/x1.pdf similarity index 100% rename from PSOPT/examples/param2/x1.pdf rename to examples/param2/x1.pdf diff --git a/PSOPT/examples/param2/x2.pdf b/examples/param2/x2.pdf similarity index 100% rename from PSOPT/examples/param2/x2.pdf rename to examples/param2/x2.pdf diff --git a/PSOPT/examples/param2/x3.pdf b/examples/param2/x3.pdf similarity index 100% rename from PSOPT/examples/param2/x3.pdf rename to examples/param2/x3.pdf diff --git a/examples/predator/CMakeList.txt b/examples/predator/CMakeList.txt new file mode 100644 index 00000000..18221ae0 --- /dev/null +++ b/examples/predator/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(predator LANGUAGES CXX) + +add_executable(${PROJECT_NAME} predator.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/predator/mesh_statistics_predator.tex b/examples/predator/mesh_statistics_predator.tex similarity index 100% rename from PSOPT/examples/predator/mesh_statistics_predator.tex rename to examples/predator/mesh_statistics_predator.tex diff --git a/PSOPT/examples/predator/predator.cxx b/examples/predator/predator.cxx similarity index 100% rename from PSOPT/examples/predator/predator.cxx rename to examples/predator/predator.cxx diff --git a/PSOPT/examples/predator/predator.dat b/examples/predator/predator.dat similarity index 100% rename from PSOPT/examples/predator/predator.dat rename to examples/predator/predator.dat diff --git a/PSOPT/examples/predator/x1.pdf b/examples/predator/x1.pdf similarity index 100% rename from PSOPT/examples/predator/x1.pdf rename to examples/predator/x1.pdf diff --git a/PSOPT/examples/predator/x1x2.pdf b/examples/predator/x1x2.pdf similarity index 100% rename from PSOPT/examples/predator/x1x2.pdf rename to examples/predator/x1x2.pdf diff --git a/PSOPT/examples/predator/x2.pdf b/examples/predator/x2.pdf similarity index 100% rename from PSOPT/examples/predator/x2.pdf rename to examples/predator/x2.pdf diff --git a/PSOPT/examples/predator/x3.pdf b/examples/predator/x3.pdf similarity index 100% rename from PSOPT/examples/predator/x3.pdf rename to examples/predator/x3.pdf diff --git a/examples/rayleigh/CMakeList.txt b/examples/rayleigh/CMakeList.txt new file mode 100644 index 00000000..79c3466e --- /dev/null +++ b/examples/rayleigh/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(rayleigh LANGUAGES CXX) + +add_executable(${PROJECT_NAME} rayleigh.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/rayleigh/Makefile b/examples/rayleigh/Makefile similarity index 100% rename from PSOPT/examples/rayleigh/Makefile rename to examples/rayleigh/Makefile diff --git a/PSOPT/examples/rayleigh/Makefile.vc b/examples/rayleigh/Makefile.vc similarity index 100% rename from PSOPT/examples/rayleigh/Makefile.vc rename to examples/rayleigh/Makefile.vc diff --git a/PSOPT/examples/rayleigh/error_message.txt b/examples/rayleigh/error_message.txt similarity index 100% rename from PSOPT/examples/rayleigh/error_message.txt rename to examples/rayleigh/error_message.txt diff --git a/PSOPT/examples/rayleigh/hartl.txt b/examples/rayleigh/hartl.txt similarity index 100% rename from PSOPT/examples/rayleigh/hartl.txt rename to examples/rayleigh/hartl.txt diff --git a/PSOPT/examples/rayleigh/mesh_statistics.txt b/examples/rayleigh/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/rayleigh/mesh_statistics.txt rename to examples/rayleigh/mesh_statistics.txt diff --git a/PSOPT/examples/rayleigh/psopt_solution_hartl.txt b/examples/rayleigh/psopt_solution_hartl.txt similarity index 100% rename from PSOPT/examples/rayleigh/psopt_solution_hartl.txt rename to examples/rayleigh/psopt_solution_hartl.txt diff --git a/PSOPT/examples/rayleigh/psopt_solution_rayleigh.txt b/examples/rayleigh/psopt_solution_rayleigh.txt similarity index 100% rename from PSOPT/examples/rayleigh/psopt_solution_rayleigh.txt rename to examples/rayleigh/psopt_solution_rayleigh.txt diff --git a/PSOPT/examples/rayleigh/rayleigh.cxx b/examples/rayleigh/rayleigh.cxx similarity index 100% rename from PSOPT/examples/rayleigh/rayleigh.cxx rename to examples/rayleigh/rayleigh.cxx diff --git a/PSOPT/examples/rayleigh/rayleigh.txt b/examples/rayleigh/rayleigh.txt similarity index 100% rename from PSOPT/examples/rayleigh/rayleigh.txt rename to examples/rayleigh/rayleigh.txt diff --git a/PSOPT/examples/rayleigh/rayleigh_control.pdf b/examples/rayleigh/rayleigh_control.pdf similarity index 100% rename from PSOPT/examples/rayleigh/rayleigh_control.pdf rename to examples/rayleigh/rayleigh_control.pdf diff --git a/PSOPT/examples/rayleigh/rayleigh_costates.pdf b/examples/rayleigh/rayleigh_costates.pdf similarity index 100% rename from PSOPT/examples/rayleigh/rayleigh_costates.pdf rename to examples/rayleigh/rayleigh_costates.pdf diff --git a/PSOPT/examples/rayleigh/rayleigh_mu.pdf b/examples/rayleigh/rayleigh_mu.pdf similarity index 100% rename from PSOPT/examples/rayleigh/rayleigh_mu.pdf rename to examples/rayleigh/rayleigh_mu.pdf diff --git a/PSOPT/examples/rayleigh/rayleigh_states.pdf b/examples/rayleigh/rayleigh_states.pdf similarity index 100% rename from PSOPT/examples/rayleigh/rayleigh_states.pdf rename to examples/rayleigh/rayleigh_states.pdf diff --git a/examples/reorientation/CMakeList.txt b/examples/reorientation/CMakeList.txt new file mode 100644 index 00000000..de824d55 --- /dev/null +++ b/examples/reorientation/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(reorientation LANGUAGES CXX) + +add_executable(${PROJECT_NAME} reorientation.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/reorientation/Makefile b/examples/reorientation/Makefile similarity index 100% rename from PSOPT/examples/reorientation/Makefile rename to examples/reorientation/Makefile diff --git a/PSOPT/examples/reorientation/Makefile.vc b/examples/reorientation/Makefile.vc similarity index 100% rename from PSOPT/examples/reorientation/Makefile.vc rename to examples/reorientation/Makefile.vc diff --git a/PSOPT/examples/reorientation/mesh_statistics.txt b/examples/reorientation/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/reorientation/mesh_statistics.txt rename to examples/reorientation/mesh_statistics.txt diff --git a/PSOPT/examples/reorientation/psopt_solution_reorientation.txt b/examples/reorientation/psopt_solution_reorientation.txt similarity index 100% rename from PSOPT/examples/reorientation/psopt_solution_reorientation.txt rename to examples/reorientation/psopt_solution_reorientation.txt diff --git a/PSOPT/examples/reorientation/reorientation.cxx b/examples/reorientation/reorientation.cxx similarity index 100% rename from PSOPT/examples/reorientation/reorientation.cxx rename to examples/reorientation/reorientation.cxx diff --git a/PSOPT/examples/reorientation/reorientation.txt b/examples/reorientation/reorientation.txt similarity index 100% rename from PSOPT/examples/reorientation/reorientation.txt rename to examples/reorientation/reorientation.txt diff --git a/PSOPT/examples/reorientation/reorientation_q.pdf b/examples/reorientation/reorientation_q.pdf similarity index 100% rename from PSOPT/examples/reorientation/reorientation_q.pdf rename to examples/reorientation/reorientation_q.pdf diff --git a/PSOPT/examples/reorientation/reorientation_u.pdf b/examples/reorientation/reorientation_u.pdf similarity index 100% rename from PSOPT/examples/reorientation/reorientation_u.pdf rename to examples/reorientation/reorientation_u.pdf diff --git a/examples/shutt/CMakeList.txt b/examples/shutt/CMakeList.txt new file mode 100644 index 00000000..22a3755e --- /dev/null +++ b/examples/shutt/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(shutt LANGUAGES CXX) + +add_executable(${PROJECT_NAME} shutt.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/shutt/Makefile b/examples/shutt/Makefile similarity index 100% rename from PSOPT/examples/shutt/Makefile rename to examples/shutt/Makefile diff --git a/PSOPT/examples/shutt/Makefile.vc b/examples/shutt/Makefile.vc similarity index 100% rename from PSOPT/examples/shutt/Makefile.vc rename to examples/shutt/Makefile.vc diff --git a/PSOPT/examples/shutt/constraint_summary.txt b/examples/shutt/constraint_summary.txt similarity index 100% rename from PSOPT/examples/shutt/constraint_summary.txt rename to examples/shutt/constraint_summary.txt diff --git a/PSOPT/examples/shutt/mesh_statistics.txt b/examples/shutt/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/shutt/mesh_statistics.txt rename to examples/shutt/mesh_statistics.txt diff --git a/PSOPT/examples/shutt/psopt_solution_shuttle.txt b/examples/shutt/psopt_solution_shuttle.txt similarity index 100% rename from PSOPT/examples/shutt/psopt_solution_shuttle.txt rename to examples/shutt/psopt_solution_shuttle.txt diff --git a/PSOPT/examples/shutt/shutt_alpha.pdf b/examples/shutt/shutt_alpha.pdf similarity index 100% rename from PSOPT/examples/shutt/shutt_alpha.pdf rename to examples/shutt/shutt_alpha.pdf diff --git a/PSOPT/examples/shutt/shutt_alt.pdf b/examples/shutt/shutt_alt.pdf similarity index 100% rename from PSOPT/examples/shutt/shutt_alt.pdf rename to examples/shutt/shutt_alt.pdf diff --git a/PSOPT/examples/shutt/shutt_azi.pdf b/examples/shutt/shutt_azi.pdf similarity index 100% rename from PSOPT/examples/shutt/shutt_azi.pdf rename to examples/shutt/shutt_azi.pdf diff --git a/PSOPT/examples/shutt/shutt_beta.pdf b/examples/shutt/shutt_beta.pdf similarity index 100% rename from PSOPT/examples/shutt/shutt_beta.pdf rename to examples/shutt/shutt_beta.pdf diff --git a/PSOPT/examples/shutt/shutt_fpa.pdf b/examples/shutt/shutt_fpa.pdf similarity index 100% rename from PSOPT/examples/shutt/shutt_fpa.pdf rename to examples/shutt/shutt_fpa.pdf diff --git a/PSOPT/examples/shutt/shutt_lat.pdf b/examples/shutt/shutt_lat.pdf similarity index 100% rename from PSOPT/examples/shutt/shutt_lat.pdf rename to examples/shutt/shutt_lat.pdf diff --git a/PSOPT/examples/shutt/shutt_lon.pdf b/examples/shutt/shutt_lon.pdf similarity index 100% rename from PSOPT/examples/shutt/shutt_lon.pdf rename to examples/shutt/shutt_lon.pdf diff --git a/PSOPT/examples/shutt/shutt_vel.pdf b/examples/shutt/shutt_vel.pdf similarity index 100% rename from PSOPT/examples/shutt/shutt_vel.pdf rename to examples/shutt/shutt_vel.pdf diff --git a/PSOPT/examples/shutt/shuttle.txt b/examples/shutt/shuttle.txt similarity index 100% rename from PSOPT/examples/shutt/shuttle.txt rename to examples/shutt/shuttle.txt diff --git a/PSOPT/examples/shutt/shuttle_reentry1.cxx b/examples/shutt/shuttle_reentry1.cxx similarity index 100% rename from PSOPT/examples/shutt/shuttle_reentry1.cxx rename to examples/shutt/shuttle_reentry1.cxx diff --git a/examples/sing5/CMakeList.txt b/examples/sing5/CMakeList.txt new file mode 100644 index 00000000..1f4fb3e2 --- /dev/null +++ b/examples/sing5/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(sing5 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} sing5.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/sing5/Makefile b/examples/sing5/Makefile similarity index 100% rename from PSOPT/examples/sing5/Makefile rename to examples/sing5/Makefile diff --git a/PSOPT/examples/sing5/Makefile.vc b/examples/sing5/Makefile.vc similarity index 100% rename from PSOPT/examples/sing5/Makefile.vc rename to examples/sing5/Makefile.vc diff --git a/PSOPT/examples/sing5/constraint_summary.txt b/examples/sing5/constraint_summary.txt similarity index 100% rename from PSOPT/examples/sing5/constraint_summary.txt rename to examples/sing5/constraint_summary.txt diff --git a/PSOPT/examples/sing5/mesh_statistics.txt b/examples/sing5/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/sing5/mesh_statistics.txt rename to examples/sing5/mesh_statistics.txt diff --git a/PSOPT/examples/sing5/psopt_solution_sing5.txt b/examples/sing5/psopt_solution_sing5.txt similarity index 100% rename from PSOPT/examples/sing5/psopt_solution_sing5.txt rename to examples/sing5/psopt_solution_sing5.txt diff --git a/PSOPT/examples/sing5/psopt_solution_summary.txt b/examples/sing5/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/sing5/psopt_solution_summary.txt rename to examples/sing5/psopt_solution_summary.txt diff --git a/PSOPT/examples/sing5/sing5.txt b/examples/sing5/sing5.txt similarity index 100% rename from PSOPT/examples/sing5/sing5.txt rename to examples/sing5/sing5.txt diff --git a/PSOPT/examples/sing5/sing5_control.pdf b/examples/sing5/sing5_control.pdf similarity index 100% rename from PSOPT/examples/sing5/sing5_control.pdf rename to examples/sing5/sing5_control.pdf diff --git a/PSOPT/examples/sing5/sing5_states.pdf b/examples/sing5/sing5_states.pdf similarity index 100% rename from PSOPT/examples/sing5/sing5_states.pdf rename to examples/sing5/sing5_states.pdf diff --git a/PSOPT/examples/sing5/singular5.cxx b/examples/sing5/singular5.cxx similarity index 100% rename from PSOPT/examples/sing5/singular5.cxx rename to examples/sing5/singular5.cxx diff --git a/examples/stc1/CMakeList.txt b/examples/stc1/CMakeList.txt new file mode 100644 index 00000000..c467850d --- /dev/null +++ b/examples/stc1/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(stc1 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} stc1.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/stc1/Makefile b/examples/stc1/Makefile similarity index 100% rename from PSOPT/examples/stc1/Makefile rename to examples/stc1/Makefile diff --git a/PSOPT/examples/stc1/Makefile.vc b/examples/stc1/Makefile.vc similarity index 100% rename from PSOPT/examples/stc1/Makefile.vc rename to examples/stc1/Makefile.vc diff --git a/PSOPT/examples/stc1/constraint_summary.txt b/examples/stc1/constraint_summary.txt similarity index 100% rename from PSOPT/examples/stc1/constraint_summary.txt rename to examples/stc1/constraint_summary.txt diff --git a/PSOPT/examples/stc1/mesh_statistics.txt b/examples/stc1/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/stc1/mesh_statistics.txt rename to examples/stc1/mesh_statistics.txt diff --git a/PSOPT/examples/stc1/psopt_solution_stc1.txt b/examples/stc1/psopt_solution_stc1.txt similarity index 100% rename from PSOPT/examples/stc1/psopt_solution_stc1.txt rename to examples/stc1/psopt_solution_stc1.txt diff --git a/PSOPT/examples/stc1/stc1.cxx b/examples/stc1/stc1.cxx similarity index 100% rename from PSOPT/examples/stc1/stc1.cxx rename to examples/stc1/stc1.cxx diff --git a/PSOPT/examples/stc1/stc1.txt b/examples/stc1/stc1.txt similarity index 100% rename from PSOPT/examples/stc1/stc1.txt rename to examples/stc1/stc1.txt diff --git a/PSOPT/examples/stc1/stc1_control.pdf b/examples/stc1/stc1_control.pdf similarity index 100% rename from PSOPT/examples/stc1/stc1_control.pdf rename to examples/stc1/stc1_control.pdf diff --git a/PSOPT/examples/stc1/stc1_states.pdf b/examples/stc1/stc1_states.pdf similarity index 100% rename from PSOPT/examples/stc1/stc1_states.pdf rename to examples/stc1/stc1_states.pdf diff --git a/examples/steps/CMakeList.txt b/examples/steps/CMakeList.txt new file mode 100644 index 00000000..b35c1bc6 --- /dev/null +++ b/examples/steps/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(steps LANGUAGES CXX) + +add_executable(${PROJECT_NAME} steps.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/steps/Makefile b/examples/steps/Makefile similarity index 100% rename from PSOPT/examples/steps/Makefile rename to examples/steps/Makefile diff --git a/PSOPT/examples/steps/Makefile.vc b/examples/steps/Makefile.vc similarity index 100% rename from PSOPT/examples/steps/Makefile.vc rename to examples/steps/Makefile.vc diff --git a/PSOPT/examples/steps/constraint_summary.txt b/examples/steps/constraint_summary.txt similarity index 100% rename from PSOPT/examples/steps/constraint_summary.txt rename to examples/steps/constraint_summary.txt diff --git a/PSOPT/examples/steps/error_message.txt b/examples/steps/error_message.txt similarity index 100% rename from PSOPT/examples/steps/error_message.txt rename to examples/steps/error_message.txt diff --git a/PSOPT/examples/steps/mesh_statistics.txt b/examples/steps/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/steps/mesh_statistics.txt rename to examples/steps/mesh_statistics.txt diff --git a/PSOPT/examples/steps/psopt_solution_steps.txt b/examples/steps/psopt_solution_steps.txt similarity index 100% rename from PSOPT/examples/steps/psopt_solution_steps.txt rename to examples/steps/psopt_solution_steps.txt diff --git a/PSOPT/examples/steps/steps.cxx b/examples/steps/steps.cxx similarity index 100% rename from PSOPT/examples/steps/steps.cxx rename to examples/steps/steps.cxx diff --git a/PSOPT/examples/steps/steps.txt b/examples/steps/steps.txt similarity index 100% rename from PSOPT/examples/steps/steps.txt rename to examples/steps/steps.txt diff --git a/PSOPT/examples/steps/steps_control.pdf b/examples/steps/steps_control.pdf similarity index 100% rename from PSOPT/examples/steps/steps_control.pdf rename to examples/steps/steps_control.pdf diff --git a/PSOPT/examples/steps/steps_state.pdf b/examples/steps/steps_state.pdf similarity index 100% rename from PSOPT/examples/steps/steps_state.pdf rename to examples/steps/steps_state.pdf diff --git a/examples/twoburn/CMakeList.txt b/examples/twoburn/CMakeList.txt new file mode 100644 index 00000000..b80b8eee --- /dev/null +++ b/examples/twoburn/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(twoburn LANGUAGES CXX) + +add_executable(${PROJECT_NAME} twoburn.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/twoburn/Makefile b/examples/twoburn/Makefile similarity index 100% rename from PSOPT/examples/twoburn/Makefile rename to examples/twoburn/Makefile diff --git a/PSOPT/examples/twoburn/Makefile.vc b/examples/twoburn/Makefile.vc similarity index 100% rename from PSOPT/examples/twoburn/Makefile.vc rename to examples/twoburn/Makefile.vc diff --git a/PSOPT/examples/twoburn/mesh_statistics.tex b/examples/twoburn/mesh_statistics.tex similarity index 100% rename from PSOPT/examples/twoburn/mesh_statistics.tex rename to examples/twoburn/mesh_statistics.tex diff --git a/PSOPT/examples/twoburn/mesh_statistics.txt b/examples/twoburn/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/twoburn/mesh_statistics.txt rename to examples/twoburn/mesh_statistics.txt diff --git a/PSOPT/examples/twoburn/phi2.pdf b/examples/twoburn/phi2.pdf similarity index 100% rename from PSOPT/examples/twoburn/phi2.pdf rename to examples/twoburn/phi2.pdf diff --git a/PSOPT/examples/twoburn/phi4.pdf b/examples/twoburn/phi4.pdf similarity index 100% rename from PSOPT/examples/twoburn/phi4.pdf rename to examples/twoburn/phi4.pdf diff --git a/PSOPT/examples/twoburn/psopt_solution_summary.txt b/examples/twoburn/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/twoburn/psopt_solution_summary.txt rename to examples/twoburn/psopt_solution_summary.txt diff --git a/PSOPT/examples/twoburn/psopt_solution_twoburn.txt b/examples/twoburn/psopt_solution_twoburn.txt similarity index 100% rename from PSOPT/examples/twoburn/psopt_solution_twoburn.txt rename to examples/twoburn/psopt_solution_twoburn.txt diff --git a/PSOPT/examples/twoburn/theta2.pdf b/examples/twoburn/theta2.pdf similarity index 100% rename from PSOPT/examples/twoburn/theta2.pdf rename to examples/twoburn/theta2.pdf diff --git a/PSOPT/examples/twoburn/theta4.pdf b/examples/twoburn/theta4.pdf similarity index 100% rename from PSOPT/examples/twoburn/theta4.pdf rename to examples/twoburn/theta4.pdf diff --git a/PSOPT/examples/twoburn/trajectory.pdf b/examples/twoburn/trajectory.pdf similarity index 100% rename from PSOPT/examples/twoburn/trajectory.pdf rename to examples/twoburn/trajectory.pdf diff --git a/PSOPT/examples/twoburn/twoburn.cxx b/examples/twoburn/twoburn.cxx similarity index 100% rename from PSOPT/examples/twoburn/twoburn.cxx rename to examples/twoburn/twoburn.cxx diff --git a/PSOPT/examples/twoburn/twoburn.txt b/examples/twoburn/twoburn.txt similarity index 100% rename from PSOPT/examples/twoburn/twoburn.txt rename to examples/twoburn/twoburn.txt diff --git a/examples/twolink/CMakeList.txt b/examples/twolink/CMakeList.txt new file mode 100644 index 00000000..74085596 --- /dev/null +++ b/examples/twolink/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(twolink LANGUAGES CXX) + +add_executable(${PROJECT_NAME} twolink.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/twolink/Makefile b/examples/twolink/Makefile similarity index 100% rename from PSOPT/examples/twolink/Makefile rename to examples/twolink/Makefile diff --git a/PSOPT/examples/twolink/Makefile.vc b/examples/twolink/Makefile.vc similarity index 100% rename from PSOPT/examples/twolink/Makefile.vc rename to examples/twolink/Makefile.vc diff --git a/PSOPT/examples/twolink/constraint_summary.txt b/examples/twolink/constraint_summary.txt similarity index 100% rename from PSOPT/examples/twolink/constraint_summary.txt rename to examples/twolink/constraint_summary.txt diff --git a/PSOPT/examples/twolink/mesh_statistics.txt b/examples/twolink/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/twolink/mesh_statistics.txt rename to examples/twolink/mesh_statistics.txt diff --git a/PSOPT/examples/twolink/psopt_solution_twolink.txt b/examples/twolink/psopt_solution_twolink.txt similarity index 100% rename from PSOPT/examples/twolink/psopt_solution_twolink.txt rename to examples/twolink/psopt_solution_twolink.txt diff --git a/PSOPT/examples/twolink/twolink.txt b/examples/twolink/twolink.txt similarity index 100% rename from PSOPT/examples/twolink/twolink.txt rename to examples/twolink/twolink.txt diff --git a/PSOPT/examples/twolink/twolinkarm.cxx b/examples/twolink/twolinkarm.cxx similarity index 100% rename from PSOPT/examples/twolink/twolinkarm.cxx rename to examples/twolink/twolinkarm.cxx diff --git a/PSOPT/examples/twolink/twolinkarm_controls.pdf b/examples/twolink/twolinkarm_controls.pdf similarity index 100% rename from PSOPT/examples/twolink/twolinkarm_controls.pdf rename to examples/twolink/twolinkarm_controls.pdf diff --git a/PSOPT/examples/twolink/twolinkarm_states.pdf b/examples/twolink/twolinkarm_states.pdf similarity index 100% rename from PSOPT/examples/twolink/twolinkarm_states.pdf rename to examples/twolink/twolinkarm_states.pdf diff --git a/examples/twophro/CMakeList.txt b/examples/twophro/CMakeList.txt new file mode 100644 index 00000000..ebc48a03 --- /dev/null +++ b/examples/twophro/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(twophro LANGUAGES CXX) + +add_executable(${PROJECT_NAME} twophro.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/twophro/Makefile b/examples/twophro/Makefile similarity index 100% rename from PSOPT/examples/twophro/Makefile rename to examples/twophro/Makefile diff --git a/PSOPT/examples/twophro/Makefile.vc b/examples/twophro/Makefile.vc similarity index 100% rename from PSOPT/examples/twophro/Makefile.vc rename to examples/twophro/Makefile.vc diff --git a/PSOPT/examples/twophro/constraint_summary.txt b/examples/twophro/constraint_summary.txt similarity index 100% rename from PSOPT/examples/twophro/constraint_summary.txt rename to examples/twophro/constraint_summary.txt diff --git a/PSOPT/examples/twophro/mesh_statistics.txt b/examples/twophro/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/twophro/mesh_statistics.txt rename to examples/twophro/mesh_statistics.txt diff --git a/PSOPT/examples/twophro/psopt_solution_twophro.txt b/examples/twophro/psopt_solution_twophro.txt similarity index 100% rename from PSOPT/examples/twophro/psopt_solution_twophro.txt rename to examples/twophro/psopt_solution_twophro.txt diff --git a/PSOPT/examples/twophro/twophase_robot.cxx b/examples/twophro/twophase_robot.cxx similarity index 100% rename from PSOPT/examples/twophro/twophase_robot.cxx rename to examples/twophro/twophase_robot.cxx diff --git a/PSOPT/examples/twophro/twophro.txt b/examples/twophro/twophro.txt similarity index 100% rename from PSOPT/examples/twophro/twophro.txt rename to examples/twophro/twophro.txt diff --git a/PSOPT/examples/twophro/twophro_controls.pdf b/examples/twophro/twophro_controls.pdf similarity index 100% rename from PSOPT/examples/twophro/twophro_controls.pdf rename to examples/twophro/twophro_controls.pdf diff --git a/PSOPT/examples/twophro/twophro_states.pdf b/examples/twophro/twophro_states.pdf similarity index 100% rename from PSOPT/examples/twophro/twophro_states.pdf rename to examples/twophro/twophro_states.pdf diff --git a/examples/twophsc/CMakeList.txt b/examples/twophsc/CMakeList.txt new file mode 100644 index 00000000..0c90f98a --- /dev/null +++ b/examples/twophsc/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(twophsc LANGUAGES CXX) + +add_executable(${PROJECT_NAME} twophsc.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/twophsc/Makefile b/examples/twophsc/Makefile similarity index 100% rename from PSOPT/examples/twophsc/Makefile rename to examples/twophsc/Makefile diff --git a/PSOPT/examples/twophsc/Makefile.vc b/examples/twophsc/Makefile.vc similarity index 100% rename from PSOPT/examples/twophsc/Makefile.vc rename to examples/twophsc/Makefile.vc diff --git a/PSOPT/examples/twophsc/constraint_summary.txt b/examples/twophsc/constraint_summary.txt similarity index 100% rename from PSOPT/examples/twophsc/constraint_summary.txt rename to examples/twophsc/constraint_summary.txt diff --git a/PSOPT/examples/twophsc/mesh_statistics.txt b/examples/twophsc/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/twophsc/mesh_statistics.txt rename to examples/twophsc/mesh_statistics.txt diff --git a/PSOPT/examples/twophsc/psopt_solution_twophsc.txt b/examples/twophsc/psopt_solution_twophsc.txt similarity index 100% rename from PSOPT/examples/twophsc/psopt_solution_twophsc.txt rename to examples/twophsc/psopt_solution_twophsc.txt diff --git a/PSOPT/examples/twophsc/twophase_schwartz.cxx b/examples/twophsc/twophase_schwartz.cxx similarity index 100% rename from PSOPT/examples/twophsc/twophase_schwartz.cxx rename to examples/twophsc/twophase_schwartz.cxx diff --git a/PSOPT/examples/twophsc/twophsc.txt b/examples/twophsc/twophsc.txt similarity index 100% rename from PSOPT/examples/twophsc/twophsc.txt rename to examples/twophsc/twophsc.txt diff --git a/PSOPT/examples/twophsc/twophsc_control.pdf b/examples/twophsc/twophsc_control.pdf similarity index 100% rename from PSOPT/examples/twophsc/twophsc_control.pdf rename to examples/twophsc/twophsc_control.pdf diff --git a/PSOPT/examples/twophsc/twophsc_states.pdf b/examples/twophsc/twophsc_states.pdf similarity index 100% rename from PSOPT/examples/twophsc/twophsc_states.pdf rename to examples/twophsc/twophsc_states.pdf diff --git a/examples/user/CMakeList.txt b/examples/user/CMakeList.txt new file mode 100644 index 00000000..a5c9ad06 --- /dev/null +++ b/examples/user/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(user LANGUAGES CXX) + +add_executable(${PROJECT_NAME} user.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/user/Makefile b/examples/user/Makefile similarity index 100% rename from PSOPT/examples/user/Makefile rename to examples/user/Makefile diff --git a/PSOPT/examples/user/Makefile.vc b/examples/user/Makefile.vc similarity index 100% rename from PSOPT/examples/user/Makefile.vc rename to examples/user/Makefile.vc diff --git a/PSOPT/examples/user/user.cxx b/examples/user/user.cxx similarity index 100% rename from PSOPT/examples/user/user.cxx rename to examples/user/user.cxx diff --git a/examples/zpm/CMakeList.txt b/examples/zpm/CMakeList.txt new file mode 100644 index 00000000..28476962 --- /dev/null +++ b/examples/zpm/CMakeList.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(zpm LANGUAGES CXX) + +add_executable(${PROJECT_NAME} zpm.cxx) +target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/PSOPT/examples/zpm/Makefile b/examples/zpm/Makefile similarity index 100% rename from PSOPT/examples/zpm/Makefile rename to examples/zpm/Makefile diff --git a/PSOPT/examples/zpm/Makefile.vc b/examples/zpm/Makefile.vc similarity index 100% rename from PSOPT/examples/zpm/Makefile.vc rename to examples/zpm/Makefile.vc diff --git a/PSOPT/examples/zpm/constraint_summary.txt b/examples/zpm/constraint_summary.txt similarity index 100% rename from PSOPT/examples/zpm/constraint_summary.txt rename to examples/zpm/constraint_summary.txt diff --git a/PSOPT/examples/zpm/mesh_statistics.txt b/examples/zpm/mesh_statistics.txt similarity index 100% rename from PSOPT/examples/zpm/mesh_statistics.txt rename to examples/zpm/mesh_statistics.txt diff --git a/PSOPT/examples/zpm/psopt_solution_summary.txt b/examples/zpm/psopt_solution_summary.txt similarity index 100% rename from PSOPT/examples/zpm/psopt_solution_summary.txt rename to examples/zpm/psopt_solution_summary.txt diff --git a/PSOPT/examples/zpm/psopt_solution_zpm.txt b/examples/zpm/psopt_solution_zpm.txt similarity index 100% rename from PSOPT/examples/zpm/psopt_solution_zpm.txt rename to examples/zpm/psopt_solution_zpm.txt diff --git a/PSOPT/examples/zpm/zpm.cxx b/examples/zpm/zpm.cxx similarity index 100% rename from PSOPT/examples/zpm/zpm.cxx rename to examples/zpm/zpm.cxx diff --git a/PSOPT/examples/zpm/zpm.txt b/examples/zpm/zpm.txt similarity index 100% rename from PSOPT/examples/zpm/zpm.txt rename to examples/zpm/zpm.txt diff --git a/PSOPT/examples/zpm/zpm_controls.pdf b/examples/zpm/zpm_controls.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_controls.pdf rename to examples/zpm/zpm_controls.pdf diff --git a/PSOPT/examples/zpm/zpm_h1.pdf b/examples/zpm/zpm_h1.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_h1.pdf rename to examples/zpm/zpm_h1.pdf diff --git a/PSOPT/examples/zpm/zpm_h2.pdf b/examples/zpm/zpm_h2.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_h2.pdf rename to examples/zpm/zpm_h2.pdf diff --git a/PSOPT/examples/zpm/zpm_h3.pdf b/examples/zpm/zpm_h3.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_h3.pdf rename to examples/zpm/zpm_h3.pdf diff --git a/PSOPT/examples/zpm/zpm_hnorm.pdf b/examples/zpm/zpm_hnorm.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_hnorm.pdf rename to examples/zpm/zpm_hnorm.pdf diff --git a/PSOPT/examples/zpm/zpm_omega1.pdf b/examples/zpm/zpm_omega1.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_omega1.pdf rename to examples/zpm/zpm_omega1.pdf diff --git a/PSOPT/examples/zpm/zpm_omega2.pdf b/examples/zpm/zpm_omega2.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_omega2.pdf rename to examples/zpm/zpm_omega2.pdf diff --git a/PSOPT/examples/zpm/zpm_omega3.pdf b/examples/zpm/zpm_omega3.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_omega3.pdf rename to examples/zpm/zpm_omega3.pdf diff --git a/PSOPT/examples/zpm/zpm_phi.pdf b/examples/zpm/zpm_phi.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_phi.pdf rename to examples/zpm/zpm_phi.pdf diff --git a/PSOPT/examples/zpm/zpm_psi.pdf b/examples/zpm/zpm_psi.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_psi.pdf rename to examples/zpm/zpm_psi.pdf diff --git a/PSOPT/examples/zpm/zpm_theta.pdf b/examples/zpm/zpm_theta.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_theta.pdf rename to examples/zpm/zpm_theta.pdf diff --git a/PSOPT/examples/zpm/zpm_u1.pdf b/examples/zpm/zpm_u1.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_u1.pdf rename to examples/zpm/zpm_u1.pdf diff --git a/PSOPT/examples/zpm/zpm_u2.pdf b/examples/zpm/zpm_u2.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_u2.pdf rename to examples/zpm/zpm_u2.pdf diff --git a/PSOPT/examples/zpm/zpm_u3.pdf b/examples/zpm/zpm_u3.pdf similarity index 100% rename from PSOPT/examples/zpm/zpm_u3.pdf rename to examples/zpm/zpm_u3.pdf diff --git a/PSOPT/src/IPOPT_interface.cxx b/src/IPOPT_interface.cxx similarity index 100% rename from PSOPT/src/IPOPT_interface.cxx rename to src/IPOPT_interface.cxx diff --git a/PSOPT/src/NLP_bounds.cxx b/src/NLP_bounds.cxx similarity index 100% rename from PSOPT/src/NLP_bounds.cxx rename to src/NLP_bounds.cxx diff --git a/PSOPT/src/NLP_constraints.cxx b/src/NLP_constraints.cxx similarity index 100% rename from PSOPT/src/NLP_constraints.cxx rename to src/NLP_constraints.cxx diff --git a/PSOPT/src/NLP_guess.cxx b/src/NLP_guess.cxx similarity index 100% rename from PSOPT/src/NLP_guess.cxx rename to src/NLP_guess.cxx diff --git a/PSOPT/src/NLP_interface.cxx b/src/NLP_interface.cxx similarity index 100% rename from PSOPT/src/NLP_interface.cxx rename to src/NLP_interface.cxx diff --git a/PSOPT/src/NLP_objective.cxx b/src/NLP_objective.cxx similarity index 100% rename from PSOPT/src/NLP_objective.cxx rename to src/NLP_objective.cxx diff --git a/PSOPT/src/SNOPT_interface.cxx b/src/SNOPT_interface.cxx similarity index 100% rename from PSOPT/src/SNOPT_interface.cxx rename to src/SNOPT_interface.cxx diff --git a/PSOPT/src/derivatives.cxx b/src/derivatives.cxx similarity index 100% rename from PSOPT/src/derivatives.cxx rename to src/derivatives.cxx diff --git a/PSOPT/src/evaluate.cxx b/src/evaluate.cxx similarity index 100% rename from PSOPT/src/evaluate.cxx rename to src/evaluate.cxx diff --git a/PSOPT/src/get_numbers.cxx b/src/get_numbers.cxx similarity index 100% rename from PSOPT/src/get_numbers.cxx rename to src/get_numbers.cxx diff --git a/PSOPT/src/get_variables.cxx b/src/get_variables.cxx similarity index 100% rename from PSOPT/src/get_variables.cxx rename to src/get_variables.cxx diff --git a/PSOPT/src/integrate.cxx b/src/integrate.cxx similarity index 100% rename from PSOPT/src/integrate.cxx rename to src/integrate.cxx diff --git a/PSOPT/src/interpolation.cxx b/src/interpolation.cxx similarity index 100% rename from PSOPT/src/interpolation.cxx rename to src/interpolation.cxx diff --git a/PSOPT/src/ipopt_psoc.h b/src/ipopt_psoc.h similarity index 100% rename from PSOPT/src/ipopt_psoc.h rename to src/ipopt_psoc.h diff --git a/PSOPT/src/ipopt_psopt.h b/src/ipopt_psopt.h similarity index 100% rename from PSOPT/src/ipopt_psopt.h rename to src/ipopt_psopt.h diff --git a/PSOPT/src/mesh.cxx b/src/mesh.cxx similarity index 100% rename from PSOPT/src/mesh.cxx rename to src/mesh.cxx diff --git a/PSOPT/src/parameter_estimation.cxx b/src/parameter_estimation.cxx similarity index 100% rename from PSOPT/src/parameter_estimation.cxx rename to src/parameter_estimation.cxx diff --git a/PSOPT/src/phases.cxx b/src/phases.cxx similarity index 100% rename from PSOPT/src/phases.cxx rename to src/phases.cxx diff --git a/PSOPT/src/plot.cxx b/src/plot.cxx similarity index 100% rename from PSOPT/src/plot.cxx rename to src/plot.cxx diff --git a/PSOPT/src/print.cxx b/src/print.cxx similarity index 100% rename from PSOPT/src/print.cxx rename to src/print.cxx diff --git a/PSOPT/src/propagate.cxx b/src/propagate.cxx similarity index 100% rename from PSOPT/src/propagate.cxx rename to src/propagate.cxx diff --git a/PSOPT/src/pseudospectral.cxx b/src/pseudospectral.cxx similarity index 100% rename from PSOPT/src/pseudospectral.cxx rename to src/pseudospectral.cxx diff --git a/PSOPT/src/psopt.cxx b/src/psopt.cxx similarity index 100% rename from PSOPT/src/psopt.cxx rename to src/psopt.cxx diff --git a/PSOPT/src/psopt.h b/src/psopt.h similarity index 96% rename from PSOPT/src/psopt.h rename to src/psopt.h index 808cd257..d47928ca 100644 --- a/PSOPT/src/psopt.h +++ b/src/psopt.h @@ -29,7 +29,7 @@ e-mail: v.m.becerra@ieee.org **********************************************************************************************/ -#include "../../RELEASE_NUMBER" +#include "../RELEASE_NUMBER" /* Define to the C type corresponding to Fortran INTEGER */ @@ -51,8 +51,6 @@ _CRTIMP int * __cdecl errno(void) { static int i=0; return &i; }; #define MIN(a, b) ( (a)<(b)? (a):(b) ) #endif -#include "dmatrixv.h" - #undef max #undef min @@ -121,7 +119,6 @@ using namespace std; #endif -#include "f2c.h" #include using std::string; diff --git a/PSOPT/src/scaling.cxx b/src/scaling.cxx similarity index 100% rename from PSOPT/src/scaling.cxx rename to src/scaling.cxx diff --git a/PSOPT/src/setup.cxx b/src/setup.cxx similarity index 100% rename from PSOPT/src/setup.cxx rename to src/setup.cxx diff --git a/PSOPT/src/solution.cxx b/src/solution.cxx similarity index 100% rename from PSOPT/src/solution.cxx rename to src/solution.cxx diff --git a/PSOPT/src/trajectories.cxx b/src/trajectories.cxx similarity index 100% rename from PSOPT/src/trajectories.cxx rename to src/trajectories.cxx diff --git a/PSOPT/src/user_functions.cxx b/src/user_functions.cxx similarity index 100% rename from PSOPT/src/user_functions.cxx rename to src/user_functions.cxx diff --git a/PSOPT/src/util.cxx b/src/util.cxx similarity index 100% rename from PSOPT/src/util.cxx rename to src/util.cxx diff --git a/PSOPT/src/validate.cxx b/src/validate.cxx similarity index 100% rename from PSOPT/src/validate.cxx rename to src/validate.cxx diff --git a/PSOPT/src/workspace.cxx b/src/workspace.cxx similarity index 100% rename from PSOPT/src/workspace.cxx rename to src/workspace.cxx From 0ee4047038a3b1013540043b16fe8b756b8dc24c Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Fri, 24 Jul 2020 05:05:00 +0200 Subject: [PATCH 20/21] added option to include examples. fixed example cmake lists --- CMakeLists.txt | 6 +++ examples/Makefile.inc | 55 ---------------------- examples/Makefile_linux.inc | 68 --------------------------- examples/alpine/CMakeLists.txt | 5 ++ examples/bioreactor/CMakeLists.txt | 5 ++ examples/brac1/CMakeLists.txt | 5 ++ examples/breakwell/CMakeLists.txt | 5 ++ examples/bryden/CMakeLists.txt | 5 ++ examples/brymr/CMakeLists.txt | 5 ++ examples/catmix/CMakeLists.txt | 5 ++ examples/chain/CMakeLists.txt | 5 ++ examples/climb/CMakeLists.txt | 5 ++ examples/coulomb/CMakeLists.txt | 5 ++ examples/cracking/CMakeLists.txt | 5 ++ examples/crane/CMakeLists.txt | 5 ++ examples/dae_i3/CMakeLists.txt | 5 ++ examples/delay1/CMakeLists.txt | 5 ++ examples/genCMake.sh | 9 ---- examples/glider/CMakeLists.txt | 5 ++ examples/goddard/CMakeLists.txt | 5 ++ examples/heat/CMakeLists.txt | 5 ++ examples/hyper/CMakeLists.txt | 5 ++ examples/ipc/CMakeLists.txt | 5 ++ examples/isop/CMakeLists.txt | 5 ++ examples/lambert/CMakeLists.txt | 5 ++ examples/launch/CMakeLists.txt | 5 ++ examples/lowthr/CMakeLists.txt | 5 ++ examples/lts/CMakeLists.txt | 5 ++ examples/manutec/CMakeLists.txt | 5 ++ examples/missile/CMakeLists.txt | 5 ++ examples/moon/CMakeLists.txt | 5 ++ examples/mpec/CMakeLists.txt | 5 ++ examples/notorious/CMakeLists.txt | 5 ++ examples/obstacle/CMakeLists.txt | 5 ++ examples/param2/CMakeLists.txt | 5 ++ examples/predator/CMakeLists.txt | 5 ++ examples/rayleigh/CMakeLists.txt | 5 ++ examples/reorientation/CMakeLists.txt | 5 ++ examples/shutt/CMakeLists.txt | 5 ++ examples/sing5/CMakeLists.txt | 5 ++ examples/stc1/CMakeLists.txt | 5 ++ examples/steps/CMakeLists.txt | 5 ++ examples/twoburn/CMakeLists.txt | 5 ++ examples/twolink/CMakeLists.txt | 5 ++ examples/twophro/CMakeLists.txt | 5 ++ examples/twophsc/CMakeLists.txt | 5 ++ examples/user/CMakeLists.txt | 5 ++ examples/zpm/CMakeLists.txt | 5 ++ 48 files changed, 226 insertions(+), 132 deletions(-) delete mode 100755 examples/Makefile.inc delete mode 100644 examples/Makefile_linux.inc create mode 100644 examples/alpine/CMakeLists.txt create mode 100644 examples/bioreactor/CMakeLists.txt create mode 100644 examples/brac1/CMakeLists.txt create mode 100644 examples/breakwell/CMakeLists.txt create mode 100644 examples/bryden/CMakeLists.txt create mode 100644 examples/brymr/CMakeLists.txt create mode 100644 examples/catmix/CMakeLists.txt create mode 100644 examples/chain/CMakeLists.txt create mode 100644 examples/climb/CMakeLists.txt create mode 100644 examples/coulomb/CMakeLists.txt create mode 100644 examples/cracking/CMakeLists.txt create mode 100644 examples/crane/CMakeLists.txt create mode 100644 examples/dae_i3/CMakeLists.txt create mode 100644 examples/delay1/CMakeLists.txt delete mode 100644 examples/genCMake.sh create mode 100644 examples/glider/CMakeLists.txt create mode 100644 examples/goddard/CMakeLists.txt create mode 100644 examples/heat/CMakeLists.txt create mode 100644 examples/hyper/CMakeLists.txt create mode 100644 examples/ipc/CMakeLists.txt create mode 100644 examples/isop/CMakeLists.txt create mode 100644 examples/lambert/CMakeLists.txt create mode 100644 examples/launch/CMakeLists.txt create mode 100644 examples/lowthr/CMakeLists.txt create mode 100644 examples/lts/CMakeLists.txt create mode 100644 examples/manutec/CMakeLists.txt create mode 100644 examples/missile/CMakeLists.txt create mode 100644 examples/moon/CMakeLists.txt create mode 100644 examples/mpec/CMakeLists.txt create mode 100644 examples/notorious/CMakeLists.txt create mode 100644 examples/obstacle/CMakeLists.txt create mode 100644 examples/param2/CMakeLists.txt create mode 100644 examples/predator/CMakeLists.txt create mode 100644 examples/rayleigh/CMakeLists.txt create mode 100644 examples/reorientation/CMakeLists.txt create mode 100644 examples/shutt/CMakeLists.txt create mode 100644 examples/sing5/CMakeLists.txt create mode 100644 examples/stc1/CMakeLists.txt create mode 100644 examples/steps/CMakeLists.txt create mode 100644 examples/twoburn/CMakeLists.txt create mode 100644 examples/twolink/CMakeLists.txt create mode 100644 examples/twophro/CMakeLists.txt create mode 100644 examples/twophsc/CMakeLists.txt create mode 100644 examples/user/CMakeLists.txt create mode 100644 examples/zpm/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 3a1ecfb6..1adec6d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required (VERSION 3.10) project(PSOPT VERSION 4.0.1 LANGUAGES CXX) +option(BUILD_EXAMPLES "Build examples from the example subdirectory." OFF) + find_package(Eigen3 REQUIRED NO_MODULE) find_package(PkgConfig REQUIRED) pkg_check_modules(adolc adolc) @@ -36,3 +38,7 @@ file(GLOB HEADER "src/*.h") add_library(${PROJECT_NAME} ${SRC} ${HEADER}) target_include_directories(${PROJECT_NAME} PUBLIC src/ PRIVATE ${ipopt_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} PUBLIC adolc ${ipopt_LIBRARIES} PRIVATE Eigen3::Eigen) + +if(${BUILD_EXAMPLES}) + add_subdirectory(examples/) +endif() diff --git a/examples/Makefile.inc b/examples/Makefile.inc deleted file mode 100755 index a2784148..00000000 --- a/examples/Makefile.inc +++ /dev/null @@ -1,55 +0,0 @@ -CXX = cl - -CC = cl - -LD = link - -CFLAGS = -DWIN32 -DLAPACK -DSPARSE_MATRIX -DUSE_IPOPT -D_CRT_ERRNO_DEFINED - -BASE = ..\..\.. - -DMATRIX = $(BASE)\dmatrix - -LUSOL = $(BASE)\lusol\csrc - -CXSPARSE = $(BASE)\CXSparse - - -ADOLC = C:\ADOL-C-2.1.12\ADOL-C\ - -ADOLCLIB = C:\ADOL-C-2.1.12\windows\sparse\adolc.lib - -IPOPT = C:\Ipopt-3.9.3 - -include ..\..\..\MicrosoftVisualStudio.inc - -PSOPT = $(BASE)\PSOPT - -INCLUDE = -I$(PSOPT)\src -I$(DMATRIX)\include -I$(BASE)\CXSparse\Include -I$(LUSOL) -I$(IPOPT)\include\coin -I$(IPOPT)\Ipopt\src\Interfaces -I$(IPOPT)\Ipopt\src\Common -I$(IPOPT)\BuildTools\headers -I$(IPOPT)\Ipopt\src\LinAlg -I$(ADOLC) -I$(ADOLC)\adolc -I$(ADOLC)\adolc\drivers -I$(ADOLC)\adolc\sparse -I$(VCINCLUDE) -I$(VCSDK) - - - -LIBS = $(DMATRIX)\lib\libdmatrix.lib $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\clapack.lib $(DMATRIX)\lib\blas.lib $(DMATRIX)\lib\libf2c.lib $(IPOPT)\Ipopt\MSVisualStudio\v8\libIpopt\Release\libIpopt.lib $(IPOPT)\Ipopt\MSVisualStudio\v8\libf2c\vcf2c.lib $(IPOPT)\Ipopt\MSVisualStudio\v8\LibCoinLapack\Release\libCoinLapack.lib $(IPOPT)\Ipopt\MSVisualStudio\v8\libCoinBlas\Release\libCoinBlas.lib $(IPOPT)\Ipopt\MSVisualStudio\v8\libCoinHSL\Release\libCoinHSL.lib $(LUSOL)\liblusol.lib $(CXSPARSE)\Lib\libcxsparse.lib $(ADOLCLIB) - - -SNFW_SRC = - -SNFW_OBJ = - - - -.cxx.obj: - $(CXX) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - -.c.obj: - $(CC) -c $(CFLAGS) $(INCLUDE) %s /Fo$*.obj - - -clean: - del *.obj - - - - - - diff --git a/examples/Makefile_linux.inc b/examples/Makefile_linux.inc deleted file mode 100644 index 23f39008..00000000 --- a/examples/Makefile_linux.inc +++ /dev/null @@ -1,68 +0,0 @@ -#Usage: make - -SHELL = /bin/sh -USERHOME = /home/$(shell whoami) - -F2CINC = $(F2CINCLUDE) -F2CLIB = $(F2CLIBRARY) - -DMATRIXDIR=../../../dmatrix - -CXSPARSE=../../../SuiteSparse/CXSparse -LUSOL=../../../lusol/csrc - -prefix = $(USERHOME)/Ipopt-3.12.12 -IPOPTINCDIR = -I${prefix}/Ipopt/src/Interfaces -I${prefix}/Ipopt/src/Common -I${prefix}/Ipopt/src/LinAlg -# Directory with libipopt.a -IPOPTLIBDIR = ${exec_prefix}/lib -exec_prefix = ${prefix} - -PSOPTDIR = ../.. - -PSOPTSRCDIR = ../../src -EXAMPLESDIR = . -LIBDIR = $(SNOPTDIR)/lib -# SNOPT_LIBS = $(SNOPTDIR)/lib/libsnopt_cpp.a $(SNOPTDIR)/lib/libsnopt_c.a $(SNOPTDIR)/lib/libsnprint_c.a $(SNOPTDIR)/lib/libblas.a $(SNOPTDIR)/lib/libf2c.a -SNOPT_LIBS = -SPARSE_LIBS = $(LUSOL)/liblusol.a $(CXSPARSE)/Lib/libcxsparse.a -ldl -# IPOPT_LIBS = $(IPOPTLIBDIR)/libipopt.a $(IPOPTLIBDIR)/libcoinhsl.a $(IPOPTLIBDIR)/ThirdParty/libcoinmumps.a $(IPOPTLIBDIR)/ThirdParty/libcoinmetis.a -lpthread -lgfortran -lblas -llapack -latlas -lf77blas -IPOPT_LIBS = `PKG_CONFIG_PATH=$(prefix)/lib64/pkgconfig:$(prefix)/lib/pkgconfig:$(prefix)/share/pkgconfig: /usr/bin/pkg-config --libs ipopt` -# ADOLC_LIBS = /usr/lib/libadolc.a /usr/lib/libColPack.a -# ADOLC_LIBS = /usr/lib/libadolc.a -lColPack -Wl,-rpath=/usr/lib/x86_64-linux-gnu/ -# ADOLC_LIBS = -ladolc -lColPack -Wl,-rpath=/usr/lib/x86_64-linux-gnu/ -ADOLC_LIBS = -ladolc /usr/lib/libColPack.a -Wl,-rpath=/usr/lib/x86_64-linux-gnu/ -PSOPT_LIBS = $(PSOPTDIR)/lib/libpsopt.a -DMATRIX_LIBS = $(DMATRIXDIR)/lib/libdmatrix.a - -# LDFLAGS = -Wl,--rpath -Wl,$(USERHOME)/Ipopt-3.9.3/lib/coin -L$(IPOPTLIBDIR) -lm -ldl -lgcc_s -LDFLAGS = -Wl,--rpath -Wl,${prefix}/lib - -CXX = /usr/bin/g++ -CC = /usr/bin/gcc -CXXFLAGS = -O0 -g -I$(USERHOME)/adolc_base/include -I$(SNOPTDIR)/cppsrc -I$(DMATRIXDIR)/include -I$(SNOPTDIR)/cppexamples -I$(PSOPTSRCDIR) -DLAPACK -DUNIX -DSPARSE_MATRIX -DUSE_IPOPT -I$(CXSPARSE)/Include -I$(CXSPARSE)/../SuiteSparse_config -I$(LUSOL) $(IPOPTINCDIR) -fomit-frame-pointer -pipe -DNDEBUG -pedantic-errors -Wimplicit -Wparentheses -Wreturn-type -Wcast-qual -Wall -Wpointer-arith -Wwrite-strings -Wconversion -fPIC -DHAVE_MALLOC -std=c++11 - -CFLAGS = -O0 -fPIC - -# The C++ interface calls some fortran object files, so it is necessary to -# add the Fortran libraries -# -# WARNING: The g95 libraries used here are machine dependent -# -# libg2c and libm are added to satisfy f2c references - -# FLIBS = /usr/lib/libf2c.a -lblas -llapack -lm -FLIBS = -lm -lf2c -llapack -lf77blas -lcblas -#FLIBS = ../dmatrix/lib/lapack_LINUX.a ../dmatrix/lib/blas_LINUX.a ../dmatrix/lib/F2CLIBS/libf2c_LINUX.a -lm - -ALL_LIBRARIES = $(ADOLC_LIBS) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(FLIBS) $(SPARSE_LIBS) $(IPOPT_LIBS) - - - -clean: - rm -f *.o - -$(EXAMPLESDIR)/%.o : $(EXAMPLESDIR)/%.cxx - $(CXX) -c $(CXXFLAGS) $< -o $@ - - - diff --git a/examples/alpine/CMakeLists.txt b/examples/alpine/CMakeLists.txt new file mode 100644 index 00000000..da33a921 --- /dev/null +++ b/examples/alpine/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(alpine LANGUAGES CXX) + +add_executable(${PROJECT_NAME} alpine.cxx) +target_link_libraries(${PROJECT_NAME} PUBLIC PSOPT ) diff --git a/examples/bioreactor/CMakeLists.txt b/examples/bioreactor/CMakeLists.txt new file mode 100644 index 00000000..fd140933 --- /dev/null +++ b/examples/bioreactor/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(bioreactor LANGUAGES CXX) + +add_executable(${PROJECT_NAME} bioreactor.cxx) +target_link_libraries(bioreactor PUBLIC PSOPT ) diff --git a/examples/brac1/CMakeLists.txt b/examples/brac1/CMakeLists.txt new file mode 100644 index 00000000..b2fd330f --- /dev/null +++ b/examples/brac1/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(brac1 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} brac1.cxx) +target_link_libraries(brac1 PUBLIC PSOPT ) diff --git a/examples/breakwell/CMakeLists.txt b/examples/breakwell/CMakeLists.txt new file mode 100644 index 00000000..e55815f3 --- /dev/null +++ b/examples/breakwell/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(breakwell LANGUAGES CXX) + +add_executable(${PROJECT_NAME} breakwell.cxx) +target_link_libraries(breakwell PUBLIC PSOPT ) diff --git a/examples/bryden/CMakeLists.txt b/examples/bryden/CMakeLists.txt new file mode 100644 index 00000000..85a5c637 --- /dev/null +++ b/examples/bryden/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(bryden LANGUAGES CXX) + +add_executable(${PROJECT_NAME} bryson_denham.cxx) +target_link_libraries(bryden PUBLIC PSOPT ) diff --git a/examples/brymr/CMakeLists.txt b/examples/brymr/CMakeLists.txt new file mode 100644 index 00000000..d0c2b01d --- /dev/null +++ b/examples/brymr/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(brymr LANGUAGES CXX) + +add_executable(${PROJECT_NAME} bryson_max_range.cxx) +target_link_libraries(brymr PUBLIC PSOPT ) diff --git a/examples/catmix/CMakeLists.txt b/examples/catmix/CMakeLists.txt new file mode 100644 index 00000000..de5d52cf --- /dev/null +++ b/examples/catmix/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(catmix LANGUAGES CXX) + +add_executable(${PROJECT_NAME} catmix.cxx) +target_link_libraries(catmix PUBLIC PSOPT ) diff --git a/examples/chain/CMakeLists.txt b/examples/chain/CMakeLists.txt new file mode 100644 index 00000000..435ab7cd --- /dev/null +++ b/examples/chain/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(chain LANGUAGES CXX) + +add_executable(${PROJECT_NAME} chain.cxx) +target_link_libraries(chain PUBLIC PSOPT ) diff --git a/examples/climb/CMakeLists.txt b/examples/climb/CMakeLists.txt new file mode 100644 index 00000000..7f26e6ef --- /dev/null +++ b/examples/climb/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(climb LANGUAGES CXX) + +add_executable(${PROJECT_NAME} climb.cxx) +target_link_libraries(climb PUBLIC PSOPT ) diff --git a/examples/coulomb/CMakeLists.txt b/examples/coulomb/CMakeLists.txt new file mode 100644 index 00000000..86352e87 --- /dev/null +++ b/examples/coulomb/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(coulomb LANGUAGES CXX) + +add_executable(${PROJECT_NAME} coulomb.cxx) +target_link_libraries(coulomb PUBLIC PSOPT ) diff --git a/examples/cracking/CMakeLists.txt b/examples/cracking/CMakeLists.txt new file mode 100644 index 00000000..98a03297 --- /dev/null +++ b/examples/cracking/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(cracking LANGUAGES CXX) + +add_executable(${PROJECT_NAME} cracking.cxx) +target_link_libraries(cracking PUBLIC PSOPT ) diff --git a/examples/crane/CMakeLists.txt b/examples/crane/CMakeLists.txt new file mode 100644 index 00000000..02ac4f38 --- /dev/null +++ b/examples/crane/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(crane LANGUAGES CXX) + +add_executable(${PROJECT_NAME} crane.cxx) +target_link_libraries(crane PUBLIC PSOPT ) diff --git a/examples/dae_i3/CMakeLists.txt b/examples/dae_i3/CMakeLists.txt new file mode 100644 index 00000000..703bee84 --- /dev/null +++ b/examples/dae_i3/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(dae_i3 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} dae_i3.cxx) +target_link_libraries(dae_i3 PUBLIC PSOPT ) diff --git a/examples/delay1/CMakeLists.txt b/examples/delay1/CMakeLists.txt new file mode 100644 index 00000000..c2d6f8a3 --- /dev/null +++ b/examples/delay1/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(delay1 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} delay1.cxx) +target_link_libraries(delay1 PUBLIC PSOPT ) diff --git a/examples/genCMake.sh b/examples/genCMake.sh deleted file mode 100644 index 8674a410..00000000 --- a/examples/genCMake.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -set -uxe -function create_cmake() { - local f="CMakeLists-generator.txt" - for d in $(ls -d */ | tr -d '/'); do - cat "$f" | sed -e "s/__MYDIR__/$d/g" > "$d/CMakeList.txt" - done -} -create_cmake diff --git a/examples/glider/CMakeLists.txt b/examples/glider/CMakeLists.txt new file mode 100644 index 00000000..f44edf89 --- /dev/null +++ b/examples/glider/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(glider LANGUAGES CXX) + +add_executable(${PROJECT_NAME} glider.cxx) +target_link_libraries(glider PUBLIC PSOPT ) diff --git a/examples/goddard/CMakeLists.txt b/examples/goddard/CMakeLists.txt new file mode 100644 index 00000000..e94893c9 --- /dev/null +++ b/examples/goddard/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(goddard LANGUAGES CXX) + +add_executable(${PROJECT_NAME} goddard.cxx) +target_link_libraries(goddard PUBLIC PSOPT ) diff --git a/examples/heat/CMakeLists.txt b/examples/heat/CMakeLists.txt new file mode 100644 index 00000000..6f4de1c2 --- /dev/null +++ b/examples/heat/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(heat LANGUAGES CXX) + +add_executable(${PROJECT_NAME} heat.cxx) +target_link_libraries(heat PUBLIC PSOPT ) diff --git a/examples/hyper/CMakeLists.txt b/examples/hyper/CMakeLists.txt new file mode 100644 index 00000000..25ba428a --- /dev/null +++ b/examples/hyper/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(hyper LANGUAGES CXX) + +add_executable(${PROJECT_NAME} hypersensitive.cxx) +target_link_libraries(hyper PUBLIC PSOPT ) diff --git a/examples/ipc/CMakeLists.txt b/examples/ipc/CMakeLists.txt new file mode 100644 index 00000000..e5780c7b --- /dev/null +++ b/examples/ipc/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(ipc LANGUAGES CXX) + +add_executable(${PROJECT_NAME} interior_point.cxx) +target_link_libraries(ipc PUBLIC PSOPT ) diff --git a/examples/isop/CMakeLists.txt b/examples/isop/CMakeLists.txt new file mode 100644 index 00000000..cfc7c83c --- /dev/null +++ b/examples/isop/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(isop LANGUAGES CXX) + +add_executable(${PROJECT_NAME} isoperimetric.cxx) +target_link_libraries(isop PUBLIC PSOPT ) diff --git a/examples/lambert/CMakeLists.txt b/examples/lambert/CMakeLists.txt new file mode 100644 index 00000000..45e634be --- /dev/null +++ b/examples/lambert/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(lambert LANGUAGES CXX) + +add_executable(${PROJECT_NAME} lambert.cxx) +target_link_libraries(lambert PUBLIC PSOPT ) diff --git a/examples/launch/CMakeLists.txt b/examples/launch/CMakeLists.txt new file mode 100644 index 00000000..ecfbccb0 --- /dev/null +++ b/examples/launch/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(launch LANGUAGES CXX) + +add_executable(${PROJECT_NAME} launch.cxx) +target_link_libraries(launch PUBLIC PSOPT ) diff --git a/examples/lowthr/CMakeLists.txt b/examples/lowthr/CMakeLists.txt new file mode 100644 index 00000000..f3bf62b8 --- /dev/null +++ b/examples/lowthr/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(lowthr LANGUAGES CXX) + +add_executable(${PROJECT_NAME} low_thrust.cxx) +target_link_libraries(lowthr PUBLIC PSOPT ) diff --git a/examples/lts/CMakeLists.txt b/examples/lts/CMakeLists.txt new file mode 100644 index 00000000..2432f7a6 --- /dev/null +++ b/examples/lts/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(lts LANGUAGES CXX) + +add_executable(${PROJECT_NAME} lts.cxx) +target_link_libraries(lts PUBLIC PSOPT ) diff --git a/examples/manutec/CMakeLists.txt b/examples/manutec/CMakeLists.txt new file mode 100644 index 00000000..c65993e5 --- /dev/null +++ b/examples/manutec/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(manutec LANGUAGES CXX) + +add_executable(${PROJECT_NAME} manutec.cxx) +target_link_libraries(manutec PUBLIC PSOPT ) diff --git a/examples/missile/CMakeLists.txt b/examples/missile/CMakeLists.txt new file mode 100644 index 00000000..79fee2c7 --- /dev/null +++ b/examples/missile/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(missile LANGUAGES CXX) + +add_executable(${PROJECT_NAME} missile.cxx) +target_link_libraries(missile PUBLIC PSOPT ) diff --git a/examples/moon/CMakeLists.txt b/examples/moon/CMakeLists.txt new file mode 100644 index 00000000..89838927 --- /dev/null +++ b/examples/moon/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(moon LANGUAGES CXX) + +add_executable(${PROJECT_NAME} moon.cxx) +target_link_libraries(moon PUBLIC PSOPT ) diff --git a/examples/mpec/CMakeLists.txt b/examples/mpec/CMakeLists.txt new file mode 100644 index 00000000..9f71cc7a --- /dev/null +++ b/examples/mpec/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(mpec LANGUAGES CXX) + +add_executable(${PROJECT_NAME} mpec.cxx) +target_link_libraries(mpec PUBLIC PSOPT ) diff --git a/examples/notorious/CMakeLists.txt b/examples/notorious/CMakeLists.txt new file mode 100644 index 00000000..773fec07 --- /dev/null +++ b/examples/notorious/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(notorious LANGUAGES CXX) + +add_executable(${PROJECT_NAME} notorious.cxx) +target_link_libraries(notorious PUBLIC PSOPT ) diff --git a/examples/obstacle/CMakeLists.txt b/examples/obstacle/CMakeLists.txt new file mode 100644 index 00000000..82b69bb3 --- /dev/null +++ b/examples/obstacle/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(obstacle LANGUAGES CXX) + +add_executable(${PROJECT_NAME} obstacle.cxx) +target_link_libraries(obstacle PUBLIC PSOPT ) diff --git a/examples/param2/CMakeLists.txt b/examples/param2/CMakeLists.txt new file mode 100644 index 00000000..52a0e1d0 --- /dev/null +++ b/examples/param2/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(param2 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} param2.cxx) +target_link_libraries(param2 PUBLIC PSOPT ) diff --git a/examples/predator/CMakeLists.txt b/examples/predator/CMakeLists.txt new file mode 100644 index 00000000..cd55cd54 --- /dev/null +++ b/examples/predator/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(predator LANGUAGES CXX) + +add_executable(${PROJECT_NAME} predator.cxx) +target_link_libraries(predator PUBLIC PSOPT ) diff --git a/examples/rayleigh/CMakeLists.txt b/examples/rayleigh/CMakeLists.txt new file mode 100644 index 00000000..e21cbf39 --- /dev/null +++ b/examples/rayleigh/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(rayleigh LANGUAGES CXX) + +add_executable(${PROJECT_NAME} rayleigh.cxx) +target_link_libraries(rayleigh PUBLIC PSOPT ) diff --git a/examples/reorientation/CMakeLists.txt b/examples/reorientation/CMakeLists.txt new file mode 100644 index 00000000..a319f319 --- /dev/null +++ b/examples/reorientation/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(reorientation LANGUAGES CXX) + +add_executable(${PROJECT_NAME} reorientation.cxx) +target_link_libraries(reorientation PUBLIC PSOPT ) diff --git a/examples/shutt/CMakeLists.txt b/examples/shutt/CMakeLists.txt new file mode 100644 index 00000000..adc40f64 --- /dev/null +++ b/examples/shutt/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(shutt LANGUAGES CXX) + +add_executable(${PROJECT_NAME} shuttle_reentry1.cxx) +target_link_libraries(shutt PUBLIC PSOPT ) diff --git a/examples/sing5/CMakeLists.txt b/examples/sing5/CMakeLists.txt new file mode 100644 index 00000000..d461e8de --- /dev/null +++ b/examples/sing5/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(sing5 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} singular5.cxx) +target_link_libraries(sing5 PUBLIC PSOPT ) diff --git a/examples/stc1/CMakeLists.txt b/examples/stc1/CMakeLists.txt new file mode 100644 index 00000000..92135031 --- /dev/null +++ b/examples/stc1/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(stc1 LANGUAGES CXX) + +add_executable(${PROJECT_NAME} stc1.cxx) +target_link_libraries(stc1 PUBLIC PSOPT ) diff --git a/examples/steps/CMakeLists.txt b/examples/steps/CMakeLists.txt new file mode 100644 index 00000000..c6aa5cb9 --- /dev/null +++ b/examples/steps/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(steps LANGUAGES CXX) + +add_executable(${PROJECT_NAME} steps.cxx) +target_link_libraries(steps PUBLIC PSOPT ) diff --git a/examples/twoburn/CMakeLists.txt b/examples/twoburn/CMakeLists.txt new file mode 100644 index 00000000..bd6dc9e6 --- /dev/null +++ b/examples/twoburn/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(twoburn LANGUAGES CXX) + +add_executable(${PROJECT_NAME} twoburn.cxx) +target_link_libraries(twoburn PUBLIC PSOPT ) diff --git a/examples/twolink/CMakeLists.txt b/examples/twolink/CMakeLists.txt new file mode 100644 index 00000000..0e4d9369 --- /dev/null +++ b/examples/twolink/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(twolink LANGUAGES CXX) + +add_executable(${PROJECT_NAME} twolinkarm.cxx) +target_link_libraries(twolink PUBLIC PSOPT ) diff --git a/examples/twophro/CMakeLists.txt b/examples/twophro/CMakeLists.txt new file mode 100644 index 00000000..6d076a11 --- /dev/null +++ b/examples/twophro/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(twophro LANGUAGES CXX) + +add_executable(${PROJECT_NAME} twophase_robot.cxx) +target_link_libraries(twophro PUBLIC PSOPT ) diff --git a/examples/twophsc/CMakeLists.txt b/examples/twophsc/CMakeLists.txt new file mode 100644 index 00000000..75074aaa --- /dev/null +++ b/examples/twophsc/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(twophsc LANGUAGES CXX) + +add_executable(${PROJECT_NAME} twophase_schwartz.cxx) +target_link_libraries(twophsc PUBLIC PSOPT ) diff --git a/examples/user/CMakeLists.txt b/examples/user/CMakeLists.txt new file mode 100644 index 00000000..b6fd8a9c --- /dev/null +++ b/examples/user/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(user LANGUAGES CXX) + +add_executable(${PROJECT_NAME} user.cxx) +target_link_libraries(user PUBLIC PSOPT) diff --git a/examples/zpm/CMakeLists.txt b/examples/zpm/CMakeLists.txt new file mode 100644 index 00000000..203eef85 --- /dev/null +++ b/examples/zpm/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.10) +project(zpm LANGUAGES CXX) + +add_executable(${PROJECT_NAME} zpm.cxx) +target_link_libraries(zpm PUBLIC PSOPT ) From 45f106abd4208adaa195d69854cfaf6bcf831416 Mon Sep 17 00:00:00 2001 From: Philipp Waxweiler Date: Fri, 24 Jul 2020 05:10:40 +0200 Subject: [PATCH 21/21] deleted invalid cmake files and Makefiles --- examples/CMakeFiles/CMakeList.txt | 5 ----- examples/alpine/CMakeList.txt | 5 ----- examples/alpine/Makefile | 11 ----------- examples/alpine/Makefile.vc | 20 -------------------- examples/bioreactor/CMakeList.txt | 5 ----- examples/bioreactor/Makefile | 11 ----------- examples/bioreactor/Makefile.vc | 20 -------------------- examples/brac1/CMakeList.txt | 5 ----- examples/brac1/Makefile | 11 ----------- examples/brac1/Makefile.vc | 21 --------------------- examples/breakwell/CMakeList.txt | 5 ----- examples/breakwell/Makefile | 11 ----------- examples/breakwell/Makefile.vc | 21 --------------------- examples/bryden/CMakeList.txt | 5 ----- examples/bryden/Makefile | 11 ----------- examples/bryden/Makefile.vc | 23 ----------------------- examples/brymr/CMakeList.txt | 5 ----- examples/brymr/Makefile | 11 ----------- examples/brymr/Makefile.vc | 21 --------------------- examples/catmix/CMakeList.txt | 5 ----- examples/catmix/Makefile | 11 ----------- examples/catmix/Makefile.vc | 21 --------------------- examples/chain/CMakeList.txt | 5 ----- examples/chain/Makefile | 10 ---------- examples/chain/Makefile.vc | 16 ---------------- examples/climb/CMakeList.txt | 5 ----- examples/climb/Makefile | 11 ----------- examples/climb/Makefile.vc | 21 --------------------- examples/coulomb/CMakeList.txt | 5 ----- examples/coulomb/Makefile | 11 ----------- examples/coulomb/Makefile.vc | 20 -------------------- examples/cracking/CMakeList.txt | 5 ----- examples/cracking/Makefile | 11 ----------- examples/cracking/Makefile.vc | 24 ------------------------ examples/crane/CMakeList.txt | 5 ----- examples/crane/Makefile | 11 ----------- examples/crane/Makefile.vc | 22 ---------------------- examples/dae_i3/CMakeList.txt | 5 ----- examples/dae_i3/Makefile | 11 ----------- examples/dae_i3/Makefile.vc | 24 ------------------------ examples/delay1/CMakeList.txt | 5 ----- examples/delay1/Makefile | 11 ----------- examples/delay1/Makefile.vc | 21 --------------------- examples/glider/CMakeList.txt | 5 ----- examples/glider/Makefile | 11 ----------- examples/glider/Makefile.vc | 20 -------------------- examples/goddard/CMakeList.txt | 5 ----- examples/goddard/Makefile | 11 ----------- examples/goddard/Makefile.vc | 24 ------------------------ examples/heat/CMakeList.txt | 5 ----- examples/heat/Makefile | 11 ----------- examples/heat/Makefile.vc | 21 --------------------- examples/hyper/CMakeList.txt | 5 ----- examples/hyper/Makefile | 11 ----------- examples/hyper/Makefile.vc | 22 ---------------------- examples/ipc/CMakeList.txt | 5 ----- examples/ipc/Makefile | 11 ----------- examples/ipc/Makefile.vc | 21 --------------------- examples/isop/CMakeList.txt | 5 ----- examples/isop/Makefile | 11 ----------- examples/isop/Makefile.vc | 23 ----------------------- examples/lambert/CMakeList.txt | 5 ----- examples/lambert/Makefile | 11 ----------- examples/lambert/Makefile.vc | 20 -------------------- examples/launch/CMakeList.txt | 5 ----- examples/launch/Makefile | 11 ----------- examples/launch/Makefile.vc | 20 -------------------- examples/lowthr/CMakeList.txt | 5 ----- examples/lowthr/Makefile | 11 ----------- examples/lowthr/Makefile.vc | 20 -------------------- examples/lts/CMakeList.txt | 5 ----- examples/lts/Makefile | 11 ----------- examples/lts/Makefile.vc | 24 ------------------------ examples/manutec/CMakeList.txt | 5 ----- examples/manutec/Makefile | 11 ----------- examples/manutec/Makefile.vc | 20 -------------------- examples/missile/CMakeList.txt | 5 ----- examples/missile/Makefile | 11 ----------- examples/missile/Makefile.vc | 17 ----------------- examples/moon/CMakeList.txt | 5 ----- examples/moon/Makefile | 11 ----------- examples/moon/Makefile.vc | 23 ----------------------- examples/mpec/CMakeList.txt | 5 ----- examples/mpec/Makefile | 11 ----------- examples/mpec/Makefile.vc | 21 --------------------- examples/notorious/CMakeList.txt | 5 ----- examples/notorious/Makefile | 11 ----------- examples/notorious/Makefile.vc | 24 ------------------------ examples/obstacle/CMakeList.txt | 5 ----- examples/obstacle/Makefile | 11 ----------- examples/obstacle/Makefile.vc | 22 ---------------------- examples/param2/CMakeList.txt | 5 ----- examples/predator/CMakeList.txt | 5 ----- examples/rayleigh/CMakeList.txt | 5 ----- examples/rayleigh/Makefile | 11 ----------- examples/rayleigh/Makefile.vc | 24 ------------------------ examples/reorientation/CMakeList.txt | 5 ----- examples/reorientation/Makefile | 11 ----------- examples/reorientation/Makefile.vc | 24 ------------------------ examples/shutt/CMakeList.txt | 5 ----- examples/shutt/Makefile | 11 ----------- examples/shutt/Makefile.vc | 22 ---------------------- examples/sing5/CMakeList.txt | 5 ----- examples/sing5/Makefile | 11 ----------- examples/sing5/Makefile.vc | 23 ----------------------- examples/stc1/CMakeList.txt | 5 ----- examples/stc1/Makefile | 11 ----------- examples/stc1/Makefile.vc | 24 ------------------------ examples/steps/CMakeList.txt | 5 ----- examples/steps/Makefile | 11 ----------- examples/steps/Makefile.vc | 21 --------------------- examples/twoburn/CMakeList.txt | 5 ----- examples/twoburn/Makefile | 11 ----------- examples/twoburn/Makefile.vc | 20 -------------------- examples/twolink/CMakeList.txt | 5 ----- examples/twolink/Makefile | 11 ----------- examples/twolink/Makefile.vc | 22 ---------------------- examples/twophro/CMakeList.txt | 5 ----- examples/twophro/Makefile | 11 ----------- examples/twophro/Makefile.vc | 21 --------------------- examples/twophsc/CMakeList.txt | 5 ----- examples/twophsc/Makefile | 11 ----------- examples/twophsc/Makefile.vc | 23 ----------------------- examples/user/CMakeList.txt | 5 ----- examples/user/Makefile | 11 ----------- examples/user/Makefile.vc | 24 ------------------------ examples/zpm/CMakeList.txt | 5 ----- examples/zpm/Makefile | 11 ----------- examples/zpm/Makefile.vc | 21 --------------------- 129 files changed, 1592 deletions(-) delete mode 100644 examples/CMakeFiles/CMakeList.txt delete mode 100644 examples/alpine/CMakeList.txt delete mode 100644 examples/alpine/Makefile delete mode 100644 examples/alpine/Makefile.vc delete mode 100644 examples/bioreactor/CMakeList.txt delete mode 100644 examples/bioreactor/Makefile delete mode 100644 examples/bioreactor/Makefile.vc delete mode 100644 examples/brac1/CMakeList.txt delete mode 100644 examples/brac1/Makefile delete mode 100644 examples/brac1/Makefile.vc delete mode 100644 examples/breakwell/CMakeList.txt delete mode 100644 examples/breakwell/Makefile delete mode 100644 examples/breakwell/Makefile.vc delete mode 100644 examples/bryden/CMakeList.txt delete mode 100644 examples/bryden/Makefile delete mode 100644 examples/bryden/Makefile.vc delete mode 100644 examples/brymr/CMakeList.txt delete mode 100644 examples/brymr/Makefile delete mode 100644 examples/brymr/Makefile.vc delete mode 100644 examples/catmix/CMakeList.txt delete mode 100644 examples/catmix/Makefile delete mode 100644 examples/catmix/Makefile.vc delete mode 100644 examples/chain/CMakeList.txt delete mode 100644 examples/chain/Makefile delete mode 100644 examples/chain/Makefile.vc delete mode 100644 examples/climb/CMakeList.txt delete mode 100644 examples/climb/Makefile delete mode 100644 examples/climb/Makefile.vc delete mode 100644 examples/coulomb/CMakeList.txt delete mode 100644 examples/coulomb/Makefile delete mode 100644 examples/coulomb/Makefile.vc delete mode 100644 examples/cracking/CMakeList.txt delete mode 100644 examples/cracking/Makefile delete mode 100644 examples/cracking/Makefile.vc delete mode 100644 examples/crane/CMakeList.txt delete mode 100644 examples/crane/Makefile delete mode 100644 examples/crane/Makefile.vc delete mode 100644 examples/dae_i3/CMakeList.txt delete mode 100644 examples/dae_i3/Makefile delete mode 100644 examples/dae_i3/Makefile.vc delete mode 100644 examples/delay1/CMakeList.txt delete mode 100644 examples/delay1/Makefile delete mode 100644 examples/delay1/Makefile.vc delete mode 100644 examples/glider/CMakeList.txt delete mode 100644 examples/glider/Makefile delete mode 100644 examples/glider/Makefile.vc delete mode 100644 examples/goddard/CMakeList.txt delete mode 100644 examples/goddard/Makefile delete mode 100644 examples/goddard/Makefile.vc delete mode 100644 examples/heat/CMakeList.txt delete mode 100644 examples/heat/Makefile delete mode 100644 examples/heat/Makefile.vc delete mode 100644 examples/hyper/CMakeList.txt delete mode 100644 examples/hyper/Makefile delete mode 100644 examples/hyper/Makefile.vc delete mode 100644 examples/ipc/CMakeList.txt delete mode 100644 examples/ipc/Makefile delete mode 100644 examples/ipc/Makefile.vc delete mode 100644 examples/isop/CMakeList.txt delete mode 100644 examples/isop/Makefile delete mode 100644 examples/isop/Makefile.vc delete mode 100644 examples/lambert/CMakeList.txt delete mode 100644 examples/lambert/Makefile delete mode 100644 examples/lambert/Makefile.vc delete mode 100644 examples/launch/CMakeList.txt delete mode 100644 examples/launch/Makefile delete mode 100644 examples/launch/Makefile.vc delete mode 100644 examples/lowthr/CMakeList.txt delete mode 100644 examples/lowthr/Makefile delete mode 100644 examples/lowthr/Makefile.vc delete mode 100644 examples/lts/CMakeList.txt delete mode 100644 examples/lts/Makefile delete mode 100644 examples/lts/Makefile.vc delete mode 100644 examples/manutec/CMakeList.txt delete mode 100644 examples/manutec/Makefile delete mode 100644 examples/manutec/Makefile.vc delete mode 100644 examples/missile/CMakeList.txt delete mode 100644 examples/missile/Makefile delete mode 100644 examples/missile/Makefile.vc delete mode 100644 examples/moon/CMakeList.txt delete mode 100644 examples/moon/Makefile delete mode 100644 examples/moon/Makefile.vc delete mode 100644 examples/mpec/CMakeList.txt delete mode 100644 examples/mpec/Makefile delete mode 100644 examples/mpec/Makefile.vc delete mode 100644 examples/notorious/CMakeList.txt delete mode 100644 examples/notorious/Makefile delete mode 100644 examples/notorious/Makefile.vc delete mode 100644 examples/obstacle/CMakeList.txt delete mode 100644 examples/obstacle/Makefile delete mode 100644 examples/obstacle/Makefile.vc delete mode 100644 examples/param2/CMakeList.txt delete mode 100644 examples/predator/CMakeList.txt delete mode 100644 examples/rayleigh/CMakeList.txt delete mode 100644 examples/rayleigh/Makefile delete mode 100644 examples/rayleigh/Makefile.vc delete mode 100644 examples/reorientation/CMakeList.txt delete mode 100755 examples/reorientation/Makefile delete mode 100644 examples/reorientation/Makefile.vc delete mode 100644 examples/shutt/CMakeList.txt delete mode 100644 examples/shutt/Makefile delete mode 100644 examples/shutt/Makefile.vc delete mode 100644 examples/sing5/CMakeList.txt delete mode 100644 examples/sing5/Makefile delete mode 100644 examples/sing5/Makefile.vc delete mode 100644 examples/stc1/CMakeList.txt delete mode 100644 examples/stc1/Makefile delete mode 100644 examples/stc1/Makefile.vc delete mode 100644 examples/steps/CMakeList.txt delete mode 100644 examples/steps/Makefile delete mode 100644 examples/steps/Makefile.vc delete mode 100644 examples/twoburn/CMakeList.txt delete mode 100644 examples/twoburn/Makefile delete mode 100644 examples/twoburn/Makefile.vc delete mode 100644 examples/twolink/CMakeList.txt delete mode 100644 examples/twolink/Makefile delete mode 100644 examples/twolink/Makefile.vc delete mode 100644 examples/twophro/CMakeList.txt delete mode 100644 examples/twophro/Makefile delete mode 100644 examples/twophro/Makefile.vc delete mode 100644 examples/twophsc/CMakeList.txt delete mode 100644 examples/twophsc/Makefile delete mode 100644 examples/twophsc/Makefile.vc delete mode 100644 examples/user/CMakeList.txt delete mode 100755 examples/user/Makefile delete mode 100644 examples/user/Makefile.vc delete mode 100644 examples/zpm/CMakeList.txt delete mode 100755 examples/zpm/Makefile delete mode 100644 examples/zpm/Makefile.vc diff --git a/examples/CMakeFiles/CMakeList.txt b/examples/CMakeFiles/CMakeList.txt deleted file mode 100644 index ddb5bdc2..00000000 --- a/examples/CMakeFiles/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(CMakeFiles LANGUAGES CXX) - -add_executable(${PROJECT_NAME} CMakeFiles.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/alpine/CMakeList.txt b/examples/alpine/CMakeList.txt deleted file mode 100644 index 196e611a..00000000 --- a/examples/alpine/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(alpine LANGUAGES CXX) - -add_executable(${PROJECT_NAME} alpine.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/alpine/Makefile b/examples/alpine/Makefile deleted file mode 100644 index 834ade88..00000000 --- a/examples/alpine/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -ALPINE = alpine $(SNOPT_WRAPPER) - -ALPINE_O = $(ALPINE:%=$(EXAMPLESDIR)/%.o) - - -alpine: $(ALPINE_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/alpine/Makefile.vc b/examples/alpine/Makefile.vc deleted file mode 100644 index 3ec987ce..00000000 --- a/examples/alpine/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ -include ..\Makefile.inc - -all: alpine.exe - - -SRC = alpine.cxx \ - $(SNFW_SRC) - -OBJ = alpine.obj \ - $(SNFW_OBJ) - - - -alpine.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:alpine.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/bioreactor/CMakeList.txt b/examples/bioreactor/CMakeList.txt deleted file mode 100644 index daefbb1d..00000000 --- a/examples/bioreactor/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(bioreactor LANGUAGES CXX) - -add_executable(${PROJECT_NAME} bioreactor.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/bioreactor/Makefile b/examples/bioreactor/Makefile deleted file mode 100644 index 21bc336e..00000000 --- a/examples/bioreactor/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -BIOREACTOR = bioreactor $(SNOPT_WRAPPER) - -BIOREACTOR_O = $(BIOREACTOR:%=$(EXAMPLESDIR)/%.o) - - -bioreactor: $(BIOREACTOR_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/bioreactor/Makefile.vc b/examples/bioreactor/Makefile.vc deleted file mode 100644 index c9896138..00000000 --- a/examples/bioreactor/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ -include ..\Makefile.inc - -all: bioreactor.exe - - -SRC = bioreactor.cxx \ - $(SNFW_SRC) - -OBJ = bioreactor.obj \ - $(SNFW_OBJ) - - - -bioreactor.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:bioreactor.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/brac1/CMakeList.txt b/examples/brac1/CMakeList.txt deleted file mode 100644 index 0788df50..00000000 --- a/examples/brac1/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(brac1 LANGUAGES CXX) - -add_executable(${PROJECT_NAME} brac1.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/brac1/Makefile b/examples/brac1/Makefile deleted file mode 100644 index 034a722d..00000000 --- a/examples/brac1/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -BRAC1 = brac1 $(SNOPT_WRAPPER) - -BRAC1_O = $(BRAC1:%=$(EXAMPLESDIR)/%.o) - - -brac1: $(BRAC1_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/brac1/Makefile.vc b/examples/brac1/Makefile.vc deleted file mode 100644 index 0596de2f..00000000 --- a/examples/brac1/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: brac1.exe - - -SRC = brac1.cxx \ - $(SNFW_SRC) - -OBJ = brac1.obj \ - $(SNFW_OBJ) - - -brac1.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:brac1.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - - diff --git a/examples/breakwell/CMakeList.txt b/examples/breakwell/CMakeList.txt deleted file mode 100644 index 0c7d5d0f..00000000 --- a/examples/breakwell/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(breakwell LANGUAGES CXX) - -add_executable(${PROJECT_NAME} breakwell.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/breakwell/Makefile b/examples/breakwell/Makefile deleted file mode 100644 index 5859d24a..00000000 --- a/examples/breakwell/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -BREAKWELL = breakwell $(SNOPT_WRAPPER) - -BREAKWELL_O = $(BREAKWELL:%=$(EXAMPLESDIR)/%.o) - - -breakwell: $(BREAKWELL_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/breakwell/Makefile.vc b/examples/breakwell/Makefile.vc deleted file mode 100644 index 4429ac3e..00000000 --- a/examples/breakwell/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: brymr.exe - - -SRC = bryson_max_range.cxx \ - $(SNFW_SRC) - -OBJ = bryson_max_range.obj \ - $(SNFW_OBJ) - - - -brymr.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:brymr.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/bryden/CMakeList.txt b/examples/bryden/CMakeList.txt deleted file mode 100644 index 8fc914b5..00000000 --- a/examples/bryden/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(bryden LANGUAGES CXX) - -add_executable(${PROJECT_NAME} bryden.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/bryden/Makefile b/examples/bryden/Makefile deleted file mode 100644 index 8352141e..00000000 --- a/examples/bryden/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -BRYDEN = bryson_denham $(SNOPT_WRAPPER) - -BRYDEN_O = $(BRYDEN:%=$(EXAMPLESDIR)/%.o) - - -bryden: $(BRYDEN_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/bryden/Makefile.vc b/examples/bryden/Makefile.vc deleted file mode 100644 index e43d36c6..00000000 --- a/examples/bryden/Makefile.vc +++ /dev/null @@ -1,23 +0,0 @@ -include ..\Makefile.inc - -all: bryden.exe - - -SRC = bryson_denham.cxx \ - $(SNFW_SRC) - -OBJ = bryson_denham.obj \ - $(SNFW_OBJ) - - - - - -bryden.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:bryden.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/brymr/CMakeList.txt b/examples/brymr/CMakeList.txt deleted file mode 100644 index 23dbe126..00000000 --- a/examples/brymr/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(brymr LANGUAGES CXX) - -add_executable(${PROJECT_NAME} brymr.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/brymr/Makefile b/examples/brymr/Makefile deleted file mode 100644 index 473363c2..00000000 --- a/examples/brymr/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -BRYMR = bryson_max_range $(SNOPT_WRAPPER) - -BRYMR_O = $(BRYMR:%=$(EXAMPLESDIR)/%.o) - - -brymr: $(BRYMR_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/brymr/Makefile.vc b/examples/brymr/Makefile.vc deleted file mode 100644 index 4429ac3e..00000000 --- a/examples/brymr/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: brymr.exe - - -SRC = bryson_max_range.cxx \ - $(SNFW_SRC) - -OBJ = bryson_max_range.obj \ - $(SNFW_OBJ) - - - -brymr.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:brymr.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/catmix/CMakeList.txt b/examples/catmix/CMakeList.txt deleted file mode 100644 index 27944dcf..00000000 --- a/examples/catmix/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(catmix LANGUAGES CXX) - -add_executable(${PROJECT_NAME} catmix.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/catmix/Makefile b/examples/catmix/Makefile deleted file mode 100644 index da87db64..00000000 --- a/examples/catmix/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -CATMIX = catmix $(SNOPT_WRAPPER) - -CATMIX_O = $(CATMIX:%=$(EXAMPLESDIR)/%.o) - - -catmix: $(CATMIX_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/catmix/Makefile.vc b/examples/catmix/Makefile.vc deleted file mode 100644 index 43ddcbec..00000000 --- a/examples/catmix/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: catmix.exe - - -SRC = catmix.cxx \ - $(SNFW_SRC) - -OBJ = catmix.obj \ - $(SNFW_OBJ) - - - -catmix.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:catmix.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/chain/CMakeList.txt b/examples/chain/CMakeList.txt deleted file mode 100644 index 24517d7b..00000000 --- a/examples/chain/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(chain LANGUAGES CXX) - -add_executable(${PROJECT_NAME} chain.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/chain/Makefile b/examples/chain/Makefile deleted file mode 100644 index a5b942bb..00000000 --- a/examples/chain/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -include ../Makefile_linux.inc - -CHAIN = chain $(SNOPT_WRAPPER) - -CHAIN_O = $(CHAIN:%=$(EXAMPLESDIR)/%.o) - - -chain: $(CHAIN_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o diff --git a/examples/chain/Makefile.vc b/examples/chain/Makefile.vc deleted file mode 100644 index bc262795..00000000 --- a/examples/chain/Makefile.vc +++ /dev/null @@ -1,16 +0,0 @@ -include ..\Makefile.inc - -all: chain.exe - - -SRC = chain.cxx \ - $(SNFW_SRC) - -OBJ = chain.obj \ - $(SNFW_OBJ) - - - -chain.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:chain.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - diff --git a/examples/climb/CMakeList.txt b/examples/climb/CMakeList.txt deleted file mode 100644 index a803b1df..00000000 --- a/examples/climb/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(climb LANGUAGES CXX) - -add_executable(${PROJECT_NAME} climb.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/climb/Makefile b/examples/climb/Makefile deleted file mode 100644 index aca9f7b8..00000000 --- a/examples/climb/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -CLIMB = climb $(SNOPT_WRAPPER) - -CLIMB_O = $(CLIMB:%=$(EXAMPLESDIR)/%.o) - - -climb: $(CLIMB_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/climb/Makefile.vc b/examples/climb/Makefile.vc deleted file mode 100644 index 964b6221..00000000 --- a/examples/climb/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: climb.exe - - -SRC = climb.cxx \ - $(SNFW_SRC) - -OBJ = climb.obj \ - $(SNFW_OBJ) - - - -climb.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:climb.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/coulomb/CMakeList.txt b/examples/coulomb/CMakeList.txt deleted file mode 100644 index 049a8305..00000000 --- a/examples/coulomb/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(coulomb LANGUAGES CXX) - -add_executable(${PROJECT_NAME} coulomb.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/coulomb/Makefile b/examples/coulomb/Makefile deleted file mode 100644 index 0b00d19c..00000000 --- a/examples/coulomb/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -COULOMB = coulomb $(SNOPT_WRAPPER) - -COULOMB_O = $(COULOMB:%=$(EXAMPLESDIR)/%.o) - - -coulomb: $(COULOMB_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/coulomb/Makefile.vc b/examples/coulomb/Makefile.vc deleted file mode 100644 index ba019d1d..00000000 --- a/examples/coulomb/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ -include ..\Makefile.inc - -all: coulomb.exe - - -SRC = coulomb.cxx \ - $(SNFW_SRC) - -OBJ = coulomb.obj \ - $(SNFW_OBJ) - - - - -coulomb.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:coulomb.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - diff --git a/examples/cracking/CMakeList.txt b/examples/cracking/CMakeList.txt deleted file mode 100644 index 7f8a7d57..00000000 --- a/examples/cracking/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(cracking LANGUAGES CXX) - -add_executable(${PROJECT_NAME} cracking.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/cracking/Makefile b/examples/cracking/Makefile deleted file mode 100644 index e296e769..00000000 --- a/examples/cracking/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -CRACKING = cracking $(SNOPT_WRAPPER) - -CRACKING_O = $(CRACKING:%=$(EXAMPLESDIR)/%.o) - - -cracking: $(CRACKING_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/cracking/Makefile.vc b/examples/cracking/Makefile.vc deleted file mode 100644 index 06e72161..00000000 --- a/examples/cracking/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: cracking.exe - - -SRC = cracking.cxx \ - $(SNFW_SRC) - -OBJ = cracking.obj \ - $(SNFW_OBJ) - - - - - - -cracking.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:cracking.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/crane/CMakeList.txt b/examples/crane/CMakeList.txt deleted file mode 100644 index 618b3875..00000000 --- a/examples/crane/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(crane LANGUAGES CXX) - -add_executable(${PROJECT_NAME} crane.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/crane/Makefile b/examples/crane/Makefile deleted file mode 100644 index c189aa39..00000000 --- a/examples/crane/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -CRANE = crane $(SNOPT_WRAPPER) - -CRANE_O = $(CRANE:%=$(EXAMPLESDIR)/%.o) - - -crane: $(CRANE_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/crane/Makefile.vc b/examples/crane/Makefile.vc deleted file mode 100644 index f1e0893b..00000000 --- a/examples/crane/Makefile.vc +++ /dev/null @@ -1,22 +0,0 @@ -include ..\Makefile.inc - -all: crane.exe - - -SRC = crane.cxx \ - $(SNFW_SRC) - -OBJ = crane.obj \ - $(SNFW_OBJ) - - - - -crane.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:crane.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/dae_i3/CMakeList.txt b/examples/dae_i3/CMakeList.txt deleted file mode 100644 index b62e90ba..00000000 --- a/examples/dae_i3/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(dae_i3 LANGUAGES CXX) - -add_executable(${PROJECT_NAME} dae_i3.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/dae_i3/Makefile b/examples/dae_i3/Makefile deleted file mode 100644 index e125bf4b..00000000 --- a/examples/dae_i3/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -DAE_I3 = dae_i3 $(SNOPT_WRAPPER) - -DAE_I3_O = $(DAE_I3:%=$(EXAMPLESDIR)/%.o) - - -dae_i3: $(DAE_I3_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/dae_i3/Makefile.vc b/examples/dae_i3/Makefile.vc deleted file mode 100644 index a33c2ce2..00000000 --- a/examples/dae_i3/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: dae_i3.exe - - -SRC = dae_i3.cxx \ - $(SNFW_SRC) - -OBJ = dae_i3.obj \ - $(SNFW_OBJ) - - - - - - -dae_i3.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:dae_i3.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/delay1/CMakeList.txt b/examples/delay1/CMakeList.txt deleted file mode 100644 index 3c66e126..00000000 --- a/examples/delay1/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(delay1 LANGUAGES CXX) - -add_executable(${PROJECT_NAME} delay1.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/delay1/Makefile b/examples/delay1/Makefile deleted file mode 100644 index c661968a..00000000 --- a/examples/delay1/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -DELAY1 = delay1 $(SNOPT_WRAPPER) - -DELAY1_O = $(DELAY1:%=$(EXAMPLESDIR)/%.o) - - -delay1: $(DELAY1_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/delay1/Makefile.vc b/examples/delay1/Makefile.vc deleted file mode 100644 index 09512517..00000000 --- a/examples/delay1/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: delay1.exe - - -SRC = delay1.cxx \ - $(SNFW_SRC) - -OBJ = delay1.obj \ - $(SNFW_OBJ) - - - -delay1.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:delay1.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/glider/CMakeList.txt b/examples/glider/CMakeList.txt deleted file mode 100644 index 72676351..00000000 --- a/examples/glider/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(glider LANGUAGES CXX) - -add_executable(${PROJECT_NAME} glider.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/glider/Makefile b/examples/glider/Makefile deleted file mode 100644 index 97e34d90..00000000 --- a/examples/glider/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -GLIDER = glider $(SNOPT_WRAPPER) - -GLIDER_O = $(GLIDER:%=$(EXAMPLESDIR)/%.o) - - -glider: $(GLIDER_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/glider/Makefile.vc b/examples/glider/Makefile.vc deleted file mode 100644 index 1b641740..00000000 --- a/examples/glider/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ -include ..\Makefile.inc - -all: glider.exe - - -SRC = glider.cxx \ - $(SNFW_SRC) - -OBJ = glider.obj \ - $(SNFW_OBJ) - - - -glider.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:glider.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/goddard/CMakeList.txt b/examples/goddard/CMakeList.txt deleted file mode 100644 index 5dd1803e..00000000 --- a/examples/goddard/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(goddard LANGUAGES CXX) - -add_executable(${PROJECT_NAME} goddard.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/goddard/Makefile b/examples/goddard/Makefile deleted file mode 100644 index f94c4b10..00000000 --- a/examples/goddard/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -GODDARD = goddard $(SNOPT_WRAPPER) - -GODDARD_O = $(GODDARD:%=$(EXAMPLESDIR)/%.o) - - -goddard: $(GODDARD_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/goddard/Makefile.vc b/examples/goddard/Makefile.vc deleted file mode 100644 index fc17a3b4..00000000 --- a/examples/goddard/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: goddard.exe - - -SRC = goddard.cxx \ - $(SNFW_SRC) - -OBJ = goddard.obj \ - $(SNFW_OBJ) - - - - - - -goddard.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:goddard.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/heat/CMakeList.txt b/examples/heat/CMakeList.txt deleted file mode 100644 index 17806396..00000000 --- a/examples/heat/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(heat LANGUAGES CXX) - -add_executable(${PROJECT_NAME} heat.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/heat/Makefile b/examples/heat/Makefile deleted file mode 100644 index 1d05dfc5..00000000 --- a/examples/heat/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -HEAT = heat $(SNOPT_WRAPPER) - -HEAT_O = $(HEAT:%=$(EXAMPLESDIR)/%.o) - - -heat: $(HEAT_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/heat/Makefile.vc b/examples/heat/Makefile.vc deleted file mode 100644 index c6da8cd0..00000000 --- a/examples/heat/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: heat.exe - - -SRC = heat.cxx \ - $(SNFW_SRC) - -OBJ = heat.obj \ - $(SNFW_OBJ) - - - -heat.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:heat.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/hyper/CMakeList.txt b/examples/hyper/CMakeList.txt deleted file mode 100644 index 6d70dd5a..00000000 --- a/examples/hyper/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(hyper LANGUAGES CXX) - -add_executable(${PROJECT_NAME} hyper.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/hyper/Makefile b/examples/hyper/Makefile deleted file mode 100644 index 4fc23ddf..00000000 --- a/examples/hyper/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -HYPER = hypersensitive $(SNOPT_WRAPPER) - -HYPER_O = $(HYPER:%=$(EXAMPLESDIR)/%.o) - - -hyper: $(HYPER_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/hyper/Makefile.vc b/examples/hyper/Makefile.vc deleted file mode 100644 index d702a584..00000000 --- a/examples/hyper/Makefile.vc +++ /dev/null @@ -1,22 +0,0 @@ -include ..\Makefile.inc - -all: hyper.exe - - -SRC = hypersensitive.cxx \ - $(SNFW_SRC) - -OBJ = hypersensitive.obj \ - $(SNFW_OBJ) - - - -hyper.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:hyper.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - - diff --git a/examples/ipc/CMakeList.txt b/examples/ipc/CMakeList.txt deleted file mode 100644 index 3f05648b..00000000 --- a/examples/ipc/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(ipc LANGUAGES CXX) - -add_executable(${PROJECT_NAME} ipc.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/ipc/Makefile b/examples/ipc/Makefile deleted file mode 100644 index b8ee5cf4..00000000 --- a/examples/ipc/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -IPC = interior_point $(SNOPT_WRAPPER) - -IPC_O = $(IPC:%=$(EXAMPLESDIR)/%.o) - - -ipc: $(IPC_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/ipc/Makefile.vc b/examples/ipc/Makefile.vc deleted file mode 100644 index 54d93f1e..00000000 --- a/examples/ipc/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: ipc.exe - - -SRC = interior_point.cxx \ - $(SNFW_SRC) - -OBJ = interior_point.obj \ - $(SNFW_OBJ) - - -ipc.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:ipc.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - - diff --git a/examples/isop/CMakeList.txt b/examples/isop/CMakeList.txt deleted file mode 100644 index 8df34414..00000000 --- a/examples/isop/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(isop LANGUAGES CXX) - -add_executable(${PROJECT_NAME} isop.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/isop/Makefile b/examples/isop/Makefile deleted file mode 100644 index 7b0372fc..00000000 --- a/examples/isop/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -ISOP = isoperimetric $(SNOPT_WRAPPER) - -ISOP_O = $(ISOP:%=$(EXAMPLESDIR)/%.o) - - -isop: $(ISOP_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/isop/Makefile.vc b/examples/isop/Makefile.vc deleted file mode 100644 index f7024530..00000000 --- a/examples/isop/Makefile.vc +++ /dev/null @@ -1,23 +0,0 @@ -include ..\Makefile.inc - -all: isop.exe - - -SRC = isoperimetric.cxx \ - $(SNFW_SRC) - -OBJ = isoperimetric.obj \ - $(SNFW_OBJ) - - - - - -isop.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:isop.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/lambert/CMakeList.txt b/examples/lambert/CMakeList.txt deleted file mode 100644 index 2a407e37..00000000 --- a/examples/lambert/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(lambert LANGUAGES CXX) - -add_executable(${PROJECT_NAME} lambert.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/lambert/Makefile b/examples/lambert/Makefile deleted file mode 100644 index 3382a070..00000000 --- a/examples/lambert/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -LAMBERT = lambert $(SNOPT_WRAPPER) - -LAMBERT_O = $(LAMBERT:%=$(EXAMPLESDIR)/%.o) - - -lambert: $(LAMBERT_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/lambert/Makefile.vc b/examples/lambert/Makefile.vc deleted file mode 100644 index bf5650a9..00000000 --- a/examples/lambert/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ -include ..\Makefile.inc - -all: lambert.exe - - -SRC = lambert.cxx \ - $(SNFW_SRC) - -OBJ = lambert.obj \ - $(SNFW_OBJ) - - - -lambert.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:lambert.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/launch/CMakeList.txt b/examples/launch/CMakeList.txt deleted file mode 100644 index bfc4f14f..00000000 --- a/examples/launch/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(launch LANGUAGES CXX) - -add_executable(${PROJECT_NAME} launch.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/launch/Makefile b/examples/launch/Makefile deleted file mode 100644 index bd3df5e2..00000000 --- a/examples/launch/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -LAUNCH = launch $(SNOPT_WRAPPER) - -LAUNCH_O = $(LAUNCH:%=$(EXAMPLESDIR)/%.o) - - -launch: $(LAUNCH_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/launch/Makefile.vc b/examples/launch/Makefile.vc deleted file mode 100644 index 13b2d392..00000000 --- a/examples/launch/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ - -include ..\Makefile.inc - -SRC = launch.cxx \ - $(SNFW_SRC) - -OBJ = launch.obj \ - $(SNFW_OBJ) - -all: launch.exe - -launch.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:launch.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - - diff --git a/examples/lowthr/CMakeList.txt b/examples/lowthr/CMakeList.txt deleted file mode 100644 index 7df990dd..00000000 --- a/examples/lowthr/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(lowthr LANGUAGES CXX) - -add_executable(${PROJECT_NAME} lowthr.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/lowthr/Makefile b/examples/lowthr/Makefile deleted file mode 100644 index 5463314f..00000000 --- a/examples/lowthr/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -LOWTHR = low_thrust $(SNOPT_WRAPPER) - -LOWTHR_O = $(LOWTHR:%=$(EXAMPLESDIR)/%.o) - - -lowthr: $(LOWTHR_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/lowthr/Makefile.vc b/examples/lowthr/Makefile.vc deleted file mode 100644 index ce3181b6..00000000 --- a/examples/lowthr/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ -include ..\Makefile.inc - -all: lowthr.exe - - -SRC = low_thrust.cxx \ - $(SNFW_SRC) - -OBJ = low_thrust.obj \ - $(SNFW_OBJ) - - - -lowthr.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:lowthr.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/lts/CMakeList.txt b/examples/lts/CMakeList.txt deleted file mode 100644 index 619a5058..00000000 --- a/examples/lts/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(lts LANGUAGES CXX) - -add_executable(${PROJECT_NAME} lts.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/lts/Makefile b/examples/lts/Makefile deleted file mode 100644 index ef5eb15c..00000000 --- a/examples/lts/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -LTS = lts $(SNOPT_WRAPPER) - -LTS_O = $(LTS:%=$(EXAMPLESDIR)/%.o) - - -lts: $(LTS_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/lts/Makefile.vc b/examples/lts/Makefile.vc deleted file mode 100644 index 97bb2577..00000000 --- a/examples/lts/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: lts.exe - - -SRC = lts.cxx \ - $(SNFW_SRC) - -OBJ = lts.obj \ - $(SNFW_OBJ) - - - - - - -lts.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:lts.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/manutec/CMakeList.txt b/examples/manutec/CMakeList.txt deleted file mode 100644 index de5e693a..00000000 --- a/examples/manutec/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(manutec LANGUAGES CXX) - -add_executable(${PROJECT_NAME} manutec.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/manutec/Makefile b/examples/manutec/Makefile deleted file mode 100644 index 3a0bdd9b..00000000 --- a/examples/manutec/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -MANUTEC = manutec $(SNOPT_WRAPPER) - -MANUTEC_O = $(MANUTEC:%=$(EXAMPLESDIR)/%.o) - - -manutec: $(MANUTEC_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/manutec/Makefile.vc b/examples/manutec/Makefile.vc deleted file mode 100644 index 8cc99282..00000000 --- a/examples/manutec/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ -include ..\Makefile.inc - -all: manutec.exe - - -SRC = manutec.cxx \ - $(SNFW_SRC) - -OBJ = manutec.obj \ - $(SNFW_OBJ) - - - -manutec.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:manutec.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/missile/CMakeList.txt b/examples/missile/CMakeList.txt deleted file mode 100644 index c720dc99..00000000 --- a/examples/missile/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(missile LANGUAGES CXX) - -add_executable(${PROJECT_NAME} missile.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/missile/Makefile b/examples/missile/Makefile deleted file mode 100644 index 4600a6bd..00000000 --- a/examples/missile/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -MISSILE = missile $(SNOPT_WRAPPER) - -MISSILE_O = $(MISSILE:%=$(EXAMPLESDIR)/%.o) - - -missile: $(MISSILE_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/missile/Makefile.vc b/examples/missile/Makefile.vc deleted file mode 100644 index 97fccc13..00000000 --- a/examples/missile/Makefile.vc +++ /dev/null @@ -1,17 +0,0 @@ -include ..\Makefile.inc - -all: missile.exe - - -SRC = missile.cxx \ - $(SNFW_SRC) - -OBJ = missile.obj \ - $(SNFW_OBJ) - - - -missile.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:missile.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - diff --git a/examples/moon/CMakeList.txt b/examples/moon/CMakeList.txt deleted file mode 100644 index 5027c5ba..00000000 --- a/examples/moon/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(moon LANGUAGES CXX) - -add_executable(${PROJECT_NAME} moon.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/moon/Makefile b/examples/moon/Makefile deleted file mode 100644 index fa470433..00000000 --- a/examples/moon/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -MOON = moon $(SNOPT_WRAPPER) - -MOON_O = $(MOON:%=$(EXAMPLESDIR)/%.o) - - -moon: $(MOON_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/moon/Makefile.vc b/examples/moon/Makefile.vc deleted file mode 100644 index 98e95230..00000000 --- a/examples/moon/Makefile.vc +++ /dev/null @@ -1,23 +0,0 @@ -include ..\Makefile.inc - -all: moon.exe - - -SRC = moon.cxx \ - $(SNFW_SRC) - -OBJ = moon.obj \ - $(SNFW_OBJ) - - - - - -moon.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:moon.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/mpec/CMakeList.txt b/examples/mpec/CMakeList.txt deleted file mode 100644 index 219b8d59..00000000 --- a/examples/mpec/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(mpec LANGUAGES CXX) - -add_executable(${PROJECT_NAME} mpec.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/mpec/Makefile b/examples/mpec/Makefile deleted file mode 100644 index 4d1ff85d..00000000 --- a/examples/mpec/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -MPEC = mpec $(SNOPT_WRAPPER) - -MPEC_O = $(MPEC:%=$(EXAMPLESDIR)/%.o) - - -mpec: $(MPEC_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/mpec/Makefile.vc b/examples/mpec/Makefile.vc deleted file mode 100644 index d9cae9af..00000000 --- a/examples/mpec/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: mpec.exe - - -SRC = mpec.cxx \ - $(SNFW_SRC) - -OBJ = mpec.obj \ - $(SNFW_OBJ) - - - -mpec.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:mpec.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/notorious/CMakeList.txt b/examples/notorious/CMakeList.txt deleted file mode 100644 index e727df38..00000000 --- a/examples/notorious/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(notorious LANGUAGES CXX) - -add_executable(${PROJECT_NAME} notorious.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/notorious/Makefile b/examples/notorious/Makefile deleted file mode 100644 index a3dd1698..00000000 --- a/examples/notorious/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -NOTORIOUS = notorious $(SNOPT_WRAPPER) - -NOTORIOUS_O = $(NOTORIOUS:%=$(EXAMPLESDIR)/%.o) - - -notorious: $(NOTORIOUS_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/notorious/Makefile.vc b/examples/notorious/Makefile.vc deleted file mode 100644 index 1980460f..00000000 --- a/examples/notorious/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: notorious.exe - - -SRC = notorious.cxx \ - $(SNFW_SRC) - -OBJ = notorious.obj \ - $(SNFW_OBJ) - - - - - - -notorious.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:notorious.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/obstacle/CMakeList.txt b/examples/obstacle/CMakeList.txt deleted file mode 100644 index dc65529a..00000000 --- a/examples/obstacle/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(obstacle LANGUAGES CXX) - -add_executable(${PROJECT_NAME} obstacle.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/obstacle/Makefile b/examples/obstacle/Makefile deleted file mode 100644 index 237dec4a..00000000 --- a/examples/obstacle/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -OBSTACLE = obstacle $(SNOPT_WRAPPER) - -OBSTACLE_O = $(OBSTACLE:%=$(EXAMPLESDIR)/%.o) - - -obstacle: $(OBSTACLE_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/obstacle/Makefile.vc b/examples/obstacle/Makefile.vc deleted file mode 100644 index 2cfe2101..00000000 --- a/examples/obstacle/Makefile.vc +++ /dev/null @@ -1,22 +0,0 @@ -include ..\Makefile.inc - -all: obstacle.exe - - -SRC = obstacle.cxx \ - $(SNFW_SRC) - -OBJ = obstacle.obj \ - $(SNFW_OBJ) - - - - -obstacle.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:obstacle.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/param2/CMakeList.txt b/examples/param2/CMakeList.txt deleted file mode 100644 index f46d57a4..00000000 --- a/examples/param2/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(param2 LANGUAGES CXX) - -add_executable(${PROJECT_NAME} param2.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/predator/CMakeList.txt b/examples/predator/CMakeList.txt deleted file mode 100644 index 18221ae0..00000000 --- a/examples/predator/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(predator LANGUAGES CXX) - -add_executable(${PROJECT_NAME} predator.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/rayleigh/CMakeList.txt b/examples/rayleigh/CMakeList.txt deleted file mode 100644 index 79c3466e..00000000 --- a/examples/rayleigh/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(rayleigh LANGUAGES CXX) - -add_executable(${PROJECT_NAME} rayleigh.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/rayleigh/Makefile b/examples/rayleigh/Makefile deleted file mode 100644 index 87cc369c..00000000 --- a/examples/rayleigh/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -RAYLEIGH = rayleigh $(SNOPT_WRAPPER) - -RAYLEIGH_O = $(RAYLEIGH:%=$(EXAMPLESDIR)/%.o) - - -rayleigh: $(RAYLEIGH_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/rayleigh/Makefile.vc b/examples/rayleigh/Makefile.vc deleted file mode 100644 index f944ae8a..00000000 --- a/examples/rayleigh/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: rayleigh.exe - - -SRC = rayleigh.cxx \ - $(SNFW_SRC) - -OBJ = rayleigh.obj \ - $(SNFW_OBJ) - - - - - - -rayleigh.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:rayleigh.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/reorientation/CMakeList.txt b/examples/reorientation/CMakeList.txt deleted file mode 100644 index de824d55..00000000 --- a/examples/reorientation/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(reorientation LANGUAGES CXX) - -add_executable(${PROJECT_NAME} reorientation.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/reorientation/Makefile b/examples/reorientation/Makefile deleted file mode 100755 index 293ac5d9..00000000 --- a/examples/reorientation/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -REORIENTATION = reorientation $(SNOPT_WRAPPER) - -REORIENTATION_O = $(REORIENTATION:%=$(EXAMPLESDIR)/%.o) - - -reorientation: $(REORIENTATION_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/reorientation/Makefile.vc b/examples/reorientation/Makefile.vc deleted file mode 100644 index 4ba73a36..00000000 --- a/examples/reorientation/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: reorientation.exe - - -SRC = reorientation.cxx \ - $(SNFW_SRC) - -OBJ = reorientation.obj \ - $(SNFW_OBJ) - - - - - - -reorientation.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:reorientation.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/shutt/CMakeList.txt b/examples/shutt/CMakeList.txt deleted file mode 100644 index 22a3755e..00000000 --- a/examples/shutt/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(shutt LANGUAGES CXX) - -add_executable(${PROJECT_NAME} shutt.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/shutt/Makefile b/examples/shutt/Makefile deleted file mode 100644 index dd1e18c0..00000000 --- a/examples/shutt/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -SHUTT = shuttle_reentry1 $(SNOPT_WRAPPER) - -SHUTT_O = $(SHUTT:%=$(EXAMPLESDIR)/%.o) - - -shutt: $(SHUTT_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/shutt/Makefile.vc b/examples/shutt/Makefile.vc deleted file mode 100644 index a66bb4e4..00000000 --- a/examples/shutt/Makefile.vc +++ /dev/null @@ -1,22 +0,0 @@ -include ..\Makefile.inc - -all: shutt.exe - - -SRC = shuttle_reentry1.cxx \ - $(SNFW_SRC) - -OBJ = shuttle_reentry1.obj \ - $(SNFW_OBJ) - - - - - -shutt.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:shutt.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/sing5/CMakeList.txt b/examples/sing5/CMakeList.txt deleted file mode 100644 index 1f4fb3e2..00000000 --- a/examples/sing5/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(sing5 LANGUAGES CXX) - -add_executable(${PROJECT_NAME} sing5.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/sing5/Makefile b/examples/sing5/Makefile deleted file mode 100644 index 80b684ba..00000000 --- a/examples/sing5/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -SING5 = singular5 $(SNOPT_WRAPPER) - -SING5_O = $(SING5:%=$(EXAMPLESDIR)/%.o) - - -sing5: $(SING5_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/sing5/Makefile.vc b/examples/sing5/Makefile.vc deleted file mode 100644 index 93bcca9f..00000000 --- a/examples/sing5/Makefile.vc +++ /dev/null @@ -1,23 +0,0 @@ -include ..\Makefile.inc - -all: sing5.exe - - -SRC = singular5.cxx \ - $(SNFW_SRC) - -OBJ = singular5.obj \ - $(SNFW_OBJ) - - - - - - -sing5.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:sing5.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/stc1/CMakeList.txt b/examples/stc1/CMakeList.txt deleted file mode 100644 index c467850d..00000000 --- a/examples/stc1/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(stc1 LANGUAGES CXX) - -add_executable(${PROJECT_NAME} stc1.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/stc1/Makefile b/examples/stc1/Makefile deleted file mode 100644 index be1806dc..00000000 --- a/examples/stc1/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -STC1 = stc1 $(SNOPT_WRAPPER) - -STC1_O = $(STC1:%=$(EXAMPLESDIR)/%.o) - - -stc1: $(STC1_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/stc1/Makefile.vc b/examples/stc1/Makefile.vc deleted file mode 100644 index 12cd0938..00000000 --- a/examples/stc1/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: stc1.exe - - -SRC = stc1.cxx \ - $(SNFW_SRC) - -OBJ = stc1.obj \ - $(SNFW_OBJ) - - - - - -stc1.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:stc1.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - - diff --git a/examples/steps/CMakeList.txt b/examples/steps/CMakeList.txt deleted file mode 100644 index b35c1bc6..00000000 --- a/examples/steps/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(steps LANGUAGES CXX) - -add_executable(${PROJECT_NAME} steps.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/steps/Makefile b/examples/steps/Makefile deleted file mode 100644 index 06fe3baf..00000000 --- a/examples/steps/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -STEPS = steps $(SNOPT_WRAPPER) - -STEPS_O = $(STEPS:%=$(EXAMPLESDIR)/%.o) - - -steps: $(STEPS_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/steps/Makefile.vc b/examples/steps/Makefile.vc deleted file mode 100644 index 4b5a3627..00000000 --- a/examples/steps/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: steps.exe - - -SRC = steps.cxx \ - $(SNFW_SRC) - -OBJ = steps.obj \ - $(SNFW_OBJ) - - - -steps.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:steps.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/twoburn/CMakeList.txt b/examples/twoburn/CMakeList.txt deleted file mode 100644 index b80b8eee..00000000 --- a/examples/twoburn/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(twoburn LANGUAGES CXX) - -add_executable(${PROJECT_NAME} twoburn.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/twoburn/Makefile b/examples/twoburn/Makefile deleted file mode 100644 index e03f5b08..00000000 --- a/examples/twoburn/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -TWOBURN = twoburn $(SNOPT_WRAPPER) - -TWOBURN_O = $(TWOBURN:%=$(EXAMPLESDIR)/%.o) - - -twoburn: $(TWOBURN_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/twoburn/Makefile.vc b/examples/twoburn/Makefile.vc deleted file mode 100644 index 7e9f4a13..00000000 --- a/examples/twoburn/Makefile.vc +++ /dev/null @@ -1,20 +0,0 @@ -include ..\Makefile.inc - -all: twoburn.exe - - -SRC = twoburn.cxx \ - $(SNFW_SRC) - -OBJ = twoburn.obj \ - $(SNFW_OBJ) - - - -twoburn.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:twoburn.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/twolink/CMakeList.txt b/examples/twolink/CMakeList.txt deleted file mode 100644 index 74085596..00000000 --- a/examples/twolink/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(twolink LANGUAGES CXX) - -add_executable(${PROJECT_NAME} twolink.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/twolink/Makefile b/examples/twolink/Makefile deleted file mode 100644 index 26e137fd..00000000 --- a/examples/twolink/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -TWOLINK = twolinkarm $(SNOPT_WRAPPER) - -TWOLINK_O = $(TWOLINK:%=$(EXAMPLESDIR)/%.o) - - -twolink: $(TWOLINK_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/twolink/Makefile.vc b/examples/twolink/Makefile.vc deleted file mode 100644 index b504ffaa..00000000 --- a/examples/twolink/Makefile.vc +++ /dev/null @@ -1,22 +0,0 @@ -include ..\Makefile.inc - -all: twolink.exe - - -SRC = twolinkarm.cxx \ - $(SNFW_SRC) - -OBJ = twolinkarm.obj \ - $(SNFW_OBJ) - - - - - -twolink.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:twolink.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - diff --git a/examples/twophro/CMakeList.txt b/examples/twophro/CMakeList.txt deleted file mode 100644 index ebc48a03..00000000 --- a/examples/twophro/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(twophro LANGUAGES CXX) - -add_executable(${PROJECT_NAME} twophro.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/twophro/Makefile b/examples/twophro/Makefile deleted file mode 100644 index 1c6ba8d6..00000000 --- a/examples/twophro/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -TWOPHRO = twophase_robot $(SNOPT_WRAPPER) - -TWOPHRO_O = $(TWOPHRO:%=$(EXAMPLESDIR)/%.o) - - -twophro: $(TWOPHRO_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/twophro/Makefile.vc b/examples/twophro/Makefile.vc deleted file mode 100644 index 8a482b5f..00000000 --- a/examples/twophro/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: twophro.exe - - -SRC = twophase_robot.cxx \ - $(SNFW_SRC) - -OBJ = twophase_robot.obj \ - $(SNFW_OBJ) - - - - - -twophro.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:twophro.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - diff --git a/examples/twophsc/CMakeList.txt b/examples/twophsc/CMakeList.txt deleted file mode 100644 index 0c90f98a..00000000 --- a/examples/twophsc/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(twophsc LANGUAGES CXX) - -add_executable(${PROJECT_NAME} twophsc.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/twophsc/Makefile b/examples/twophsc/Makefile deleted file mode 100644 index 1d8a4f02..00000000 --- a/examples/twophsc/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -TWOPHSC = twophase_schwartz $(SNOPT_WRAPPER) - -TWOPHSC_O = $(TWOPHSC:%=$(EXAMPLESDIR)/%.o) - - -twophsc: $(TWOPHSC_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/twophsc/Makefile.vc b/examples/twophsc/Makefile.vc deleted file mode 100644 index 3782c21d..00000000 --- a/examples/twophsc/Makefile.vc +++ /dev/null @@ -1,23 +0,0 @@ -include ..\Makefile.inc - -all: twophsc.exe - - -SRC = twophase_schwartz.cxx \ - $(SNFW_SRC) - -OBJ = twophase_schwartz.obj \ - $(SNFW_OBJ) - - - - - -twophsc.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:twophsc.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/user/CMakeList.txt b/examples/user/CMakeList.txt deleted file mode 100644 index a5c9ad06..00000000 --- a/examples/user/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(user LANGUAGES CXX) - -add_executable(${PROJECT_NAME} user.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/user/Makefile b/examples/user/Makefile deleted file mode 100755 index c2b2f531..00000000 --- a/examples/user/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -USER = user $(SNOPT_WRAPPER) - -USER_O = $(USER:%=$(EXAMPLESDIR)/%.o) - - -user: $(USER_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/user/Makefile.vc b/examples/user/Makefile.vc deleted file mode 100644 index df06a0db..00000000 --- a/examples/user/Makefile.vc +++ /dev/null @@ -1,24 +0,0 @@ -include ..\Makefile.inc - -all: user.exe - - -SRC = user.cxx \ - $(SNFW_SRC) - -OBJ = user.obj \ - $(SNFW_OBJ) - - - - - - -user.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:user.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - - diff --git a/examples/zpm/CMakeList.txt b/examples/zpm/CMakeList.txt deleted file mode 100644 index 28476962..00000000 --- a/examples/zpm/CMakeList.txt +++ /dev/null @@ -1,5 +0,0 @@ -cmake_minimum_required (VERSION 3.10) -project(zpm LANGUAGES CXX) - -add_executable(${PROJECT_NAME} zpm.cxx) -target_link_libraries(colon PUBLIC PSOPT dmatrix) diff --git a/examples/zpm/Makefile b/examples/zpm/Makefile deleted file mode 100755 index 351c387a..00000000 --- a/examples/zpm/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -include ../Makefile_linux.inc - -ZPM = zpm $(SNOPT_WRAPPER) - -ZPM_O = $(ZPM:%=$(EXAMPLESDIR)/%.o) - - -zpm: $(ZPM_O) $(PSOPT_LIBS) $(DMATRIX_LIBS) $(SPARSE_LIBS) - $(CXX) $(CXXFLAGS) $^ -o $@ -L$(LIBDIR) $(ALL_LIBRARIES) $(LDFLAGS) - rm -f *.o - diff --git a/examples/zpm/Makefile.vc b/examples/zpm/Makefile.vc deleted file mode 100644 index cb56a568..00000000 --- a/examples/zpm/Makefile.vc +++ /dev/null @@ -1,21 +0,0 @@ -include ..\Makefile.inc - -all: zpm.exe - - -SRC = zpm.cxx \ - $(SNFW_SRC) - -OBJ = zpm.obj \ - $(SNFW_OBJ) - - - -zpm.exe: $(OBJ) $(PSOPT)\lib\libpsopt.lib $(DMATRIX)\lib\libdmatrix.lib - $(LD) -out:zpm.exe $(OBJ) $(LIBS) /NODEFAULTLIB:"LIBC.lib" /DEFAULTLIB:"LIBCMT.lib" - - - - - -