[mlpack-git] master: Update license information for backported Armadillo code. (7783497)
gitdub at mlpack.org
gitdub at mlpack.org
Mon Jun 20 09:03:36 EDT 2016
Repository : https://github.com/mlpack/mlpack
On branch : master
Link : https://github.com/mlpack/mlpack/compare/779556fed748819a18cc898d9a6f69900740ef23...20b4b2736cedb8c44c03e2af3f67f8a5af00927c
>---------------------------------------------------------------
commit 77834972a9720418efe089d5bfb1569fac2ddf80
Author: Ryan Curtin <ryan at ratml.org>
Date: Mon Jun 20 09:01:17 2016 -0400
Update license information for backported Armadillo code.
Also remove backports that we no longer need.
>---------------------------------------------------------------
77834972a9720418efe089d5bfb1569fac2ddf80
src/mlpack/core/arma_extend/CMakeLists.txt | 4 -
src/mlpack/core/arma_extend/Mat_extra_bones.hpp | 10 +
src/mlpack/core/arma_extend/Mat_extra_meat.hpp | 10 +
src/mlpack/core/arma_extend/README.md | 23 ++
src/mlpack/core/arma_extend/SpMat_extra_bones.hpp | 40 +--
src/mlpack/core/arma_extend/SpMat_extra_meat.hpp | 323 +---------------------
src/mlpack/core/arma_extend/arma_extend.hpp | 4 -
src/mlpack/core/arma_extend/fn_ind2sub.hpp | 8 +
src/mlpack/core/arma_extend/hdf5_misc.hpp | 11 +
src/mlpack/core/arma_extend/operator_minus.hpp | 10 +
10 files changed, 95 insertions(+), 348 deletions(-)
diff --git a/src/mlpack/core/arma_extend/CMakeLists.txt b/src/mlpack/core/arma_extend/CMakeLists.txt
index db0c221..3eba508 100644
--- a/src/mlpack/core/arma_extend/CMakeLists.txt
+++ b/src/mlpack/core/arma_extend/CMakeLists.txt
@@ -10,10 +10,6 @@ set(SOURCES
op_ccov_meat.hpp
op_ccov_proto.hpp
operator_minus.hpp
- promote_type.hpp
- restrictors.hpp
- traits.hpp
- typedef.hpp
SpMat_extra_bones.hpp
SpMat_extra_meat.hpp
Mat_extra_bones.hpp
diff --git a/src/mlpack/core/arma_extend/Mat_extra_bones.hpp b/src/mlpack/core/arma_extend/Mat_extra_bones.hpp
index 433d3d4..e09f5f5 100644
--- a/src/mlpack/core/arma_extend/Mat_extra_bones.hpp
+++ b/src/mlpack/core/arma_extend/Mat_extra_bones.hpp
@@ -1,3 +1,13 @@
+// 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
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+// -------------------------------------------------------------------
+//
+// Written by Conrad Sanderson - http://conradsanderson.id.au
+// Written by Ryan Curtin
+
//! Add a serialization operator.
template<typename Archive>
void serialize(Archive& ar, const unsigned int version);
diff --git a/src/mlpack/core/arma_extend/Mat_extra_meat.hpp b/src/mlpack/core/arma_extend/Mat_extra_meat.hpp
index 17fabdc..0a6851e 100644
--- a/src/mlpack/core/arma_extend/Mat_extra_meat.hpp
+++ b/src/mlpack/core/arma_extend/Mat_extra_meat.hpp
@@ -1,3 +1,13 @@
+// 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
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+// -------------------------------------------------------------------
+//
+// Written by Conrad Sanderson - http://conradsanderson.id.au
+// Written by Ryan Curtin
+
// Add a serialization operator.
template<typename eT>
template<typename Archive>
diff --git a/src/mlpack/core/arma_extend/README.md b/src/mlpack/core/arma_extend/README.md
new file mode 100644
index 0000000..f24b955
--- /dev/null
+++ b/src/mlpack/core/arma_extend/README.md
@@ -0,0 +1,23 @@
+The files in this directory are taken from newer versions of Armadillo in order
+to still support older versions of Armadillo. Therefore some files are licensed
+under the Mozilla Public License v2.0 (MPL2).
+
+These are the files under the MPL:
+
+ - fn_ind2sub.hpp
+ - SpMat_extra_bones.hpp
+ - SpMat_extra_meat.hpp
+ - operator_minus.hpp
+ - hdf5_misc.hpp
+ - Mat_extra_bones.hpp
+ - Mat_extra_meat.hpp
+
+If you want a copy of mlpack without MPL code included, you will need to
+
+ * Remove all of the above-listed files.
+ * Remove the above-listed files from CMakeLists.txt.
+ * Remove the above-listed files from arma_extend.hpp.
+ * Modify the root CMakeLists.txt to require a sufficiently new version of
+ * Armadillo that none of the above backports are required, by changing the line
+ "find_package(Armadillo x.yyy.z REQUIRED)" to reference a sufficiently new
+ version instead of x.yyy.z.
diff --git a/src/mlpack/core/arma_extend/SpMat_extra_bones.hpp b/src/mlpack/core/arma_extend/SpMat_extra_bones.hpp
index 6a84ddc..d3c18de 100644
--- a/src/mlpack/core/arma_extend/SpMat_extra_bones.hpp
+++ b/src/mlpack/core/arma_extend/SpMat_extra_bones.hpp
@@ -1,39 +1,21 @@
+// Copyright (C) 2008-2015 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
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+// -------------------------------------------------------------------
+//
+// Written by Conrad Sanderson - http://conradsanderson.id.au
+// Written by Ryan Curtin
+// Written by Matthew Amidon
+
/**
- * @file SpMat_extra_bones.hpp
- * @author Ryan Curtin
- *
* Add a batch constructor for SpMat, if the version is older than 3.810.0, and
* also a serialize() function for Armadillo.
*/
template<typename Archive>
void serialize(Archive& ar, const unsigned int version);
-#if ARMA_VERSION_MAJOR == 3 && ARMA_VERSION_MINOR < 810
-template<typename T1, typename T2>
-inline SpMat(
- const Base<uword, T1>& locations,
- const Base<eT, T2>& values,
- const bool sort_locations = true);
-
-template<typename T1, typename T2>
-inline SpMat(
- const Base<uword, T1>& locations,
- const Base<eT, T2>& values,
- const uword n_rows,
- const uword n_cols,
- const bool sort_locations = true);
-#endif
-
-#if ARMA_VERSION_MAJOR == 3 && ARMA_VERSION_MINOR < 920
-template<typename T1, typename T2, typename T3>
-inline SpMat(
- const Base<uword, T1>& rowind,
- const Base<uword, T2>& colptr,
- const Base<eT, T3>& values,
- const uword n_rows,
- const uword n_cols);
-#endif
-
/*
* Extra functions for SpMat<eT>
* Adding definition of row_col_iterator to generalize with Mat<eT>::row_col_iterator
diff --git a/src/mlpack/core/arma_extend/SpMat_extra_meat.hpp b/src/mlpack/core/arma_extend/SpMat_extra_meat.hpp
index 341aec4..6035b09 100644
--- a/src/mlpack/core/arma_extend/SpMat_extra_meat.hpp
+++ b/src/mlpack/core/arma_extend/SpMat_extra_meat.hpp
@@ -1,10 +1,16 @@
+// Copyright (C) 2008-2015 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
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+// -------------------------------------------------------------------
+//
+// Written by Conrad Sanderson - http://conradsanderson.id.au
+// Written by Ryan Curtin
+// Written by Matthew Amidon
+
/**
- * @file SpMat_extra_meat.hpp
- * @author Ryan Curtin
- *
- * Take the Armadillo batch sparse matrix constructor function from newer
- * Armadillo versions and port it to versions earlier than 3.810.0, and also add
- * a serialization function.
+ * Add a serialization function.
*/
template<typename eT>
template<typename Archive>
@@ -37,311 +43,6 @@ void SpMat<eT>::serialize(Archive& ar, const unsigned int /* version */)
ar & make_array(access::rwp(col_ptrs), n_cols + 1);
}
-#if ARMA_VERSION_MAJOR == 3 && ARMA_VERSION_MINOR < 810
-
-//! Insert a large number of values at once.
-//! locations.row[0] should be row indices, locations.row[1] should be column indices,
-//! and values should be the corresponding values.
-//! If sort_locations is false, then it is assumed that the locations and values
-//! are already sorted in column-major ordering.
-template<typename eT>
-template<typename T1, typename T2>
-inline
-SpMat<eT>::SpMat(const Base<uword,T1>& locations_expr, const Base<eT,T2>& vals_expr, const bool sort_locations)
- : n_rows(0)
- , n_cols(0)
- , n_elem(0)
- , n_nonzero(0)
- , vec_state(0)
- , values(NULL)
- , row_indices(NULL)
- , col_ptrs(NULL)
- {
- arma_extra_debug_sigprint_this(this);
-
- const unwrap<T1> locs_tmp( locations_expr.get_ref() );
- const Mat<uword>& locs = locs_tmp.M;
-
- const unwrap<T2> vals_tmp( vals_expr.get_ref() );
- const Mat<eT>& vals = vals_tmp.M;
-
- arma_debug_check( (vals.is_vec() == false), "SpMat::SpMat(): given 'values' object is not a vector" );
-
- arma_debug_check((locs.n_cols != vals.n_elem), "SpMat::SpMat(): number of locations is different than number of values");
-
- // If there are no elements in the list, max() will fail.
- if (locs.n_cols == 0)
- {
- init(0, 0);
- return;
- }
-
- arma_debug_check((locs.n_rows != 2), "SpMat::SpMat(): locations matrix must have two rows");
-
- // Automatically determine size (and check if it's sorted).
- uvec bounds = arma::max(locs, 1);
- init(bounds[0] + 1, bounds[1] + 1);
-
- // Resize to correct number of elements.
- mem_resize(vals.n_elem);
-
- // Reset column pointers to zero.
- arrayops::inplace_set(access::rwp(col_ptrs), uword(0), n_cols + 1);
-
- bool actually_sorted = true;
- if(sort_locations == true)
- {
- // sort_index() uses std::sort() which may use quicksort... so we better
- // make sure it's not already sorted before taking an O(N^2) sort penalty.
- for (uword i = 1; i < locs.n_cols; ++i)
- {
- if ((locs.at(1, i) < locs.at(1, i - 1)) || (locs.at(1, i) == locs.at(1, i - 1) && locs.at(0, i) <= locs.at(0, i - 1)))
- {
- actually_sorted = false;
- break;
- }
- }
-
- if(actually_sorted == false)
- {
- // This may not be the fastest possible implementation but it maximizes code reuse.
- Col<uword> abslocs(locs.n_cols);
-
- for (uword i = 0; i < locs.n_cols; ++i)
- {
- abslocs[i] = locs.at(1, i) * n_rows + locs.at(0, i);
- }
-
- // Now we will sort with sort_index().
- uvec sorted_indices = sort_index(abslocs); // Ascending sort.
-
- // Now we add the elements in this sorted order.
- for (uword i = 0; i < sorted_indices.n_elem; ++i)
- {
- arma_debug_check((locs.at(0, sorted_indices[i]) >= n_rows), "SpMat::SpMat(): invalid row index");
- arma_debug_check((locs.at(1, sorted_indices[i]) >= n_cols), "SpMat::SpMat(): invalid column index");
-
- access::rw(values[i]) = vals[sorted_indices[i]];
- access::rw(row_indices[i]) = locs.at(0, sorted_indices[i]);
-
- access::rw(col_ptrs[locs.at(1, sorted_indices[i]) + 1])++;
- }
- }
- }
- if( (sort_locations == false) || (actually_sorted == true) )
- {
- // Now set the values and row indices correctly.
- // Increment the column pointers in each column (so they are column "counts").
- for (uword i = 0; i < vals.n_elem; ++i)
- {
- arma_debug_check((locs.at(0, i) >= n_rows), "SpMat::SpMat(): invalid row index");
- arma_debug_check((locs.at(1, i) >= n_cols), "SpMat::SpMat(): invalid column index");
-
- // Check ordering in debug mode.
- if(i > 0)
- {
- arma_debug_check
- (
- ( (locs.at(1, i) < locs.at(1, i - 1)) || (locs.at(1, i) == locs.at(1, i - 1) && locs.at(0, i) < locs.at(0, i - 1)) ),
- "SpMat::SpMat(): out of order points; either pass sort_locations = true, or sort points in column-major ordering"
- );
- arma_debug_check((locs.at(1, i) == locs.at(1, i - 1) && locs.at(0, i) == locs.at(0, i - 1)), "SpMat::SpMat(): two identical point locations in list");
- }
-
- access::rw(values[i]) = vals[i];
- access::rw(row_indices[i]) = locs.at(0, i);
-
- access::rw(col_ptrs[locs.at(1, i) + 1])++;
- }
- }
-
- // Now fix the column pointers.
- for (uword i = 0; i <= n_cols; ++i)
- {
- access::rw(col_ptrs[i + 1]) += col_ptrs[i];
- }
- }
-
-
-
-//! Insert a large number of values at once.
-//! locations.row[0] should be row indices, locations.row[1] should be column indices,
-//! and values should be the corresponding values.
-//! If sort_locations is false, then it is assumed that the locations and values
-//! are already sorted in column-major ordering.
-//! In this constructor the size is explicitly given.
-template<typename eT>
-template<typename T1, typename T2>
-inline
-SpMat<eT>::SpMat(const Base<uword,T1>& locations_expr, const Base<eT,T2>& vals_expr, const uword in_n_rows, const uword in_n_cols, const bool sort_locations)
- : n_rows(0)
- , n_cols(0)
- , n_elem(0)
- , n_nonzero(0)
- , vec_state(0)
- , values(NULL)
- , row_indices(NULL)
- , col_ptrs(NULL)
- {
- arma_extra_debug_sigprint_this(this);
-
- init(in_n_rows, in_n_cols);
-
- const unwrap<T1> locs_tmp( locations_expr.get_ref() );
- const Mat<uword>& locs = locs_tmp.M;
-
- const unwrap<T2> vals_tmp( vals_expr.get_ref() );
- const Mat<eT>& vals = vals_tmp.M;
-
- arma_debug_check( (vals.is_vec() == false), "SpMat::SpMat(): given 'values' object is not a vector" );
-
- arma_debug_check((locs.n_rows != 2), "SpMat::SpMat(): locations matrix must have two rows");
-
- arma_debug_check((locs.n_cols != vals.n_elem), "SpMat::SpMat(): number of locations is different than number of values");
-
- // Resize to correct number of elements.
- mem_resize(vals.n_elem);
-
- // Reset column pointers to zero.
- arrayops::inplace_set(access::rwp(col_ptrs), uword(0), n_cols + 1);
-
- bool actually_sorted = true;
- if(sort_locations == true)
- {
- // sort_index() uses std::sort() which may use quicksort... so we better
- // make sure it's not already sorted before taking an O(N^2) sort penalty.
- for (uword i = 1; i < locs.n_cols; ++i)
- {
- if ((locs.at(1, i) < locs.at(1, i - 1)) || (locs.at(1, i) == locs.at(1, i - 1) && locs.at(0, i) <= locs.at(0, i - 1)))
- {
- actually_sorted = false;
- break;
- }
- }
-
- if(actually_sorted == false)
- {
- // This may not be the fastest possible implementation but it maximizes code reuse.
- Col<uword> abslocs(locs.n_cols);
-
- for (uword i = 0; i < locs.n_cols; ++i)
- {
- abslocs[i] = locs.at(1, i) * n_rows + locs.at(0, i);
- }
-
- // Now we will sort with sort_index().
- uvec sorted_indices = sort_index(abslocs); // Ascending sort.
-
- // Now we add the elements in this sorted order.
- for (uword i = 0; i < sorted_indices.n_elem; ++i)
- {
- arma_debug_check((locs.at(0, sorted_indices[i]) >= n_rows), "SpMat::SpMat(): invalid row index");
- arma_debug_check((locs.at(1, sorted_indices[i]) >= n_cols), "SpMat::SpMat(): invalid column index");
-
- access::rw(values[i]) = vals[sorted_indices[i]];
- access::rw(row_indices[i]) = locs.at(0, sorted_indices[i]);
-
- access::rw(col_ptrs[locs.at(1, sorted_indices[i]) + 1])++;
- }
- }
- }
-
- if( (sort_locations == false) || (actually_sorted == true) )
- {
- // Now set the values and row indices correctly.
- // Increment the column pointers in each column (so they are column "counts").
- for (uword i = 0; i < vals.n_elem; ++i)
- {
- arma_debug_check((locs.at(0, i) >= n_rows), "SpMat::SpMat(): invalid row index");
- arma_debug_check((locs.at(1, i) >= n_cols), "SpMat::SpMat(): invalid column index");
-
- // Check ordering in debug mode.
- if(i > 0)
- {
- arma_debug_check
- (
- ( (locs.at(1, i) < locs.at(1, i - 1)) || (locs.at(1, i) == locs.at(1, i - 1) && locs.at(0, i) < locs.at(0, i - 1)) ),
- "SpMat::SpMat(): out of order points; either pass sort_locations = true or sort points in column-major ordering"
- );
- arma_debug_check((locs.at(1, i) == locs.at(1, i - 1) && locs.at(0, i) == locs.at(0, i - 1)), "SpMat::SpMat(): two identical point locations in list");
- }
-
- access::rw(values[i]) = vals[i];
- access::rw(row_indices[i]) = locs.at(0, i);
-
- access::rw(col_ptrs[locs.at(1, i) + 1])++;
- }
- }
-
- // Now fix the column pointers.
- for (uword i = 0; i <= n_cols; ++i)
- {
- access::rw(col_ptrs[i + 1]) += col_ptrs[i];
- }
- }
-
-#endif
-
-#if ARMA_VERSION_MAJOR == 3 && ARMA_VERSION_MINOR < 920
-//! Insert a large number of values at once.
-//! Per CSC format, rowind_expr should be row indices,~
-//! colptr_expr should column ptr indices locations,
-//! and values should be the corresponding values.
-//! In this constructor the size is explicitly given.
-//! Values are assumed to be sorted, and the size~
-//! information is trusted
-template<typename eT>
-template<typename T1, typename T2, typename T3>
-inline
-SpMat<eT>::SpMat
- (
- const Base<uword,T1>& rowind_expr,
- const Base<uword,T2>& colptr_expr,
- const Base<eT, T3>& values_expr,
- const uword in_n_rows,
- const uword in_n_cols
- )
- : n_rows(0)
- , n_cols(0)
- , n_elem(0)
- , n_nonzero(0)
- , vec_state(0)
- , values(NULL)
- , row_indices(NULL)
- , col_ptrs(NULL)
- {
- arma_extra_debug_sigprint_this(this);
-
- init(in_n_rows, in_n_cols);
-
- const unwrap<T1> rowind_tmp( rowind_expr.get_ref() );
- const unwrap<T2> colptr_tmp( colptr_expr.get_ref() );
- const unwrap<T3> vals_tmp( values_expr.get_ref() );
-
- const Mat<uword>& rowind = rowind_tmp.M;
- const Mat<uword>& colptr = colptr_tmp.M;
- const Mat<eT>& vals = vals_tmp.M;
-
- arma_debug_check( (rowind.is_vec() == false), "SpMat::SpMat(): given 'rowind' object is not a vector" );
- arma_debug_check( (colptr.is_vec() == false), "SpMat::SpMat(): given 'colptr' object is not a vector" );
- arma_debug_check( (vals.is_vec() == false), "SpMat::SpMat(): given 'values' object is not a vector" );
-
- arma_debug_check( (rowind.n_elem != vals.n_elem), "SpMat::SpMat(): number of row indices is not equal to number of values" );
- arma_debug_check( (colptr.n_elem != (n_cols+1) ), "SpMat::SpMat(): number of column pointers is not equal to n_cols+1" );
-
- // Resize to correct number of elements (this also sets n_nonzero)
- mem_resize(vals.n_elem);
-
- // copy supplied values into sparse matrix -- not checked for consistency
- arrayops::copy(access::rwp(row_indices), rowind.memptr(), rowind.n_elem );
- arrayops::copy(access::rwp(col_ptrs), colptr.memptr(), colptr.n_elem );
- arrayops::copy(access::rwp(values), vals.memptr(), vals.n_elem );
-
- // important: set the sentinel as well
- access::rw(col_ptrs[n_cols + 1]) = std::numeric_limits<uword>::max();
- }
-#endif
-
#if ARMA_VERSION_MAJOR < 4 || \
(ARMA_VERSION_MAJOR == 4 && ARMA_VERSION_MINOR < 349)
template<typename eT>
diff --git a/src/mlpack/core/arma_extend/arma_extend.hpp b/src/mlpack/core/arma_extend/arma_extend.hpp
index 12765c7..088b8d8 100644
--- a/src/mlpack/core/arma_extend/arma_extend.hpp
+++ b/src/mlpack/core/arma_extend/arma_extend.hpp
@@ -53,10 +53,6 @@
namespace arma {
// u64/s64
- #include "typedef.hpp"
- #include "traits.hpp"
- #include "promote_type.hpp"
- #include "restrictors.hpp"
#include "hdf5_misc.hpp"
// ccov()
diff --git a/src/mlpack/core/arma_extend/fn_ind2sub.hpp b/src/mlpack/core/arma_extend/fn_ind2sub.hpp
index 7991b9d..cfa6ab5 100644
--- a/src/mlpack/core/arma_extend/fn_ind2sub.hpp
+++ b/src/mlpack/core/arma_extend/fn_ind2sub.hpp
@@ -1,3 +1,11 @@
+// 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
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+// -------------------------------------------------------------------
+//
+// Written by Conrad Sanderson - http://conradsanderson.id.au
#if (ARMA_VERSION_MAJOR < 6 || \
(ARMA_VERSION_MAJOR == 6 && ARMA_VERSION_MINOR < 399))
diff --git a/src/mlpack/core/arma_extend/hdf5_misc.hpp b/src/mlpack/core/arma_extend/hdf5_misc.hpp
index 83068fc..6cd42da 100644
--- a/src/mlpack/core/arma_extend/hdf5_misc.hpp
+++ b/src/mlpack/core/arma_extend/hdf5_misc.hpp
@@ -1,3 +1,14 @@
+// Copyright (C) 2012-2013 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
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+// -------------------------------------------------------------------
+//
+// Written by Conrad Sanderson - http://conradsanderson.id.au
+// Written by Ryan Curtin
+// Written by Szabolcs Horvat
+
// To hack in u64/s64 support to Armadillo when it is not compiled with
// ARMA_64BIT_WORD.
namespace hdf5_misc {
diff --git a/src/mlpack/core/arma_extend/operator_minus.hpp b/src/mlpack/core/arma_extend/operator_minus.hpp
index dc6a4f1..0e56c62 100644
--- a/src/mlpack/core/arma_extend/operator_minus.hpp
+++ b/src/mlpack/core/arma_extend/operator_minus.hpp
@@ -1,3 +1,13 @@
+// Copyright (C) 2008-2015 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
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+// -------------------------------------------------------------------
+//
+// Written by Conrad Sanderson - http://conradsanderson.id.au
+// Written by Ryan Curtin
+
// Backport unary minus operator for sparse matrices to Armadillo 4.000 and
// older.
More information about the mlpack-git
mailing list