diff armadillo-3.900.4/include/armadillo_bits/injector_meat.hpp @ 49:1ec0e2823891

Switch to using subrepo copies of qm-dsp, nnls-chroma, vamp-plugin-sdk; update Armadillo version; assume build without external BLAS/LAPACK
author Chris Cannam
date Thu, 13 Jun 2013 10:25:24 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/armadillo-3.900.4/include/armadillo_bits/injector_meat.hpp	Thu Jun 13 10:25:24 2013 +0100
@@ -0,0 +1,584 @@
+// Copyright (C) 2010 NICTA (www.nicta.com.au)
+// Copyright (C) 2010 Conrad Sanderson
+// 
+// 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/.
+
+
+//! \addtogroup injector
+//! @{
+
+
+
+template<typename eT>
+inline
+mat_injector_row<eT>::mat_injector_row()
+  : n_cols(0)
+  {
+  arma_extra_debug_sigprint();
+  
+  A.set_size( podarray_prealloc_n_elem::val );
+  }
+
+
+
+template<typename eT>
+inline
+void
+mat_injector_row<eT>::insert(const eT val) const
+  {
+  arma_extra_debug_sigprint();
+  
+  if(n_cols < A.n_elem)
+    {
+    A[n_cols] = val;
+    ++n_cols;
+    }
+  else
+    {
+    B.set_size(2 * A.n_elem);
+    
+    arrayops::copy(B.memptr(), A.memptr(), n_cols);
+    
+    B[n_cols] = val;
+    ++n_cols;
+    
+    std::swap( access::rw(A.mem),    access::rw(B.mem)    );
+    std::swap( access::rw(A.n_elem), access::rw(B.n_elem) );
+    }
+  }
+
+
+
+//
+//
+//
+
+
+
+template<typename T1>
+inline
+mat_injector<T1>::mat_injector(T1& in_X, const typename mat_injector<T1>::elem_type val)
+  : X(in_X)
+  , n_rows(1)
+  {
+  arma_extra_debug_sigprint();
+  
+  typedef typename mat_injector<T1>::elem_type eT;
+  
+  AA = new podarray< mat_injector_row<eT>* >;
+  BB = new podarray< mat_injector_row<eT>* >;
+  
+  podarray< mat_injector_row<eT>* >& A = *AA;
+  
+  A.set_size(n_rows);
+  
+  for(uword row=0; row<n_rows; ++row)
+    {
+    A[row] = new mat_injector_row<eT>;
+    }
+  
+  (*(A[0])).insert(val);
+  }
+
+
+
+template<typename T1>
+inline
+mat_injector<T1>::mat_injector(T1& in_X, const injector_end_of_row<>& x)
+  : X(in_X)
+  , n_rows(1)
+  {
+  arma_extra_debug_sigprint();
+  arma_ignore(x);
+  
+  typedef typename mat_injector<T1>::elem_type eT;
+  
+  AA = new podarray< mat_injector_row<eT>* >;
+  BB = new podarray< mat_injector_row<eT>* >;
+  
+  podarray< mat_injector_row<eT>* >& A = *AA;
+  
+  A.set_size(n_rows);
+  
+  for(uword row=0; row<n_rows; ++row)
+    {
+    A[row] = new mat_injector_row<eT>;
+    }
+  
+  (*this).end_of_row();
+  }
+
+
+
+template<typename T1>
+inline
+mat_injector<T1>::~mat_injector()
+  {
+  arma_extra_debug_sigprint();
+  
+  typedef typename mat_injector<T1>::elem_type eT;
+  
+  podarray< mat_injector_row<eT>* >& A = *AA;
+  
+  if(n_rows > 0)
+    {
+    uword max_n_cols = (*(A[0])).n_cols;
+    
+    for(uword row=1; row<n_rows; ++row)
+      {
+      const uword n_cols = (*(A[row])).n_cols;
+      
+      if(max_n_cols < n_cols)
+        {
+        max_n_cols = n_cols;
+        }
+      }
+    
+    const uword max_n_rows = ((*(A[n_rows-1])).n_cols == 0) ? n_rows-1 : n_rows;
+    
+    if(is_Mat_only<T1>::value == true)
+      {
+      X.set_size(max_n_rows, max_n_cols);
+      
+      for(uword row=0; row<max_n_rows; ++row)
+        {
+        const uword n_cols = (*(A[row])).n_cols;
+        
+        for(uword col=0; col<n_cols; ++col)
+          {
+          X.at(row,col) = (*(A[row])).A[col];
+          }
+        
+        for(uword col=n_cols; col<max_n_cols; ++col)
+          {
+          X.at(row,col) = eT(0);
+          }
+        }
+      }
+    else
+    if(is_Row<T1>::value == true)
+      {
+      arma_debug_check( (max_n_rows > 1), "matrix initialisation: incompatible dimensions" );
+      
+      const uword n_cols = (*(A[0])).n_cols;
+      
+      X.set_size(1, n_cols);
+      
+      arrayops::copy( X.memptr(), (*(A[0])).A.memptr(), n_cols );
+      }
+    else
+    if(is_Col<T1>::value == true)
+      {
+      const bool is_vec = ( (max_n_rows == 1) || (max_n_cols == 1) );
+      
+      arma_debug_check( (is_vec == false), "matrix initialisation: incompatible dimensions" );
+      
+      const uword n_elem = (std::max)(max_n_rows, max_n_cols);
+      
+      X.set_size(n_elem, 1);
+      
+      uword i = 0;
+      for(uword row=0; row<max_n_rows; ++row)
+        {
+        const uword n_cols = (*(A[0])).n_cols;
+        
+        for(uword col=0; col<n_cols; ++col)
+          {
+          X[i] = (*(A[row])).A[col];
+          ++i;
+          }
+        
+        for(uword col=n_cols; col<max_n_cols; ++col)
+          {
+          X[i] = eT(0);
+          ++i;
+          }
+        }
+      }
+    }
+  
+  for(uword row=0; row<n_rows; ++row)
+    {
+    delete A[row];
+    }
+    
+  delete AA;
+  delete BB;
+  }
+
+
+
+template<typename T1>
+inline
+void
+mat_injector<T1>::insert(const typename mat_injector<T1>::elem_type val) const
+  {
+  arma_extra_debug_sigprint();
+  
+  typedef typename mat_injector<T1>::elem_type eT;
+  
+  podarray< mat_injector_row<eT>* >& A = *AA;
+  
+  (*(A[n_rows-1])).insert(val);
+  }
+
+
+
+
+template<typename T1>
+inline
+void
+mat_injector<T1>::end_of_row() const
+  {
+  arma_extra_debug_sigprint();
+  
+  typedef typename mat_injector<T1>::elem_type eT;
+  
+  podarray< mat_injector_row<eT>* >& A = *AA;
+  podarray< mat_injector_row<eT>* >& B = *BB;
+  
+  B.set_size( n_rows+1 );
+  
+  arrayops::copy(B.memptr(), A.memptr(), n_rows);
+  
+  for(uword row=n_rows; row<(n_rows+1); ++row)
+    {
+    B[row] = new mat_injector_row<eT>;
+    }
+  
+  std::swap(AA, BB);
+  
+  n_rows += 1;
+  }
+
+
+
+template<typename T1>
+arma_inline
+const mat_injector<T1>&
+operator<<(const mat_injector<T1>& ref, const typename mat_injector<T1>::elem_type val)
+  {
+  arma_extra_debug_sigprint();
+  
+  ref.insert(val);
+  
+  return ref;
+  }
+
+
+
+template<typename T1>
+arma_inline
+const mat_injector<T1>&
+operator<<(const mat_injector<T1>& ref, const injector_end_of_row<>& x)
+  {
+  arma_extra_debug_sigprint();
+  arma_ignore(x);
+  
+  ref.end_of_row();
+  
+  return ref;
+  }
+
+
+
+//// using a mixture of operator << and , doesn't work yet
+//// e.g. A << 1, 2, 3 << endr
+//// in the above "3 << endr" requires special handling.
+//// similarly, special handling is necessary for "endr << 3"
+//// 
+// template<typename T1>
+// arma_inline
+// const mat_injector<T1>&
+// operator,(const mat_injector<T1>& ref, const typename mat_injector<T1>::elem_type val)
+//   {
+//   arma_extra_debug_sigprint();
+//   
+//   ref.insert(val);
+//   
+//   return ref;
+//   }
+
+
+
+// template<typename T1>
+// arma_inline
+// const mat_injector<T1>&
+// operator,(const mat_injector<T1>& ref, const injector_end_of_row<>& x)
+//   {
+//   arma_extra_debug_sigprint();
+//   arma_ignore(x);
+//   
+//   ref.end_of_row();
+//   
+//   return ref;
+//   }
+
+
+
+
+//
+//
+//
+
+
+
+template<typename oT>
+inline
+field_injector_row<oT>::field_injector_row()
+  : n_cols(0)
+  {
+  arma_extra_debug_sigprint();
+  
+  AA = new field<oT>;
+  BB = new field<oT>;
+  
+  field<oT>& A = *AA;
+  
+  A.set_size( field_prealloc_n_elem::val );
+  }
+
+
+
+template<typename oT>
+inline
+field_injector_row<oT>::~field_injector_row()
+  {
+  arma_extra_debug_sigprint();
+  
+  delete AA;
+  delete BB;
+  }
+
+
+
+template<typename oT>
+inline
+void
+field_injector_row<oT>::insert(const oT& val) const
+  {
+  arma_extra_debug_sigprint();
+  
+  field<oT>& A = *AA;
+  field<oT>& B = *BB;
+  
+  if(n_cols < A.n_elem)
+    {
+    A[n_cols] = val;
+    ++n_cols;
+    }
+  else
+    {
+    B.set_size(2 * A.n_elem);
+    
+    for(uword i=0; i<n_cols; ++i)
+      {
+      B[i] = A[i];
+      }
+    
+    B[n_cols] = val;
+    ++n_cols;
+    
+    std::swap(AA, BB);
+    }
+  }
+
+
+
+//
+//
+//
+
+
+template<typename T1>
+inline
+field_injector<T1>::field_injector(T1& in_X, const typename field_injector<T1>::object_type& val)
+  : X(in_X)
+  , n_rows(1)
+  {
+  arma_extra_debug_sigprint();
+  
+  typedef typename field_injector<T1>::object_type oT;
+  
+  AA = new podarray< field_injector_row<oT>* >;
+  BB = new podarray< field_injector_row<oT>* >;
+  
+  podarray< field_injector_row<oT>* >& A = *AA;
+  
+  A.set_size(n_rows);
+  
+  for(uword row=0; row<n_rows; ++row)
+    {
+    A[row] = new field_injector_row<oT>;
+    }
+  
+  (*(A[0])).insert(val);
+  }
+
+
+
+template<typename T1>
+inline
+field_injector<T1>::field_injector(T1& in_X, const injector_end_of_row<>& x)
+  : X(in_X)
+  , n_rows(1)
+  {
+  arma_extra_debug_sigprint();
+  arma_ignore(x);
+  
+  typedef typename field_injector<T1>::object_type oT;
+  
+  AA = new podarray< field_injector_row<oT>* >;
+  BB = new podarray< field_injector_row<oT>* >;
+  
+  podarray< field_injector_row<oT>* >& A = *AA;
+  
+  A.set_size(n_rows);
+  
+  for(uword row=0; row<n_rows; ++row)
+    {
+    A[row] = new field_injector_row<oT>;
+    }
+  
+  (*this).end_of_row();
+  }
+
+
+
+template<typename T1>
+inline
+field_injector<T1>::~field_injector()
+  {
+  arma_extra_debug_sigprint();
+  
+  typedef typename field_injector<T1>::object_type oT;
+  
+  podarray< field_injector_row<oT>* >& A = *AA;
+  
+  if(n_rows > 0)
+    {
+    uword max_n_cols = (*(A[0])).n_cols;
+    
+    for(uword row=1; row<n_rows; ++row)
+      {
+      const uword n_cols = (*(A[row])).n_cols;
+      
+      if(max_n_cols < n_cols)
+        {
+        max_n_cols = n_cols;
+        }
+      }
+      
+    const uword max_n_rows = ((*(A[n_rows-1])).n_cols == 0) ? n_rows-1 : n_rows;
+    
+    X.set_size(max_n_rows, max_n_cols);
+    
+    for(uword row=0; row<max_n_rows; ++row)
+      {
+      const uword n_cols = (*(A[row])).n_cols;
+      
+      for(uword col=0; col<n_cols; ++col)
+        {
+        const field<oT>& tmp = *((*(A[row])).AA);
+        X.at(row,col) = tmp[col];
+        }
+      
+      for(uword col=n_cols; col<max_n_cols; ++col)
+        {
+        X.at(row,col) = oT();
+        }
+      }
+    }
+  
+  
+  for(uword row=0; row<n_rows; ++row)
+    {
+    delete A[row];
+    }
+  
+  delete AA;
+  delete BB;
+  }
+
+
+
+template<typename T1>
+inline
+void
+field_injector<T1>::insert(const typename field_injector<T1>::object_type& val) const
+  {
+  arma_extra_debug_sigprint();
+  
+  typedef typename field_injector<T1>::object_type oT;
+  
+  podarray< field_injector_row<oT>* >& A = *AA;
+  
+  (*(A[n_rows-1])).insert(val);
+  }
+
+
+
+
+template<typename T1>
+inline
+void
+field_injector<T1>::end_of_row() const
+  {
+  arma_extra_debug_sigprint();
+  
+  typedef typename field_injector<T1>::object_type oT;
+  
+  podarray< field_injector_row<oT>* >& A = *AA;
+  podarray< field_injector_row<oT>* >& B = *BB;
+  
+  B.set_size( n_rows+1 );
+  
+  for(uword row=0; row<n_rows; ++row)
+    {
+    B[row] = A[row];
+    }
+  
+  for(uword row=n_rows; row<(n_rows+1); ++row)
+    {
+    B[row] = new field_injector_row<oT>;
+    }
+  
+  std::swap(AA, BB);
+  
+  n_rows += 1;
+  }
+
+
+
+template<typename T1>
+arma_inline
+const field_injector<T1>&
+operator<<(const field_injector<T1>& ref, const typename field_injector<T1>::object_type& val)
+  {
+  arma_extra_debug_sigprint();
+  
+  ref.insert(val);
+  
+  return ref;
+  }
+
+
+
+template<typename T1>
+arma_inline
+const field_injector<T1>&
+operator<<(const field_injector<T1>& ref, const injector_end_of_row<>& x)
+  {
+  arma_extra_debug_sigprint();
+  arma_ignore(x);
+  
+  ref.end_of_row();
+  
+  return ref;
+  }
+
+
+
+//! @}