Hello community,
here is the log from the commit of package armadillo for openSUSE:Factory checked in at 2016-10-31 09:56:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/armadillo (Old)
and /work/SRC/openSUSE:Factory/.armadillo.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "armadillo"
Changes:
--------
--- /work/SRC/openSUSE:Factory/armadillo/armadillo.changes 2016-09-30 15:33:52.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.armadillo.new/armadillo.changes 2016-10-31 09:56:50.000000000 +0100
@@ -1,0 +2,8 @@
+Mon Oct 24 13:16:30 UTC 2016 - badshah400@gmail.com
+
+- Update to version 7.500.0:
+ + Expanded qz() to optionally specify ordering of the Schur
+ form.
+ + Expanded .each_slice() to support matrix multiplication.
+
+-------------------------------------------------------------------
Old:
----
armadillo-7.400.3.tar.xz
New:
----
armadillo-7.500.0.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ armadillo.spec ++++++
--- /var/tmp/diff_new_pack.96NKpe/_old 2016-10-31 09:56:51.000000000 +0100
+++ /var/tmp/diff_new_pack.96NKpe/_new 2016-10-31 09:56:51.000000000 +0100
@@ -19,7 +19,7 @@
%define soname libarmadillo7
Name: armadillo
-Version: 7.400.3
+Version: 7.500.0
Release: 0
Summary: Fast C++ matrix library with interfaces to LAPACK and ATLAS
License: MPL-2.0
++++++ armadillo-7.400.3.tar.xz -> armadillo-7.500.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/CMakeLists.txt new/armadillo-7.500.0/CMakeLists.txt
--- old/armadillo-7.400.3/CMakeLists.txt 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/CMakeLists.txt 2016-06-16 18:16:06.000000000 +0200
@@ -14,13 +14,9 @@
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
-set(ARMA_MAJOR 7)
-set(ARMA_MINOR 400)
-set(ARMA_PATCH 2)
-set(ARMADILLO_VERSION ${ARMA_MAJOR}.${ARMA_MINOR}.${ARMA_PATCH})
-
-message(STATUS "Configuring Armadillo ${ARMADILLO_VERSION}")
-
+project(armadillo CXX)
+include(CheckIncludeFileCXX)
+include(CheckLibraryExists)
## Set ARMA_USE_WRAPPER to false if you're getting linking errors when compiling your programs,
## or if you prefer to directly link with BLAS and/or LAPACK.
@@ -40,12 +36,24 @@
set(ARMA_USE_EXTERN_CXX11_RNG false)
set(ARMA_USE_SUPERLU false) # Caveat: only SuperLU version 5.x can be used!
-project(armadillo CXX)
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake_aux/Modules/")
+## extract version from sources
-include(CheckIncludeFileCXX)
-include(CheckLibraryExists)
+set(ARMA_VERSION_FILE_NAME "${PROJECT_SOURCE_DIR}/include/armadillo_bits/arma_version.hpp")
+
+if(NOT EXISTS ${ARMA_VERSION_FILE_NAME})
+ message(FATAL_ERROR "Can't read ${ARMA_VERSION_FILE_NAME}")
+endif()
+
+file(READ ${ARMA_VERSION_FILE_NAME} ARMA_VERSION_FILE_CONTENTS)
+string(REGEX REPLACE ".*#define ARMA_VERSION_MAJOR ([0-9]+).*" "\\1" ARMA_VERSION_MAJOR "${ARMA_VERSION_FILE_CONTENTS}")
+string(REGEX REPLACE ".*#define ARMA_VERSION_MINOR ([0-9]+).*" "\\1" ARMA_VERSION_MINOR "${ARMA_VERSION_FILE_CONTENTS}")
+string(REGEX REPLACE ".*#define ARMA_VERSION_PATCH ([0-9]+).*" "\\1" ARMA_VERSION_PATCH "${ARMA_VERSION_FILE_CONTENTS}")
+
+message(STATUS "Configuring Armadillo ${ARMA_VERSION_MAJOR}.${ARMA_VERSION_MINOR}.${ARMA_VERSION_PATCH}")
+
+
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake_aux/Modules/")
if(MSVC)
@@ -312,13 +320,13 @@
## work around a silly limitation in Mac OS X
if(APPLE)
- if(${ARMA_MINOR} GREATER 99)
- math(EXPR ARMA_MINOR_ALT "${ARMA_MINOR} / 10")
+ if(${ARMA_VERSION_MINOR} GREATER 99)
+ math(EXPR ARMA_VERSION_MINOR_ALT "${ARMA_VERSION_MINOR} / 10")
else()
- set(ARMA_MINOR_ALT ${ARMA_MINOR})
+ set(ARMA_VERSION_MINOR_ALT ${ARMA_VERSION_MINOR})
endif()
else()
- set(ARMA_MINOR_ALT ${ARMA_MINOR})
+ set(ARMA_VERSION_MINOR_ALT ${ARMA_VERSION_MINOR})
endif()
@@ -339,7 +347,7 @@
add_library( armadillo ${PROJECT_SOURCE_DIR}/src/wrapper.cpp )
target_link_libraries( armadillo ${ARMA_LIBS} )
-set_target_properties(armadillo PROPERTIES VERSION ${ARMA_MAJOR}.${ARMA_MINOR_ALT}.${ARMA_PATCH} SOVERSION ${ARMA_MAJOR})
+set_target_properties(armadillo PROPERTIES VERSION ${ARMA_VERSION_MAJOR}.${ARMA_VERSION_MINOR_ALT}.${ARMA_VERSION_PATCH} SOVERSION ${ARMA_VERSION_MAJOR})
################################################################################
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/README.txt new/armadillo-7.500.0/README.txt
--- old/armadillo-7.400.3/README.txt 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/README.txt 2016-06-16 18:16:06.000000000 +0200
@@ -8,33 +8,30 @@
1: Introduction
2: Citation Details
+ 3: License
- 3: Licenses
- 4: Technical Support
+ 4: Requirements
- 5: Requirements
+ 5: Linux and Mac OS X: Installation
+ 6: Linux and Mac OS X: Compiling & Linking
- 6: Linux and Mac OS X: Installation
- 7: Linux and Mac OS X: Compiling & Linking
+ 7: Windows: Installation
+ 8: Windows: Compiling & Linking
- 8: Windows: Installation
- 9: Windows: Compiling & Linking
+ 9: Support for OpenBLAS, Intel MKL and AMD ACML
+10: Support for ATLAS
-10: Support for OpenBLAS, Intel MKL and AMD ACML
-11: Support for ATLAS
+11: API Documentation
+12: MEX Interface to Octave/Matlab
-12: API Documentation
-13: MEX Interface to Octave/Matlab
-
-14: Bug Reports and Frequently Asked Questions
-15: Related Software
+13: Bug Reports and Frequently Asked Questions
+14: Related Software
1: Introduction
===============
-
Armadillo is a high quality C++ linear algebra library,
aiming towards a good balance between speed and ease of use.
@@ -55,10 +52,7 @@
The library can be used for machine learning, pattern recognition, computer vision,
signal processing, bioinformatics, statistics, econometrics, etc.
-Armadillo is primarily developed at Data61 / NICTA (Australia).
-For information about Data61 see http://data61.csiro.au
-
-Main developers:
+Authors:
Conrad Sanderson - http://conradsanderson.id.au
Ryan Curtin - http://ratml.org
@@ -77,30 +71,15 @@
-3: Licenses
-===========
+3: License
+==========
-Armadillo is available under 2 licenses:
-
-- Open source, under the restrictions of the Mozilla Public License (MPL) 2.0.
- See the "LICENSE.txt" file for details.
-
-- Commercial license (not open source), available for purchase.
- Please contact Conrad Sanderson for more information:
- http://conradsanderson.id.au
+Armadillo is available as open source, under the restrictions of the
+Mozilla Public License (MPL) 2.0. See the "LICENSE.txt" file for details.
-4: Technical Support
-====================
-
-Technical support can be obtained by purchasing the commercial license (see above).
-Please contact Conrad Sanderson for more information:
-http://conradsanderson.id.au
-
-
-
-5: Requirements
+4: Requirements
===============
Armadillo makes extensive use of template meta-programming, recursive templates
@@ -122,7 +101,7 @@
-6: Linux and Mac OS X: Installation
+5: Linux and Mac OS X: Installation
===================================
* Step 1:
@@ -195,7 +174,7 @@
-7: Linux and Mac OS X: Compiling & Linking
+6: Linux and Mac OS X: Compiling & Linking
==========================================
The "examples" directory contains several quick example programs
@@ -219,7 +198,7 @@
-8: Windows: Installation
+7: Windows: Installation
========================
The installation is comprised of 3 steps:
@@ -249,7 +228,7 @@
-9: Windows: Compiling & Linking
+8: Windows: Compiling & Linking
===============================
Within the "examples" folder, we have included an MSVC project named "example1_win64"
@@ -299,8 +278,8 @@
-10: Support for OpenBLAS, Intel MKL and AMD ACML
-================================================
+9: Support for OpenBLAS, Intel MKL and AMD ACML
+===============================================
Armadillo can use OpenBLAS, or Intel Math Kernel Library (MKL),
or the AMD Core Math Library (ACML) as high-speed replacements
@@ -357,7 +336,7 @@
-11: Support for ATLAS
+10: Support for ATLAS
=====================
Armadillo can use the ATLAS library for faster versions of
@@ -374,7 +353,7 @@
-12: API Documentation
+11: API Documentation
=====================
Documentation of functions and classes is available at:
@@ -386,7 +365,7 @@
-13: MEX Interface to Octave/Matlab
+12: MEX Interface to Octave/Matlab
==================================
The "mex_interface" folder contains examples of how to interface
@@ -394,7 +373,7 @@
-14: Bug Reports and Frequently Asked Questions
+13: Bug Reports and Frequently Asked Questions
==============================================
Answers to frequently asked questions can be found at:
@@ -416,15 +395,12 @@
-15: Related Software
+14: Related Software
====================
* MLPACK: C++ library for machine learning and pattern recognition, built on top of Armadillo.
http://mlpack.org
-* Mantella: C++ library for analysing and solving optimisation problems
- https://github.com/SebastianNiemann/Mantella
-
* libpca: C++ library for principal component analysis
http://sourceforge.net/projects/libpca/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/docs.html new/armadillo-7.500.0/docs.html
--- old/armadillo-7.400.3/docs.html 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/docs.html 2016-06-16 18:16:06.000000000 +0200
@@ -144,7 +144,7 @@
<!-- -->
<a class="noprint" style="display:scroll; position:fixed; bottom:5px; right:5px;" href="#top"><font size=-1>[top]</font></a>
-<big><b>API Documentation for Armadillo 7.400</b></big>
+<big><b>API Documentation for Armadillo 7.500</b></big>
<br>
<br>
<br>
@@ -156,7 +156,7 @@
<table border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
-<td style="text-align: left; vertical-align: top; width: 50%;">
+<td style="text-align: left; vertical-align: top; width: 45%;">
<ul>
<li>
For converting Matlab/Octave programs,
@@ -182,7 +182,7 @@
<td class="line" style="vertical-align: top;">
<br>
</td>
-<td style="text-align: left; vertical-align: top; width: 45%;">
+<td style="text-align: left; vertical-align: top; width: 50%;">
<ul>
<li>
Please cite the following article if you use Armadillo in your research and/or software.
@@ -195,13 +195,6 @@
<br>Journal of Open Source Software, Vol. 1, pp. 26, 2016.
</font>
</li>
-
</ul>
</td>
</tr>
@@ -3867,11 +3860,11 @@
</li>
<br>
<li>
-Repeat a matrix operation on each slice of a cube
+Repeat a matrix operation on each slice of a cube, with each slice treated as a matrix
</li>
<br>
<li>
-Supported operations for <i>.each_slice()</i> and <i>.each_slice(vector_of_indices)</i> forms:
+Supported operations for the <i>.each_slice()</i> form:
<br>
<br>
<ul>
@@ -3880,11 +3873,16 @@
<tr><td><code><b>-</b></code></td><td> </td><td>subtraction</td><td> </td><td><code><b>-=</b></code></td><td> </td><td>in-place subtraction</td></tr>
<tr><td><code><b>%</b></code></td><td> </td><td>element-wise multiplication</td><td> </td><td><code><b>%=</b></code></td><td> </td><td>in-place element-wise multiplication</td></tr>
<tr><td><code><b>/</b></code></td><td> </td><td>element-wise division</td><td> </td><td><code><b>/=</b></code></td><td> </td><td>in-place element-wise division</td></tr>
+<tr><td><code><b>*</b></code></td><td> </td><td>matrix multiplication</td><td> </td><td><code><b>*=</b></code></td><td> </td><td>in-place matrix multiplication</td></tr>
<tr><td><code><b>=</b></code></td><td> </td><td>assignment (copy)</td><td> </td><td> </td><td> </td><td> </td></tr>
</table>
</ul>
</li>
<br>
+<li>
+The <i>.each_slice(vector_of_indices)</i> form also supports the above operations, except for <code><b>*</b></code> and <code><b>*=</b></code> (ie. matrix multiplication)
+</li>
+<br>
<li>The argument <i>vector_of_indices</i> is optional; by default all slices are used</li>
<br>
<li>
@@ -7096,9 +7094,7 @@
</li>
<br>
<li>
-If a binary or trinary expression is given (ie. 2 or 3 terms),
-the function will try to exploit the fact that the result is a 1x1 matrix
-by using optimised expression evaluations
+Optimised expression evaluations are automatically used when a binary or trinary expression is given (ie. 2 or 3 terms)
</li>
<br>
<li>
@@ -7109,8 +7105,7 @@
colvec q = randu<colvec>(5);
mat X = randu<mat>(5,5);
-// examples of some expressions
-// for which optimised implementations exist
+// examples of expressions which have optimised implementations
double a = as_scalar(r*q);
double b = as_scalar(r*X*q);
@@ -10875,12 +10870,28 @@
<div class="pagebreak"></div><div class="noprint"><hr class="greyline"><br></div>
<a name="qz"></a>
<b>qz( AA, BB, Q, Z, A, B )</b>
+<br><b>qz( AA, BB, Q, Z, A, B, select )</b>
<ul>
<li>
Generalised Schur decomposition for pair of general square matrices <i>A</i> and <i>B</i> of the same size,
<br>such that <i>A = Q.t()*AA*Z.t()</i> and <i>B = Q.t()*BB*Z.t()</i>
</li>
<br>
+<li>The <i>select</i> argument is optional and specifies the ordering of the top left of the Schur form; it is one of the following:
+<br>
+<ul>
+<table>
+<tbody>
+<tr><td><code>"none"</code></td><td> </td><td>no selection (default operation)</td></tr>
+<tr><td><code>"lhp"</code></td><td> </td><td>left-half-plane: eigenvalues with real part < 0</td></tr>
+<tr><td><code>"rhp"</code></td><td> </td><td>right-half-plane: eigenvalues with real part > 0</td></tr>
+<tr><td><code>"iuc"</code></td><td> </td><td>inside-unit-circle: eigenvalues with absolute value < 1</td></tr>
+<tr><td><code>"ouc"</code></td><td> </td><td>outside-unit-circle: eigenvalues with absolute value > 1</td></tr>
+</tbody>
+</table>
+</ul>
+</li>
+<br>
<li>The left and right Schur vectors are stored in <i>Q</i> and <i>Z</i>, respectively</li>
<br>
<li>In the complex-valued problem, the generalised eigenvalues are found in <i>diagvec(AA) / diagvec(BB)</i></li>
@@ -15121,6 +15132,29 @@
<tbody>
<tr>
<td style="vertical-align: top;">
+<code>ARMA_DONT_USE_WRAPPER</code>
+ </td>
+ <td style="vertical-align: top;">
+
+ </td>
+ <td style="vertical-align: top;">
+Disable going through the run-time Armadillo wrapper library (<i>libarmadillo.so</i>) when calling LAPACK, BLAS, ARPACK, SuperLU and HDF5 functions.
+You will need to directly link with BLAS, LAPACK, etc (eg. <i>-lblas -llapack </i>)
+ </td>
+ </tr>
+ <tr>
+ <td style="vertical-align: top;">
+
+ </td>
+ <td style="vertical-align: top;">
+
+ </td>
+ <td style="vertical-align: top;">
+
+ </td>
+ </tr>
+ <tr>
+ <td style="vertical-align: top;">
<code>ARMA_USE_LAPACK</code>
</td>
<td style="vertical-align: top;">
@@ -15394,29 +15428,6 @@
</tr>
<tr>
<td style="vertical-align: top;">
-<code>ARMA_DONT_USE_WRAPPER</code>
- </td>
- <td style="vertical-align: top;">
-
- </td>
- <td style="vertical-align: top;">
-Disable going through the run-time Armadillo wrapper library (<i>libarmadillo.so</i>) when calling LAPACK, BLAS, ARPACK, SuperLU and HDF5 functions.
-You will need to directly link with LAPACK, BLAS, etc (eg. <i>-llapack -lblas</i>)
- </td>
- </tr>
- <tr>
- <td style="vertical-align: top;">
-
- </td>
- <td style="vertical-align: top;">
-
- </td>
- <td style="vertical-align: top;">
-
- </td>
- </tr>
- <tr>
- <td style="vertical-align: top;">
<a name="config_hpp_arma_use_cxx11"></a>
<code>ARMA_USE_CXX11</code>
</td>
@@ -15891,6 +15902,14 @@
<br>
<ul>
+<a name="version_7500"></a>
+<li>Version 7.500:
+<ul>
+<li>expanded <a href="#qz">qz()</a> to optionally specify ordering of the Schur form</li>
+<li>expanded <a href="#each_slice">each_slice()</a> to support matrix multiplication</li>
+</ul>
+</li>
+<br>
<a name="version_7400"></a>
<li>Version 7.400:
<ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/Mat_meat.hpp new/armadillo-7.500.0/include/armadillo_bits/Mat_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/Mat_meat.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/Mat_meat.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -3877,7 +3877,7 @@
for(uword ii=0; ii < n_cols; ++ii)
{
- const Col<eT> tmp(colptr(ii), n_rows, false, true);
+ const Col<eT> tmp(const_cast(colptr(ii)), n_rows, false, true);
F(tmp);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/arma_version.hpp new/armadillo-7.500.0/include/armadillo_bits/arma_version.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/arma_version.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/arma_version.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -14,9 +14,9 @@
#define ARMA_VERSION_MAJOR 7
-#define ARMA_VERSION_MINOR 400
-#define ARMA_VERSION_PATCH 3
-#define ARMA_VERSION_NAME "Feral Winter Deluxe"
+#define ARMA_VERSION_MINOR 500
+#define ARMA_VERSION_PATCH 0
+#define ARMA_VERSION_NAME "Coup d'Etat"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/arrayops_meat.hpp new/armadillo-7.500.0/include/armadillo_bits/arrayops_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/arrayops_meat.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/arrayops_meat.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -19,7 +19,7 @@
void
arrayops::copy(eT* dest, const eT* src, const uword n_elem)
{
- if( (n_elem <= 16) && (is_cx<eT>::no) )
+ if( (n_elem <= 9) && (is_cx<eT>::no) )
{
arrayops::copy_small(dest, src, n_elem);
}
@@ -39,13 +39,6 @@
{
switch(n_elem)
{
- case 16: dest[15] = src[15];
- case 15: dest[14] = src[14];
- case 14: dest[13] = src[13];
- case 13: dest[12] = src[12];
- case 12: dest[11] = src[11];
- case 11: dest[10] = src[10];
- case 10: dest[ 9] = src[ 9];
case 9: dest[ 8] = src[ 8];
case 8: dest[ 7] = src[ 7];
case 7: dest[ 6] = src[ 6];
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/auxlib_bones.hpp new/armadillo-7.500.0/include/armadillo_bits/auxlib_bones.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/auxlib_bones.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/auxlib_bones.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -260,10 +260,10 @@
// QZ decomposition
template
- inline static bool qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const Base& X_expr, const Base& Y_expr);
+ inline static bool qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const Base& X_expr, const Base& Y_expr, const char mode);
template
- inline static bool qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr);
+ inline static bool qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr, const char mode);
//
@@ -277,4 +277,22 @@
};
+
+namespace qz_helper
+ {
+ template<typename T> inline blas_int select_lhp(const T* x_ptr, const T* y_ptr, const T* z_ptr);
+ template<typename T> inline blas_int select_rhp(const T* x_ptr, const T* y_ptr, const T* z_ptr);
+ template<typename T> inline blas_int select_iuc(const T* x_ptr, const T* y_ptr, const T* z_ptr);
+ template<typename T> inline blas_int select_ouc(const T* x_ptr, const T* y_ptr, const T* z_ptr);
+
+ template<typename T> inline blas_int cx_select_lhp(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr);
+ template<typename T> inline blas_int cx_select_rhp(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr);
+ template<typename T> inline blas_int cx_select_iuc(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr);
+ template<typename T> inline blas_int cx_select_ouc(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr);
+
+ template<typename T> inline void_ptr ptr_cast(blas_int (*function)(const T*, const T*, const T*));
+ template<typename T> inline void_ptr ptr_cast(blas_int (*function)(const std::complex<T>*, const std::complex<T>*));
+ }
+
+
//! @}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/auxlib_meat.hpp new/armadillo-7.500.0/include/armadillo_bits/auxlib_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/auxlib_meat.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/auxlib_meat.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -3885,7 +3885,7 @@
template
inline
bool
-auxlib::qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const Base& X_expr, const Base& Y_expr)
+auxlib::qz(Mat<T>& A, Mat<T>& B, Mat<T>& vsl, Mat<T>& vsr, const Base& X_expr, const Base& Y_expr, const char mode)
{
arma_extra_debug_sigprint();
@@ -3921,6 +3921,11 @@
blas_int lwork = 3 * ((std::max)(blas_int(1),8*N+16));
blas_int info = 0;
+ if(mode == 'l') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::select_lhp<T>)); }
+ else if(mode == 'r') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::select_rhp<T>)); }
+ else if(mode == 'i') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::select_iuc<T>)); }
+ else if(mode == 'o') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::select_ouc<T>)); }
+
podarray<T> alphar(A.n_rows);
podarray<T> alphai(A.n_rows);
podarray<T> beta(A.n_rows);
@@ -3952,6 +3957,7 @@
arma_ignore(vsr);
arma_ignore(X_expr);
arma_ignore(Y_expr);
+ arma_ignore(mode);
arma_stop_logic_error("qz(): use of LAPACK must be enabled");
return false;
}
@@ -3966,7 +3972,7 @@
template
inline
bool
-auxlib::qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr)
+auxlib::qz(Mat< std::complex<T> >& A, Mat< std::complex<T> >& B, Mat< std::complex<T> >& vsl, Mat< std::complex<T> >& vsr, const Base< std::complex<T>, T1 >& X_expr, const Base< std::complex<T>, T2 >& Y_expr, const char mode)
{
arma_extra_debug_sigprint();
@@ -4015,6 +4021,11 @@
blas_int lwork = 3 * ((std::max)(blas_int(1),2*N));
blas_int info = 0;
+ if(mode == 'l') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::cx_select_lhp<T>)); }
+ else if(mode == 'r') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::cx_select_rhp<T>)); }
+ else if(mode == 'i') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::cx_select_iuc<T>)); }
+ else if(mode == 'o') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::cx_select_ouc<T>)); }
+
podarray<eT> alpha(A.n_rows);
podarray<eT> beta(A.n_rows);
@@ -4046,6 +4057,7 @@
arma_ignore(vsr);
arma_ignore(X_expr);
arma_ignore(Y_expr);
+ arma_ignore(mode);
arma_stop_logic_error("qz(): use of LAPACK must be enabled");
return false;
}
@@ -4166,4 +4178,248 @@
+//
+
+
+
+namespace qz_helper
+{
+
+// sgges() and dgges() require an external function with three arguments:
+// select(alpha_real, alpha_imag, beta)
+// where the eigenvalue is defined as complex(alpha_real, alpha_imag) / beta
+
+template<typename T>
+inline
+blas_int
+select_lhp(const T* x_ptr, const T* y_ptr, const T* z_ptr)
+ {
+ arma_extra_debug_sigprint();
+
+ // cout << "select_lhp(): (*x_ptr) = " << (*x_ptr) << endl;
+ // cout << "select_lhp(): (*y_ptr) = " << (*y_ptr) << endl;
+ // cout << "select_lhp(): (*z_ptr) = " << (*z_ptr) << endl;
+
+ arma_ignore(y_ptr); // ignore imaginary part
+
+ const T x = (*x_ptr);
+ const T z = (*z_ptr);
+
+ if(z == T(0)) { return blas_int(0); } // consider an infinite eig value not to lie in either lhp or rhp
+
+ return ((x/z) < T(0)) ? blas_int(1) : blas_int(0);
+ }
+
+
+
+template<typename T>
+inline
+blas_int
+select_rhp(const T* x_ptr, const T* y_ptr, const T* z_ptr)
+ {
+ arma_extra_debug_sigprint();
+
+ // cout << "select_rhp(): (*x_ptr) = " << (*x_ptr) << endl;
+ // cout << "select_rhp(): (*y_ptr) = " << (*y_ptr) << endl;
+ // cout << "select_rhp(): (*z_ptr) = " << (*z_ptr) << endl;
+
+ arma_ignore(y_ptr); // ignore imaginary part
+
+ const T x = (*x_ptr);
+ const T z = (*z_ptr);
+
+ if(z == T(0)) { return blas_int(0); } // consider an infinite eig value not to lie in either lhp or rhp
+
+ return ((x/z) > T(0)) ? blas_int(1) : blas_int(0);
+ }
+
+
+
+template<typename T>
+inline
+blas_int
+select_iuc(const T* x_ptr, const T* y_ptr, const T* z_ptr)
+ {
+ arma_extra_debug_sigprint();
+
+ // cout << "select_iuc(): (*x_ptr) = " << (*x_ptr) << endl;
+ // cout << "select_iuc(): (*y_ptr) = " << (*y_ptr) << endl;
+ // cout << "select_iuc(): (*z_ptr) = " << (*z_ptr) << endl;
+
+ const T x = (*x_ptr);
+ const T y = (*y_ptr);
+ const T z = (*z_ptr);
+
+ if(z == T(0)) { return blas_int(0); } // consider an infinite eig value to be outside of the unit circle
+
+ //return (std::abs(std::complex<T>(x,y) / z) < T(1)) ? blas_int(1) : blas_int(0);
+ return (std::sqrt(x*x + y*y) < std::abs(z)) ? blas_int(1) : blas_int(0);
+ }
+
+
+
+template<typename T>
+inline
+blas_int
+select_ouc(const T* x_ptr, const T* y_ptr, const T* z_ptr)
+ {
+ arma_extra_debug_sigprint();
+
+ // cout << "select_ouc(): (*x_ptr) = " << (*x_ptr) << endl;
+ // cout << "select_ouc(): (*y_ptr) = " << (*y_ptr) << endl;
+ // cout << "select_ouc(): (*z_ptr) = " << (*z_ptr) << endl;
+
+ const T x = (*x_ptr);
+ const T y = (*y_ptr);
+ const T z = (*z_ptr);
+
+ if(z == T(0))
+ {
+ return (x == T(0)) ? blas_int(0) : blas_int(1); // consider an infinite eig value to be outside of the unit circle
+ }
+
+ //return (std::abs(std::complex<T>(x,y) / z) > T(1)) ? blas_int(1) : blas_int(0);
+ return (std::sqrt(x*x + y*y) > std::abs(z)) ? blas_int(1) : blas_int(0);
+ }
+
+
+
+// cgges() and zgges() require an external function with two arguments:
+// select(alpha, beta)
+// where the complex eigenvalue is defined as (alpha / beta)
+
+template<typename T>
+inline
+blas_int
+cx_select_lhp(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr)
+ {
+ arma_extra_debug_sigprint();
+
+ // cout << "cx_select_lhp(): (*x_ptr) = " << (*x_ptr) << endl;
+ // cout << "cx_select_lhp(): (*y_ptr) = " << (*y_ptr) << endl;
+
+ const std::complex<T>& x = (*x_ptr);
+ const std::complex<T>& y = (*y_ptr);
+
+ if( (y.real() == T(0)) && (y.imag() == T(0)) ) { return blas_int(0); } // consider an infinite eig value not to lie in either lhp or rhp
+
+ return (std::real(x / y) < T(0)) ? blas_int(1) : blas_int(0);
+ }
+
+
+
+template<typename T>
+inline
+blas_int
+cx_select_rhp(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr)
+ {
+ arma_extra_debug_sigprint();
+
+ // cout << "cx_select_rhp(): (*x_ptr) = " << (*x_ptr) << endl;
+ // cout << "cx_select_rhp(): (*y_ptr) = " << (*y_ptr) << endl;
+
+ const std::complex<T>& x = (*x_ptr);
+ const std::complex<T>& y = (*y_ptr);
+
+ if( (y.real() == T(0)) && (y.imag() == T(0)) ) { return blas_int(0); } // consider an infinite eig value not to lie in either lhp or rhp
+
+ return (std::real(x / y) > T(0)) ? blas_int(1) : blas_int(0);
+ }
+
+
+
+template<typename T>
+inline
+blas_int
+cx_select_iuc(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr)
+ {
+ arma_extra_debug_sigprint();
+
+ // cout << "cx_select_iuc(): (*x_ptr) = " << (*x_ptr) << endl;
+ // cout << "cx_select_iuc(): (*y_ptr) = " << (*y_ptr) << endl;
+
+ const std::complex<T>& x = (*x_ptr);
+ const std::complex<T>& y = (*y_ptr);
+
+ if( (y.real() == T(0)) && (y.imag() == T(0)) ) { return blas_int(0); } // consider an infinite eig value to be outside of the unit circle
+
+ return (std::abs(x / y) < T(1)) ? blas_int(1) : blas_int(0);
+ }
+
+
+
+template<typename T>
+inline
+blas_int
+cx_select_ouc(const std::complex<T>* x_ptr, const std::complex<T>* y_ptr)
+ {
+ arma_extra_debug_sigprint();
+
+ // cout << "cx_select_ouc(): (*x_ptr) = " << (*x_ptr) << endl;
+ // cout << "cx_select_ouc(): (*y_ptr) = " << (*y_ptr) << endl;
+
+ const std::complex<T>& x = (*x_ptr);
+ const std::complex<T>& y = (*y_ptr);
+
+ if( (y.real() == T(0)) && (y.imag() == T(0)) )
+ {
+ return ((x.real() == T(0)) && (x.imag() == T(0))) ? blas_int(0) : blas_int(1); // consider an infinite eig value to be outside of the unit circle
+ }
+
+ return (std::abs(x / y) > T(1)) ? blas_int(1) : blas_int(0);
+ }
+
+
+
+// need to do shenanigans with pointers due to:
+// - we're using LAPACK ?gges() defined to expect pointer-to-function to be passed as pointer-to-object
+// - explicit casting between pointer-to-function and pointer-to-object is a non-standard extension in C
+// - the extension is essentially mandatory on POSIX systems
+// - some compilers will complain about the extension in pedantic mode
+
+template<typename T>
+inline
+void_ptr
+ptr_cast(blas_int (*function)(const T*, const T*, const T*))
+ {
+ union converter
+ {
+ blas_int (*fn)(const T*, const T*, const T*);
+ void_ptr obj;
+ };
+
+ converter tmp;
+
+ tmp.obj = 0;
+ tmp.fn = function;
+
+ return tmp.obj;
+ }
+
+
+
+template<typename T>
+inline
+void_ptr
+ptr_cast(blas_int (*function)(const std::complex<T>*, const std::complex<T>*))
+ {
+ union converter
+ {
+ blas_int (*fn)(const std::complex<T>*, const std::complex<T>*);
+ void_ptr obj;
+ };
+
+ converter tmp;
+
+ tmp.obj = 0;
+ tmp.fn = function;
+
+ return tmp.obj;
+ }
+
+
+
+} // end of namespace qz_helper
+
+
//! @}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/fn_elem.hpp new/armadillo-7.500.0/include/armadillo_bits/fn_elem.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/fn_elem.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/fn_elem.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -441,6 +441,12 @@
//
+//
+// TODO: arg (C++11)
+
+
+
+//
// square
template<typename T1>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/fn_qz.hpp new/armadillo-7.500.0/include/armadillo_bits/fn_qz.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/fn_qz.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/fn_qz.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -1,4 +1,4 @@
-// Copyright (C) 2015 National ICT Australia (NICTA)
+// Copyright (C) 2015-2016 National ICT Australia (NICTA)
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -30,12 +30,17 @@
Mat<typename T1::elem_type>& Q,
Mat<typename T1::elem_type>& Z,
const Base& A_expr,
- const Base& B_expr
+ const Base& B_expr,
+ const char* select = "none"
)
{
arma_extra_debug_sigprint();
- const bool status = auxlib::qz(AA, BB, Q, Z, A_expr.get_ref(), B_expr.get_ref());
+ const char sig = (select != NULL) ? select[0] : char(0);
+
+ arma_debug_check( ( (sig != 'n') && (sig != 'l') && (sig != 'r') && (sig != 'i') && (sig != 'o') ), "qz(): unknown select form" );
+
+ const bool status = auxlib::qz(AA, BB, Q, Z, A_expr.get_ref(), B_expr.get_ref(), sig);
if(status == false)
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/operator_cube_times.hpp new/armadillo-7.500.0/include/armadillo_bits/operator_cube_times.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/operator_cube_times.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/operator_cube_times.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -1,4 +1,4 @@
-// Copyright (C) 2008-2010 National ICT Australia (NICTA)
+// Copyright (C) 2008-2016 National ICT Australia (NICTA)
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -80,5 +80,37 @@
}
+
+template
+arma_inline
+Cube<eT>
+operator*
+ (
+ const subview_cube_each1<eT>& X,
+ const Base& Y
+ )
+ {
+ arma_extra_debug_sigprint();
+
+ return subview_cube_each1_aux::operator_times(X, Y.get_ref());
+ }
+
+
+
+template
+arma_inline
+Cube<eT>
+operator*
+ (
+ const Base& X,
+ const subview_cube_each1<eT>& Y
+ )
+ {
+ arma_extra_debug_sigprint();
+
+ return subview_cube_each1_aux::operator_times(X.get_ref(), Y);
+ }
+
+
//! @}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/subview_cube_each_bones.hpp new/armadillo-7.500.0/include/armadillo_bits/subview_cube_each_bones.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/subview_cube_each_bones.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/subview_cube_each_bones.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -1,4 +1,4 @@
-// Copyright (C) 2015 National ICT Australia (NICTA)
+// Copyright (C) 2015-2016 National ICT Australia (NICTA)
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -56,6 +56,7 @@
template<typename T1> inline void operator-= (const Base& x);
template<typename T1> inline void operator%= (const Base& x);
template<typename T1> inline void operator/= (const Base& x);
+ template<typename T1> inline void operator*= (const Base& x);
private:
@@ -116,6 +117,12 @@
template
static inline Cube<eT> operator_div(const Base& X, const subview_cube_each1<eT>& Y);
+
+ template
+ static inline Cube<eT> operator_times(const subview_cube_each1<eT>& X,const Base& Y);
+
+ template
+ static inline Cube<eT> operator_times(const Base& X, const subview_cube_each1<eT>& Y);
};
@@ -141,6 +148,8 @@
template
static inline Cube<eT> operator_div(const Base& X, const subview_cube_each2& Y);
+
+ // TODO: operator_times
};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/subview_cube_each_meat.hpp new/armadillo-7.500.0/include/armadillo_bits/subview_cube_each_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/subview_cube_each_meat.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/subview_cube_each_meat.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -1,4 +1,4 @@
-// Copyright (C) 2015 National ICT Australia (NICTA)
+// Copyright (C) 2015-2016 National ICT Australia (NICTA)
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -207,6 +207,21 @@
+template<typename eT>
+template<typename T1>
+inline
+void
+subview_cube_each1<eT>::operator*= (const Base& in)
+ {
+ arma_extra_debug_sigprint();
+
+ Cube<eT>& C = access::rw(subview_cube_each_common<eT>::P);
+
+ C = C.each_slice() * in.get_ref();
+ }
+
+
+
//
//
// subview_cube_each2
@@ -662,6 +677,68 @@
}
return out;
+ }
+
+
+
+template
+inline
+Cube<eT>
+subview_cube_each1_aux::operator_times
+ (
+ const subview_cube_each1<eT>& X,
+ const Base& Y
+ )
+ {
+ arma_extra_debug_sigprint();
+
+ const Cube<eT>& C = X.P;
+
+ const unwrap<T2> tmp(Y.get_ref());
+ const Mat<eT>& M = tmp.M;
+
+ Cube<eT> out(C.n_rows, M.n_cols, C.n_slices);
+
+ for(uword i=0; i < C.n_slices; ++i)
+ {
+ Mat<eT> out_slice( out.slice_memptr(i), C.n_rows, M.n_cols, false, true);
+ const Mat<eT> C_slice(const_cast(C.slice_memptr(i)), C.n_rows, C.n_cols, false, true);
+
+ out_slice = C_slice * M;
+ }
+
+ return out;
+ }
+
+
+
+template
+inline
+Cube<eT>
+subview_cube_each1_aux::operator_times
+ (
+ const Base& X,
+ const subview_cube_each1<eT>& Y
+ )
+ {
+ arma_extra_debug_sigprint();
+
+ const unwrap<T1> tmp(X.get_ref());
+ const Mat<eT>& M = tmp.M;
+
+ const Cube<eT>& C = Y.P;
+
+ Cube<eT> out(M.n_rows, C.n_cols, C.n_slices);
+
+ for(uword i=0; i < C.n_slices; ++i)
+ {
+ Mat<eT> out_slice( out.slice_memptr(i), M.n_rows, C.n_cols, false, true);
+ const Mat<eT> C_slice(const_cast(C.slice_memptr(i)), C.n_rows, C.n_cols, false, true);
+
+ out_slice = M * C_slice;
+ }
+
+ return out;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/include/armadillo_bits/subview_elem1_meat.hpp new/armadillo-7.500.0/include/armadillo_bits/subview_elem1_meat.hpp
--- old/armadillo-7.400.3/include/armadillo_bits/subview_elem1_meat.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/include/armadillo_bits/subview_elem1_meat.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -27,6 +27,8 @@
, a(in_a)
{
arma_extra_debug_sigprint();
+
+ // TODO: refactor to unwrap 'in_a' instead of storing a ref to it; this will allow removal of carrying T1 around and repetition of size checks
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/armadillo-7.400.3/mex_interface/armaMex.hpp new/armadillo-7.500.0/mex_interface/armaMex.hpp
--- old/armadillo-7.400.3/mex_interface/armaMex.hpp 2016-06-16 18:16:04.000000000 +0200
+++ new/armadillo-7.500.0/mex_interface/armaMex.hpp 2016-06-16 18:16:06.000000000 +0200
@@ -362,8 +362,8 @@
return Cube<double>();
}
}
-
-
+
+
// Get complex cube from Matlab/Octave
inline
cx_cube
@@ -389,8 +389,7 @@
return cx_cube();
}
}
-
-
+
// return real valued cube to Matlab/Octave
template<class Type>
inline
@@ -403,7 +402,7 @@
std::memcpy(dst_pointer, src_pointer, sizeof(Type)*armaCube.n_elem);
}
-
+
// Return double real valued cube to Matlab/Octave
inline
void
@@ -415,7 +414,7 @@
std::memcpy(dst_pointer, src_pointer, sizeof(double)*armaCube.n_elem);
}
-
+
// Return imaginary valued cube to Matlab/Octave.
template<class Type>
inline
@@ -428,7 +427,7 @@
std::memcpy(dst_pointer, src_pointer, sizeof(Type)*armaCube.n_elem);
}
-
+
// Return double imaginary valued matrix to Matlab/Octave
inline
void
@@ -574,8 +573,8 @@
return SpMat<double>(locations, values, m, n, sort_locations);
}
}
-
-
+
+
// Get imaginary sparse matrix from Matlab/Octave.
template<class Type>
inline
@@ -694,8 +693,8 @@
return SpMat<double>(locations, values, m, n, sort_locations);
}
}
-
-
+
+
// Return sparse matrix to matlab
inline
void