[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