diff --git a/docs/conf.py b/docs/conf.py index f678ec3..f67b416 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,16 +1,12 @@ # -*- coding: utf-8 -*- # -# cppmat documentation build configuration file, created by -# sphinx-quickstart on Tue Feb 28 17:10:58 2017. +# Configuration file for the Sphinx documentation builder. # -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the @@ -21,7 +17,19 @@ # sys.path.insert(0, os.path.abspath('.')) -# -- General configuration ------------------------------------------------ +# -- Project information ----------------------------------------------------- + +project = 'cppmat' +copyright = '2017, Tom de Geus' +author = 'Tom de Geus' + +# The short X.Y version +version = '' +# The full version, including alpha/beta/rc tags +release = '' + + +# -- General configuration --------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # @@ -30,7 +38,9 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.imgmath'] +extensions = [ + 'sphinx.ext.imgmath', +] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -44,20 +54,6 @@ # The master toctree document. master_doc = 'index' -# General information about the project. -project = u'cppmat' -copyright = u'2017, Tom de Geus' -author = u'Tom de Geus' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = u'' -# The full version, including alpha/beta/rc tags. -release = u'' - # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # @@ -67,22 +63,19 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path +# This pattern also affects html_static_path and html_extra_path . exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - -# -- Options for HTML output ---------------------------------------------- +# -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'default' +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -95,14 +88,24 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} -# -- Options for HTMLHelp output ------------------------------------------ + +# -- Options for HTMLHelp output --------------------------------------------- # Output file base name for HTML help builder. htmlhelp_basename = 'cppmatdoc' -# -- Options for LaTeX output --------------------------------------------- +# -- Options for LaTeX output ------------------------------------------------ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). @@ -131,7 +134,7 @@ ] -# -- Options for manual page output --------------------------------------- +# -- Options for manual page output ------------------------------------------ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). @@ -141,7 +144,7 @@ ] -# -- Options for Texinfo output ------------------------------------------- +# -- Options for Texinfo output ---------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, @@ -153,4 +156,4 @@ ] - +# -- Extension configuration ------------------------------------------------- \ No newline at end of file diff --git a/src/cppmat/cppmat.h b/src/cppmat/cppmat.h index 0228063..8329293 100644 --- a/src/cppmat/cppmat.h +++ b/src/cppmat/cppmat.h @@ -23,7 +23,7 @@ #define CPPMAT_WORLD_VERSION 0 #define CPPMAT_MAJOR_VERSION 6 -#define CPPMAT_MINOR_VERSION 2 +#define CPPMAT_MINOR_VERSION 3 #define CPPMAT_VERSION_AT_LEAST(x,y,z) \ (CPPMAT_WORLD_VERSION>x || (CPPMAT_WORLD_VERSION>=x && \ diff --git a/src/cppmat/periodic_array.cpp b/src/cppmat/periodic_array.cpp index f97ccfe..c3b9698 100644 --- a/src/cppmat/periodic_array.cpp +++ b/src/cppmat/periodic_array.cpp @@ -4,8 +4,8 @@ ================================================================================================= */ -#ifndef CPPMAT_PERIODIC_MATRIX_CPP -#define CPPMAT_PERIODIC_MATRIX_CPP +#ifndef CPPMAT_PERIODIC_ARRAY_CPP +#define CPPMAT_PERIODIC_ARRAY_CPP // ------------------------------------------------------------------------------------------------- @@ -23,7 +23,7 @@ namespace periodic { template inline array::array(const std::vector &shape) { - // store shape, and other size parameters, allocate "m_data" + // store shape, and other size parameters, allocate "mData" resize(shape); } @@ -109,36 +109,36 @@ inline void array::resize(const std::vector &shape) assert( shape.size() <= MAX_DIM ); // update number of dimensions - m_ndim = shape.size(); + mNdim = shape.size(); // initialize shape in all directions to "1" for ( size_t i = 0 ; i < MAX_DIM ; ++i ) { - m_shape [i] = 1; - m_strides[i] = 1; + mShape [i] = 1; + mStrides[i] = 1; } // initialize size - m_size = 1; + mSize = 1; // update shape/size - for ( size_t i = 0 ; i < m_ndim ; ++i ) + for ( size_t i = 0 ; i < mNdim ; ++i ) { - m_shape[i] = shape[i]; - m_size *= shape[i]; + mShape[i] = shape[i]; + mSize *= shape[i]; } // set storage strides - for ( size_t i = 0 ; i < m_ndim ; ++i ) - for ( size_t j = i+1 ; j < m_ndim ; ++j ) - m_strides[i] *= m_shape[j]; + for ( size_t i = 0 ; i < mNdim ; ++i ) + for ( size_t j = i+1 ; j < mNdim ; ++j ) + mStrides[i] *= mShape[j]; // update shape stored as integers for ( size_t i = 0 ; i < MAX_DIM ; ++i ) - m_shape_i[i] = static_cast(m_shape[i]); + mShapeI[i] = static_cast(mShape[i]); // allocate data - m_data.resize(m_size); + mData.resize(mSize); } // ------------------------------------------------------------------------------------------------- @@ -148,11 +148,11 @@ inline void array::chdim(size_t ndim) { // check that all removed dimensions are of shape 1 #ifndef NDEBUG - for ( size_t i = ndim ; i < MAX_DIM ; ++i ) assert( m_shape[i] == 1 ); + for ( size_t i = ndim ; i < MAX_DIM ; ++i ) assert( mShape[i] == 1 ); #endif // update number of dimensions - m_ndim = ndim; + mNdim = ndim; } // ------------------------------------------------------------------------------------------------- @@ -166,7 +166,7 @@ inline void array::reshape(const std::vector &shape) for ( auto &i : shape ) n *= i; - assert( n == m_size ); + assert( n == mSize ); #endif // process new shape @@ -180,7 +180,7 @@ inline void array::reshape(const std::vector &shape) template inline size_t array::size() const { - return m_size; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -188,7 +188,7 @@ inline size_t array::size() const template inline size_t array::ndim() const { - return m_ndim; + return mNdim; } // ------------------------------------------------------------------------------------------------- @@ -197,17 +197,17 @@ template inline size_t array::shape(int i) const { // check axis: (0,1,...,ndim-1) or (-1,-2,...,-ndim) - assert( i < static_cast(m_ndim) ); - assert( i >= -1 * static_cast(m_ndim) ); + assert( i < static_cast(mNdim) ); + assert( i >= -1 * static_cast(mNdim) ); // get number of dimensions as integer - int n = static_cast(m_ndim); + int n = static_cast(mNdim); // correct periodic index i = ( n + (i%n) ) % n; // return shape - return m_shape[i]; + return mShape[i]; } // ------------------------------------------------------------------------------------------------- @@ -216,10 +216,10 @@ template inline size_t array::shape(size_t i) const { // check axis: (0,1,...,ndim-1) - assert( i < m_ndim ); + assert( i < mNdim ); // return shape - return m_shape[i]; + return mShape[i]; } // ------------------------------------------------------------------------------------------------- @@ -227,9 +227,9 @@ inline size_t array::shape(size_t i) const template inline std::vector array::shape() const { - std::vector ret(m_ndim); + std::vector ret(mNdim); - for ( size_t i = 0 ; i < m_ndim ; ++i ) ret[i] = m_shape[i]; + std::copy(std::begin(mShape), std::begin(mShape)+mNdim, ret.begin()); return ret; } @@ -239,13 +239,12 @@ inline std::vector array::shape() const template inline std::vector array::strides(bool bytes) const { - std::vector ret(m_ndim); + std::vector ret(mNdim); - for ( size_t i = 0 ; i < m_ndim ; ++i ) - ret[i] = m_strides[i]; + std::copy(std::begin(mStrides), std::begin(mStrides)+mNdim, ret.begin()); if ( bytes ) - for ( size_t i = 0 ; i < m_ndim ; ++i ) + for ( size_t i = 0 ; i < mNdim ; ++i ) ret[i] *= sizeof(X); return ret; @@ -258,9 +257,9 @@ inline std::vector array::strides(bool bytes) const template inline X& array::operator[](size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -268,9 +267,9 @@ inline X& array::operator[](size_t i) template inline const X& array::operator[](size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ================================================================================================= @@ -280,13 +279,13 @@ inline const X& array::operator[](size_t i) const template inline X& array::operator()(int a) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape_i[0] ); + assert( a < mShapeI[0] ); - return m_data[a*m_strides[0]]; + return mData[a*mStrides[0]]; } // ------------------------------------------------------------------------------------------------- @@ -294,13 +293,13 @@ inline X& array::operator()(int a) template inline const X& array::operator()(int a) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape_i[0] ); + assert( a < mShapeI[0] ); - return m_data[a*m_strides[0]]; + return mData[a*mStrides[0]]; } // ------------------------------------------------------------------------------------------------- @@ -308,15 +307,15 @@ inline const X& array::operator()(int a) const template inline X& array::operator()(int a, int b) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); - return m_data[a*m_strides[0]+b*m_strides[1]]; + return mData[a*mStrides[0]+b*mStrides[1]]; } // ------------------------------------------------------------------------------------------------- @@ -324,15 +323,15 @@ inline X& array::operator()(int a, int b) template inline const X& array::operator()(int a, int b) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); - return m_data[a*m_strides[0]+b*m_strides[1]]; + return mData[a*mStrides[0]+b*mStrides[1]]; } // ------------------------------------------------------------------------------------------------- @@ -340,17 +339,17 @@ inline const X& array::operator()(int a, int b) const template inline X& array::operator()(int a, int b, int c) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]]; } // ------------------------------------------------------------------------------------------------- @@ -358,17 +357,17 @@ inline X& array::operator()(int a, int b, int c) template inline const X& array::operator()(int a, int b, int c) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]]; } // ------------------------------------------------------------------------------------------------- @@ -376,19 +375,19 @@ inline const X& array::operator()(int a, int b, int c) const template inline X& array::operator()(int a, int b, int c, int d) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]]; } // ------------------------------------------------------------------------------------------------- @@ -396,19 +395,19 @@ inline X& array::operator()(int a, int b, int c, int d) template inline const X& array::operator()(int a, int b, int c, int d) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]]; } // ------------------------------------------------------------------------------------------------- @@ -416,21 +415,21 @@ inline const X& array::operator()(int a, int b, int c, int d) const template inline X& array::operator()(int a, int b, int c, int d, int e) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]]; } // ------------------------------------------------------------------------------------------------- @@ -438,21 +437,21 @@ inline X& array::operator()(int a, int b, int c, int d, int e) template inline const X& array::operator()(int a, int b, int c, int d, int e) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]]; } // ------------------------------------------------------------------------------------------------- @@ -460,24 +459,24 @@ inline const X& array::operator()(int a, int b, int c, int d, int e) const template inline X& array::operator()(int a, int b, int c, int d, int e, int f) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; - f = ( m_shape_i[5] + (f % m_shape_i[5]) ) % m_shape_i[5]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; + f = ( mShapeI[5] + (f % mShapeI[5]) ) % mShapeI[5]; - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); - assert( f < m_shape_i[5] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); + assert( f < mShapeI[5] ); return \ - m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]]; + mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]]; } // ------------------------------------------------------------------------------------------------- @@ -485,24 +484,24 @@ inline X& array::operator()(int a, int b, int c, int d, int e, int f) template inline const X& array::operator()(int a, int b, int c, int d, int e, int f) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; - f = ( m_shape_i[5] + (f % m_shape_i[5]) ) % m_shape_i[5]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; + f = ( mShapeI[5] + (f % mShapeI[5]) ) % mShapeI[5]; - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); - assert( f < m_shape_i[5] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); + assert( f < mShapeI[5] ); return \ - m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]]; + mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]]; } // ================================================================================================= @@ -514,12 +513,12 @@ template inline X& array::at(Iterator first, Iterator last) { // check input - assert( static_cast(last-first) > 0 ); - assert( static_cast(last-first) <= m_ndim ); + assert( static_cast(last-first) > 0 ); + assert( static_cast(last-first) <= mNdim ); // iterator to shape and stride - int *shape = &m_shape_i[0]; - size_t *stride = &m_strides[0]; + int *shape = &mShapeI [0]; + size_t *stride = &mStrides[0]; // zero-initialize plain storage index size_t idx = 0; @@ -533,14 +532,14 @@ inline X& array::at(Iterator first, Iterator last) i = ( (*shape) + (i % (*shape)) ) % (*shape); // - check array index assert( i < (*shape) ); - // - update the index + // - update index idx += i * (*stride); // - move iterators forward ++stride; ++shape; } - return m_data[idx]; + return mData[idx]; } // ------------------------------------------------------------------------------------------------- @@ -550,12 +549,12 @@ template inline const X& array::at(Iterator first, Iterator last) const { // check input - assert( static_cast(last-first) > 0 ); - assert( static_cast(last-first) <= m_ndim ); + assert( static_cast(last-first) > 0 ); + assert( static_cast(last-first) <= mNdim ); // iterator to shape and stride - int *shape = &m_shape_i[0]; - size_t *stride = &m_strides[0]; + int *shape = &mShapeI [0]; + size_t *stride = &mStrides[0]; // zero-initialize plain storage index size_t idx = 0; @@ -569,14 +568,14 @@ inline const X& array::at(Iterator first, Iterator last) const i = ( (*shape) + (i % (*shape)) ) % (*shape); // - check array index assert( i < (*shape) ); - // - update the index + // - update index idx += i * (*stride); // - move iterators forward ++stride; ++shape; } - return m_data[idx]; + return mData[idx]; } @@ -587,13 +586,13 @@ inline const X& array::at(Iterator first, Iterator last) const template inline size_t array::compress(int a) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape_i[0] ); + assert( a < mShapeI[0] ); - return a*m_strides[0]; + return a*mStrides[0]; } // ------------------------------------------------------------------------------------------------- @@ -601,15 +600,15 @@ inline size_t array::compress(int a) const template inline size_t array::compress(int a, int b) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); - return a*m_strides[0]+b*m_strides[1]; + return a*mStrides[0]+b*mStrides[1]; } // ------------------------------------------------------------------------------------------------- @@ -617,17 +616,17 @@ inline size_t array::compress(int a, int b) const template inline size_t array::compress(int a, int b, int c) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); - return a*m_strides[0]+b*m_strides[1]+c*m_strides[2]; + return a*mStrides[0]+b*mStrides[1]+c*mStrides[2]; } // ------------------------------------------------------------------------------------------------- @@ -635,19 +634,19 @@ inline size_t array::compress(int a, int b, int c) const template inline size_t array::compress(int a, int b, int c, int d) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); - return a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]; + return a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]; } // ------------------------------------------------------------------------------------------------- @@ -655,21 +654,21 @@ inline size_t array::compress(int a, int b, int c, int d) const template inline size_t array::compress(int a, int b, int c, int d, int e) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); - return a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]; + return a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]; } // ------------------------------------------------------------------------------------------------- @@ -677,23 +676,23 @@ inline size_t array::compress(int a, int b, int c, int d, int e) const template inline size_t array::compress(int a, int b, int c, int d, int e, int f) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; - f = ( m_shape_i[5] + (f % m_shape_i[5]) ) % m_shape_i[5]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; + f = ( mShapeI[5] + (f % mShapeI[5]) ) % mShapeI[5]; - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); - assert( f < m_shape_i[5] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); + assert( f < mShapeI[5] ); - return a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]; + return a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]; } // ================================================================================================= @@ -704,15 +703,15 @@ template inline std::vector array::decompress(size_t i) const { // check input - assert( i < m_size ); + assert( i < mSize ); // allocate array-index - std::vector idx(m_ndim); + std::vector idx(mNdim); // reconstruct - for ( size_t j = 0 ; j < m_ndim ; ++j ) { - idx[j] = (i - i%m_strides[j]) / m_strides[j]; - i -= idx[j] * m_strides[j]; + for ( size_t j = 0 ; j < mNdim ; ++j ) { + idx[j] = (i - i%mStrides[j]) / mStrides[j]; + i -= idx[j] * mStrides[j]; } return idx; @@ -725,7 +724,7 @@ inline std::vector array::decompress(size_t i) const template inline X* array::data() { - return m_data.data(); + return mData.data(); } // ------------------------------------------------------------------------------------------------- @@ -733,7 +732,7 @@ inline X* array::data() template inline const X* array::data() const { - return m_data.data(); + return mData.data(); } // ================================================================================================= @@ -743,7 +742,7 @@ inline const X* array::data() const template inline auto array::begin() { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -751,7 +750,7 @@ inline auto array::begin() template inline auto array::begin() const { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -759,7 +758,7 @@ inline auto array::begin() const template inline auto array::end() { - return m_data.end(); + return mData.end(); } // ------------------------------------------------------------------------------------------------- @@ -767,7 +766,7 @@ inline auto array::end() template inline auto array::end() const { - return m_data.end(); + return mData.end(); } // ================================================================================================= @@ -777,9 +776,9 @@ inline auto array::end() const template inline auto array::index(size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ------------------------------------------------------------------------------------------------- @@ -787,9 +786,9 @@ inline auto array::index(size_t i) template inline auto array::index(size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ================================================================================================= @@ -799,13 +798,13 @@ inline auto array::index(size_t i) const template inline auto array::item(int a) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape_i[0] ); + assert( a < mShapeI[0] ); - return m_data.begin() + a*m_strides[0]; + return begin() + a*mStrides[0]; } // ------------------------------------------------------------------------------------------------- @@ -813,13 +812,13 @@ inline auto array::item(int a) template inline auto array::item(int a) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape_i[0] ); + assert( a < mShapeI[0] ); - return m_data.begin() + a*m_strides[0]; + return begin() + a*mStrides[0]; } // ------------------------------------------------------------------------------------------------- @@ -827,15 +826,15 @@ inline auto array::item(int a) const template inline auto array::item(int a, int b) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]; + return begin() + a*mStrides[0]+b*mStrides[1]; } // ------------------------------------------------------------------------------------------------- @@ -843,15 +842,15 @@ inline auto array::item(int a, int b) template inline auto array::item(int a, int b) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]; + return begin() + a*mStrides[0]+b*mStrides[1]; } // ------------------------------------------------------------------------------------------------- @@ -859,17 +858,17 @@ inline auto array::item(int a, int b) const template inline auto array::item(int a, int b, int c) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]+c*m_strides[2]; + return begin() + a*mStrides[0]+b*mStrides[1]+c*mStrides[2]; } // ------------------------------------------------------------------------------------------------- @@ -877,17 +876,17 @@ inline auto array::item(int a, int b, int c) template inline auto array::item(int a, int b, int c) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]+c*m_strides[2]; + return begin() + a*mStrides[0]+b*mStrides[1]+c*mStrides[2]; } // ------------------------------------------------------------------------------------------------- @@ -895,19 +894,19 @@ inline auto array::item(int a, int b, int c) const template inline auto array::item(int a, int b, int c, int d) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]; + return begin() + a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]; } // ------------------------------------------------------------------------------------------------- @@ -915,19 +914,19 @@ inline auto array::item(int a, int b, int c, int d) template inline auto array::item(int a, int b, int c, int d) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]; + return begin() + a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]; } // ------------------------------------------------------------------------------------------------- @@ -935,21 +934,21 @@ inline auto array::item(int a, int b, int c, int d) const template inline auto array::item(int a, int b, int c, int d, int e) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); - return m_data.begin()+a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]; + return begin()+a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]; } // ------------------------------------------------------------------------------------------------- @@ -957,21 +956,21 @@ inline auto array::item(int a, int b, int c, int d, int e) template inline auto array::item(int a, int b, int c, int d, int e) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); - return m_data.begin()+a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]; + return begin()+a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]; } // ------------------------------------------------------------------------------------------------- @@ -979,24 +978,23 @@ inline auto array::item(int a, int b, int c, int d, int e) const template inline auto array::item(int a, int b, int c, int d, int e, int f) { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; - f = ( m_shape_i[5] + (f % m_shape_i[5]) ) % m_shape_i[5]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; + f = ( mShapeI[5] + (f % mShapeI[5]) ) % mShapeI[5]; - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); - assert( f < m_shape_i[5] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); + assert( f < mShapeI[5] ); - return m_data.begin() + - a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]; + return begin()+a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]; } // ------------------------------------------------------------------------------------------------- @@ -1004,24 +1002,23 @@ inline auto array::item(int a, int b, int c, int d, int e, int f) template inline auto array::item(int a, int b, int c, int d, int e, int f) const { - a = ( m_shape_i[0] + (a % m_shape_i[0]) ) % m_shape_i[0]; - b = ( m_shape_i[1] + (b % m_shape_i[1]) ) % m_shape_i[1]; - c = ( m_shape_i[2] + (c % m_shape_i[2]) ) % m_shape_i[2]; - d = ( m_shape_i[3] + (d % m_shape_i[3]) ) % m_shape_i[3]; - e = ( m_shape_i[4] + (e % m_shape_i[4]) ) % m_shape_i[4]; - f = ( m_shape_i[5] + (f % m_shape_i[5]) ) % m_shape_i[5]; + a = ( mShapeI[0] + (a % mShapeI[0]) ) % mShapeI[0]; + b = ( mShapeI[1] + (b % mShapeI[1]) ) % mShapeI[1]; + c = ( mShapeI[2] + (c % mShapeI[2]) ) % mShapeI[2]; + d = ( mShapeI[3] + (d % mShapeI[3]) ) % mShapeI[3]; + e = ( mShapeI[4] + (e % mShapeI[4]) ) % mShapeI[4]; + f = ( mShapeI[5] + (f % mShapeI[5]) ) % mShapeI[5]; - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape_i[0] ); - assert( b < m_shape_i[1] ); - assert( c < m_shape_i[2] ); - assert( d < m_shape_i[3] ); - assert( e < m_shape_i[4] ); - assert( f < m_shape_i[5] ); + assert( a < mShapeI[0] ); + assert( b < mShapeI[1] ); + assert( c < mShapeI[2] ); + assert( d < mShapeI[3] ); + assert( e < mShapeI[4] ); + assert( f < mShapeI[5] ); - return m_data.begin() + - a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]; + return begin()+a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]; } // ================================================================================================= @@ -1031,7 +1028,7 @@ inline auto array::item(int a, int b, int c, int d, int e, int f) const template inline void array::setArange() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1039,7 +1036,7 @@ inline void array::setArange() template inline void array::setZero() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -1047,7 +1044,7 @@ inline void array::setZero() template inline void array::setOnes() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -1055,7 +1052,7 @@ inline void array::setOnes() template inline void array::setConstant(X D) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -1064,11 +1061,9 @@ template template inline void array::setCopy(Iterator first, Iterator last) { - // check size - assert( m_size == last - first ); + assert( mSize == last - first ); - // copy - std::copy(first, last, m_data.data()); + std::copy(first, last, begin()); } // ================================================================================================= @@ -1081,8 +1076,8 @@ inline array& array::operator*= (const array &B) assert( shape() == B.shape() ); assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } @@ -1095,8 +1090,8 @@ inline array& array::operator/= (const array &B) assert( shape() == B.shape() ); assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } @@ -1109,8 +1104,8 @@ inline array& array::operator+= (const array &B) assert( shape() == B.shape() ); assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } @@ -1123,8 +1118,8 @@ inline array& array::operator-= (const array &B) assert( shape() == B.shape() ); assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } @@ -1134,8 +1129,8 @@ inline array& array::operator-= (const array &B) template inline array& array::operator*= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } @@ -1145,8 +1140,8 @@ inline array& array::operator*= (const X &B) template inline array& array::operator/= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } @@ -1156,8 +1151,8 @@ inline array& array::operator/= (const X &B) template inline array& array::operator+= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } @@ -1167,8 +1162,8 @@ inline array& array::operator+= (const X &B) template inline array& array::operator-= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } @@ -1375,7 +1370,7 @@ template inline array array::minCoeff(size_t axis) const { // check input - assert( axis < m_ndim ); + assert( axis < mNdim ); // initialize output to the same shape as the input, with one axis removed array out = array::Constant(del(this->shape(),axis), this->maxCoeff()); @@ -1384,19 +1379,19 @@ inline array array::minCoeff(size_t axis) const // - copy strides std::vector estrides = this->strides(); // - insert total size at the beginning - estrides.insert(estrides.begin(), m_size); + estrides.insert(estrides.begin(), mSize); // extract sizes size_t n = estrides[axis ]; size_t m = estrides[axis+1]; // perform reduction - for ( size_t i = 0 ; i < m_size ; ++i ) + for ( size_t i = 0 ; i < mSize ; ++i ) { // - get the new index size_t ni = i/n*m + i%m; // - store - out[ni] = std::min(out[ni], m_data[i]); + out[ni] = std::min(out[ni], mData[i]); } return out; @@ -1408,11 +1403,11 @@ template inline array array::minCoeff(int axis) const { // check axis: (0,1,...,ndim-1) or (-1,-2,...,-ndim) - assert( axis < static_cast(m_ndim) ); - assert( axis >= -1 * static_cast(m_ndim) ); + assert( axis < static_cast(mNdim) ); + assert( axis >= -1 * static_cast(mNdim) ); // get number of dimensions as integer - int n = static_cast(m_ndim); + int n = static_cast(mNdim); // correct periodic axis axis = ( n + (axis%n) ) % n; @@ -1427,7 +1422,7 @@ template inline array array::minCoeff(const std::vector &axes_in) const { // correct for 'periodicity', sort from high to low - std::vector axes = Private::sort_axes(axes_in, static_cast(m_ndim), true); + std::vector axes = Private::sort_axes(axes_in, static_cast(mNdim), true); // copy array array out = (*this); @@ -1455,7 +1450,7 @@ template inline array array::maxCoeff(size_t axis) const { // check input - assert( axis < m_ndim ); + assert( axis < mNdim ); // initialize output to the same shape as the input, with one axis removed array out = array::Constant(del(this->shape(),axis), this->minCoeff()); @@ -1464,19 +1459,19 @@ inline array array::maxCoeff(size_t axis) const // - copy strides std::vector estrides = this->strides(); // - insert total size at the beginning - estrides.insert(estrides.begin(), m_size); + estrides.insert(estrides.begin(), mSize); // extract sizes size_t n = estrides[axis ]; size_t m = estrides[axis+1]; // perform reduction - for ( size_t i = 0 ; i < m_size ; ++i ) + for ( size_t i = 0 ; i < mSize ; ++i ) { // - get the new index size_t ni = i/n*m + i%m; // - store - out[ni] = std::max(out[ni], m_data[i]); + out[ni] = std::max(out[ni], mData[i]); } return out; @@ -1488,11 +1483,11 @@ template inline array array::maxCoeff(int axis) const { // check axis: (0,1,...,ndim-1) or (-1,-2,...,-ndim) - assert( axis < static_cast(m_ndim) ); - assert( axis >= -1 * static_cast(m_ndim) ); + assert( axis < static_cast(mNdim) ); + assert( axis >= -1 * static_cast(mNdim) ); // get number of dimensions as integer - int n = static_cast(m_ndim); + int n = static_cast(mNdim); // correct periodic axis axis = ( n + (axis%n) ) % n; @@ -1507,7 +1502,7 @@ template inline array array::maxCoeff(const std::vector &axes_in) const { // correct for 'periodicity', sort from high to low - std::vector axes = Private::sort_axes(axes_in, static_cast(m_ndim), true); + std::vector axes = Private::sort_axes(axes_in, static_cast(mNdim), true); // copy array array out = (*this); @@ -1528,8 +1523,8 @@ inline X array::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } @@ -1546,19 +1541,19 @@ inline array array::sum(size_t axis) const // - copy strides std::vector estrides = this->strides(); // - insert total size at the beginning - estrides.insert(estrides.begin(), m_size); + estrides.insert(estrides.begin(), mSize); // extract sizes size_t n = estrides[axis ]; size_t m = estrides[axis+1]; // perform reduction - for ( size_t i = 0 ; i < m_size ; ++i ) + for ( size_t i = 0 ; i < mSize ; ++i ) { // - get the new index size_t ni = i/n*m + i%m; // - store - out[ni] += m_data[i]; + out[ni] += mData[i]; } return out; @@ -1570,11 +1565,11 @@ template inline array array::sum(int axis) const { // check axis: (0,1,...,ndim-1) or (-1,-2,...,-ndim) - assert( axis < static_cast(m_ndim) ); - assert( axis >= -1 * static_cast(m_ndim) ); + assert( axis < static_cast(mNdim) ); + assert( axis >= -1 * static_cast(mNdim) ); // get number of dimensions as integer - int n = static_cast(m_ndim); + int n = static_cast(mNdim); // correct periodic axis axis = ( n + (axis%n) ) % n; @@ -1589,7 +1584,7 @@ template inline array array::sum(const std::vector &axes_in) const { // correct for 'periodicity', sort from high to low - std::vector axes = Private::sort_axes(axes_in, static_cast(m_ndim), true); + std::vector axes = Private::sort_axes(axes_in, static_cast(mNdim), true); // copy array array out = (*this); @@ -1608,7 +1603,7 @@ inline array array::sum(const std::vector &axes_in) const template inline double array::mean() const { - return static_cast(this->sum())/static_cast(m_size); + return static_cast(this->sum())/static_cast(mSize); } // ------------------------------------------------------------------------------------------------- @@ -1652,8 +1647,8 @@ inline double array::average(const array &weights, bool norm) const X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; if ( norm ) return static_cast(out)/static_cast(weights.sum()); else return static_cast(out); @@ -1694,7 +1689,7 @@ inline array array::average( template inline void array::abs() { - for ( auto &i : m_data ) + for ( auto &i : mData ) i = std::abs(i); } @@ -1705,22 +1700,22 @@ inline void array::abs() template inline void array::printf(std::string fmt) const { - if ( m_ndim == 1 ) + if ( mNdim == 1 ) { - for ( size_t j = 0 ; j < m_shape[0] ; ++j ) { - if ( j != m_shape[0]-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); - else std::printf((fmt + ";\n").c_str(), (*this)(j)); + for ( size_t j = 0 ; j < mShape[0] ; ++j ) { + if ( j != mShape[0]-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); + else std::printf((fmt + ";\n").c_str(), (*this)(j)); } return; } - if ( m_ndim == 2 ) + if ( mNdim == 2 ) { - for ( size_t i = 0 ; i < m_shape[0] ; ++i ) { - for ( size_t j = 0 ; j < m_shape[1] ; ++j ) { - if ( j != m_shape[1]-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); - else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < mShape[0] ; ++i ) { + for ( size_t j = 0 ; j < mShape[1] ; ++j ) { + if ( j != mShape[1]-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } @@ -1729,10 +1724,10 @@ inline void array::printf(std::string fmt) const std::cout << "cppmat::periodic::array["; - for ( size_t i = 0 ; i < m_ndim-1 ; ++i ) + for ( size_t i = 0 ; i < mNdim-1 ; ++i ) std::cout << shape(i) << ","; - std::cout << shape(m_ndim-1) << "]\n"; + std::cout << shape(mNdim-1) << "]\n"; } diff --git a/src/cppmat/periodic_array.h b/src/cppmat/periodic_array.h index 85bfe7a..e4f440e 100644 --- a/src/cppmat/periodic_array.h +++ b/src/cppmat/periodic_array.h @@ -4,8 +4,8 @@ ================================================================================================= */ -#ifndef CPPMAT_PERIODIC_MATRIX_H -#define CPPMAT_PERIODIC_MATRIX_H +#ifndef CPPMAT_PERIODIC_ARRAY_H +#define CPPMAT_PERIODIC_ARRAY_H // ------------------------------------------------------------------------------------------------- @@ -25,18 +25,18 @@ class array { private: - static const size_t MAX_DIM=6; // maximum number of dimensions - std::vector m_data; // data container - size_t m_ndim=0; // actual number of dimensions - size_t m_size=0; // total size == data.size() == prod(shape) - size_t m_shape[MAX_DIM]; // number of entries in each dimensions - int m_shape_i[MAX_DIM]; // == m_shape, but with int's - size_t m_strides[MAX_DIM]; // stride length for each index + static const size_t MAX_DIM=6; // maximum number of dimensions + std::vector mData; // data container + size_t mNdim=0; // actual number of dimensions + size_t mSize=0; // total size == data.size() == prod(shape) + size_t mShape[MAX_DIM]; // number of entries in each dimensions + int mShapeI[MAX_DIM]; // == mShape, but with int's + size_t mStrides[MAX_DIM]; // stride length for each index public: // constructor - array(){}; + array() = default; array(const std::vector &shape); // constructor: initialize diff --git a/src/cppmat/periodic_matrix.cpp b/src/cppmat/periodic_matrix.cpp index f37e287..184f892 100644 --- a/src/cppmat/periodic_matrix.cpp +++ b/src/cppmat/periodic_matrix.cpp @@ -4,8 +4,8 @@ ================================================================================================= */ -#ifndef CPPMAT_PERIODIC_MATRIX2_CPP -#define CPPMAT_PERIODIC_MATRIX2_CPP +#ifndef CPPMAT_PERIODIC_MATRIX_CPP +#define CPPMAT_PERIODIC_MATRIX_CPP // ------------------------------------------------------------------------------------------------- @@ -23,7 +23,7 @@ namespace periodic { template inline matrix::matrix(size_t m, size_t n) { - // store shape, and other size parameters, allocate "m_data" + // store shape, and other size parameters, allocate "mData" resize(m,n); } @@ -106,14 +106,14 @@ template inline void matrix::resize(size_t m, size_t n) { // update shape/size - m_m = m; - m_n = n; - m_m_i = static_cast(m); - m_n_i = static_cast(n); - m_size = m*n; + M = m; + N = n; + MI = static_cast(m); + NI = static_cast(n); + mSize = m*n; // allocate data - m_data.resize(m_size); + mData.resize(mSize); } // ------------------------------------------------------------------------------------------------- @@ -122,7 +122,7 @@ template inline void matrix::reshape(size_t m, size_t n) { // check that the size is unchanged - assert( m_size == m*n ); + assert( mSize == m*n ); // process new shape resize(m,n); @@ -135,7 +135,7 @@ inline void matrix::reshape(size_t m, size_t n) template inline size_t matrix::size() const { - return m_size; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -151,7 +151,7 @@ inline size_t matrix::ndim() const template inline size_t matrix::rows() const { - return m_m; + return M; } // ------------------------------------------------------------------------------------------------- @@ -159,7 +159,7 @@ inline size_t matrix::rows() const template inline size_t matrix::cols() const { - return m_n; + return N; } // ------------------------------------------------------------------------------------------------- @@ -175,8 +175,8 @@ inline size_t matrix::shape(int i) const i = ( 2 + (i%2) ) % 2; // return shape - if ( i == 0 ) return m_m; - else return m_n; + if ( i == 0 ) return M; + else return N; } // ------------------------------------------------------------------------------------------------- @@ -188,8 +188,8 @@ inline size_t matrix::shape(size_t i) const assert( i < 2 ); // return shape - if ( i == 0 ) return m_m; - else return m_n; + if ( i == 0 ) return M; + else return N; } // ------------------------------------------------------------------------------------------------- @@ -199,8 +199,8 @@ inline std::vector matrix::shape() const { std::vector ret(2); - ret[0] = m_m; - ret[1] = m_n; + ret[0] = M; + ret[1] = N; return ret; } @@ -212,7 +212,7 @@ inline std::vector matrix::strides(bool bytes) const { std::vector ret(2); - ret[0] = m_n; + ret[0] = N; ret[1] = 1; if ( bytes ) { @@ -230,9 +230,9 @@ inline std::vector matrix::strides(bool bytes) const template inline X& matrix::operator[](size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -240,9 +240,9 @@ inline X& matrix::operator[](size_t i) template inline const X& matrix::operator[](size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ================================================================================================= @@ -252,11 +252,11 @@ inline const X& matrix::operator[](size_t i) const template inline X& matrix::operator()(int a) { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; + a = ( MI + (a % MI) ) % MI; - assert( a < m_m_i ); + assert( a < MI ); - return m_data[a*m_n]; + return mData[a*N]; } // ------------------------------------------------------------------------------------------------- @@ -264,11 +264,11 @@ inline X& matrix::operator()(int a) template inline const X& matrix::operator()(int a) const { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; + a = ( MI + (a % MI) ) % MI; - assert( a < m_m_i ); + assert( a < MI ); - return m_data[a*m_n]; + return mData[a*N]; } // ------------------------------------------------------------------------------------------------- @@ -276,13 +276,13 @@ inline const X& matrix::operator()(int a) const template inline X& matrix::operator()(int a, int b) { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; - b = ( m_n_i + (b % m_n_i) ) % m_n_i; + a = ( MI + (a % MI) ) % MI; + b = ( NI + (b % NI) ) % NI; - assert( a < m_m_i ); - assert( b < m_n_i ); + assert( a < MI ); + assert( b < NI ); - return m_data[a*m_n+b]; + return mData[a*N+b]; } // ------------------------------------------------------------------------------------------------- @@ -290,13 +290,13 @@ inline X& matrix::operator()(int a, int b) template inline const X& matrix::operator()(int a, int b) const { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; - b = ( m_n_i + (b % m_n_i) ) % m_n_i; + a = ( MI + (a % MI) ) % MI; + b = ( NI + (b % NI) ) % NI; - assert( a < m_m_i ); - assert( b < m_n_i ); + assert( a < MI ); + assert( b < NI ); - return m_data[a*m_n+b]; + return mData[a*N+b]; } // ================================================================================================= @@ -322,10 +322,10 @@ inline X& matrix::at(Iterator first, Iterator last) if ( last-first == 2 ) b = first[1]; // correct for periodicity - a = ( m_m_i + (a % m_m_i) ) % m_m_i; - b = ( m_n_i + (b % m_n_i) ) % m_n_i; + a = ( MI + (a % MI) ) % MI; + b = ( NI + (b % NI) ) % NI; - return m_data[a*m_n+b]; + return mData[a*N+b]; } // ------------------------------------------------------------------------------------------------- @@ -349,10 +349,10 @@ inline const X& matrix::at(Iterator first, Iterator last) const if ( last-first == 2 ) b = first[1]; // correct for periodicity - a = ( m_m_i + (a % m_m_i) ) % m_m_i; - b = ( m_n_i + (b % m_n_i) ) % m_n_i; + a = ( MI + (a % MI) ) % MI; + b = ( NI + (b % NI) ) % NI; - return m_data[a*m_n+b]; + return mData[a*N+b]; } // ================================================================================================= @@ -362,11 +362,11 @@ inline const X& matrix::at(Iterator first, Iterator last) const template inline size_t matrix::compress(int a) const { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; + a = ( MI + (a % MI) ) % MI; - assert( a < m_m ); + assert( a < M ); - return static_cast(a*m_n_i); + return static_cast(a*NI); } // ------------------------------------------------------------------------------------------------- @@ -374,13 +374,13 @@ inline size_t matrix::compress(int a) const template inline size_t matrix::compress(int a, int b) const { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; - b = ( m_n_i + (b % m_n_i) ) % m_n_i; + a = ( MI + (a % MI) ) % MI; + b = ( NI + (b % NI) ) % NI; - assert( a < m_m ); - assert( b < m_n ); + assert( a < M ); + assert( b < N ); - return static_cast(a*m_n_i+b); + return static_cast(a*NI+b); } // ================================================================================================= @@ -391,14 +391,14 @@ template inline std::vector matrix::decompress(size_t i) const { // check input - assert( i < m_size ); + assert( i < mSize ); // allocate array-index std::vector idx(2); // reconstruct - idx[1] = i % m_n; - idx[0] = ( i - idx[1] ) / m_n; + idx[1] = i % N; + idx[0] = ( i - idx[1] ) / N; return idx; } @@ -410,7 +410,7 @@ inline std::vector matrix::decompress(size_t i) const template inline X* matrix::data() { - return m_data.data(); + return mData.data(); } // ------------------------------------------------------------------------------------------------- @@ -418,7 +418,7 @@ inline X* matrix::data() template inline const X* matrix::data() const { - return m_data.data(); + return mData.data(); } // ================================================================================================= @@ -428,7 +428,7 @@ inline const X* matrix::data() const template inline auto matrix::begin() { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -436,7 +436,7 @@ inline auto matrix::begin() template inline auto matrix::begin() const { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -444,7 +444,7 @@ inline auto matrix::begin() const template inline auto matrix::end() { - return m_data.end(); + return mData.end(); } // ------------------------------------------------------------------------------------------------- @@ -452,7 +452,7 @@ inline auto matrix::end() template inline auto matrix::end() const { - return m_data.end(); + return mData.end(); } // ================================================================================================= @@ -462,9 +462,9 @@ inline auto matrix::end() const template inline auto matrix::beginRow(size_t a) { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + a*m_n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- @@ -472,9 +472,9 @@ inline auto matrix::beginRow(size_t a) template inline auto matrix::beginRow(size_t a) const { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + a*m_n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- @@ -482,9 +482,9 @@ inline auto matrix::beginRow(size_t a) const template inline auto matrix::endRow(size_t a) { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + (a+1)*m_n; + return begin() + (a+1)*N; } // ------------------------------------------------------------------------------------------------- @@ -492,9 +492,9 @@ inline auto matrix::endRow(size_t a) template inline auto matrix::endRow(size_t a) const { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + (a+1)*m_n; + return begin() + (a+1)*N; } // ================================================================================================= @@ -504,9 +504,9 @@ inline auto matrix::endRow(size_t a) const template inline auto matrix::index(size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ------------------------------------------------------------------------------------------------- @@ -514,9 +514,9 @@ inline auto matrix::index(size_t i) template inline auto matrix::index(size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ================================================================================================= @@ -526,11 +526,11 @@ inline auto matrix::index(size_t i) const template inline auto matrix::item(int a) { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; + a = ( MI + (a % MI) ) % MI; - assert( a < m_m_i ); + assert( a < MI ); - return m_data.begin() + a*m_n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- @@ -538,11 +538,11 @@ inline auto matrix::item(int a) template inline auto matrix::item(int a) const { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; + a = ( MI + (a % MI) ) % MI; - assert( a < m_m_i ); + assert( a < MI ); - return m_data.begin() + a*m_n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- @@ -550,13 +550,13 @@ inline auto matrix::item(int a) const template inline auto matrix::item(int a, int b) { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; - b = ( m_n_i + (b % m_n_i) ) % m_n_i; + a = ( MI + (a % MI) ) % MI; + b = ( NI + (b % NI) ) % NI; - assert( a < m_m_i ); - assert( b < m_n_i ); + assert( a < MI ); + assert( b < NI ); - return m_data.begin() + a*m_n+b; + return begin() + a*N+b; } // ------------------------------------------------------------------------------------------------- @@ -564,13 +564,13 @@ inline auto matrix::item(int a, int b) template inline auto matrix::item(int a, int b) const { - a = ( m_m_i + (a % m_m_i) ) % m_m_i; - b = ( m_n_i + (b % m_n_i) ) % m_n_i; + a = ( MI + (a % MI) ) % MI; + b = ( NI + (b % NI) ) % NI; - assert( a < m_m_i ); - assert( b < m_n_i ); + assert( a < MI ); + assert( b < NI ); - return m_data.begin() + a*m_n+b; + return begin() + a*N+b; } // ================================================================================================= @@ -580,7 +580,7 @@ inline auto matrix::item(int a, int b) const template inline void matrix::setArange() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -588,7 +588,7 @@ inline void matrix::setArange() template inline void matrix::setZero() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -596,7 +596,7 @@ inline void matrix::setZero() template inline void matrix::setOnes() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -604,7 +604,7 @@ inline void matrix::setOnes() template inline void matrix::setConstant(X D) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -613,11 +613,9 @@ template template inline void matrix::setCopy(Iterator first, Iterator last) { - // check size - assert( m_size == last - first ); + assert( mSize == last - first ); - // copy - std::copy(first, last, m_data.data()); + std::copy(first, last, begin()); } // ================================================================================================= @@ -627,11 +625,11 @@ inline void matrix::setCopy(Iterator first, Iterator last) template inline matrix& matrix::operator*= (const matrix &B) { - assert( m_m == B.shape(0) ); - assert( m_n == B.shape(1) ); + assert( M == B.shape(0) ); + assert( N == B.shape(1) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } @@ -641,11 +639,11 @@ inline matrix& matrix::operator*= (const matrix &B) template inline matrix& matrix::operator/= (const matrix &B) { - assert( m_m == B.shape(0) ); - assert( m_n == B.shape(1) ); + assert( M == B.shape(0) ); + assert( N == B.shape(1) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } @@ -655,11 +653,11 @@ inline matrix& matrix::operator/= (const matrix &B) template inline matrix& matrix::operator+= (const matrix &B) { - assert( m_m == B.shape(0) ); - assert( m_n == B.shape(1) ); + assert( M == B.shape(0) ); + assert( N == B.shape(1) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } @@ -669,11 +667,11 @@ inline matrix& matrix::operator+= (const matrix &B) template inline matrix& matrix::operator-= (const matrix &B) { - assert( m_m == B.shape(0) ); - assert( m_n == B.shape(1) ); + assert( M == B.shape(0) ); + assert( N == B.shape(1) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } @@ -683,8 +681,8 @@ inline matrix& matrix::operator-= (const matrix &B) template inline matrix& matrix::operator*= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } @@ -694,8 +692,8 @@ inline matrix& matrix::operator*= (const X &B) template inline matrix& matrix::operator/= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } @@ -705,8 +703,8 @@ inline matrix& matrix::operator/= (const X &B) template inline matrix& matrix::operator+= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } @@ -716,8 +714,8 @@ inline matrix& matrix::operator+= (const X &B) template inline matrix& matrix::operator-= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } @@ -929,21 +927,21 @@ inline vector matrix::minCoeff(size_t axis) const // contraction of columns if ( axis == 1 ) { - vector out = vector::Constant(m_m, this->maxCoeff()); + vector out = vector::Constant(M, this->maxCoeff()); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[i] = std::min( out[i], m_data[i*m_n+j] ); + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[i] = std::min( out[i], mData[i*N+j] ); return out; } // contraction of rows - vector out = vector::Constant(m_n, this->maxCoeff()); + vector out = vector::Constant(N, this->maxCoeff()); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[j] = std::min( out[j], m_data[i*m_n+j] ); + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[j] = std::min( out[j], mData[i*N+j] ); return out; } @@ -985,21 +983,21 @@ inline vector matrix::maxCoeff(size_t axis) const // contraction of columns if ( axis == 1 ) { - vector out = vector::Constant(m_m, this->minCoeff()); + vector out = vector::Constant(M, this->minCoeff()); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[i] = std::max( out[i], m_data[i*m_n+j] ); + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[i] = std::max( out[i], mData[i*N+j] ); return out; } // contraction of rows - vector out = vector::Constant(m_n, this->minCoeff()); + vector out = vector::Constant(N, this->minCoeff()); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[j] = std::max( out[j], m_data[i*m_n+j] ); + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[j] = std::max( out[j], mData[i*N+j] ); return out; } @@ -1029,8 +1027,8 @@ inline X matrix::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } @@ -1046,21 +1044,21 @@ inline vector matrix::sum(size_t axis) const // contraction of columns if ( axis == 1 ) { - vector out = vector::Zero(m_m); + vector out = vector::Zero(M); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[i] += m_data[i*m_n+j]; + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[i] += mData[i*N+j]; return out; } // contraction of rows - vector out = vector::Zero(m_n); + vector out = vector::Zero(N); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[j] += m_data[i*m_n+j]; + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[j] += mData[i*N+j]; return out; } @@ -1088,7 +1086,7 @@ inline vector matrix::sum(int axis) const template inline double matrix::mean() const { - return static_cast(this->sum())/static_cast(m_size); + return static_cast(this->sum())/static_cast(mSize); } // ------------------------------------------------------------------------------------------------- @@ -1096,7 +1094,7 @@ inline double matrix::mean() const template inline vector matrix::mean(size_t axis) const { - matrix weights = matrix::Ones(m_m, m_n); + matrix weights = matrix::Ones(M, N); return (*this).sum(axis) / weights.sum(axis); } @@ -1106,10 +1104,9 @@ inline vector matrix::mean(size_t axis) const template inline vector matrix::mean(int axis) const { - matrix weights = matrix::Ones(m_m, m_n); + matrix weights = matrix::Ones(M, N); return (*this).sum(axis) / weights.sum(axis); - } // ================================================================================================= @@ -1119,13 +1116,13 @@ inline vector matrix::mean(int axis) const template inline double matrix::average(const matrix &weights, bool norm) const { - assert( m_m == weights.shape(0) ); - assert( m_n == weights.shape(1) ); + assert( M == weights.shape(0) ); + assert( N == weights.shape(1) ); X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; if ( norm ) return static_cast(out)/static_cast(weights.sum()); else return static_cast(out); @@ -1156,7 +1153,7 @@ inline vector matrix::average(const matrix &weights, int axis, bool nor template inline void matrix::abs() { - for ( auto &i : m_data ) + for ( auto &i : mData ) i = std::abs(i); } @@ -1167,10 +1164,10 @@ inline void matrix::abs() template inline void matrix::printf(std::string fmt) const { - for ( size_t i = 0 ; i < m_m ; ++i ) { - for ( size_t j = 0 ; j < m_n ; ++j ) { - if ( j != m_n-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); - else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < M ; ++i ) { + for ( size_t j = 0 ; j < N ; ++j ) { + if ( j != N-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } } diff --git a/src/cppmat/periodic_matrix.h b/src/cppmat/periodic_matrix.h index bc9042e..91b21fc 100644 --- a/src/cppmat/periodic_matrix.h +++ b/src/cppmat/periodic_matrix.h @@ -4,8 +4,8 @@ ================================================================================================= */ -#ifndef CPPMAT_PERIODIC_MATRIX2_H -#define CPPMAT_PERIODIC_MATRIX2_H +#ifndef CPPMAT_PERIODIC_MATRIX_H +#define CPPMAT_PERIODIC_MATRIX_H // ------------------------------------------------------------------------------------------------- @@ -25,17 +25,17 @@ class matrix { private: - std::vector m_data; // data container - size_t m_size=0; // total size - size_t m_m=0; // number of rows - size_t m_n=0; // number of columns - int m_m_i=0; // == m_m, but int - int m_n_i=0; // == m_n, but int + std::vector mData; // data container + size_t mSize=0; // total size + size_t M=0; // number of rows + size_t N=0; // number of columns + int MI=0; // == M, but int + int NI=0; // == N, but int public: // constructor - matrix(){}; + matrix() = default; matrix(size_t m, size_t n); // constructor: initialize diff --git a/src/cppmat/periodic_vector.cpp b/src/cppmat/periodic_vector.cpp index 80d1729..010aee7 100644 --- a/src/cppmat/periodic_vector.cpp +++ b/src/cppmat/periodic_vector.cpp @@ -23,7 +23,7 @@ namespace periodic { template inline vector::vector(size_t n) { - // store shape, and other size parameters, allocate "m_data" + // store shape, and other size parameters, allocate "mData" resize(n); } @@ -106,12 +106,12 @@ template inline void vector::resize(size_t n) { // update size - m_n = n; - m_n_i = static_cast(n); - m_size = n; + N = n; + NI = static_cast(n); + mSize = n; // allocate data - m_data.resize(m_size); + mData.resize(mSize); } // ================================================================================================= @@ -121,7 +121,7 @@ inline void vector::resize(size_t n) template inline size_t vector::size() const { - return m_size; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -141,7 +141,7 @@ inline size_t vector::shape(int i) const assert( i < 1 ); assert( i >= -1 ); - return m_n; + return N; } // ------------------------------------------------------------------------------------------------- @@ -151,8 +151,8 @@ inline size_t vector::shape(size_t i) const { // check axis: (0) assert( i < 1 ); - return m_n; + return N; } // ------------------------------------------------------------------------------------------------- @@ -162,7 +162,7 @@ inline std::vector vector::shape() const { std::vector ret(1); - ret[0] = m_n; + ret[0] = N; return ret; } @@ -189,9 +189,9 @@ inline std::vector vector::strides(bool bytes) const template inline X& vector::operator[](size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -199,9 +199,9 @@ inline X& vector::operator[](size_t i) template inline const X& vector::operator[](size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ================================================================================================= @@ -211,11 +211,11 @@ inline const X& vector::operator[](size_t i) const template inline X& vector::operator()(int a) { - a = ( m_n_i + (a % m_n_i) ) % m_n_i; + a = ( NI + (a % NI) ) % NI; - assert( a < m_n_i ); + assert( a < NI ); - return m_data[a]; + return mData[a]; } // ------------------------------------------------------------------------------------------------- @@ -223,12 +223,11 @@ inline X& vector::operator()(int a) template inline const X& vector::operator()(int a) const { - a = ( m_n_i + (a % m_n_i) ) % m_n_i; + a = ( NI + (a % NI) ) % NI; - assert( a < m_n_i ); - - return m_data[a]; + assert( a < NI ); + return mData[a]; } // ================================================================================================= @@ -238,7 +237,7 @@ inline const X& vector::operator()(int a) const template inline X* vector::data() { - return m_data.data(); + return mData.data(); } // ------------------------------------------------------------------------------------------------- @@ -246,7 +245,7 @@ inline X* vector::data() template inline const X* vector::data() const { - return m_data.data(); + return mData.data(); } // ================================================================================================= @@ -256,7 +255,7 @@ inline const X* vector::data() const template inline auto vector::begin() { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -264,7 +263,7 @@ inline auto vector::begin() template inline auto vector::begin() const { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -272,7 +271,7 @@ inline auto vector::begin() const template inline auto vector::end() { - return m_data.end(); + return mData.end(); } // ------------------------------------------------------------------------------------------------- @@ -280,7 +279,7 @@ inline auto vector::end() template inline auto vector::end() const { - return m_data.end(); + return mData.end(); } // ================================================================================================= @@ -290,9 +289,9 @@ inline auto vector::end() const template inline auto vector::index(size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ------------------------------------------------------------------------------------------------- @@ -300,9 +299,9 @@ inline auto vector::index(size_t i) template inline auto vector::index(size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ================================================================================================= @@ -312,11 +311,11 @@ inline auto vector::index(size_t i) const template inline auto vector::item(int a) { - a = ( m_n_i + (a % m_n_i) ) % m_n_i; + a = ( NI + (a % NI) ) % NI; - assert( a < m_n_i ); + assert( a < NI ); - return m_data.begin() + a; + return begin() + a; } // ------------------------------------------------------------------------------------------------- @@ -324,11 +323,11 @@ inline auto vector::item(int a) template inline auto vector::item(int a) const { - a = ( m_n_i + (a % m_n_i) ) % m_n_i; + a = ( NI + (a % NI) ) % NI; - assert( a < m_n_i ); + assert( a < NI ); - return m_data.begin() + a; + return begin() + a; } // ================================================================================================= @@ -338,7 +337,7 @@ inline auto vector::item(int a) const template inline void vector::setArange() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -346,7 +345,7 @@ inline void vector::setArange() template inline void vector::setZero() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -354,7 +353,7 @@ inline void vector::setZero() template inline void vector::setOnes() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -362,7 +361,7 @@ inline void vector::setOnes() template inline void vector::setConstant(X D) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -371,11 +370,9 @@ template template inline void vector::setCopy(Iterator first, Iterator last) { - // check size - assert( m_size == last - first ); + assert( mSize == last - first ); - // copy - std::copy(first, last, m_data.data()); + std::copy(first, last, begin()); } // ================================================================================================= @@ -385,10 +382,10 @@ inline void vector::setCopy(Iterator first, Iterator last) template inline vector& vector::operator*= (const vector &B) { - assert( m_n == B.shape(0) ); + assert( N == B.shape(0) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } @@ -398,10 +395,10 @@ inline vector& vector::operator*= (const vector &B) template inline vector& vector::operator/= (const vector &B) { - assert( m_n == B.shape(0) ); + assert( N == B.shape(0) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } @@ -411,10 +408,10 @@ inline vector& vector::operator/= (const vector &B) template inline vector& vector::operator+= (const vector &B) { - assert( m_n == B.shape(0) ); + assert( N == B.shape(0) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } @@ -424,10 +421,10 @@ inline vector& vector::operator+= (const vector &B) template inline vector& vector::operator-= (const vector &B) { - assert( m_n == B.shape(0) ); + assert( N == B.shape(0) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } @@ -437,8 +434,8 @@ inline vector& vector::operator-= (const vector &B) template inline vector& vector::operator*= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } @@ -448,8 +445,8 @@ inline vector& vector::operator*= (const X &B) template inline vector& vector::operator/= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } @@ -459,8 +456,8 @@ inline vector& vector::operator/= (const X &B) template inline vector& vector::operator+= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } @@ -470,8 +467,8 @@ inline vector& vector::operator+= (const X &B) template inline vector& vector::operator-= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } @@ -687,8 +684,8 @@ inline X vector::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } @@ -700,7 +697,7 @@ inline X vector::sum() const template inline double vector::mean() const { - return static_cast(this->sum())/static_cast(m_size); + return static_cast(this->sum())/static_cast(mSize); } // ================================================================================================= @@ -710,12 +707,12 @@ inline double vector::mean() const template inline double vector::average(const vector &weights, bool norm) const { - assert( m_n == weights.shape(0) ); + assert( N == weights.shape(0) ); X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; if ( norm ) return static_cast(out)/static_cast(weights.sum()); else return static_cast(out); @@ -728,18 +725,18 @@ inline double vector::average(const vector &weights, bool norm) const template inline vector vector::where() const { - size_t n = 0; + size_t nnz = 0; - for ( auto &i : m_data ) - if ( i ) - ++n; + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] ) + ++nnz; - vector out(n); + vector out(nnz); size_t j = 0; - for ( size_t i = 0 ; i < m_size ; ++i ) { - if ( m_data[i] ) { + for ( size_t i = 0 ; i < mSize ; ++i ) { + if ( mData[i] ) { out[j] = i; ++j; } @@ -755,7 +752,7 @@ inline vector vector::where() const template inline void vector::abs() { - for ( auto &i : m_data ) + for ( auto &i : mData ) i = std::abs(i); } @@ -766,9 +763,9 @@ inline void vector::abs() template inline void vector::printf(std::string fmt) const { - for ( size_t j = 0 ; j < m_n ; ++j ) { - if ( j != m_n-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); - else std::printf((fmt + ";\n").c_str(), (*this)(j)); + for ( size_t j = 0 ; j < N ; ++j ) { + if ( j != N-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); + else std::printf((fmt + ";\n").c_str(), (*this)(j)); } } diff --git a/src/cppmat/periodic_vector.h b/src/cppmat/periodic_vector.h index 14f1fe0..ded3b6b 100644 --- a/src/cppmat/periodic_vector.h +++ b/src/cppmat/periodic_vector.h @@ -25,15 +25,15 @@ class vector { private: - std::vector m_data; // data container - size_t m_size=0; // total size - size_t m_n=0; // number of columns - int m_n_i=0; // == m_n, but int + std::vector mData; // data container + size_t mSize=0; // total size + size_t N=0; // number of columns + int NI=0; // == N, but int public: // constructor - vector(){}; + vector() = default; vector(size_t n); // constructor: initialize diff --git a/src/cppmat/regular_array.cpp b/src/cppmat/regular_array.cpp index 9a3ad58..eb0c8c4 100644 --- a/src/cppmat/regular_array.cpp +++ b/src/cppmat/regular_array.cpp @@ -22,7 +22,7 @@ namespace cppmat { template inline array::array(const std::vector &shape) { - // store shape, and other size parameters, allocate "m_data" + // store shape, and other size parameters, allocate "mData" resize(shape); } @@ -108,32 +108,32 @@ inline void array::resize(const std::vector &shape) assert( shape.size() <= MAX_DIM ); // update number of dimensions - m_ndim = shape.size(); + mNdim = shape.size(); // initialize shape in all directions to "1" for ( size_t i = 0 ; i < MAX_DIM ; ++i ) { - m_shape [i] = 1; - m_strides[i] = 1; + mShape [i] = 1; + mStrides[i] = 1; } // initialize size - m_size = 1; + mSize = 1; // update shape/size - for ( size_t i = 0 ; i < m_ndim ; ++i ) + for ( size_t i = 0 ; i < mNdim ; ++i ) { - m_shape[i] = shape[i]; - m_size *= shape[i]; + mShape[i] = shape[i]; + mSize *= shape[i]; } // set storage strides - for ( size_t i = 0 ; i < m_ndim ; ++i ) - for ( size_t j = i+1 ; j < m_ndim ; ++j ) - m_strides[i] *= m_shape[j]; + for ( size_t i = 0 ; i < mNdim ; ++i ) + for ( size_t j = i+1 ; j < mNdim ; ++j ) + mStrides[i] *= mShape[j]; // allocate data - m_data.resize(m_size); + mData.resize(mSize); } // ------------------------------------------------------------------------------------------------- @@ -143,11 +143,11 @@ inline void array::chdim(size_t ndim) { // check that all removed dimensions are of shape 1 #ifndef NDEBUG - for ( size_t i = ndim ; i < MAX_DIM ; ++i ) assert( m_shape[i] == 1 ); + for ( size_t i = ndim ; i < MAX_DIM ; ++i ) assert( mShape[i] == 1 ); #endif // update number of dimensions - m_ndim = ndim; + mNdim = ndim; } // ------------------------------------------------------------------------------------------------- @@ -161,7 +161,7 @@ inline void array::reshape(const std::vector &shape) for ( auto &i : shape ) n *= i; - assert( n == m_size ); + assert( n == mSize ); #endif // process new shape @@ -175,7 +175,7 @@ inline void array::reshape(const std::vector &shape) template inline size_t array::size() const { - return m_size; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -183,7 +183,7 @@ inline size_t array::size() const template inline size_t array::ndim() const { - return m_ndim; + return mNdim; } // ------------------------------------------------------------------------------------------------- @@ -192,17 +192,17 @@ template inline size_t array::shape(int i) const { // check axis: (0,1,...,ndim-1) or (-1,-2,...,-ndim) - assert( i < static_cast(m_ndim) ); - assert( i >= -1 * static_cast(m_ndim) ); + assert( i < static_cast(mNdim) ); + assert( i >= -1 * static_cast(mNdim) ); // get number of dimensions as integer - int n = static_cast(m_ndim); + int n = static_cast(mNdim); // correct periodic index i = ( n + (i%n) ) % n; // return shape - return m_shape[i]; + return mShape[i]; } // ------------------------------------------------------------------------------------------------- @@ -211,10 +211,10 @@ template inline size_t array::shape(size_t i) const { // check axis: (0,1,...,ndim-1) - assert( i < m_ndim ); + assert( i < mNdim ); // return shape - return m_shape[i]; + return mShape[i]; } // ------------------------------------------------------------------------------------------------- @@ -222,9 +222,9 @@ inline size_t array::shape(size_t i) const template inline std::vector array::shape() const { - std::vector ret(m_ndim); + std::vector ret(mNdim); - for ( size_t i = 0 ; i < m_ndim ; ++i ) ret[i] = m_shape[i]; + std::copy(std::begin(mShape), std::begin(mShape)+mNdim, ret.begin()); return ret; } @@ -234,13 +234,12 @@ inline std::vector array::shape() const template inline std::vector array::strides(bool bytes) const { - std::vector ret(m_ndim); + std::vector ret(mNdim); - for ( size_t i = 0 ; i < m_ndim ; ++i ) - ret[i] = m_strides[i]; + std::copy(std::begin(mStrides), std::begin(mStrides)+mNdim, ret.begin()); if ( bytes ) - for ( size_t i = 0 ; i < m_ndim ; ++i ) + for ( size_t i = 0 ; i < mNdim ; ++i ) ret[i] *= sizeof(X); return ret; @@ -253,9 +252,9 @@ inline std::vector array::strides(bool bytes) const template inline X& array::operator[](size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -263,9 +262,9 @@ inline X& array::operator[](size_t i) template inline const X& array::operator[](size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ================================================================================================= @@ -275,11 +274,11 @@ inline const X& array::operator[](size_t i) const template inline X& array::operator()(size_t a) { - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape[0] ); + assert( a < mShape[0] ); - return m_data[a*m_strides[0]]; + return mData[a*mStrides[0]]; } // ------------------------------------------------------------------------------------------------- @@ -287,11 +286,11 @@ inline X& array::operator()(size_t a) template inline const X& array::operator()(size_t a) const { - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape[0] ); + assert( a < mShape[0] ); - return m_data[a*m_strides[0]]; + return mData[a*mStrides[0]]; } // ------------------------------------------------------------------------------------------------- @@ -299,12 +298,12 @@ inline const X& array::operator()(size_t a) const template inline X& array::operator()(size_t a, size_t b) { - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); - return m_data[a*m_strides[0]+b*m_strides[1]]; + return mData[a*mStrides[0]+b*mStrides[1]]; } // ------------------------------------------------------------------------------------------------- @@ -312,12 +311,12 @@ inline X& array::operator()(size_t a, size_t b) template inline const X& array::operator()(size_t a, size_t b) const { - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); - return m_data[a*m_strides[0]+b*m_strides[1]]; + return mData[a*mStrides[0]+b*mStrides[1]]; } // ------------------------------------------------------------------------------------------------- @@ -325,13 +324,13 @@ inline const X& array::operator()(size_t a, size_t b) const template inline X& array::operator()(size_t a, size_t b, size_t c) { - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]]; } // ------------------------------------------------------------------------------------------------- @@ -339,13 +338,13 @@ inline X& array::operator()(size_t a, size_t b, size_t c) template inline const X& array::operator()(size_t a, size_t b, size_t c) const { - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]]; } // ------------------------------------------------------------------------------------------------- @@ -353,14 +352,14 @@ inline const X& array::operator()(size_t a, size_t b, size_t c) const template inline X& array::operator()(size_t a, size_t b, size_t c, size_t d) { - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]]; } // ------------------------------------------------------------------------------------------------- @@ -368,14 +367,14 @@ inline X& array::operator()(size_t a, size_t b, size_t c, size_t d) template inline const X& array::operator()(size_t a, size_t b, size_t c, size_t d) const { - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]]; } // ------------------------------------------------------------------------------------------------- @@ -383,15 +382,15 @@ inline const X& array::operator()(size_t a, size_t b, size_t c, size_t d) con template inline X& array::operator()(size_t a, size_t b, size_t c, size_t d, size_t e) { - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]]; } // ------------------------------------------------------------------------------------------------- @@ -399,15 +398,15 @@ inline X& array::operator()(size_t a, size_t b, size_t c, size_t d, size_t e) template inline const X& array::operator()(size_t a, size_t b, size_t c, size_t d, size_t e) const { - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); - return m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]]; + return mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]]; } // ------------------------------------------------------------------------------------------------- @@ -415,17 +414,17 @@ inline const X& array::operator()(size_t a, size_t b, size_t c, size_t d, siz template inline X& array::operator()(size_t a, size_t b, size_t c, size_t d, size_t e, size_t f) { - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); - assert( f < m_shape[5] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); + assert( f < mShape[5] ); return \ - m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]]; + mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]]; } // ------------------------------------------------------------------------------------------------- @@ -434,17 +433,17 @@ template inline const X& array::operator()( size_t a, size_t b, size_t c, size_t d, size_t e, size_t f) const { - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); - assert( f < m_shape[5] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); + assert( f < mShape[5] ); return \ - m_data[a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]]; + mData[a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]]; } // ================================================================================================= @@ -456,12 +455,12 @@ template inline X& array::at(Iterator first, Iterator last) { // check input - assert( static_cast(last-first) > 0 ); - assert( static_cast(last-first) <= m_ndim ); + assert( static_cast(last-first) > 0 ); + assert( static_cast(last-first) <= mNdim ); // iterator to shape and stride - size_t *shape = &m_shape [0]; - size_t *stride = &m_strides[0]; + size_t *shape = &mShape [0]; + size_t *stride = &mStrides[0]; // zero-initialize plain storage index size_t idx = 0; @@ -478,7 +477,7 @@ inline X& array::at(Iterator first, Iterator last) ++shape; } - return m_data[idx]; + return mData[idx]; } // ------------------------------------------------------------------------------------------------- @@ -488,12 +487,12 @@ template inline const X& array::at(Iterator first, Iterator last) const { // check input - assert( static_cast(last-first) > 0 ); - assert( static_cast(last-first) <= m_ndim ); + assert( static_cast(last-first) > 0 ); + assert( static_cast(last-first) <= mNdim ); // iterator to shape and stride - size_t *shape = &m_shape [0]; - size_t *stride = &m_strides[0]; + size_t *shape = &mShape [0]; + size_t *stride = &mStrides[0]; // zero-initialize plain storage index size_t idx = 0; @@ -510,7 +509,7 @@ inline const X& array::at(Iterator first, Iterator last) const ++shape; } - return m_data[idx]; + return mData[idx]; } // ================================================================================================= @@ -520,11 +519,11 @@ inline const X& array::at(Iterator first, Iterator last) const template inline size_t array::compress(size_t a) const { - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape[0] ); + assert( a < mShape[0] ); - return a*m_strides[0]; + return a*mStrides[0]; } // ------------------------------------------------------------------------------------------------- @@ -532,12 +531,12 @@ inline size_t array::compress(size_t a) const template inline size_t array::compress(size_t a, size_t b) const { - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); - return a*m_strides[0]+b*m_strides[1]; + return a*mStrides[0]+b*mStrides[1]; } // ------------------------------------------------------------------------------------------------- @@ -545,13 +544,13 @@ inline size_t array::compress(size_t a, size_t b) const template inline size_t array::compress(size_t a, size_t b, size_t c) const { - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); - return a*m_strides[0]+b*m_strides[1]+c*m_strides[2]; + return a*mStrides[0]+b*mStrides[1]+c*mStrides[2]; } // ------------------------------------------------------------------------------------------------- @@ -559,14 +558,14 @@ inline size_t array::compress(size_t a, size_t b, size_t c) const template inline size_t array::compress(size_t a, size_t b, size_t c, size_t d) const { - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); - return a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]; + return a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]; } // ------------------------------------------------------------------------------------------------- @@ -574,15 +573,15 @@ inline size_t array::compress(size_t a, size_t b, size_t c, size_t d) const template inline size_t array::compress(size_t a, size_t b, size_t c, size_t d, size_t e) const { - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); - return a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]; + return a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]; } // ------------------------------------------------------------------------------------------------- @@ -590,16 +589,16 @@ inline size_t array::compress(size_t a, size_t b, size_t c, size_t d, size_t template inline size_t array::compress(size_t a, size_t b, size_t c, size_t d, size_t e, size_t f) const { - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); - assert( f < m_shape[5] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); + assert( f < mShape[5] ); - return a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]; + return a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]; } // ================================================================================================= @@ -610,15 +609,15 @@ template inline std::vector array::decompress(size_t i) const { // check input - assert( i < m_size ); + assert( i < mSize ); // allocate array-index - std::vector idx(m_ndim); + std::vector idx(mNdim); // reconstruct - for ( size_t j = 0 ; j < m_ndim ; ++j ) { - idx[j] = (i - i%m_strides[j]) / m_strides[j]; - i -= idx[j] * m_strides[j]; + for ( size_t j = 0 ; j < mNdim ; ++j ) { + idx[j] = (i - i%mStrides[j]) / mStrides[j]; + i -= idx[j] * mStrides[j]; } return idx; @@ -631,7 +630,7 @@ inline std::vector array::decompress(size_t i) const template inline X* array::data() { - return m_data.data(); + return mData.data(); } // ------------------------------------------------------------------------------------------------- @@ -639,7 +638,7 @@ inline X* array::data() template inline const X* array::data() const { - return m_data.data(); + return mData.data(); } // ================================================================================================= @@ -649,7 +648,7 @@ inline const X* array::data() const template inline auto array::begin() { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -657,7 +656,7 @@ inline auto array::begin() template inline auto array::begin() const { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -665,7 +664,7 @@ inline auto array::begin() const template inline auto array::end() { - return m_data.end(); + return mData.end(); } // ------------------------------------------------------------------------------------------------- @@ -673,7 +672,7 @@ inline auto array::end() template inline auto array::end() const { - return m_data.end(); + return mData.end(); } // ================================================================================================= @@ -683,9 +682,9 @@ inline auto array::end() const template inline auto array::index(size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ------------------------------------------------------------------------------------------------- @@ -693,9 +692,9 @@ inline auto array::index(size_t i) template inline auto array::index(size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ================================================================================================= @@ -705,11 +704,11 @@ inline auto array::index(size_t i) const template inline auto array::item(size_t a) { - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape[0] ); + assert( a < mShape[0] ); - return m_data.begin() + a*m_strides[0]; + return begin() + a*mStrides[0]; } // ------------------------------------------------------------------------------------------------- @@ -717,11 +716,11 @@ inline auto array::item(size_t a) template inline auto array::item(size_t a) const { - assert( m_ndim >= 1 ); + assert( mNdim >= 1 ); - assert( a < m_shape[0] ); + assert( a < mShape[0] ); - return m_data.begin() + a*m_strides[0]; + return begin() + a*mStrides[0]; } // ------------------------------------------------------------------------------------------------- @@ -729,12 +728,12 @@ inline auto array::item(size_t a) const template inline auto array::item(size_t a, size_t b) { - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]; + return begin() + a*mStrides[0]+b*mStrides[1]; } // ------------------------------------------------------------------------------------------------- @@ -742,12 +741,12 @@ inline auto array::item(size_t a, size_t b) template inline auto array::item(size_t a, size_t b) const { - assert( m_ndim >= 2 ); + assert( mNdim >= 2 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]; + return begin() + a*mStrides[0]+b*mStrides[1]; } // ------------------------------------------------------------------------------------------------- @@ -755,13 +754,13 @@ inline auto array::item(size_t a, size_t b) const template inline auto array::item(size_t a, size_t b, size_t c) { - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]+c*m_strides[2]; + return begin() + a*mStrides[0]+b*mStrides[1]+c*mStrides[2]; } // ------------------------------------------------------------------------------------------------- @@ -769,13 +768,13 @@ inline auto array::item(size_t a, size_t b, size_t c) template inline auto array::item(size_t a, size_t b, size_t c) const { - assert( m_ndim >= 3 ); + assert( mNdim >= 3 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]+c*m_strides[2]; + return begin() + a*mStrides[0]+b*mStrides[1]+c*mStrides[2]; } // ------------------------------------------------------------------------------------------------- @@ -783,14 +782,14 @@ inline auto array::item(size_t a, size_t b, size_t c) const template inline auto array::item(size_t a, size_t b, size_t c, size_t d) { - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]; + return begin() + a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]; } // ------------------------------------------------------------------------------------------------- @@ -798,14 +797,14 @@ inline auto array::item(size_t a, size_t b, size_t c, size_t d) template inline auto array::item(size_t a, size_t b, size_t c, size_t d) const { - assert( m_ndim >= 4 ); + assert( mNdim >= 4 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); - return m_data.begin() + a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]; + return begin() + a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]; } // ------------------------------------------------------------------------------------------------- @@ -813,15 +812,15 @@ inline auto array::item(size_t a, size_t b, size_t c, size_t d) const template inline auto array::item(size_t a, size_t b, size_t c, size_t d, size_t e) { - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); - return m_data.begin()+a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]; + return begin()+a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]; } // ------------------------------------------------------------------------------------------------- @@ -829,15 +828,15 @@ inline auto array::item(size_t a, size_t b, size_t c, size_t d, size_t e) template inline auto array::item(size_t a, size_t b, size_t c, size_t d, size_t e) const { - assert( m_ndim >= 5 ); + assert( mNdim >= 5 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); - return m_data.begin()+a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]; + return begin()+a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]; } // ------------------------------------------------------------------------------------------------- @@ -845,17 +844,16 @@ inline auto array::item(size_t a, size_t b, size_t c, size_t d, size_t e) con template inline auto array::item(size_t a, size_t b, size_t c, size_t d, size_t e, size_t f) { - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); - assert( f < m_shape[5] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); + assert( f < mShape[5] ); - return m_data.begin() + - a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]; + return begin()+a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]; } // ------------------------------------------------------------------------------------------------- @@ -863,17 +861,16 @@ inline auto array::item(size_t a, size_t b, size_t c, size_t d, size_t e, siz template inline auto array::item(size_t a, size_t b, size_t c, size_t d, size_t e, size_t f) const { - assert( m_ndim >= 6 ); + assert( mNdim >= 6 ); - assert( a < m_shape[0] ); - assert( b < m_shape[1] ); - assert( c < m_shape[2] ); - assert( d < m_shape[3] ); - assert( e < m_shape[4] ); - assert( f < m_shape[5] ); + assert( a < mShape[0] ); + assert( b < mShape[1] ); + assert( c < mShape[2] ); + assert( d < mShape[3] ); + assert( e < mShape[4] ); + assert( f < mShape[5] ); - return m_data.begin() + - a*m_strides[0]+b*m_strides[1]+c*m_strides[2]+d*m_strides[3]+e*m_strides[4]+f*m_strides[5]; + return begin()+a*mStrides[0]+b*mStrides[1]+c*mStrides[2]+d*mStrides[3]+e*mStrides[4]+f*mStrides[5]; } // ================================================================================================= @@ -883,7 +880,7 @@ inline auto array::item(size_t a, size_t b, size_t c, size_t d, size_t e, siz template inline void array::setArange() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -891,7 +888,7 @@ inline void array::setArange() template inline void array::setZero() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -899,7 +896,7 @@ inline void array::setZero() template inline void array::setOnes() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -907,7 +904,7 @@ inline void array::setOnes() template inline void array::setConstant(X D) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -916,11 +913,9 @@ template template inline void array::setCopy(Iterator first, Iterator last) { - // check size - assert( m_size == last - first ); + assert( mSize == last - first ); - // copy - std::copy(first, last, m_data.data()); + std::copy(first, last, begin()); } // ================================================================================================= @@ -933,8 +928,8 @@ inline array& array::operator*= (const array &B) assert( shape() == B.shape() ); assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } @@ -947,8 +942,8 @@ inline array& array::operator/= (const array &B) assert( shape() == B.shape() ); assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } @@ -961,8 +956,8 @@ inline array& array::operator+= (const array &B) assert( shape() == B.shape() ); assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } @@ -975,8 +970,8 @@ inline array& array::operator-= (const array &B) assert( shape() == B.shape() ); assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } @@ -986,8 +981,8 @@ inline array& array::operator-= (const array &B) template inline array& array::operator*= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } @@ -997,8 +992,8 @@ inline array& array::operator*= (const X &B) template inline array& array::operator/= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } @@ -1008,8 +1003,8 @@ inline array& array::operator/= (const X &B) template inline array& array::operator+= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } @@ -1019,8 +1014,8 @@ inline array& array::operator+= (const X &B) template inline array& array::operator-= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } @@ -1227,7 +1222,7 @@ template inline array array::minCoeff(size_t axis) const { // check input - assert( axis < m_ndim ); + assert( axis < mNdim ); // initialize output to the same shape as the input, with one axis removed array out = array::Constant(del(this->shape(),axis), this->maxCoeff()); @@ -1236,19 +1231,19 @@ inline array array::minCoeff(size_t axis) const // - copy strides std::vector estrides = this->strides(); // - insert total size at the beginning - estrides.insert(estrides.begin(), m_size); + estrides.insert(estrides.begin(), mSize); // extract sizes size_t n = estrides[axis ]; size_t m = estrides[axis+1]; // perform reduction - for ( size_t i = 0 ; i < m_size ; ++i ) + for ( size_t i = 0 ; i < mSize ; ++i ) { // - get the new index size_t ni = i/n*m + i%m; // - store - out[ni] = std::min(out[ni], m_data[i]); + out[ni] = std::min(out[ni], mData[i]); } return out; @@ -1260,11 +1255,11 @@ template inline array array::minCoeff(int axis) const { // check axis: (0,1,...,ndim-1) or (-1,-2,...,-ndim) - assert( axis < static_cast(m_ndim) ); - assert( axis >= -1 * static_cast(m_ndim) ); + assert( axis < static_cast(mNdim) ); + assert( axis >= -1 * static_cast(mNdim) ); // get number of dimensions as integer - int n = static_cast(m_ndim); + int n = static_cast(mNdim); // correct periodic axis axis = ( n + (axis%n) ) % n; @@ -1279,7 +1274,7 @@ template inline array array::minCoeff(const std::vector &axes_in) const { // correct for 'periodicity', sort from high to low - std::vector axes = Private::sort_axes(axes_in, static_cast(m_ndim), true); + std::vector axes = Private::sort_axes(axes_in, static_cast(mNdim), true); // copy array array out = (*this); @@ -1307,7 +1302,7 @@ template inline array array::maxCoeff(size_t axis) const { // check input - assert( axis < m_ndim ); + assert( axis < mNdim ); // initialize output to the same shape as the input, with one axis removed array out = array::Constant(del(this->shape(),axis), this->minCoeff()); @@ -1316,19 +1311,19 @@ inline array array::maxCoeff(size_t axis) const // - copy strides std::vector estrides = this->strides(); // - insert total size at the beginning - estrides.insert(estrides.begin(), m_size); + estrides.insert(estrides.begin(), mSize); // extract sizes size_t n = estrides[axis ]; size_t m = estrides[axis+1]; // perform reduction - for ( size_t i = 0 ; i < m_size ; ++i ) + for ( size_t i = 0 ; i < mSize ; ++i ) { // - get the new index size_t ni = i/n*m + i%m; // - store - out[ni] = std::max(out[ni], m_data[i]); + out[ni] = std::max(out[ni], mData[i]); } return out; @@ -1340,11 +1335,11 @@ template inline array array::maxCoeff(int axis) const { // check axis: (0,1,...,ndim-1) or (-1,-2,...,-ndim) - assert( axis < static_cast(m_ndim) ); - assert( axis >= -1 * static_cast(m_ndim) ); + assert( axis < static_cast(mNdim) ); + assert( axis >= -1 * static_cast(mNdim) ); // get number of dimensions as integer - int n = static_cast(m_ndim); + int n = static_cast(mNdim); // correct periodic axis axis = ( n + (axis%n) ) % n; @@ -1359,7 +1354,7 @@ template inline array array::maxCoeff(const std::vector &axes_in) const { // correct for 'periodicity', sort from high to low - std::vector axes = Private::sort_axes(axes_in, static_cast(m_ndim), true); + std::vector axes = Private::sort_axes(axes_in, static_cast(mNdim), true); // copy array array out = (*this); @@ -1380,8 +1375,8 @@ inline X array::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } @@ -1398,19 +1393,19 @@ inline array array::sum(size_t axis) const // - copy strides std::vector estrides = this->strides(); // - insert total size at the beginning - estrides.insert(estrides.begin(), m_size); + estrides.insert(estrides.begin(), mSize); // extract sizes size_t n = estrides[axis ]; size_t m = estrides[axis+1]; // perform reduction - for ( size_t i = 0 ; i < m_size ; ++i ) + for ( size_t i = 0 ; i < mSize ; ++i ) { // - get the new index size_t ni = i/n*m + i%m; // - store - out[ni] += m_data[i]; + out[ni] += mData[i]; } return out; @@ -1422,11 +1417,11 @@ template inline array array::sum(int axis) const { // check axis: (0,1,...,ndim-1) or (-1,-2,...,-ndim) - assert( axis < static_cast(m_ndim) ); - assert( axis >= -1 * static_cast(m_ndim) ); + assert( axis < static_cast(mNdim) ); + assert( axis >= -1 * static_cast(mNdim) ); // get number of dimensions as integer - int n = static_cast(m_ndim); + int n = static_cast(mNdim); // correct periodic axis axis = ( n + (axis%n) ) % n; @@ -1441,7 +1436,7 @@ template inline array array::sum(const std::vector &axes_in) const { // correct for 'periodicity', sort from high to low - std::vector axes = Private::sort_axes(axes_in, static_cast(m_ndim), true); + std::vector axes = Private::sort_axes(axes_in, static_cast(mNdim), true); // copy array array out = (*this); @@ -1460,7 +1455,7 @@ inline array array::sum(const std::vector &axes_in) const template inline double array::mean() const { - return static_cast(this->sum())/static_cast(m_size); + return static_cast(this->sum())/static_cast(mSize); } // ------------------------------------------------------------------------------------------------- @@ -1504,8 +1499,8 @@ inline double array::average(const array &weights, bool norm) const X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; if ( norm ) return static_cast(out)/static_cast(weights.sum()); else return static_cast(out); @@ -1546,7 +1541,7 @@ inline array array::average( template inline void array::abs() { - for ( auto &i : m_data ) + for ( auto &i : mData ) i = std::abs(i); } @@ -1557,22 +1552,22 @@ inline void array::abs() template inline void array::printf(std::string fmt) const { - if ( m_ndim == 1 ) + if ( mNdim == 1 ) { - for ( size_t j = 0 ; j < m_shape[0] ; ++j ) { - if ( j != m_shape[0]-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); - else std::printf((fmt + ";\n").c_str(), (*this)(j)); + for ( size_t j = 0 ; j < mShape[0] ; ++j ) { + if ( j != mShape[0]-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); + else std::printf((fmt + ";\n").c_str(), (*this)(j)); } return; } - if ( m_ndim == 2 ) + if ( mNdim == 2 ) { - for ( size_t i = 0 ; i < m_shape[0] ; ++i ) { - for ( size_t j = 0 ; j < m_shape[1] ; ++j ) { - if ( j != m_shape[1]-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); - else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < mShape[0] ; ++i ) { + for ( size_t j = 0 ; j < mShape[1] ; ++j ) { + if ( j != mShape[1]-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } @@ -1581,10 +1576,10 @@ inline void array::printf(std::string fmt) const std::cout << "cppmat::array["; - for ( size_t i = 0 ; i < m_ndim-1 ; ++i ) + for ( size_t i = 0 ; i < mNdim-1 ; ++i ) std::cout << shape(i) << ","; - std::cout << shape(m_ndim-1) << "]\n"; + std::cout << shape(mNdim-1) << "]\n"; } diff --git a/src/cppmat/regular_array.h b/src/cppmat/regular_array.h index 0ca7e45..dadd223 100644 --- a/src/cppmat/regular_array.h +++ b/src/cppmat/regular_array.h @@ -24,17 +24,17 @@ class array { private: - static const size_t MAX_DIM=6; // maximum number of dimensions - std::vector m_data; // data container - size_t m_ndim=0; // actual number of dimensions - size_t m_size=0; // total size == data.size() == prod(shape) - size_t m_shape[MAX_DIM]; // number of entries in each dimensions - size_t m_strides[MAX_DIM]; // stride length for each index + static const size_t MAX_DIM=6; // maximum number of dimensions + std::vector mData; // data container + size_t mNdim=0; // actual number of dimensions + size_t mSize=0; // total size == data.size() == prod(shape) + size_t mShape[MAX_DIM]; // number of entries in each dimensions + size_t mStrides[MAX_DIM]; // stride length for each index public: // constructor - array(){}; + array() = default; array(const std::vector &shape); // constructor: initialize diff --git a/src/cppmat/regular_matrix.cpp b/src/cppmat/regular_matrix.cpp index 16f9da6..0a3dee8 100644 --- a/src/cppmat/regular_matrix.cpp +++ b/src/cppmat/regular_matrix.cpp @@ -22,7 +22,7 @@ namespace cppmat { template inline matrix::matrix(size_t m, size_t n) { - // store shape, and other size parameters, allocate "m_data" + // store shape, and other size parameters, allocate "mData" resize(m,n); } @@ -105,12 +105,12 @@ template inline void matrix::resize(size_t m, size_t n) { // update shape/size - m_m = m; - m_n = n; - m_size = m*n; + M = m; + N = n; + mSize = m*n; // allocate data - m_data.resize(m_size); + mData.resize(mSize); } // ------------------------------------------------------------------------------------------------- @@ -119,7 +119,7 @@ template inline void matrix::reshape(size_t m, size_t n) { // check that the size is unchanged - assert( m_size == m*n ); + assert( mSize == m*n ); // process new shape resize(m,n); @@ -132,7 +132,7 @@ inline void matrix::reshape(size_t m, size_t n) template inline size_t matrix::size() const { - return m_size; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -148,7 +148,7 @@ inline size_t matrix::ndim() const template inline size_t matrix::rows() const { - return m_m; + return M; } // ------------------------------------------------------------------------------------------------- @@ -156,7 +156,7 @@ inline size_t matrix::rows() const template inline size_t matrix::cols() const { - return m_n; + return N; } // ------------------------------------------------------------------------------------------------- @@ -172,8 +172,8 @@ inline size_t matrix::shape(int i) const i = ( 2 + (i%2) ) % 2; // return shape - if ( i == 0 ) return m_m; - else return m_n; + if ( i == 0 ) return M; + else return N; } // ------------------------------------------------------------------------------------------------- @@ -185,8 +185,8 @@ inline size_t matrix::shape(size_t i) const assert( i < 2 ); // return shape - if ( i == 0 ) return m_m; - else return m_n; + if ( i == 0 ) return M; + else return N; } // ------------------------------------------------------------------------------------------------- @@ -196,8 +196,8 @@ inline std::vector matrix::shape() const { std::vector ret(2); - ret[0] = m_m; - ret[1] = m_n; + ret[0] = M; + ret[1] = N; return ret; } @@ -209,7 +209,7 @@ inline std::vector matrix::strides(bool bytes) const { std::vector ret(2); - ret[0] = m_n; + ret[0] = N; ret[1] = 1; if ( bytes ) { @@ -227,9 +227,9 @@ inline std::vector matrix::strides(bool bytes) const template inline X& matrix::operator[](size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -237,9 +237,9 @@ inline X& matrix::operator[](size_t i) template inline const X& matrix::operator[](size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ================================================================================================= @@ -249,9 +249,9 @@ inline const X& matrix::operator[](size_t i) const template inline X& matrix::operator()(size_t a) { - assert( a < m_m ); + assert( a < M ); - return m_data[a*m_n]; + return mData[a*N]; } // ------------------------------------------------------------------------------------------------- @@ -259,9 +259,9 @@ inline X& matrix::operator()(size_t a) template inline const X& matrix::operator()(size_t a) const { - assert( a < m_m ); + assert( a < M ); - return m_data[a*m_n]; + return mData[a*N]; } // ------------------------------------------------------------------------------------------------- @@ -269,10 +269,10 @@ inline const X& matrix::operator()(size_t a) const template inline X& matrix::operator()(size_t a, size_t b) { - assert( a < m_m ); - assert( b < m_n ); + assert( a < M ); + assert( b < N ); - return m_data[a*m_n+b]; + return mData[a*N+b]; } // ------------------------------------------------------------------------------------------------- @@ -280,10 +280,10 @@ inline X& matrix::operator()(size_t a, size_t b) template inline const X& matrix::operator()(size_t a, size_t b) const { - assert( a < m_m ); - assert( b < m_n ); + assert( a < M ); + assert( b < N ); - return m_data[a*m_n+b]; + return mData[a*N+b]; } // ================================================================================================= @@ -308,7 +308,7 @@ inline X& matrix::at(Iterator first, Iterator last) // optional index if ( last-first == 2 ) b = first[1]; - return m_data[a*m_n+b]; + return mData[a*N+b]; } // ------------------------------------------------------------------------------------------------- @@ -331,7 +331,7 @@ inline const X& matrix::at(Iterator first, Iterator last) const // optional index if ( last-first == 2 ) b = first[1]; - return m_data[a*m_n+b]; + return mData[a*N+b]; } // ================================================================================================= @@ -341,9 +341,9 @@ inline const X& matrix::at(Iterator first, Iterator last) const template inline size_t matrix::compress(size_t a) const { - assert( a < m_m ); + assert( a < M ); - return a*m_n; + return a*N; } // ------------------------------------------------------------------------------------------------- @@ -351,10 +351,10 @@ inline size_t matrix::compress(size_t a) const template inline size_t matrix::compress(size_t a, size_t b) const { - assert( a < m_m ); - assert( b < m_n ); + assert( a < M ); + assert( b < N ); - return a*m_n+b; + return a*N+b; } // ================================================================================================= @@ -365,14 +365,14 @@ template inline std::vector matrix::decompress(size_t i) const { // check input - assert( i < m_size ); + assert( i < mSize ); // allocate array-index std::vector idx(2); // reconstruct - idx[1] = i % m_n; - idx[0] = ( i - idx[1] ) / m_n; + idx[1] = i % N; + idx[0] = ( i - idx[1] ) / N; return idx; } @@ -384,7 +384,7 @@ inline std::vector matrix::decompress(size_t i) const template inline X* matrix::data() { - return m_data.data(); + return mData.data(); } // ------------------------------------------------------------------------------------------------- @@ -392,7 +392,7 @@ inline X* matrix::data() template inline const X* matrix::data() const { - return m_data.data(); + return mData.data(); } // ================================================================================================= @@ -402,7 +402,7 @@ inline const X* matrix::data() const template inline auto matrix::begin() { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -410,7 +410,7 @@ inline auto matrix::begin() template inline auto matrix::begin() const { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -418,7 +418,7 @@ inline auto matrix::begin() const template inline auto matrix::end() { - return m_data.end(); + return mData.end(); } // ------------------------------------------------------------------------------------------------- @@ -426,7 +426,7 @@ inline auto matrix::end() template inline auto matrix::end() const { - return m_data.end(); + return mData.end(); } // ================================================================================================= @@ -436,9 +436,9 @@ inline auto matrix::end() const template inline auto matrix::beginRow(size_t a) { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + a*m_n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- @@ -446,9 +446,9 @@ inline auto matrix::beginRow(size_t a) template inline auto matrix::beginRow(size_t a) const { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + a*m_n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- @@ -456,9 +456,9 @@ inline auto matrix::beginRow(size_t a) const template inline auto matrix::endRow(size_t a) { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + (a+1)*m_n; + return begin() + (a+1)*N; } // ------------------------------------------------------------------------------------------------- @@ -466,9 +466,9 @@ inline auto matrix::endRow(size_t a) template inline auto matrix::endRow(size_t a) const { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + (a+1)*m_n; + return begin() + (a+1)*N; } // ================================================================================================= @@ -478,9 +478,9 @@ inline auto matrix::endRow(size_t a) const template inline auto matrix::index(size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ------------------------------------------------------------------------------------------------- @@ -488,9 +488,9 @@ inline auto matrix::index(size_t i) template inline auto matrix::index(size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ================================================================================================= @@ -500,9 +500,9 @@ inline auto matrix::index(size_t i) const template inline auto matrix::item(size_t a) { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + a*m_n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- @@ -510,9 +510,9 @@ inline auto matrix::item(size_t a) template inline auto matrix::item(size_t a) const { - assert( a < m_m ); + assert( a < M ); - return m_data.begin() + a*m_n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- @@ -520,10 +520,10 @@ inline auto matrix::item(size_t a) const template inline auto matrix::item(size_t a, size_t b) { - assert( a < m_m ); - assert( b < m_n ); + assert( a < M ); + assert( b < N ); - return m_data.begin() + a*m_n+b; + return begin() + a*N+b; } // ------------------------------------------------------------------------------------------------- @@ -531,10 +531,10 @@ inline auto matrix::item(size_t a, size_t b) template inline auto matrix::item(size_t a, size_t b) const { - assert( a < m_m ); - assert( b < m_n ); + assert( a < M ); + assert( b < N ); - return m_data.begin() + a*m_n+b; + return begin() + a*N+b; } // ================================================================================================= @@ -544,7 +544,7 @@ inline auto matrix::item(size_t a, size_t b) const template inline void matrix::setArange() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -552,7 +552,7 @@ inline void matrix::setArange() template inline void matrix::setZero() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -560,7 +560,7 @@ inline void matrix::setZero() template inline void matrix::setOnes() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -568,7 +568,7 @@ inline void matrix::setOnes() template inline void matrix::setConstant(X D) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -577,11 +577,9 @@ template template inline void matrix::setCopy(Iterator first, Iterator last) { - // check size - assert( m_size == last - first ); + assert( mSize == last - first ); - // copy - std::copy(first, last, m_data.data()); + std::copy(first, last, begin()); } // ================================================================================================= @@ -591,11 +589,11 @@ inline void matrix::setCopy(Iterator first, Iterator last) template inline matrix& matrix::operator*= (const matrix &B) { - assert( m_m == B.shape(0) ); - assert( m_n == B.shape(1) ); + assert( M == B.shape(0) ); + assert( N == B.shape(1) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } @@ -605,11 +603,11 @@ inline matrix& matrix::operator*= (const matrix &B) template inline matrix& matrix::operator/= (const matrix &B) { - assert( m_m == B.shape(0) ); - assert( m_n == B.shape(1) ); + assert( M == B.shape(0) ); + assert( N == B.shape(1) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } @@ -619,11 +617,11 @@ inline matrix& matrix::operator/= (const matrix &B) template inline matrix& matrix::operator+= (const matrix &B) { - assert( m_m == B.shape(0) ); - assert( m_n == B.shape(1) ); + assert( M == B.shape(0) ); + assert( N == B.shape(1) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } @@ -633,11 +631,11 @@ inline matrix& matrix::operator+= (const matrix &B) template inline matrix& matrix::operator-= (const matrix &B) { - assert( m_m == B.shape(0) ); - assert( m_n == B.shape(1) ); + assert( M == B.shape(0) ); + assert( N == B.shape(1) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } @@ -647,8 +645,8 @@ inline matrix& matrix::operator-= (const matrix &B) template inline matrix& matrix::operator*= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } @@ -658,8 +656,8 @@ inline matrix& matrix::operator*= (const X &B) template inline matrix& matrix::operator/= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } @@ -669,8 +667,8 @@ inline matrix& matrix::operator/= (const X &B) template inline matrix& matrix::operator+= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } @@ -680,8 +678,8 @@ inline matrix& matrix::operator+= (const X &B) template inline matrix& matrix::operator-= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } @@ -893,21 +891,21 @@ inline vector matrix::minCoeff(size_t axis) const // contraction of columns if ( axis == 1 ) { - vector out = vector::Constant(m_m, this->maxCoeff()); + vector out = vector::Constant(M, this->maxCoeff()); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[i] = std::min( out[i], m_data[i*m_n+j] ); + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[i] = std::min( out[i], mData[i*N+j] ); return out; } // contraction of rows - vector out = vector::Constant(m_n, this->maxCoeff()); + vector out = vector::Constant(N, this->maxCoeff()); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[j] = std::min( out[j], m_data[i*m_n+j] ); + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[j] = std::min( out[j], mData[i*N+j] ); return out; } @@ -949,21 +947,21 @@ inline vector matrix::maxCoeff(size_t axis) const // contraction of columns if ( axis == 1 ) { - vector out = vector::Constant(m_m, this->minCoeff()); + vector out = vector::Constant(M, this->minCoeff()); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[i] = std::max( out[i], m_data[i*m_n+j] ); + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[i] = std::max( out[i], mData[i*N+j] ); return out; } // contraction of rows - vector out = vector::Constant(m_n, this->minCoeff()); + vector out = vector::Constant(N, this->minCoeff()); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[j] = std::max( out[j], m_data[i*m_n+j] ); + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[j] = std::max( out[j], mData[i*N+j] ); return out; } @@ -993,8 +991,8 @@ inline X matrix::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } @@ -1010,21 +1008,21 @@ inline vector matrix::sum(size_t axis) const // contraction of columns if ( axis == 1 ) { - vector out = vector::Zero(m_m); + vector out = vector::Zero(M); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[i] += m_data[i*m_n+j]; + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[i] += mData[i*N+j]; return out; } // contraction of rows - vector out = vector::Zero(m_n); + vector out = vector::Zero(N); - for ( size_t i = 0 ; i < m_m ; ++i ) - for ( size_t j = 0 ; j < m_n ; ++j ) - out[j] += m_data[i*m_n+j]; + for ( size_t i = 0 ; i < M ; ++i ) + for ( size_t j = 0 ; j < N ; ++j ) + out[j] += mData[i*N+j]; return out; } @@ -1052,7 +1050,7 @@ inline vector matrix::sum(int axis) const template inline double matrix::mean() const { - return static_cast(this->sum())/static_cast(m_size); + return static_cast(this->sum())/static_cast(mSize); } // ------------------------------------------------------------------------------------------------- @@ -1060,7 +1058,7 @@ inline double matrix::mean() const template inline vector matrix::mean(size_t axis) const { - matrix weights = matrix::Ones(m_m, m_n); + matrix weights = matrix::Ones(M, N); return (*this).sum(axis) / weights.sum(axis); } @@ -1070,7 +1068,7 @@ inline vector matrix::mean(size_t axis) const template inline vector matrix::mean(int axis) const { - matrix weights = matrix::Ones(m_m, m_n); + matrix weights = matrix::Ones(M, N); return (*this).sum(axis) / weights.sum(axis); } @@ -1082,13 +1080,13 @@ inline vector matrix::mean(int axis) const template inline double matrix::average(const matrix &weights, bool norm) const { - assert( m_m == weights.shape(0) ); - assert( m_n == weights.shape(1) ); + assert( M == weights.shape(0) ); + assert( N == weights.shape(1) ); X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; if ( norm ) return static_cast(out)/static_cast(weights.sum()); else return static_cast(out); @@ -1119,7 +1117,7 @@ inline vector matrix::average(const matrix &weights, int axis, bool nor template inline void matrix::abs() { - for ( auto &i : m_data ) + for ( auto &i : mData ) i = std::abs(i); } @@ -1130,10 +1128,10 @@ inline void matrix::abs() template inline void matrix::printf(std::string fmt) const { - for ( size_t i = 0 ; i < m_m ; ++i ) { - for ( size_t j = 0 ; j < m_n ; ++j ) { - if ( j != m_n-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); - else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < M ; ++i ) { + for ( size_t j = 0 ; j < N ; ++j ) { + if ( j != N-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } } diff --git a/src/cppmat/regular_matrix.h b/src/cppmat/regular_matrix.h index ca58108..30a7629 100644 --- a/src/cppmat/regular_matrix.h +++ b/src/cppmat/regular_matrix.h @@ -24,15 +24,15 @@ class matrix { private: - std::vector m_data; // data container - size_t m_size=0; // total size - size_t m_m=0; // number of rows - size_t m_n=0; // number of columns + std::vector mData; // data container + size_t mSize=0; // total size + size_t M=0; // number of rows + size_t N=0; // number of columns public: // constructor - matrix(){}; + matrix() = default; matrix(size_t m, size_t n); // constructor: initialize diff --git a/src/cppmat/regular_vector.cpp b/src/cppmat/regular_vector.cpp index 09babac..c9b4998 100644 --- a/src/cppmat/regular_vector.cpp +++ b/src/cppmat/regular_vector.cpp @@ -22,7 +22,7 @@ namespace cppmat { template inline vector::vector(size_t n) { - // store shape, and other size parameters, allocate "m_data" + // store shape, and other size parameters, allocate "mData" resize(n); } @@ -105,11 +105,11 @@ template inline void vector::resize(size_t n) { // update size - m_n = n; - m_size = n; + N = n; + mSize = n; // allocate data - m_data.resize(m_size); + mData.resize(mSize); } // ================================================================================================= @@ -119,7 +119,7 @@ inline void vector::resize(size_t n) template inline size_t vector::size() const { - return m_size; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -139,7 +139,7 @@ inline size_t vector::shape(int i) const assert( i < 1 ); assert( i >= -1 ); - return m_n; + return N; } // ------------------------------------------------------------------------------------------------- @@ -150,8 +150,7 @@ inline size_t vector::shape(size_t i) const // check axis: (0) assert( i < 1 ); - return m_n; - + return N; } // ------------------------------------------------------------------------------------------------- @@ -161,7 +160,7 @@ inline std::vector vector::shape() const { std::vector ret(1); - ret[0] = m_n; + ret[0] = N; return ret; } @@ -188,9 +187,9 @@ inline std::vector vector::strides(bool bytes) const template inline X& vector::operator[](size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -198,9 +197,9 @@ inline X& vector::operator[](size_t i) template inline const X& vector::operator[](size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ================================================================================================= @@ -210,9 +209,9 @@ inline const X& vector::operator[](size_t i) const template inline X& vector::operator()(size_t a) { - assert( a < m_n ); + assert( a < N ); - return m_data[a]; + return mData[a]; } // ------------------------------------------------------------------------------------------------- @@ -220,9 +219,9 @@ inline X& vector::operator()(size_t a) template inline const X& vector::operator()(size_t a) const { - assert( a < m_n ); + assert( a < N ); - return m_data[a]; + return mData[a]; } // ================================================================================================= @@ -232,7 +231,7 @@ inline const X& vector::operator()(size_t a) const template inline X* vector::data() { - return m_data.data(); + return mData.data(); } // ------------------------------------------------------------------------------------------------- @@ -240,7 +239,7 @@ inline X* vector::data() template inline const X* vector::data() const { - return m_data.data(); + return mData.data(); } // ================================================================================================= @@ -250,7 +249,7 @@ inline const X* vector::data() const template inline auto vector::begin() { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -258,7 +257,7 @@ inline auto vector::begin() template inline auto vector::begin() const { - return m_data.begin(); + return mData.begin(); } // ------------------------------------------------------------------------------------------------- @@ -266,7 +265,7 @@ inline auto vector::begin() const template inline auto vector::end() { - return m_data.end(); + return mData.end(); } // ------------------------------------------------------------------------------------------------- @@ -274,7 +273,7 @@ inline auto vector::end() template inline auto vector::end() const { - return m_data.end(); + return mData.end(); } // ================================================================================================= @@ -284,9 +283,9 @@ inline auto vector::end() const template inline auto vector::index(size_t i) { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ------------------------------------------------------------------------------------------------- @@ -294,9 +293,9 @@ inline auto vector::index(size_t i) template inline auto vector::index(size_t i) const { - assert( i < m_size ); + assert( i < mSize ); - return m_data.begin() + i; + return begin() + i; } // ================================================================================================= @@ -306,9 +305,9 @@ inline auto vector::index(size_t i) const template inline auto vector::item(size_t a) { - assert( a < m_n ); + assert( a < N ); - return m_data.begin() + a; + return begin() + a; } // ------------------------------------------------------------------------------------------------- @@ -316,9 +315,9 @@ inline auto vector::item(size_t a) template inline auto vector::item(size_t a) const { - assert( a < m_n ); + assert( a < N ); - return m_data.begin() + a; + return begin() + a; } // ================================================================================================= @@ -328,7 +327,7 @@ inline auto vector::item(size_t a) const template inline void vector::setArange() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -336,7 +335,7 @@ inline void vector::setArange() template inline void vector::setZero() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -344,7 +343,7 @@ inline void vector::setZero() template inline void vector::setOnes() { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -352,7 +351,7 @@ inline void vector::setOnes() template inline void vector::setConstant(X D) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -361,11 +360,9 @@ template template inline void vector::setCopy(Iterator first, Iterator last) { - // check size - assert( m_size == last - first ); + assert( mSize == last - first ); - // copy - std::copy(first, last, m_data.data()); + std::copy(first, last, begin()); } // ================================================================================================= @@ -375,10 +372,10 @@ inline void vector::setCopy(Iterator first, Iterator last) template inline vector& vector::operator*= (const vector &B) { - assert( m_n == B.shape(0) ); + assert( N == B.shape(0) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } @@ -388,10 +385,10 @@ inline vector& vector::operator*= (const vector &B) template inline vector& vector::operator/= (const vector &B) { - assert( m_n == B.shape(0) ); + assert( N == B.shape(0) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } @@ -401,10 +398,10 @@ inline vector& vector::operator/= (const vector &B) template inline vector& vector::operator+= (const vector &B) { - assert( m_n == B.shape(0) ); + assert( N == B.shape(0) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } @@ -414,10 +411,10 @@ inline vector& vector::operator+= (const vector &B) template inline vector& vector::operator-= (const vector &B) { - assert( m_n == B.shape(0) ); + assert( N == B.shape(0) ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } @@ -427,8 +424,8 @@ inline vector& vector::operator-= (const vector &B) template inline vector& vector::operator*= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } @@ -438,8 +435,8 @@ inline vector& vector::operator*= (const X &B) template inline vector& vector::operator/= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } @@ -449,8 +446,8 @@ inline vector& vector::operator/= (const X &B) template inline vector& vector::operator+= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } @@ -460,8 +457,8 @@ inline vector& vector::operator+= (const X &B) template inline vector& vector::operator-= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } @@ -677,8 +674,8 @@ inline X vector::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } @@ -690,7 +687,7 @@ inline X vector::sum() const template inline double vector::mean() const { - return static_cast(this->sum())/static_cast(m_size); + return static_cast(this->sum())/static_cast(mSize); } // ================================================================================================= @@ -700,12 +697,12 @@ inline double vector::mean() const template inline double vector::average(const vector &weights, bool norm) const { - assert( m_n == weights.shape(0) ); + assert( N == weights.shape(0) ); X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; if ( norm ) return static_cast(out)/static_cast(weights.sum()); else return static_cast(out); @@ -720,16 +717,16 @@ inline vector vector::where() const { size_t nnz = 0; - for ( auto &i : m_data ) - if ( i ) + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] ) ++nnz; vector out(nnz); size_t j = 0; - for ( size_t i = 0 ; i < m_size ; ++i ) { - if ( m_data[i] ) { + for ( size_t i = 0 ; i < mSize ; ++i ) { + if ( mData[i] ) { out[j] = i; ++j; } @@ -745,7 +742,7 @@ inline vector vector::where() const template inline void vector::abs() { - for ( auto &i : m_data ) + for ( auto &i : mData ) i = std::abs(i); } @@ -756,9 +753,9 @@ inline void vector::abs() template inline void vector::printf(std::string fmt) const { - for ( size_t j = 0 ; j < m_n ; ++j ) { - if ( j != m_n-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); - else std::printf((fmt + ";\n").c_str(), (*this)(j)); + for ( size_t j = 0 ; j < N ; ++j ) { + if ( j != N-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); + else std::printf((fmt + ";\n").c_str(), (*this)(j)); } } diff --git a/src/cppmat/regular_vector.h b/src/cppmat/regular_vector.h index 8fe4dd5..8e173bc 100644 --- a/src/cppmat/regular_vector.h +++ b/src/cppmat/regular_vector.h @@ -24,14 +24,14 @@ class vector { private: - std::vector m_data; // data container - size_t m_size=0; // total size - size_t m_n=0; // number of columns + std::vector mData; // data container + size_t mSize=0; // total size + size_t N=0; // number of columns public: // constructor - vector(){}; + vector() = default; vector(size_t n); // constructor: initialize diff --git a/src/cppmat/tensor.cpp b/src/cppmat/tensor.cpp index fb2cf8f..546b74f 100644 --- a/src/cppmat/tensor.cpp +++ b/src/cppmat/tensor.cpp @@ -32,7 +32,7 @@ inline tensor4::tensor4(size_t nd) template inline tensor4 tensor4::Arange(size_t nd) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -46,7 +46,7 @@ inline tensor4 tensor4::Arange(size_t nd) template inline tensor4 tensor4::Zero(size_t nd) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -60,7 +60,7 @@ inline tensor4 tensor4::Zero(size_t nd) template inline tensor4 tensor4::Ones(size_t nd) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -74,7 +74,7 @@ inline tensor4 tensor4::Ones(size_t nd) template inline tensor4 tensor4::Constant(size_t nd, X D) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -88,7 +88,7 @@ inline tensor4 tensor4::Constant(size_t nd, X D) template inline tensor4 tensor4::I(size_t nd) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -102,7 +102,7 @@ inline tensor4 tensor4::I(size_t nd) template inline tensor4 tensor4::Irt(size_t nd) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -116,7 +116,7 @@ inline tensor4 tensor4::Irt(size_t nd) template inline tensor4 tensor4::Is(size_t nd) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -130,7 +130,7 @@ inline tensor4 tensor4::Is(size_t nd) template inline tensor4 tensor4::Id(size_t nd) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -144,7 +144,7 @@ inline tensor4 tensor4::Id(size_t nd) template inline tensor4 tensor4::II(size_t nd) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -159,7 +159,7 @@ template template inline tensor4 tensor4::Copy(size_t nd, Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor4 out(nd); // initialize @@ -182,7 +182,7 @@ inline tensor2::tensor2(size_t nd) template inline tensor2 tensor2::Arange(size_t nd) { - // allocate tensor + // call basic constructor tensor2 out(nd); // initialize @@ -196,7 +196,7 @@ inline tensor2 tensor2::Arange(size_t nd) template inline tensor2 tensor2::Zero(size_t nd) { - // allocate tensor + // call basic constructor tensor2 out(nd); // initialize @@ -210,7 +210,7 @@ inline tensor2 tensor2::Zero(size_t nd) template inline tensor2 tensor2::Ones(size_t nd) { - // allocate tensor + // call basic constructor tensor2 out(nd); // initialize @@ -224,7 +224,7 @@ inline tensor2 tensor2::Ones(size_t nd) template inline tensor2 tensor2::Constant(size_t nd, X D) { - // allocate tensor + // call basic constructor tensor2 out(nd); // initialize @@ -238,7 +238,7 @@ inline tensor2 tensor2::Constant(size_t nd, X D) template inline tensor2 tensor2::I(size_t nd) { - // allocate tensor + // call basic constructor tensor2 out(nd); // initialize @@ -253,7 +253,7 @@ template template inline tensor2 tensor2::Copy(size_t nd, Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2 out(nd); // initialize @@ -276,7 +276,7 @@ inline tensor2s::tensor2s(size_t nd) template inline tensor2s tensor2s::Arange(size_t nd) { - // allocate tensor + // call basic constructor tensor2s out(nd); // initialize @@ -290,7 +290,7 @@ inline tensor2s tensor2s::Arange(size_t nd) template inline tensor2s tensor2s::Zero(size_t nd) { - // allocate tensor + // call basic constructor tensor2s out(nd); // initialize @@ -304,7 +304,7 @@ inline tensor2s tensor2s::Zero(size_t nd) template inline tensor2s tensor2s::Ones(size_t nd) { - // allocate tensor + // call basic constructor tensor2s out(nd); // initialize @@ -318,7 +318,7 @@ inline tensor2s tensor2s::Ones(size_t nd) template inline tensor2s tensor2s::Constant(size_t nd, X D) { - // allocate tensor + // call basic constructor tensor2s out(nd); // initialize @@ -332,7 +332,7 @@ inline tensor2s tensor2s::Constant(size_t nd, X D) template inline tensor2s tensor2s::I(size_t nd) { - // allocate tensor + // call basic constructor tensor2s out(nd); // initialize @@ -347,7 +347,7 @@ template template inline tensor2s tensor2s::Copy(size_t nd, Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2s out(nd); // initialize @@ -362,7 +362,7 @@ template template inline tensor2s tensor2s::CopyDense(size_t nd, Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2s out(nd); // initialize @@ -377,7 +377,7 @@ template inline tensor2d::tensor2d() { // set dummy parameter - m_zero[0] = static_cast(0); + mZero[0] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -389,7 +389,7 @@ inline tensor2d::tensor2d(size_t nd) resize(nd); // set dummy parameter - m_zero[0] = static_cast(0); + mZero[0] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -397,7 +397,7 @@ inline tensor2d::tensor2d(size_t nd) template inline tensor2d tensor2d::Arange(size_t nd) { - // allocate tensor + // call basic constructor tensor2d out(nd); // initialize @@ -411,7 +411,7 @@ inline tensor2d tensor2d::Arange(size_t nd) template inline tensor2d tensor2d::Zero(size_t nd) { - // allocate tensor + // call basic constructor tensor2d out(nd); // initialize @@ -425,7 +425,7 @@ inline tensor2d tensor2d::Zero(size_t nd) template inline tensor2d tensor2d::Ones(size_t nd) { - // allocate tensor + // call basic constructor tensor2d out(nd); // initialize @@ -439,7 +439,7 @@ inline tensor2d tensor2d::Ones(size_t nd) template inline tensor2d tensor2d::Constant(size_t nd, X D) { - // allocate tensor + // call basic constructor tensor2d out(nd); // initialize @@ -453,7 +453,7 @@ inline tensor2d tensor2d::Constant(size_t nd, X D) template inline tensor2d tensor2d::I(size_t nd) { - // allocate tensor + // call basic constructor tensor2d out(nd); // initialize @@ -468,7 +468,7 @@ template template inline tensor2d tensor2d::Copy(size_t nd, Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2d out(nd); // initialize @@ -483,7 +483,7 @@ template template inline tensor2d tensor2d::CopyDense(size_t nd, Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2d out(nd); // initialize @@ -506,7 +506,7 @@ inline vector::vector(size_t nd) template inline vector vector::Arange(size_t nd) { - // allocate tensor + // call basic constructor vector out(nd); // initialize @@ -520,7 +520,7 @@ inline vector vector::Arange(size_t nd) template inline vector vector::Zero(size_t nd) { - // allocate tensor + // call basic constructor vector out(nd); // initialize @@ -534,7 +534,7 @@ inline vector vector::Zero(size_t nd) template inline vector vector::Ones(size_t nd) { - // allocate tensor + // call basic constructor vector out(nd); // initialize @@ -548,7 +548,7 @@ inline vector vector::Ones(size_t nd) template inline vector vector::Constant(size_t nd, X D) { - // allocate tensor + // call basic constructor vector out(nd); // initialize @@ -563,7 +563,7 @@ template template inline vector vector::Copy(size_t nd, Iterator first, Iterator last) { - // allocate tensor + // call basic constructor vector out(nd); // initialize @@ -573,18 +573,18 @@ inline vector vector::Copy(size_t nd, Iterator first, Iterator last) } // ================================================================================================= -// cast to different class / type +// cast to different class // ================================================================================================= template<> template<> inline tensor2s tensor2::cast>() const { - tensor2s out(m_nd); + tensor2s out(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = i ; j < m_nd ; ++j ) - out[i*m_nd-(i-1)*i/2+j-i] = ( m_data[i*m_nd+j] + m_data[j*m_nd+i] ) / 2.; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i ; j < mNd ; ++j ) + out[i*mNd-(i-1)*i/2+j-i] = ( mData[i*mNd+j] + mData[j*mNd+i] ) / 2.; return out; } @@ -595,10 +595,10 @@ template<> template<> inline tensor2d tensor2::cast>() const { - tensor2d out(m_nd); + tensor2d out(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - out[i] = m_data[i*m_nd+i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + out[i] = mData[i*mNd+i]; return out; } @@ -609,11 +609,11 @@ template<> template<> inline tensor2 tensor2s::cast>() const { - tensor2 out(m_nd); + tensor2 out(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = i ; j < m_nd ; ++j ) - out[i*m_nd+j] = out[j*m_nd+i] = m_data[i*m_nd-(i-1)*i/2+j-i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i ; j < mNd ; ++j ) + out[i*mNd+j] = out[j*mNd+i] = mData[i*mNd-(i-1)*i/2+j-i]; return out; } @@ -624,10 +624,10 @@ template<> template<> inline tensor2d tensor2s::cast>() const { - tensor2d out(m_nd); + tensor2d out(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - out[i] = m_data[i*m_nd-(i-1)*i/2]; + for ( size_t i = 0 ; i < mNd ; ++i ) + out[i] = mData[i*mNd-(i-1)*i/2]; return out; } @@ -638,10 +638,10 @@ template<> template<> inline tensor2 tensor2d::cast>() const { - tensor2 out = tensor2::Zero(m_nd); + tensor2 out = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - out[i*m_nd+i] = m_data[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + out[i*mNd+i] = mData[i]; return out; } @@ -652,25 +652,27 @@ template<> template<> inline tensor2s tensor2d::cast>() const { - tensor2s out = tensor2s::Zero(m_nd); + tensor2s out = tensor2s::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - out[i*m_nd-(i-1)*i/2] = m_data[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + out[i*mNd-(i-1)*i/2] = mData[i]; return out; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// automatic cast to different class +// ================================================================================================= #ifndef CPPMAT_NOCONVERT template inline tensor2s::operator tensor2 () const { - tensor2 out(m_nd); + tensor2 out(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = i ; j < m_nd ; ++j ) - out[i*m_nd+j] = out[j*m_nd+i] = m_data[i*m_nd-(i-1)*i/2+j-i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i ; j < mNd ; ++j ) + out[i*mNd+j] = out[j*mNd+i] = mData[i*mNd-(i-1)*i/2+j-i]; return out; } @@ -682,10 +684,10 @@ inline tensor2s::operator tensor2 () const template inline tensor2d::operator tensor2 () const { - tensor2 out = tensor2::Zero(m_nd); + tensor2 out = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - out[i*m_nd+i] = m_data[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + out[i*mNd+i] = mData[i]; return out; } @@ -697,10 +699,10 @@ inline tensor2d::operator tensor2 () const template inline tensor2d::operator tensor2s () const { - tensor2s out(m_nd,static_cast(0)); + tensor2s out(mNd,static_cast(0)); - for ( size_t i = 0 ; i < m_nd ; ++i ) - out[i*m_nd-(i-1)*i/2] = m_data[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + out[i*mNd-(i-1)*i/2] = mData[i]; return out; } @@ -714,11 +716,11 @@ template inline void tensor4::resize(size_t nd) { // store size - m_nd = nd; - m_size = m_nd*m_nd*m_nd*m_nd; + mNd = nd; + mSize = mNd*mNd*mNd*mNd; // resize storage - m_data.resize(m_size); + mData.resize(mSize); } // ------------------------------------------------------------------------------------------------- @@ -727,11 +729,11 @@ template inline void tensor2::resize(size_t nd) { // store size - m_nd = nd; - m_size = m_nd*m_nd; + mNd = nd; + mSize = mNd*mNd; // resize storage - m_data.resize(m_size); + mData.resize(mSize); } // ------------------------------------------------------------------------------------------------- @@ -740,11 +742,11 @@ template inline void tensor2s::resize(size_t nd) { // store size - m_nd = nd; - m_size = (m_nd+1)*m_nd/2; + mNd = nd; + mSize = (mNd+1)*mNd/2; // resize storage - m_data.resize(m_size); + mData.resize(mSize); } // ------------------------------------------------------------------------------------------------- @@ -753,11 +755,11 @@ template inline void tensor2d::resize(size_t nd) { // store size - m_nd = nd; - m_size = m_nd; + mNd = nd; + mSize = mNd; // resize storage - m_data.resize(m_size); + mData.resize(mSize); } // ------------------------------------------------------------------------------------------------- @@ -766,34 +768,36 @@ template inline void vector::resize(size_t nd) { // store size - m_nd = nd; - m_size = m_nd; + mNd = nd; + mSize = mNd; // resize storage - m_data.resize(m_size); + mData.resize(mSize); } // ================================================================================================= // get dimensions // ================================================================================================= -template inline size_t tensor4 ::size() const { return m_size; } -template inline size_t tensor2 ::size() const { return m_size; } -template inline size_t tensor2s::size() const { return m_size; } -template inline size_t tensor2d::size() const { return m_size; } -template inline size_t vector ::size() const { return m_size; } -template inline size_t tensor4 ::ndim() const { return m_nd; } -template inline size_t tensor2 ::ndim() const { return m_nd; } -template inline size_t tensor2s::ndim() const { return m_nd; } -template inline size_t tensor2d::ndim() const { return m_nd; } -template inline size_t vector ::ndim() const { return m_nd; } +template inline size_t tensor4 ::size() const { return mSize; } +template inline size_t tensor2 ::size() const { return mSize; } +template inline size_t tensor2s::size() const { return mSize; } +template inline size_t tensor2d::size() const { return mSize; } +template inline size_t vector ::size() const { return mSize; } +template inline size_t tensor4 ::ndim() const { return mNd; } +template inline size_t tensor2 ::ndim() const { return mNd; } +template inline size_t tensor2s::ndim() const { return mNd; } +template inline size_t tensor2d::ndim() const { return mNd; } +template inline size_t vector ::ndim() const { return mNd; } // ------------------------------------------------------------------------------------------------- template inline std::vector tensor4::shape() const { - std::vector out(4, m_nd); + std::vector out(4); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -803,7 +807,9 @@ inline std::vector tensor4::shape() const template inline std::vector tensor2::shape() const { - std::vector out(2, m_nd); + std::vector out(2); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -813,7 +819,9 @@ inline std::vector tensor2::shape() const template inline std::vector vector::shape() const { - std::vector out(1, m_nd); + std::vector out(1); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -823,7 +831,7 @@ inline std::vector vector::shape() const template inline std::vector tensor4::strides(bool bytes) const { - std::vector out = { m_nd*m_nd*m_nd, m_nd*m_nd, m_nd, 1 }; + std::vector out = { mNd*mNd*mNd, mNd*mNd, mNd, 1 }; if ( bytes ) { @@ -841,7 +849,7 @@ inline std::vector tensor4::strides(bool bytes) const template inline std::vector tensor2::strides(bool bytes) const { - std::vector out = { m_nd, 1 }; + std::vector out = { mNd, 1 }; if ( bytes ) { @@ -866,790 +874,1037 @@ inline std::vector vector::strides(bool bytes) const } // ================================================================================================= -// index operators +// index operators : operator[...] // ================================================================================================= -template inline X& tensor4 ::operator[](size_t i) { return m_data[i]; } -template inline const X& tensor4 ::operator[](size_t i) const { return m_data[i]; } -template inline X& tensor2 ::operator[](size_t i) { return m_data[i]; } -template inline const X& tensor2 ::operator[](size_t i) const { return m_data[i]; } -template inline X& tensor2s::operator[](size_t i) { return m_data[i]; } -template inline const X& tensor2s::operator[](size_t i) const { return m_data[i]; } -template inline X& tensor2d::operator[](size_t i) { return m_data[i]; } -template inline const X& tensor2d::operator[](size_t i) const { return m_data[i]; } -template inline X& vector ::operator[](size_t i) { return m_data[i]; } -template inline const X& vector ::operator[](size_t i) const { return m_data[i]; } - -// ------------------------------------------------------------------------------------------------- - template -inline X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) +inline X& tensor4::operator[](size_t i) { - return m_data[i*m_nd*m_nd*m_nd+j*m_nd*m_nd+k*m_nd+l]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) const +inline const X& tensor4::operator[](size_t i) const { - return m_data[i*m_nd*m_nd*m_nd+j*m_nd*m_nd+k*m_nd+l]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline X& tensor2::operator()(size_t i, size_t j) +inline X& tensor2::operator[](size_t i) { - return m_data[i*m_nd+j]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline const X& tensor2::operator()(size_t i, size_t j) const +inline const X& tensor2::operator[](size_t i) const { - return m_data[i*m_nd+j]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline X& tensor2s::operator()(size_t i, size_t j) +inline X& tensor2s::operator[](size_t i) { - if (i <= j) return m_data[ i*m_nd - (i-1)*i/2 + j - i ]; - else return m_data[ j*m_nd - (j-1)*j/2 + i - j ]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline const X& tensor2s::operator()(size_t i, size_t j) const +inline const X& tensor2s::operator[](size_t i) const { - if (i <= j) return m_data[ i*m_nd - (i-1)*i/2 + j - i ]; - else return m_data[ j*m_nd - (j-1)*j/2 + i - j ]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline X& tensor2d::operator()(size_t i, size_t j) +inline X& tensor2d::operator[](size_t i) { - if (i == j) return m_data[i]; - else return m_zero[0]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline const X& tensor2d::operator()(size_t i, size_t j) const +inline const X& tensor2d::operator[](size_t i) const { - if (i == j) return m_data[i]; - else return m_zero[0]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline X& vector::operator()(size_t i) +inline X& vector::operator[](size_t i) { - return m_data[i]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline const X& vector::operator()(size_t i) const +inline const X& vector::operator[](size_t i) const { - return m_data[i]; -} - -// ================================================================================================= -// pointers / iterators -// ================================================================================================= + assert( i < mSize ); -template inline X* tensor4 ::data() { return m_data.data(); } -template inline const X* tensor4 ::data() const { return m_data.data(); } -template inline auto tensor4 ::begin() { return m_data.begin(); } -template inline auto tensor4 ::begin() const { return m_data.begin(); } -template inline auto tensor4 ::end() { return m_data.end(); } -template inline auto tensor4 ::end() const { return m_data.end(); } -template inline X* tensor2 ::data() { return m_data.data(); } -template inline const X* tensor2 ::data() const { return m_data.data(); } -template inline auto tensor2 ::begin() { return m_data.begin(); } -template inline auto tensor2 ::begin() const { return m_data.begin(); } -template inline auto tensor2 ::end() { return m_data.end(); } -template inline auto tensor2 ::end() const { return m_data.end(); } -template inline X* tensor2s::data() { return m_data.data(); } -template inline const X* tensor2s::data() const { return m_data.data(); } -template inline auto tensor2s::begin() { return m_data.begin(); } -template inline auto tensor2s::begin() const { return m_data.begin(); } -template inline auto tensor2s::end() { return m_data.end(); } -template inline auto tensor2s::end() const { return m_data.end(); } -template inline X* tensor2d::data() { return m_data.data(); } -template inline const X* tensor2d::data() const { return m_data.data(); } -template inline auto tensor2d::begin() { return m_data.begin(); } -template inline auto tensor2d::begin() const { return m_data.begin(); } -template inline auto tensor2d::end() { return m_data.end(); } -template inline auto tensor2d::end() const { return m_data.end(); } -template inline X* vector ::data() { return m_data.data(); } -template inline const X* vector ::data() const { return m_data.data(); } -template inline auto vector ::begin() { return m_data.begin(); } -template inline auto vector ::begin() const { return m_data.begin(); } -template inline auto vector ::end() { return m_data.end(); } -template inline auto vector ::end() const { return m_data.end(); } + return mData[i]; +} // ================================================================================================= -// basic initialization +// index operators : operator(...) // ================================================================================================= template -inline void tensor4::setArange() +inline X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return mData[i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l]; } // ------------------------------------------------------------------------------------------------- template -inline void tensor4::setZero() +inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return mData[i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l]; } // ------------------------------------------------------------------------------------------------- template -inline void tensor4::setOnes() +inline X& tensor2::operator()(size_t i, size_t j) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + assert( i < mNd ); + assert( j < mNd ); + + return mData[i*mNd+j]; } // ------------------------------------------------------------------------------------------------- template -inline void tensor4::setConstant(X D) +inline const X& tensor2::operator()(size_t i, size_t j) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + assert( i < mNd ); + assert( j < mNd ); + + return mData[i*mNd+j]; } // ------------------------------------------------------------------------------------------------- template -template -inline void tensor4::setCopy(Iterator first, Iterator last) +inline X& tensor2s::operator()(size_t i, size_t j) { - // check size - assert( m_size == last - first ); + assert( i < mNd ); + assert( j < mNd ); - // copy - std::copy(first, last, m_data.data()); + if (i <= j) return mData[ i*mNd - (i-1)*i/2 + j - i ]; + else return mData[ j*mNd - (j-1)*j/2 + i - j ]; } // ------------------------------------------------------------------------------------------------- template -inline void tensor4::setI() +inline const X& tensor2s::operator()(size_t i, size_t j) const { - this->setZero(); + assert( i < mNd ); + assert( j < mNd ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - if ( i == l and j == k ) - (*this)(i,j,k,l) = static_cast(1); + if (i <= j) return mData[ i*mNd - (i-1)*i/2 + j - i ]; + else return mData[ j*mNd - (j-1)*j/2 + i - j ]; } // ------------------------------------------------------------------------------------------------- template -inline void tensor4::setIrt() +inline X& tensor2d::operator()(size_t i, size_t j) { - this->setZero(); + assert( i < mNd ); + assert( j < mNd ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - if ( i == k and j == l ) - (*this)(i,j,k,l) = static_cast(1); + if (i == j) return mData[i]; + else return mZero[0]; } // ------------------------------------------------------------------------------------------------- template -inline void tensor4::setIs() +inline const X& tensor2d::operator()(size_t i, size_t j) const { - return ( tensor4::I(m_nd) + tensor4::Irt(m_nd) ) / static_cast(2); + assert( i < mNd ); + assert( j < mNd ); + + if (i == j) return mData[i]; + else return mZero[0]; } // ------------------------------------------------------------------------------------------------- template -inline void tensor4::setId() +inline X& vector::operator()(size_t i) { - return tensor4::Is(m_nd) - tensor4::II(m_nd)/static_cast(m_nd); + assert( i < mNd ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- template -inline void tensor4::setII() +inline const X& vector::operator()(size_t i) const { - this->setZero(); + assert( i < mNd ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - if ( i == j and k == l ) - (*this)(i,j,k,l) = static_cast(1); + return mData[i]; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// index operators : compress(...) +// ================================================================================================= template -inline void tensor2::setArange() +inline size_t tensor4::compress(size_t i, size_t j, size_t k, size_t l) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2::setZero() +inline size_t tensor2::compress(size_t i, size_t j) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + assert( i < mNd ); + assert( j < mNd ); + + return i*mNd+j; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2::setOnes() +inline size_t tensor2s::compress(size_t i, size_t j) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + assert( i < mNd ); + assert( j < mNd ); + + if (i <= j) return i*mNd - (i-1)*i/2 + j - i; + else return j*mNd - (j-1)*j/2 + i - j; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// index operators : decompress(...) +// ================================================================================================= template -inline void tensor2::setConstant(X D) +inline std::vector tensor4::decompress(size_t i) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; -} + // check input + assert( i < mSize ); -// ------------------------------------------------------------------------------------------------- + // allocate array-index + std::vector idx(4); -template -template -inline void tensor2::setCopy(Iterator first, Iterator last) -{ - // check size - assert( m_size == last - first ); + // reconstruct + idx[0] = (i - i%(mNd*mNd*mNd)) / (mNd*mNd*mNd); i -= idx[0] * (mNd*mNd*mNd); + idx[1] = (i - i%(mNd*mNd) ) / (mNd*mNd); i -= idx[1] * (mNd*mNd); + idx[2] = (i - i% mNd ) / mNd; i -= idx[2] * mNd; + idx[3] = i; - // copy - std::copy(first, last, m_data.data()); + return idx; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2::setI() +inline std::vector tensor2::decompress(size_t i) const { - this->setZero(); + // check input + assert( i < mSize ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - (*this)(i,i) = static_cast(1); + // allocate array-index + std::vector idx(2); + + // reconstruct + idx[1] = i % mNd; + idx[0] = ( i - idx[1] ) / mNd; + + return idx; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2s::setArange() +inline std::vector tensor2s::decompress(size_t i) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + // check input + assert( i < mSize ); + + // allocate array-index + std::vector idx(2); + + // reconstruct + idx[0] = 0; + size_t keyafter; + do + { + idx[0]++; + keyafter = idx[0] * mNd - (idx[0] - 1) * idx[0] / 2; + } while ( i >= keyafter ); + idx[0]--; + idx[1] = mNd - keyafter + i; + + return idx; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// pointers / iterators +// ================================================================================================= + +template inline X* tensor4 ::data() { return mData.data(); } +template inline const X* tensor4 ::data() const { return mData.data(); } +template inline auto tensor4 ::begin() { return mData.begin(); } +template inline auto tensor4 ::begin() const { return mData.begin(); } +template inline auto tensor4 ::end() { return mData.end(); } +template inline auto tensor4 ::end() const { return mData.end(); } +template inline X* tensor2 ::data() { return mData.data(); } +template inline const X* tensor2 ::data() const { return mData.data(); } +template inline auto tensor2 ::begin() { return mData.begin(); } +template inline auto tensor2 ::begin() const { return mData.begin(); } +template inline auto tensor2 ::end() { return mData.end(); } +template inline auto tensor2 ::end() const { return mData.end(); } +template inline X* tensor2s::data() { return mData.data(); } +template inline const X* tensor2s::data() const { return mData.data(); } +template inline auto tensor2s::begin() { return mData.begin(); } +template inline auto tensor2s::begin() const { return mData.begin(); } +template inline auto tensor2s::end() { return mData.end(); } +template inline auto tensor2s::end() const { return mData.end(); } +template inline X* tensor2d::data() { return mData.data(); } +template inline const X* tensor2d::data() const { return mData.data(); } +template inline auto tensor2d::begin() { return mData.begin(); } +template inline auto tensor2d::begin() const { return mData.begin(); } +template inline auto tensor2d::end() { return mData.end(); } +template inline auto tensor2d::end() const { return mData.end(); } +template inline X* vector ::data() { return mData.data(); } +template inline const X* vector ::data() const { return mData.data(); } +template inline auto vector ::begin() { return mData.begin(); } +template inline auto vector ::begin() const { return mData.begin(); } +template inline auto vector ::end() { return mData.end(); } +template inline auto vector ::end() const { return mData.end(); } + +// ================================================================================================= +// iterators : index() +// ================================================================================================= template -inline void tensor2s::setZero() +inline auto tensor4::index(size_t i) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + assert( i < mSize ); + + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2s::setOnes() +inline auto tensor4::index(size_t i) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + assert( i < mSize ); + + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2s::setConstant(X D) +inline auto tensor2::index(size_t i) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + assert( i < mSize ); + + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -template -inline void tensor2s::setCopy(Iterator first, Iterator last) +inline auto tensor2::index(size_t i) const { - // check size - assert( m_size == last - first ); + assert( i < mSize ); - // copy - std::copy(first, last, m_data.data()); + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -template -inline void tensor2s::setCopyDense(Iterator first, Iterator last) +inline auto tensor2s::index(size_t i) { - // avoid compiler warning - UNUSED(last); - - // check size - assert( m_nd * m_nd == last - first ); + assert( i < mSize ); - // check for symmetry - #ifndef NDEBUG - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = i+1 ; j < m_nd ; ++j ) - assert( first[i*m_nd+j] == first[j*m_nd+i] ); - #endif - - // copy from input (ignores lower diagonal terms) - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = i ; j < m_nd ; ++j ) - m_data[i*m_nd-(i-1)*i/2+j-i] = first[i*m_nd+j]; + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2s::setI() +inline auto tensor2s::index(size_t i) const { - this->setZero(); + assert( i < mSize ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - (*this)(i,i) = static_cast(1); + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2d::setArange() +inline auto tensor2d::index(size_t i) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + assert( i < mSize ); + + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2d::setZero() +inline auto tensor2d::index(size_t i) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + assert( i < mSize ); + + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2d::setOnes() +inline auto vector::index(size_t i) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + assert( i < mSize ); + + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2d::setConstant(X D) +inline auto vector::index(size_t i) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + assert( i < mSize ); + + return begin() + i; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// iterators : item() +// ================================================================================================= template -template -inline void tensor2d::setCopy(Iterator first, Iterator last) +inline auto tensor4::item(size_t i, size_t j, size_t k, size_t l) { - // check size - assert( m_size == last - first ); + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); - // copy - std::copy(first, last, m_data.data()); + return begin() + i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; } // ------------------------------------------------------------------------------------------------- template -template -inline void tensor2d::setCopyDense(Iterator first, Iterator last) +inline auto tensor4::item(size_t i, size_t j, size_t k, size_t l) const { - // avoid compiler warning - UNUSED(last); - - // check size - assert( m_nd * m_nd == last - first ); - - // check the input to be diagonal - #ifndef NDEBUG - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - if ( i !=j ) - assert( !first[i*m_nd+j] ); - #endif + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); - // copy from input (ignores off-diagonal terms) - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] = first[i*m_nd+i]; + return begin() + i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; } // ------------------------------------------------------------------------------------------------- template -inline void tensor2d::setI() +inline auto tensor2::item(size_t i, size_t j) { - this->setZero(); + assert( i < mNd ); + assert( j < mNd ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] = static_cast(1); + return begin() + i*mNd+j; } // ------------------------------------------------------------------------------------------------- template -inline void vector::setArange() +inline auto tensor2::item(size_t i, size_t j) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(i); + assert( i < mNd ); + assert( j < mNd ); + + return begin() + i*mNd+j; } // ------------------------------------------------------------------------------------------------- template -inline void vector::setZero() +inline auto tensor2s::item(size_t i, size_t j) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(0); + assert( i < mNd ); + assert( j < mNd ); + + if (i <= j) return begin() + i*mNd - (i-1)*i/2 + j - i; + else return begin() + j*mNd - (j-1)*j/2 + i - j; } // ------------------------------------------------------------------------------------------------- template -inline void vector::setOnes() +inline auto tensor2s::item(size_t i, size_t j) const { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = static_cast(1); + assert( i < mNd ); + assert( j < mNd ); + + if (i <= j) return begin() + i*mNd - (i-1)*i/2 + j - i; + else return begin() + j*mNd - (j-1)*j/2 + i - j; } // ------------------------------------------------------------------------------------------------- template -inline void vector::setConstant(X D) +inline auto vector::item(size_t i) { - for ( size_t i = 0 ; i < m_size ; ++i ) m_data[i] = D; + assert( i < mNd ); + + return begin() + i; } // ------------------------------------------------------------------------------------------------- template -template -inline void vector::setCopy(Iterator first, Iterator last) +inline auto vector::item(size_t i) const { - // check size - assert( m_size == last - first ); + assert( i < mNd ); - // copy - std::copy(first, last, m_data.data()); + return begin() + i; } // ================================================================================================= -// arithmetic operators +// basic initialization - tensor4 // ================================================================================================= template -inline tensor4& tensor4::operator*= (const tensor4 &B) +inline void tensor4::setArange() { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; - - return *this; + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- template -inline tensor4& tensor4::operator/= (const tensor4 &B) +inline void tensor4::setZero() { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; - - return *this; + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- template -inline tensor4& tensor4::operator+= (const tensor4 &B) +inline void tensor4::setOnes() { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + std::fill(begin(), end(), static_cast(1)); +} - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; +// ------------------------------------------------------------------------------------------------- - return *this; +template +inline void tensor4::setConstant(X D) +{ + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- template -inline tensor4& tensor4::operator-= (const tensor4 &B) +template +inline void tensor4::setCopy(Iterator first, Iterator last) { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( mSize == last-first ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; - - return *this; + std::copy(first, last, begin()); } // ------------------------------------------------------------------------------------------------- template -inline tensor4& tensor4::operator*= (const X &B) +inline void tensor4::setI() { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + setZero(); - return *this; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + if ( i == l and j == k ) + (*this)(i,j,k,l) = static_cast(1); } // ------------------------------------------------------------------------------------------------- template -inline tensor4& tensor4::operator/= (const X &B) +inline void tensor4::setIrt() { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + setZero(); - return *this; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + if ( i == k and j == l ) + (*this)(i,j,k,l) = static_cast(1); } // ------------------------------------------------------------------------------------------------- template -inline tensor4& tensor4::operator+= (const X &B) +inline void tensor4::setIs() { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; - - return *this; + return ( tensor4::I(mNd) + tensor4::Irt(mNd) ) / static_cast(2); } // ------------------------------------------------------------------------------------------------- template -inline tensor4& tensor4::operator-= (const X &B) +inline void tensor4::setId() { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; - - return *this; + return tensor4::Is(mNd) - tensor4::II(mNd)/static_cast(mNd); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator* (const tensor4 &A, const tensor4 &B) +inline void tensor4::setII() { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + setZero(); - tensor4 C(A.ndim()); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + if ( i == j and k == l ) + (*this)(i,j,k,l) = static_cast(1); +} - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] * B[i]; +// ================================================================================================= +// basic initialization - tensor2 +// ================================================================================================= - return C; +template +inline void tensor2::setArange() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator/ (const tensor4 &A, const tensor4 &B) +inline void tensor2::setZero() { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); - - tensor4 C(A.ndim()); + std::fill(begin(), end(), static_cast(0)); +} - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] / B[i]; +// ------------------------------------------------------------------------------------------------- - return C; +template +inline void tensor2::setOnes() +{ + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator+ (const tensor4 &A, const tensor4 &B) +inline void tensor2::setConstant(X D) { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + std::fill(begin(), end(), D); +} - tensor4 C(A.ndim()); +// ------------------------------------------------------------------------------------------------- - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] + B[i]; +template +template +inline void tensor2::setCopy(Iterator first, Iterator last) +{ + assert( mSize == last-first ); - return C; + std::copy(first, last, begin()); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator- (const tensor4 &A, const tensor4 &B) +inline void tensor2::setI() { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); - - tensor4 C(A.ndim()); + setZero(); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] - B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + (*this)(i,i) = static_cast(1); +} - return C; +// ================================================================================================= +// basic initialization - tensor2s +// ================================================================================================= + +template +inline void tensor2s::setArange() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator* (const tensor4 &A, const X &B) +inline void tensor2s::setZero() { - tensor4 C(A.ndim()); + std::fill(begin(), end(), static_cast(0)); +} - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] * B; +// ------------------------------------------------------------------------------------------------- - return C; +template +inline void tensor2s::setOnes() +{ + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator/ (const tensor4 &A, const X &B) +inline void tensor2s::setConstant(X D) { - tensor4 C(A.ndim()); + std::fill(begin(), end(), D); +} - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] / B; +// ------------------------------------------------------------------------------------------------- - return C; +template +template +inline void tensor2s::setCopy(Iterator first, Iterator last) +{ + assert( mSize == last-first ); + + std::copy(first, last, begin()); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator+ (const tensor4 &A, const X &B) +template +inline void tensor2s::setCopyDense(Iterator first, Iterator last) { - tensor4 C(A.ndim()); + // avoid compiler warning + UNUSED(last); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] + B; + // check size + assert( mNd*mNd == last-first ); - return C; + // check for symmetry + #ifndef NDEBUG + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i+1 ; j < mNd ; ++j ) + assert( first[i*mNd+j] == first[j*mNd+i] ); + #endif + + // copy from input (ignores lower diagonal terms) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i ; j < mNd ; ++j ) + mData[i*mNd-(i-1)*i/2+j-i] = first[i*mNd+j]; } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator- (const tensor4 &A, const X &B) +inline void tensor2s::setI() { - tensor4 C(A.ndim()); + setZero(); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] - B; + for ( size_t i = 0 ; i < mNd ; ++i ) + (*this)(i,i) = static_cast(1); +} - return C; +// ================================================================================================= +// basic initialization - tensor2d +// ================================================================================================= + +template +inline void tensor2d::setArange() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator* (const X &A, const tensor4 &B) +inline void tensor2d::setZero() { - tensor4 C(B.ndim()); + std::fill(begin(), end(), static_cast(0)); +} - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A * B[i]; +// ------------------------------------------------------------------------------------------------- - return C; +template +inline void tensor2d::setOnes() +{ + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator/ (const X &A, const tensor4 &B) +inline void tensor2d::setConstant(X D) { - tensor4 C(B.ndim()); + std::fill(begin(), end(), D); +} - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A / B[i]; +// ------------------------------------------------------------------------------------------------- - return C; +template +template +inline void tensor2d::setCopy(Iterator first, Iterator last) +{ + assert( mSize == last-first ); + + std::copy(first, last, begin()); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator+ (const X &A, const tensor4 &B) +template +inline void tensor2d::setCopyDense(Iterator first, Iterator last) { - tensor4 C(B.ndim()); + // avoid compiler warning + UNUSED(last); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A + B[i]; + // check size + assert( mNd*mNd == last-first ); - return C; + // check the input to be diagonal + #ifndef NDEBUG + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + if ( i !=j ) + assert( !first[i*mNd+j] ); + #endif + + // copy from input (ignores off-diagonal terms) + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] = first[i*mNd+i]; } // ------------------------------------------------------------------------------------------------- template -inline tensor4 operator- (const X &A, const tensor4 &B) +inline void tensor2d::setI() { - tensor4 C(B.ndim()); + setZero(); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A - B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] = static_cast(1); +} - return C; +// ================================================================================================= +// basic initialization - vector +// ================================================================================================= + +template +inline void vector::setArange() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void vector::setZero() +{ + std::fill(begin(), end(), static_cast(0)); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void vector::setOnes() +{ + std::fill(begin(), end(), static_cast(1)); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void vector::setConstant(X D) +{ + std::fill(begin(), end(), D); +} + +// ------------------------------------------------------------------------------------------------- + +template +template +inline void vector::setCopy(Iterator first, Iterator last) +{ + assert( mSize == last-first ); + + std::copy(first, last, begin()); +} + +// ================================================================================================= +// arithmetic operators - tensor4 +// ================================================================================================= + +template +inline tensor4& tensor4::operator*= (const tensor4 &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4& tensor4::operator/= (const tensor4 &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4& tensor4::operator+= (const tensor4 &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4& tensor4::operator-= (const tensor4 &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4& tensor4::operator*= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4& tensor4::operator/= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4& tensor4::operator+= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; + + return *this; } // ------------------------------------------------------------------------------------------------- +template +inline tensor4& tensor4::operator-= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; + + return *this; +} + +// ================================================================================================= +// arithmetic operators - tensor2 +// ================================================================================================= + template inline tensor2& tensor2::operator*= (const tensor2 &B) { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } @@ -1659,11 +1914,10 @@ inline tensor2& tensor2::operator*= (const tensor2 &B) template inline tensor2& tensor2::operator/= (const tensor2 &B) { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } @@ -1673,11 +1927,10 @@ inline tensor2& tensor2::operator/= (const tensor2 &B) template inline tensor2& tensor2::operator+= (const tensor2 &B) { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } @@ -1687,11 +1940,10 @@ inline tensor2& tensor2::operator+= (const tensor2 &B) template inline tensor2& tensor2::operator-= (const tensor2 &B) { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } @@ -1701,15 +1953,15 @@ inline tensor2& tensor2::operator-= (const tensor2 &B) template inline tensor2& tensor2::operator*= (const tensor2s &B) { - assert( m_nd == B.ndim() ); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = i ; j < m_nd ; ++j ) { + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = i ; j < mNd ; ++j ) { // - extract value - X b = B[i*m_nd-(i-1)*i/2+j-i]; + X b = B[i*mNd-(i-1)*i/2+j-i]; // - store symmetrically - m_data[i*m_nd+j] *= b; - if ( i != j ) m_data[j*m_nd+i] *= b; + mData[i*mNd+j] *= b; + if ( i != j ) mData[j*mNd+i] *= b; } } @@ -1721,15 +1973,15 @@ inline tensor2& tensor2::operator*= (const tensor2s &B) template inline tensor2& tensor2::operator/= (const tensor2s &B) { - assert( m_nd == B.ndim() ); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = i ; j < m_nd ; ++j ) { + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = i ; j < mNd ; ++j ) { // - extract value - X b = B[i*m_nd-(i-1)*i/2+j-i]; + X b = B[i*mNd-(i-1)*i/2+j-i]; // - store symmetrically - m_data[i*m_nd+j] /= b; - if ( i != j ) m_data[j*m_nd+i] /= b; + mData[i*mNd+j] /= b; + if ( i != j ) mData[j*mNd+i] /= b; } } @@ -1741,15 +1993,15 @@ inline tensor2& tensor2::operator/= (const tensor2s &B) template inline tensor2& tensor2::operator+= (const tensor2s &B) { - assert( m_nd == B.ndim() ); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = i ; j < m_nd ; ++j ) { + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = i ; j < mNd ; ++j ) { // - extract value - X b = B[i*m_nd-(i-1)*i/2+j-i]; + X b = B[i*mNd-(i-1)*i/2+j-i]; // - store symmetrically - m_data[i*m_nd+j] += b; - if ( i != j ) m_data[j*m_nd+i] += b; + mData[i*mNd+j] += b; + if ( i != j ) mData[j*mNd+i] += b; } } @@ -1761,15 +2013,15 @@ inline tensor2& tensor2::operator+= (const tensor2s &B) template inline tensor2& tensor2::operator-= (const tensor2s &B) { - assert( m_nd == B.ndim() ); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = i ; j < m_nd ; ++j ) { + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = i ; j < mNd ; ++j ) { // - extract value - X b = B[i*m_nd-(i-1)*i/2+j-i]; + X b = B[i*mNd-(i-1)*i/2+j-i]; // - store symmetrically - m_data[i*m_nd+j] -= b; - if ( i != j ) m_data[j*m_nd+i] -= b; + mData[i*mNd+j] -= b; + if ( i != j ) mData[j*mNd+i] -= b; } } @@ -1783,10 +2035,10 @@ inline tensor2& tensor2::operator*= (const tensor2d &B) { assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = 0 ; j < m_nd ; ++j ) { - if ( i == j ) m_data[i*m_nd+i] *= B[i]; - else m_data[i*m_nd+j] = static_cast(0); + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = 0 ; j < mNd ; ++j ) { + if ( i == j ) mData[i*mNd+i] *= B[i]; + else mData[i*mNd+j] = static_cast(0); } } @@ -1800,8 +2052,8 @@ inline tensor2& tensor2::operator+= (const tensor2d &B) { assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i*m_nd+i] += B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i*mNd+i] += B[i]; return *this; } @@ -1813,8 +2065,8 @@ inline tensor2& tensor2::operator-= (const tensor2d &B) { assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i*m_nd+i] -= B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i*mNd+i] -= B[i]; return *this; } @@ -1824,8 +2076,8 @@ inline tensor2& tensor2::operator-= (const tensor2d &B) template inline tensor2& tensor2::operator*= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } @@ -1835,8 +2087,8 @@ inline tensor2& tensor2::operator*= (const X &B) template inline tensor2& tensor2::operator/= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } @@ -1846,8 +2098,8 @@ inline tensor2& tensor2::operator/= (const X &B) template inline tensor2& tensor2::operator+= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } @@ -1857,56 +2109,602 @@ inline tensor2& tensor2::operator+= (const X &B) template inline tensor2& tensor2::operator-= (const X &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// arithmetic operators - tensor2s +// ================================================================================================= template -inline tensor2 operator* (const tensor2 &A, const tensor2 &B) +inline tensor2s& tensor2s::operator*= (const tensor2s &B) { - assert( A.size() == B.size() ); - assert( B.ndim() == B.ndim() ); + assert( mNd == B.ndim() ); - tensor2 C(A.ndim()); - - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] * B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; - return C; + return *this; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 operator/ (const tensor2 &A, const tensor2 &B) +inline tensor2s& tensor2s::operator/= (const tensor2s &B) { - assert( A.size() == B.size() ); - assert( B.ndim() == B.ndim() ); - - tensor2 C(A.ndim()); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] / B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; - return C; + return *this; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 operator+ (const tensor2 &A, const tensor2 &B) +inline tensor2s& tensor2s::operator+= (const tensor2s &B) { - assert( A.size() == B.size() ); - assert( B.ndim() == B.ndim() ); + assert( mNd == B.ndim() ); - tensor2 C(A.ndim()); - - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] + B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2s& tensor2s::operator-= (const tensor2s &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2s& tensor2s::operator*= (const tensor2d &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j=i; j(0); + } + } + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2s& tensor2s::operator+= (const tensor2d &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i*mNd-(i-1)*i/2] += B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2s& tensor2s::operator-= (const tensor2d &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i*mNd-(i-1)*i/2] -= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2s& tensor2s::operator*= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2s& tensor2s::operator/= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2s& tensor2s::operator+= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2s& tensor2s::operator-= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; + + return *this; +} + +// ================================================================================================= +// arithmetic operators - tensor2d +// ================================================================================================= + +template +inline tensor2d& tensor2d::operator*= (const tensor2d &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] *= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator+= (const tensor2d &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] += B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator-= (const tensor2d &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] -= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator*= (const tensor2 &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd; ++i ) + mData[i] *= B[i*mNd+i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator/= (const tensor2 &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd; ++i ) + mData[i] /= B[i*mNd+i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator*= (const tensor2s &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] *= B[i*mNd-(i-1)*i/2]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator/= (const tensor2s &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] /= B[i*mNd-(i-1)*i/2]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator*= (const X &B) +{ + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] *= B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator/= (const X &B) +{ + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] /= B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator+= (const X &B) +{ + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] += B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d& tensor2d::operator-= (const X &B) +{ + for ( size_t i = 0 ; i < mNd ; ++i ) + mData[i] -= B; + + return *this; +} + +// ================================================================================================= +// arithmetic operators - vector +// ================================================================================================= + +template +inline vector& vector::operator*= (const vector &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector& vector::operator/= (const vector &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector& vector::operator+= (const vector &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector& vector::operator-= (const vector &B) +{ + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector& vector::operator*= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector& vector::operator/= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector& vector::operator+= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; + + return *this; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector& vector::operator-= (const X &B) +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; + + return *this; +} + +// ================================================================================================= +// arithmetic operators - mixed class +// ================================================================================================= + +template +inline tensor4 operator* (const tensor4 &A, const tensor4 &B) +{ + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + tensor4 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] * B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator/ (const tensor4 &A, const tensor4 &B) +{ + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + tensor4 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] / B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator+ (const tensor4 &A, const tensor4 &B) +{ + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + tensor4 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] + B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator- (const tensor4 &A, const tensor4 &B) +{ + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + tensor4 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] - B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator* (const tensor4 &A, const X &B) +{ + tensor4 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] * B; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator/ (const tensor4 &A, const X &B) +{ + tensor4 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] / B; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator+ (const tensor4 &A, const X &B) +{ + tensor4 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] + B; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator- (const tensor4 &A, const X &B) +{ + tensor4 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] - B; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator* (const X &A, const tensor4 &B) +{ + tensor4 C(B.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A * B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator/ (const X &A, const tensor4 &B) +{ + tensor4 C(B.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A / B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator+ (const X &A, const tensor4 &B) +{ + tensor4 C(B.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A + B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor4 operator- (const X &A, const tensor4 &B) +{ + tensor4 C(B.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A - B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2 operator* (const tensor2 &A, const tensor2 &B) +{ + assert( A.size() == B.size() ); + assert( B.ndim() == B.ndim() ); + + tensor2 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] * B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2 operator/ (const tensor2 &A, const tensor2 &B) +{ + assert( A.size() == B.size() ); + assert( B.ndim() == B.ndim() ); + + tensor2 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] / B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2 operator+ (const tensor2 &A, const tensor2 &B) +{ + assert( A.size() == B.size() ); + assert( B.ndim() == B.ndim() ); + + tensor2 C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] + B[i]; return C; } @@ -2220,222 +3018,79 @@ inline tensor2 operator+ (const tensor2d &A, const tensor2 &B) } } - return C; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2 operator- (const tensor2d &A, const tensor2 &B) -{ - assert( A.ndim() == B.ndim() ); - - size_t nd = A.ndim(); - tensor2 C(nd); - - for ( size_t i = 0 ; i < nd ; ++i ) { - for ( size_t j = 0 ; j < nd ; ++j ) { - if ( i == j ) C[ i*nd + j ] = A[ i ] - B[ i*nd + j ]; - else C[ i*nd + j ] = - B[ i*nd + j ]; - } - } - - return C; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2 operator* (const X &A, const tensor2 &B) -{ - tensor2 C(B.ndim()); - - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A * B[i]; - - return C; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2 operator/ (const X &A, const tensor2 &B) -{ - tensor2 C(B.ndim()); - - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A / B[i]; - - return C; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2 operator+ (const X &A, const tensor2 &B) -{ - tensor2 C(B.ndim()); - - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A + B[i]; - - return C; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2 operator- (const X &A, const tensor2 &B) -{ - tensor2 C(B.ndim()); - - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A - B[i]; - - return C; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2s& tensor2s::operator*= (const tensor2s &B) -{ - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; - - return *this; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2s& tensor2s::operator/= (const tensor2s &B) -{ - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; - - return *this; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2s& tensor2s::operator+= (const tensor2s &B) -{ - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; - - return *this; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2s& tensor2s::operator-= (const tensor2s &B) -{ - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; - - return *this; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2s& tensor2s::operator*= (const tensor2d &B) -{ - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j=i; j(0); - } - } - - return *this; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline tensor2s& tensor2s::operator+= (const tensor2d &B) -{ - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i*m_nd-(i-1)*i/2] += B[i]; - - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2s& tensor2s::operator-= (const tensor2d &B) +inline tensor2 operator- (const tensor2d &A, const tensor2 &B) { - assert( m_nd == B.ndim() ); + assert( A.ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i*m_nd-(i-1)*i/2] -= B[i]; + size_t nd = A.ndim(); + tensor2 C(nd); - return *this; + for ( size_t i = 0 ; i < nd ; ++i ) { + for ( size_t j = 0 ; j < nd ; ++j ) { + if ( i == j ) C[ i*nd + j ] = A[ i ] - B[ i*nd + j ]; + else C[ i*nd + j ] = - B[ i*nd + j ]; + } + } + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2s& tensor2s::operator*= (const X &B) +inline tensor2 operator* (const X &A, const tensor2 &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; + tensor2 C(B.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A * B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2s& tensor2s::operator/= (const X &B) +inline tensor2 operator/ (const X &A, const tensor2 &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + tensor2 C(B.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A / B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2s& tensor2s::operator+= (const X &B) +inline tensor2 operator+ (const X &A, const tensor2 &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + tensor2 C(B.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A + B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2s& tensor2s::operator-= (const X &B) +inline tensor2 operator- (const X &A, const tensor2 &B) { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + tensor2 C(B.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A - B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- @@ -2609,7 +3264,7 @@ inline tensor2s operator+ (const tensor2d &A, const X &B) } } - return C; + return C; } // ------------------------------------------------------------------------------------------------- @@ -2627,7 +3282,7 @@ inline tensor2s operator- (const tensor2d &A, const X &B) } } - return C; + return C; } // ------------------------------------------------------------------------------------------------- @@ -2737,7 +3392,7 @@ inline tensor2s operator+ (const X &A, const tensor2d &B) } } - return C; + return C; } // ------------------------------------------------------------------------------------------------- @@ -2755,159 +3410,379 @@ inline tensor2s operator- (const X &A, const tensor2d &B) } } - return C; + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator*= (const tensor2d &B) +inline tensor2d operator* (const tensor2d &A, const tensor2d &B) { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + tensor2d C(A.ndim()); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < C.ndim() ; ++i ) + C[i] = A[i] * B[i]; - return *this; + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator+ (const tensor2d &A, const tensor2d &B) +{ + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < C.ndim() ; ++i ) + C[i] = A[i] + B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator- (const tensor2d &A, const tensor2d &B) +{ + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < C.ndim() ; ++i ) + C[i] = A[i] - B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator* (const tensor2d &A, const tensor2 &B) +{ + assert( A.ndim() == B.ndim() ); + + size_t nd = A.ndim(); + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < nd ; ++i ) + C[i] = A[i] * B[ i*nd + i ]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator/ (const tensor2d &A, const tensor2 &B) +{ + assert( A.ndim() == B.ndim() ); + + size_t nd = A.ndim(); + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < nd ; ++i ) + C[i] = A[i] / B[ i*nd + i ]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator* (const tensor2d &A, const tensor2s &B) +{ + assert( A.ndim() == B.ndim() ); + + size_t nd = A.ndim(); + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < nd ; ++i ) + C[i] = A[i] * B[ i*nd - (i-1)*i/2 ]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator/ (const tensor2d &A, const tensor2s &B) +{ + assert( A.ndim() == B.ndim() ); + + size_t nd = A.ndim(); + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < nd ; ++i ) + C[i] = A[i] / B[ i*nd - (i-1)*i/2 ]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator* (const tensor2d &A, const X &B) +{ + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < C.ndim() ; ++i ) + C[i] = A[i] * B; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator/ (const tensor2d &A, const X &B) +{ + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < C.ndim() ; ++i ) + C[i] = A[i] / B; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator* (const tensor2 &A, const tensor2d &B) +{ + assert( A.ndim() == B.ndim() ); + + size_t nd = A.ndim(); + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < nd ; ++i ) + C[i] = A[ i*nd + i ] * B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator* (const tensor2s &A, const tensor2d &B) +{ + assert( A.ndim() == B.ndim() ); + + size_t nd = A.ndim(); + tensor2d C(A.ndim()); + + for ( size_t i = 0 ; i < nd ; ++i ) + C[i] = A[ i*nd - (i-1)*i/2 ] * B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline tensor2d operator* (const X &A, const tensor2d &B) +{ + tensor2d C(B.ndim()); + + for ( size_t i = 0 ; i < C.ndim() ; ++i ) + C[i] = A * B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector operator* (const vector &A, const vector &B) +{ + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + vector C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] * B[i]; + + return C; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline vector operator/ (const vector &A, const vector &B) +{ + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + vector C(A.ndim()); + + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] / B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator+= (const tensor2d &B) +inline vector operator+ (const vector &A, const vector &B) { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] += B[i]; + vector C(A.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] + B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator-= (const tensor2d &B) +inline vector operator- (const vector &A, const vector &B) { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( A.size() == B.size() ); + assert( A.ndim() == B.ndim() ); + + vector C(A.ndim()); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] - B[i]; - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator*= (const tensor2 &B) +inline vector operator* (const vector &A, const X &B) { - assert( m_nd == B.ndim() ); + vector C(A.ndim()); - for ( size_t i = 0 ; i < m_nd; ++i ) - m_data[i] *= B[i*m_nd+i]; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] * B; - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator/= (const tensor2 &B) +inline vector operator/ (const vector &A, const X &B) { - assert( m_nd == B.ndim() ); + vector C(A.ndim()); - for ( size_t i = 0 ; i < m_nd; ++i ) - m_data[i] /= B[i*m_nd+i]; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] / B; - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator*= (const tensor2s &B) +inline vector operator+ (const vector &A, const X &B) { - assert( m_nd == B.ndim() ); + vector C(A.ndim()); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] *= B[i*m_nd-(i-1)*i/2]; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] + B; - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator/= (const tensor2s &B) +inline vector operator- (const vector &A, const X &B) { - assert( m_nd == B.ndim() ); + vector C(A.ndim()); - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] /= B[i*m_nd-(i-1)*i/2]; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A[i] - B; - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator*= (const X &B) +inline vector operator* (const X &A, const vector &B) { - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] *= B; + vector C(B.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A * B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator/= (const X &B) +inline vector operator/ (const X &A, const vector &B) { - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] /= B; + vector C(B.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A / B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator+= (const X &B) +inline vector operator+ (const X &A, const vector &B) { - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] += B; + vector C(B.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A + B[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d& tensor2d::operator-= (const X &B) +inline vector operator- (const X &A, const vector &B) { - for ( size_t i = 0 ; i < m_nd ; ++i ) - m_data[i] -= B; + vector C(B.ndim()); - return *this; + for ( size_t i = 0 ; i < C.size() ; ++i ) + C[i] = A - B[i]; + + return C; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// tensor products +// ================================================================================================= template -inline tensor2d operator* (const tensor2d &A, const tensor2d &B) +inline tensor4 tensor4::ddot(const tensor4 &B) const { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + assert( size() == B.size() ); + assert( ndim() == B.ndim() ); - tensor2d C(A.ndim()); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < C.ndim() ; ++i ) - C[i] = A[i] * B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + for ( size_t m = 0 ; m < mNd ; ++m ) + for ( size_t n = 0 ; n < mNd ; ++n ) + C(i,j,m,n) += (*this)(i,j,k,l) * B(l,k,m,n); return C; } @@ -2915,15 +3790,17 @@ inline tensor2d operator* (const tensor2d &A, const tensor2d &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator+ (const tensor2d &A, const tensor2d &B) +inline tensor2 tensor4::ddot(const tensor2 &B) const { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - tensor2d C(A.ndim()); + tensor2 C = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < C.ndim() ; ++i ) - C[i] = A[i] + B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,j) += (*this)(i,j,k,l) * B(l,k); return C; } @@ -2931,15 +3808,17 @@ inline tensor2d operator+ (const tensor2d &A, const tensor2d &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator- (const tensor2d &A, const tensor2d &B) +inline tensor2 tensor4::ddot(const tensor2s &B) const { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - tensor2d C(A.ndim()); + tensor2 C = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < C.ndim() ; ++i ) - C[i] = A[i] - B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,j) += (*this)(i,j,k,l) * B(l,k); return C; } @@ -2947,15 +3826,16 @@ inline tensor2d operator- (const tensor2d &A, const tensor2d &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator* (const tensor2d &A, const tensor2 &B) +inline tensor2 tensor4::ddot(const tensor2d &B) const { - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - size_t nd = A.ndim(); - tensor2d C(A.ndim()); + tensor2 C = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < nd ; ++i ) - C[i] = A[i] * B[ i*nd + i ]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,j) += (*this)(i,j,k,k) * B(k,k); return C; } @@ -2963,15 +3843,17 @@ inline tensor2d operator* (const tensor2d &A, const tensor2 &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator/ (const tensor2d &A, const tensor2 &B) +inline tensor2 tensor2::ddot(const tensor4 &B) const { - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - size_t nd = A.ndim(); - tensor2d C(A.ndim()); + tensor2 C = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < nd ; ++i ) - C[i] = A[i] / B[ i*nd + i ]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(k,l) += (*this)(i,j) * B(j,i,k,l); return C; } @@ -2979,15 +3861,16 @@ inline tensor2d operator/ (const tensor2d &A, const tensor2 &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator* (const tensor2d &A, const tensor2s &B) +inline X tensor2::ddot(const tensor2 &B) const { - assert( A.ndim() == B.ndim() ); + assert( size() == B.size() ); + assert( ndim() == B.ndim() ); - size_t nd = A.ndim(); - tensor2d C(A.ndim()); + X C = static_cast(0); - for ( size_t i = 0 ; i < nd ; ++i ) - C[i] = A[i] * B[ i*nd - (i-1)*i/2 ]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C += (*this)(i,j) * B(j,i); return C; } @@ -2995,15 +3878,15 @@ inline tensor2d operator* (const tensor2d &A, const tensor2s &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator/ (const tensor2d &A, const tensor2s &B) +inline X tensor2::ddot(const tensor2s &B) const { - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - size_t nd = A.ndim(); - tensor2d C(A.ndim()); + X C = static_cast(0); - for ( size_t i = 0 ; i < nd ; ++i ) - C[i] = A[i] / B[ i*nd - (i-1)*i/2 ]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C += (*this)(i,j) * B(j,i); return C; } @@ -3011,12 +3894,14 @@ inline tensor2d operator/ (const tensor2d &A, const tensor2s &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator* (const tensor2d &A, const X &B) +inline X tensor2::ddot(const tensor2d &B) const { - tensor2d C(A.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.ndim() ; ++i ) - C[i] = A[i] * B; + X C = static_cast(0); + + for ( size_t i = 0 ; i < mNd ; ++i ) + C += (*this)(i,i) * B(i,i); return C; } @@ -3024,12 +3909,17 @@ inline tensor2d operator* (const tensor2d &A, const X &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator/ (const tensor2d &A, const X &B) +inline tensor2 tensor2s::ddot(const tensor4 &B) const { - tensor2d C(A.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.ndim() ; ++i ) - C[i] = A[i] / B; + tensor2 C = tensor2::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(k,l) += (*this)(i,j) * B(j,i,k,l); return C; } @@ -3037,15 +3927,15 @@ inline tensor2d operator/ (const tensor2d &A, const X &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator* (const tensor2 &A, const tensor2d &B) +inline X tensor2s::ddot(const tensor2 &B) const { - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - size_t nd = A.ndim(); - tensor2d C(A.ndim()); + X C = static_cast(0); - for ( size_t i = 0 ; i < nd ; ++i ) - C[i] = A[ i*nd + i ] * B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C += (*this)(i,j) * B(j,i); return C; } @@ -3053,15 +3943,19 @@ inline tensor2d operator* (const tensor2 &A, const tensor2d &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator* (const tensor2s &A, const tensor2d &B) +inline X tensor2s::ddot(const tensor2s &B) const { - assert( A.ndim() == B.ndim() ); + assert( size() == B.size() ); + assert( ndim() == B.ndim() ); - size_t nd = A.ndim(); - tensor2d C(A.ndim()); + X C = static_cast(0); - for ( size_t i = 0 ; i < nd ; ++i ) - C[i] = A[ i*nd - (i-1)*i/2 ] * B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + C += ( mData[i*mNd-(i-1)*i/2] * B[i*mNd-(i-1)*i/2] ); + + for ( size_t i = 0 ; i(2) * mData[i*mNd-(i-1)*i/2+j-i] * B[i*mNd-(i-1)*i/2+j-i] ); return C; } @@ -3069,12 +3963,14 @@ inline tensor2d operator* (const tensor2s &A, const tensor2d &B) // ------------------------------------------------------------------------------------------------- template -inline tensor2d operator* (const X &A, const tensor2d &B) +inline X tensor2s::ddot(const tensor2d &B) const { - tensor2d C(B.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.ndim() ; ++i ) - C[i] = A * B[i]; + X C = static_cast(0); + + for ( size_t i = 0 ; i < mNd ; ++i ) + C += mData[i*mNd-(i-1)*i/2]*B[i]; return C; } @@ -3082,115 +3978,129 @@ inline tensor2d operator* (const X &A, const tensor2d &B) // ------------------------------------------------------------------------------------------------- template -inline vector& vector::operator*= (const vector &B) +inline tensor2 tensor2d::ddot(const tensor4 &B) const { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B[i]; + tensor2 C = tensor2::Zero(mNd); - return *this; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(k,l) += mData[i]*B(i,i,k,l); + + return C; } // ------------------------------------------------------------------------------------------------- template -inline vector& vector::operator/= (const vector &B) +inline X tensor2d::ddot(const tensor2 &B) const { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B[i]; + X C = static_cast(0); - return *this; + for ( size_t i = 0 ; i < mNd ; ++i ) + C += mData[i]*B(i,i); + + return C; } // ------------------------------------------------------------------------------------------------- template -inline vector& vector::operator+= (const vector &B) +inline X tensor2d::ddot(const tensor2s &B) const { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( ndim() == B.ndim() ); + + X C = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + C += mData[i]*B[i*mNd-(i-1)*i/2]; - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline vector& vector::operator-= (const vector &B) +inline X tensor2d::ddot(const tensor2d &B) const { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + assert( size() == B.size() ); + assert( ndim() == B.ndim() ); + + X C = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + C += mData[i]*B[i]; - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline vector& vector::operator*= (const X &B) +inline tensor2 tensor2::dot(const tensor2 &B) const { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] *= B; - - return *this; -} + assert( size() == B.size() ); + assert( ndim() == B.ndim() ); -// ------------------------------------------------------------------------------------------------- + tensor2 C = tensor2::Zero(mNd); -template -inline vector& vector::operator/= (const X &B) -{ - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,k) += (*this)(i,j) * B(j,k); - return *this; + return C; } // ------------------------------------------------------------------------------------------------- template -inline vector& vector::operator+= (const X &B) +inline tensor2 tensor2::dot(const tensor2s &B) const { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] += B; + assert( ndim() == B.ndim() ); - return *this; + tensor2 C = tensor2::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,k) += (*this)(i,j) * B(j,k); + + return C; } // ------------------------------------------------------------------------------------------------- template -inline vector& vector::operator-= (const X &B) +inline tensor2 tensor2::dot(const tensor2d &B) const { - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] -= B; + assert( ndim() == B.ndim() ); - return *this; + tensor2 C = tensor2::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C(i,j) += (*this)(i,j) * B(j,j); + + return C; } // ------------------------------------------------------------------------------------------------- template -inline vector operator* (const vector &A, const vector &B) +inline vector tensor2::dot(const vector &B) const { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - vector C(A.ndim()); + vector C = vector::Zero(mNd); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] * B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C(i) += (*this)(i,j) * B(j); return C; } @@ -3198,15 +4108,16 @@ inline vector operator* (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator/ (const vector &A, const vector &B) +inline tensor2 tensor2s::dot(const tensor2 &B) const { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - vector C(A.ndim()); + tensor2 C = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] / B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,k) += (*this)(i,j) * B(j,k); return C; } @@ -3214,15 +4125,17 @@ inline vector operator/ (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator+ (const vector &A, const vector &B) +inline tensor2 tensor2s::dot(const tensor2s &B) const { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + assert( size() == B.size() ); + assert( ndim() == B.ndim() ); - vector C(A.ndim()); + tensor2 C = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] + B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,k) += (*this)(i,j) * B(j,k); return C; } @@ -3230,15 +4143,15 @@ inline vector operator+ (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator- (const vector &A, const vector &B) +inline tensor2 tensor2s::dot(const tensor2d &B) const { - assert( A.size() == B.size() ); - assert( A.ndim() == B.ndim() ); + assert( ndim() == B.ndim() ); - vector C(A.ndim()); + tensor2 C = tensor2::Zero(mNd); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] - B[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C(i,j) += (*this)(i,j) * B(j,j); return C; } @@ -3246,12 +4159,15 @@ inline vector operator- (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator* (const vector &A, const X &B) +inline vector tensor2s::dot(const vector &B) const { - vector C(A.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] * B; + vector C = vector::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C(i) += (*this)(i,j) * B(j); return C; } @@ -3259,12 +4175,15 @@ inline vector operator* (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator/ (const vector &A, const X &B) +inline tensor2 tensor2d::dot(const tensor2 &B) const { - vector C(A.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] / B; + tensor2 C = tensor2::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,k) += (*this)(i,i) * B(i,k); return C; } @@ -3272,12 +4191,15 @@ inline vector operator/ (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator+ (const vector &A, const X &B) +inline tensor2 tensor2d::dot(const tensor2s &B) const { - vector C(A.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] + B; + tensor2 C = tensor2::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,k) += (*this)(i,i) * B(i,k); return C; } @@ -3285,12 +4207,15 @@ inline vector operator+ (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator- (const vector &A, const X &B) +inline tensor2d tensor2d::dot(const tensor2d &B) const { - vector C(A.ndim()); + assert( size() == B.size() ); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A[i] - B; + tensor2d C = tensor2d::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + C(i,i) += (*this)(i,i) * B(i,i); return C; } @@ -3298,12 +4223,14 @@ inline vector operator- (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator* (const X &A, const vector &B) +inline vector tensor2d::dot(const vector &B) const { - vector C(B.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A * B[i]; + vector C = vector::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + C(i) += (*this)(i,i) * B(i); return C; } @@ -3311,12 +4238,15 @@ inline vector operator* (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator/ (const X &A, const vector &B) +inline vector vector::dot(const tensor2 &B) const { - vector C(B.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A / B[i]; + vector C = vector::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C(j) += (*this)(i) * B(i,j); return C; } @@ -3324,12 +4254,15 @@ inline vector operator/ (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator+ (const X &A, const vector &B) +inline vector vector::dot(const tensor2s &B) const { - vector C(B.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A + B[i]; + vector C = vector::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C(j) += (*this)(i) * B(i,j); return C; } @@ -3337,35 +4270,30 @@ inline vector operator+ (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- template -inline vector operator- (const X &A, const vector &B) +inline vector vector::dot(const tensor2d &B) const { - vector C(B.ndim()); + assert( ndim() == B.ndim() ); - for ( size_t i = 0 ; i < C.size() ; ++i ) - C[i] = A - B[i]; + vector C = vector::Zero(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + C(i) += (*this)(i) * B(i,i); return C; } -// ================================================================================================= -// tensor products -// ================================================================================================= +// ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor4::ddot(const tensor4 &B) const +inline X vector::dot(const vector &B) const { assert( size() == B.size() ); assert( ndim() == B.ndim() ); - tensor4 C = tensor4::Zero(m_nd); + X C = static_cast(0); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - for ( size_t m = 0 ; m < m_nd ; ++m ) - for ( size_t n = 0 ; n < m_nd ; ++n ) - C(i,j,m,n) += (*this)(i,j,k,l) * B(l,k,m,n); + for ( size_t i = 0 ; i < mNd ; ++i ) + C += (*this)(i) * B(i); return C; } @@ -3373,17 +4301,18 @@ inline tensor4 tensor4::ddot(const tensor4 &B) const // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor4::ddot(const tensor2 &B) const +inline tensor4 tensor2::dyadic(const tensor2 &B) const { + assert( size() == B.size() ); assert( ndim() == B.ndim() ); - tensor2 C = tensor2::Zero(m_nd); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,j) += (*this)(i,j,k,l) * B(l,k); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; } @@ -3391,17 +4320,17 @@ inline tensor2 tensor4::ddot(const tensor2 &B) const // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor4::ddot(const tensor2s &B) const +inline tensor4 tensor2::dyadic(const tensor2s &B) const { assert( ndim() == B.ndim() ); - tensor2 C = tensor2::Zero(m_nd); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,j) += (*this)(i,j,k,l) * B(l,k); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; } @@ -3409,16 +4338,16 @@ inline tensor2 tensor4::ddot(const tensor2s &B) const // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor4::ddot(const tensor2d &B) const +inline tensor4 tensor2::dyadic(const tensor2d &B) const { assert( ndim() == B.ndim() ); - tensor2 C = tensor2::Zero(m_nd); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,j) += (*this)(i,j,k,k) * B(k,k); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,j,k,k) += (*this)(i,j) * B(k,k); return C; } @@ -3426,17 +4355,17 @@ inline tensor2 tensor4::ddot(const tensor2d &B) const // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2::ddot(const tensor4 &B) const +inline tensor4 tensor2s::dyadic(const tensor2 &B) const { assert( ndim() == B.ndim() ); - tensor2 C = tensor2::Zero(m_nd); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(k,l) += (*this)(i,j) * B(j,i,k,l); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; } @@ -3444,16 +4373,18 @@ inline tensor2 tensor2::ddot(const tensor4 &B) const // ------------------------------------------------------------------------------------------------- template -inline X tensor2::ddot(const tensor2 &B) const +inline tensor4 tensor2s::dyadic(const tensor2s &B) const { assert( size() == B.size() ); assert( ndim() == B.ndim() ); - X C = static_cast(0); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C += (*this)(i,j) * B(j,i); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; } @@ -3461,15 +4392,16 @@ inline X tensor2::ddot(const tensor2 &B) const // ------------------------------------------------------------------------------------------------- template -inline X tensor2::ddot(const tensor2s &B) const +inline tensor4 tensor2s::dyadic(const tensor2d &B) const { assert( ndim() == B.ndim() ); - X C = static_cast(0); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C += (*this)(i,j) * B(j,i); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,j,k,k) += (*this)(i,j) * B(k,k); return C; } @@ -3477,14 +4409,16 @@ inline X tensor2::ddot(const tensor2s &B) const // ------------------------------------------------------------------------------------------------- template -inline X tensor2::ddot(const tensor2d &B) const +inline tensor4 tensor2d::dyadic(const tensor2 &B) const { assert( ndim() == B.ndim() ); - X C = static_cast(0); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += (*this)(i,i) * B(i,i); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,i,k,l) += (*this)(i,i) * B(k,l); return C; } @@ -3492,17 +4426,16 @@ inline X tensor2::ddot(const tensor2d &B) const // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2s::ddot(const tensor4 &B) const +inline tensor4 tensor2d::dyadic(const tensor2s &B) const { assert( ndim() == B.ndim() ); - tensor2 C = tensor2::Zero(m_nd); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(k,l) += (*this)(i,j) * B(j,i,k,l); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,i,k,l) += (*this)(i,i) * B(k,l); return C; } @@ -3510,15 +4443,16 @@ inline tensor2 tensor2s::ddot(const tensor4 &B) const // ------------------------------------------------------------------------------------------------- template -inline X tensor2s::ddot(const tensor2 &B) const +inline tensor4 tensor2d::dyadic(const tensor2d &B) const { + assert( size() == B.size() ); assert( ndim() == B.ndim() ); - X C = static_cast(0); + tensor4 C = tensor4::Zero(mNd); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C += (*this)(i,j) * B(j,i); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + C(i,i,k,k) += (*this)(i,i) * B(k,k); return C; } @@ -3526,19 +4460,16 @@ inline X tensor2s::ddot(const tensor2 &B) const // ------------------------------------------------------------------------------------------------- template -inline X tensor2s::ddot(const tensor2s &B) const +inline tensor2 vector::dyadic(const vector &B) const { assert( size() == B.size() ); assert( ndim() == B.ndim() ); - X C = static_cast(0); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += ( m_data[i*m_nd-(i-1)*i/2] * B[i*m_nd-(i-1)*i/2] ); + tensor2 C = tensor2::Zero(mNd); - for ( size_t i = 0 ; i(2) * m_data[i*m_nd-(i-1)*i/2+j-i] * B[i*m_nd-(i-1)*i/2+j-i] ); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C(i,j) += (*this)(i) * B(j); return C; } @@ -3546,14 +4477,19 @@ inline X tensor2s::ddot(const tensor2s &B) const // ------------------------------------------------------------------------------------------------- template -inline X tensor2s::ddot(const tensor2d &B) const +inline vector vector::cross(const vector &B) const { + assert( size() == B.size() ); assert( ndim() == B.ndim() ); - X C = static_cast(0); + if ( mNd != 3 ) + throw std::runtime_error("'cross' only implemented in 3D"); + + vector C(3); - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += m_data[i*m_nd-(i-1)*i/2]*B[i]; + C[0] = mData[1]*B[2]-B[1]*mData[2] ; + C[1] = static_cast(-1)*(mData[0]*B[2]-B[0]*mData[2]); + C[2] = mData[0]*B[1]-B[0]*mData[1] ; return C; } @@ -3561,1465 +4497,1363 @@ inline X tensor2s::ddot(const tensor2d &B) const // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2d::ddot(const tensor4 &B) const +inline tensor4 ddot(const tensor4 &A, const tensor4 &B) { - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); + return A.ddot(B); +} - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(k,l) += m_data[i]*B(i,i,k,l); +// ------------------------------------------------------------------------------------------------- - return C; +template +inline tensor2 ddot(const tensor4 &A, const tensor2 &B) +{ + return A.ddot(B); } // ------------------------------------------------------------------------------------------------- template -inline X tensor2d::ddot(const tensor2 &B) const +inline tensor2 ddot(const tensor4 &A, const tensor2s &B) { - assert( ndim() == B.ndim() ); - - X C = static_cast(0); + return A.ddot(B); +} - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += m_data[i]*B(i,i); +// ------------------------------------------------------------------------------------------------- - return C; +template +inline tensor2 ddot(const tensor4 &A, const tensor2d &B) +{ + return A.ddot(B); } // ------------------------------------------------------------------------------------------------- template -inline X tensor2d::ddot(const tensor2s &B) const +inline tensor2 ddot(const tensor2 &A, const tensor4 &B) { - assert( ndim() == B.ndim() ); - - X C = static_cast(0); + return A.ddot(B); +} - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += m_data[i]*B[i*m_nd-(i-1)*i/2]; +// ------------------------------------------------------------------------------------------------- - return C; +template +inline tensor2 ddot(const tensor2s &A, const tensor4 &B) +{ + return A.ddot(B); } // ------------------------------------------------------------------------------------------------- template -inline X tensor2d::ddot(const tensor2d &B) const +inline tensor2 ddot(const tensor2d &A, const tensor4 &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - X C = static_cast(0); + return A.ddot(B); +} - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += m_data[i]*B[i]; +// ------------------------------------------------------------------------------------------------- - return C; +template +inline X ddot(const tensor2 &A, const tensor2 &B) +{ + return A.ddot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2::dot(const tensor2 &B) const +inline X ddot(const tensor2 &A, const tensor2s &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); + return A.ddot(B); +} - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,k) += (*this)(i,j) * B(j,k); +// ------------------------------------------------------------------------------------------------- - return C; +template +inline X ddot(const tensor2 &A, const tensor2d &B) +{ + return A.ddot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2::dot(const tensor2s &B) const +inline X ddot(const tensor2s &A, const tensor2 &B) { - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); + return A.ddot(B); +} - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,k) += (*this)(i,j) * B(j,k); +// ------------------------------------------------------------------------------------------------- - return C; +template +inline X ddot(const tensor2s &A, const tensor2s &B) +{ + return A.ddot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2::dot(const tensor2d &B) const +inline X ddot(const tensor2s &A, const tensor2d &B) { - assert( ndim() == B.ndim() ); + return A.ddot(B); +} - tensor2 C = tensor2::Zero(m_nd); +// ------------------------------------------------------------------------------------------------- - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C(i,j) += (*this)(i,j) * B(j,j); +template +inline X ddot(const tensor2d &A, const tensor2 &B) +{ + return A.ddot(B); +} - return C; +// ------------------------------------------------------------------------------------------------- + +template +inline X ddot(const tensor2d &A, const tensor2s &B) +{ + return A.ddot(B); } // ------------------------------------------------------------------------------------------------- template -inline vector tensor2::dot(const vector &B) const +inline X ddot(const tensor2d &A, const tensor2d &B) { - assert( ndim() == B.ndim() ); - - vector C = vector::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C(i) += (*this)(i,j) * B(j); - - return C; + return A.ddot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2s::dot(const tensor2 &B) const +inline tensor2 dot(const tensor2 &A, const tensor2 &B) { - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,k) += (*this)(i,j) * B(j,k); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2s::dot(const tensor2s &B) const +inline tensor2 dot(const tensor2 &A, const tensor2s &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,k) += (*this)(i,j) * B(j,k); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2s::dot(const tensor2d &B) const +inline tensor2 dot(const tensor2 &A, const tensor2d &B) { - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C(i,j) += (*this)(i,j) * B(j,j); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline vector tensor2s::dot(const vector &B) const +inline tensor2 dot(const tensor2s &A, const tensor2 &B) { - assert( ndim() == B.ndim() ); - - vector C = vector::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C(i) += (*this)(i,j) * B(j); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2d::dot(const tensor2 &B) const +inline tensor2 dot(const tensor2s &A, const tensor2s &B) { - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,k) += (*this)(i,i) * B(i,k); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2d::dot(const tensor2s &B) const +inline tensor2 dot(const tensor2s &A, const tensor2d &B) { - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,k) += (*this)(i,i) * B(i,k); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2d tensor2d::dot(const tensor2d &B) const +inline tensor2 dot(const tensor2d &A, const tensor2 &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - tensor2d C = tensor2d::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - C(i,i) += (*this)(i,i) * B(i,i); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline vector tensor2d::dot(const vector &B) const +inline tensor2 dot(const tensor2d &A, const tensor2s &B) { - assert( ndim() == B.ndim() ); - - vector C = vector::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - C(i) += (*this)(i,i) * B(i); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline vector vector::dot(const tensor2 &B) const +inline tensor2d dot(const tensor2d &A, const tensor2d &B) { - assert( ndim() == B.ndim() ); - - vector C = vector::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C(j) += (*this)(i) * B(i,j); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline vector vector::dot(const tensor2s &B) const +inline vector dot(const tensor2 &A, const vector &B) { - assert( ndim() == B.ndim() ); - - vector C = vector::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C(j) += (*this)(i) * B(i,j); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline vector vector::dot(const tensor2d &B) const +inline vector dot(const tensor2s &A, const vector &B) { - assert( ndim() == B.ndim() ); - - vector C = vector::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - C(i) += (*this)(i) * B(i,i); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline X vector::dot(const vector &B) const +inline vector dot(const tensor2d &A, const vector &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - X C = static_cast(0); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += (*this)(i) * B(i); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2::dyadic(const tensor2 &B) const +inline vector dot(const vector &A, const tensor2 &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,j,k,l) += (*this)(i,j) * B(k,l); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2::dyadic(const tensor2s &B) const +inline vector dot(const vector &A, const tensor2s &B) { - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,j,k,l) += (*this)(i,j) * B(k,l); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2::dyadic(const tensor2d &B) const +inline vector dot(const vector &A, const tensor2d &B) { - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,j,k,k) += (*this)(i,j) * B(k,k); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2s::dyadic(const tensor2 &B) const +inline X dot(const vector &A, const vector &B) { - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,j,k,l) += (*this)(i,j) * B(k,l); - - return C; + return A.dot(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2s::dyadic(const tensor2s &B) const +inline tensor4 dyadic(const tensor2 &A, const tensor2 &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,j,k,l) += (*this)(i,j) * B(k,l); - - return C; + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2s::dyadic(const tensor2d &B) const +inline tensor4 dyadic(const tensor2 &A, const tensor2s &B) { - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,j,k,k) += (*this)(i,j) * B(k,k); - - return C; + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2d::dyadic(const tensor2 &B) const +inline tensor4 dyadic(const tensor2 &A, const tensor2d &B) { - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,i,k,l) += (*this)(i,i) * B(k,l); - - return C; + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2d::dyadic(const tensor2s &B) const +inline tensor4 dyadic(const tensor2s &A, const tensor2 &B) { - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,i,k,l) += (*this)(i,i) * B(k,l); - - return C; + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor2d::dyadic(const tensor2d &B) const +inline tensor4 dyadic(const tensor2s &A, const tensor2s &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - tensor4 C = tensor4::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - C(i,i,k,k) += (*this)(i,i) * B(k,k); - - return C; + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 vector::dyadic(const vector &B) const +inline tensor4 dyadic(const tensor2s &A, const tensor2d &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - tensor2 C = tensor2::Zero(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C(i,j) += (*this)(i) * B(j); - - return C; + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline vector vector::cross(const vector &B) const +inline tensor4 dyadic(const tensor2d &A, const tensor2 &B) { - assert( size() == B.size() ); - assert( ndim() == B.ndim() ); - - if ( m_nd != 3 ) - throw std::runtime_error("'cross' only implemented in 3D"); - - vector C(3); + return A.dyadic(B); +} - C[0] = m_data[1]*B[2]-B[1]*m_data[2] ; - C[1] = static_cast(-1)*(m_data[0]*B[2]-B[0]*m_data[2]); - C[2] = m_data[0]*B[1]-B[0]*m_data[1] ; +// ------------------------------------------------------------------------------------------------- - return C; +template +inline tensor4 dyadic(const tensor2d &A, const tensor2s &B) +{ + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 ddot(const tensor4 &A, const tensor4 &B) +inline tensor4 dyadic(const tensor2d &A, const tensor2d &B) { - return A.ddot(B); + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 ddot(const tensor4 &A, const tensor2 &B) +inline tensor2 dyadic(const vector &A, const vector &B) { - return A.ddot(B); + return A.dyadic(B); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 ddot(const tensor4 &A, const tensor2s &B) +inline vector cross (const vector &A, const vector &B) { - return A.ddot(B); + return A.cross (B); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// transpositions +// ================================================================================================= template -inline tensor2 ddot(const tensor4 &A, const tensor2d &B) +inline tensor4 tensor4::T() const { - return A.ddot(B); + tensor4 C(mNd); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(l,k,j,i) = (*this)(i,j,k,l); + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 ddot(const tensor2 &A, const tensor4 &B) +inline tensor4 tensor4::RT() const { - return A.ddot(B); -} + tensor4 C(mNd); -// ------------------------------------------------------------------------------------------------- + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(i,j,l,k) = (*this)(i,j,k,l); -template -inline tensor2 ddot(const tensor2s &A, const tensor4 &B) -{ - return A.ddot(B); + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 ddot(const tensor2d &A, const tensor4 &B) +inline tensor4 tensor4::LT() const { - return A.ddot(B); -} + tensor4 C(mNd); -// ------------------------------------------------------------------------------------------------- + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(j,i,k,l) = (*this)(i,j,k,l); -template -inline X ddot(const tensor2 &A, const tensor2 &B) -{ - return A.ddot(B); + return C; } // ------------------------------------------------------------------------------------------------- template -inline X ddot(const tensor2 &A, const tensor2s &B) +inline tensor2 tensor2::T() const { - return A.ddot(B); -} + tensor2 C(mNd); -// ------------------------------------------------------------------------------------------------- + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + C(j,i) = (*this)(i,j); -template -inline X ddot(const tensor2 &A, const tensor2d &B) -{ - return A.ddot(B); + return C; } // ------------------------------------------------------------------------------------------------- template -inline X ddot(const tensor2s &A, const tensor2 &B) +inline tensor2s tensor2s::T() const { - return A.ddot(B); + tensor2s C(mNd); + + for ( size_t i = 0 ; i < mSize ; ++i ) + C[i] = (*this)[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline X ddot(const tensor2s &A, const tensor2s &B) +inline tensor2d tensor2d::T() const { - return A.ddot(B); + tensor2d C(mNd); + + for ( size_t i = 0 ; i < mSize ; ++i ) + C[i] = (*this)[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline X ddot(const tensor2s &A, const tensor2d &B) +inline tensor2 transpose(const tensor2 &A) { - return A.ddot(B); + return A.T(); } // ------------------------------------------------------------------------------------------------- template -inline X ddot(const tensor2d &A, const tensor2 &B) +inline tensor2s transpose(const tensor2s &A) { - return A.ddot(B); + return A.T(); } // ------------------------------------------------------------------------------------------------- template -inline X ddot(const tensor2d &A, const tensor2s &B) +inline tensor2d transpose(const tensor2d &A) { - return A.ddot(B); + return A.T(); } // ------------------------------------------------------------------------------------------------- template -inline X ddot(const tensor2d &A, const tensor2d &B) +inline tensor4 transpose(const tensor4 &A) { - return A.ddot(B); + return A.T(); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 dot(const tensor2 &A, const tensor2 &B) +inline tensor4 transposeR(const tensor4 &A) { - return A.dot(B); + return A.RT(); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 dot(const tensor2 &A, const tensor2s &B) +inline tensor4 transposeL(const tensor4 &A) { - return A.dot(B); + return A.LT(); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// miscellaneous tensor operations +// ================================================================================================= template -inline tensor2 dot(const tensor2 &A, const tensor2d &B) +inline X tensor2::trace() const { - return A.dot(B); + X C = static_cast(0); + + for ( size_t i = 0 ; i < mNd ; ++i ) + C += (*this)(i,i); + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 dot(const tensor2s &A, const tensor2 &B) +inline X tensor2s::trace() const { - return A.dot(B); + X C = static_cast(0); + + for ( size_t i = 0 ; i < mNd ; ++i ) + C += (*this)(i,i); + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 dot(const tensor2s &A, const tensor2s &B) +inline X tensor2d::trace() const { - return A.dot(B); + X C = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + C += (*this)[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 dot(const tensor2s &A, const tensor2d &B) +inline X tensor2::det() const { - return A.dot(B); + if ( mNd==2 ) + return mData[0] * mData[3] - mData[1] * mData[2]; + + if ( mNd==3 ) + return ( mData[0] * mData[4] * mData[8] + + mData[1] * mData[5] * mData[6] + + mData[2] * mData[3] * mData[7] ) - + ( mData[2] * mData[4] * mData[6] + + mData[1] * mData[3] * mData[8] + + mData[0] * mData[5] * mData[7] ); + + throw std::runtime_error("'det' only implemented in 2D/3D, use e.g. 'Eigen'"); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 dot(const tensor2d &A, const tensor2 &B) +inline X tensor2s::det() const { - return A.dot(B); + if ( mNd==2 ) + return mData[0] * mData[2] - mData[1] * mData[1]; + + if ( mNd==3 ) + return ( mData[0] * mData[3] * mData[5] + + static_cast(2) * mData[1] * mData[2] * mData[4] ) - + ( mData[4] * mData[4] * mData[0] + + mData[2] * mData[2] * mData[3] + + mData[1] * mData[1] * mData[5] ); + + throw std::runtime_error("'det' only implemented in 2D/3D, use e.g. 'Eigen'"); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 dot(const tensor2d &A, const tensor2s &B) +inline X tensor2d::det() const { - return A.dot(B); + X C = static_cast(1); + + for ( size_t i = 0 ; i < mNd ; ++i ) + C *= (*this)[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d dot(const tensor2d &A, const tensor2d &B) +inline tensor2 tensor2::inv() const { - return A.dot(B); + // compute determinant + X D = det(); + + // allocate result + tensor2 C(mNd); + + if ( mNd==2 ) + { + C[0] = mData[3] / D; + C[1] = static_cast(-1) * mData[1] / D; + C[2] = static_cast(-1) * mData[2] / D; + C[3] = mData[0] / D; + + return C; + } + + if ( mNd==3 ) + { + C[0] = (mData[4]*mData[8]-mData[5]*mData[7]) / D; + C[1] = (mData[2]*mData[7]-mData[1]*mData[8]) / D; + C[2] = (mData[1]*mData[5]-mData[2]*mData[4]) / D; + C[3] = (mData[5]*mData[6]-mData[3]*mData[8]) / D; + C[4] = (mData[0]*mData[8]-mData[2]*mData[6]) / D; + C[5] = (mData[2]*mData[3]-mData[0]*mData[5]) / D; + C[6] = (mData[3]*mData[7]-mData[4]*mData[6]) / D; + C[7] = (mData[1]*mData[6]-mData[0]*mData[7]) / D; + C[8] = (mData[0]*mData[4]-mData[1]*mData[3]) / D; + + return C; + } + + throw std::runtime_error("'inv' only implemented in 2D/3D, use e.g. 'Eigen'"); } // ------------------------------------------------------------------------------------------------- template -inline vector dot(const tensor2 &A, const vector &B) +inline tensor2s tensor2s::inv() const { - return A.dot(B); + // compute determinant + X D = det(); + + // allocate result + tensor2s C(mNd); + + if ( mNd==2 ) + { + C[0] = mData[2] / D; + C[1] = static_cast(-1) * mData[1] / D; + C[2] = mData[0] / D; + + return C; + } + + if ( mNd==3 ) + { + C[0] = (mData[3]*mData[5]-mData[4]*mData[4]) / D; + C[1] = (mData[2]*mData[4]-mData[1]*mData[5]) / D; + C[2] = (mData[1]*mData[4]-mData[2]*mData[3]) / D; + C[3] = (mData[0]*mData[5]-mData[2]*mData[2]) / D; + C[4] = (mData[2]*mData[1]-mData[0]*mData[4]) / D; + C[5] = (mData[0]*mData[3]-mData[1]*mData[1]) / D; + + return C; + } + + throw std::runtime_error("'inv' only implemented in 2D/3D, use e.g. 'Eigen'"); } // ------------------------------------------------------------------------------------------------- template -inline vector dot(const tensor2s &A, const vector &B) +inline tensor2d tensor2d::inv() const { - return A.dot(B); + // allocate result + tensor2d C(mNd); + + for ( size_t i = 0; i < mNd ; ++i ) + C[i] = static_cast(1) / mData[i]; + + return C; } // ------------------------------------------------------------------------------------------------- template -inline vector dot(const tensor2d &A, const vector &B) +inline tensor2 inv(const tensor2 &A) { - return A.dot(B); + return A.inv(); } // ------------------------------------------------------------------------------------------------- template -inline vector dot(const vector &A, const tensor2 &B) +inline tensor2s inv(const tensor2s &A) { - return A.dot(B); + return A.inv(); } // ------------------------------------------------------------------------------------------------- template -inline vector dot(const vector &A, const tensor2s &B) +inline tensor2d inv(const tensor2d &A) { - return A.dot(B); + return A.inv(); } // ------------------------------------------------------------------------------------------------- template -inline vector dot(const vector &A, const tensor2d &B) +inline X det(const tensor2 &A) { - return A.dot(B); + return A.det(); } // ------------------------------------------------------------------------------------------------- template -inline X dot(const vector &A, const vector &B) +inline X det(const tensor2s &A) { - return A.dot(B); + return A.det(); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 dyadic(const tensor2 &A, const tensor2 &B) +inline X det(const tensor2d &A) { - return A.dyadic(B); + return A.det(); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 dyadic(const tensor2 &A, const tensor2s &B) +inline X trace(const tensor2 &A) { - return A.dyadic(B); + return A.trace(); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 dyadic(const tensor2 &A, const tensor2d &B) +inline X trace(const tensor2s &A) { - return A.dyadic(B); + return A.trace(); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 dyadic(const tensor2s &A, const tensor2 &B) +inline X trace(const tensor2d &A) { - return A.dyadic(B); + return A.trace(); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// equality operators +// ================================================================================================= template -inline tensor4 dyadic(const tensor2s &A, const tensor2s &B) +inline bool tensor4::operator== (const tensor4 &B) const { - return A.dyadic(B); + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] != B[i] ) + return false; + + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor4 dyadic(const tensor2s &A, const tensor2d &B) +inline bool tensor2::operator== (const tensor2 &B) const { - return A.dyadic(B); + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] != B[i] ) + return false; + + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor4 dyadic(const tensor2d &A, const tensor2 &B) +inline bool tensor2::operator== (const tensor2s &B) const { - return A.dyadic(B); + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + if ( mData[i*mNd+j] != B(i,j) ) + return false; + + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor4 dyadic(const tensor2d &A, const tensor2s &B) +inline bool tensor2::operator== (const tensor2d &B) const { - return A.dyadic(B); + assert( mNd == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + if ( mData[i*mNd+j] != B(i,j) ) + return false; + + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor4 dyadic(const tensor2d &A, const tensor2d &B) +inline bool tensor2s::operator== (const tensor2s &B) const { - return A.dyadic(B); + assert( ndim() == B.ndim() ); + + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] != B[i] ) + return false; + + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 dyadic(const vector &A, const vector &B) +inline bool tensor2s::operator== (const tensor2 &B) const { - return A.dyadic(B); + assert( ndim() == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = i ; j < mNd ; ++j ) { + if ( mData[i*mNd-(i-1)*i/2+j-i] != B(i,j) ) return false; + if ( mData[i*mNd-(i-1)*i/2+j-i] != B(j,i) ) return false; + } + } + + return true; } // ------------------------------------------------------------------------------------------------- template -inline vector cross (const vector &A, const vector &B) +inline bool tensor2s::operator== (const tensor2d &B) const { - return A.cross (B); + assert( ndim() == B.ndim() ); + + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i ; j < mNd ; ++j ) + if ( mData[i*mNd-(i-1)*i/2+j-i] != B(i,j) ) return false; + + return true; } -// ================================================================================================= -// transpositions -// ================================================================================================= +// ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor4::T() const +inline bool tensor2d::operator== (const tensor2d &B) const { - tensor4 C(m_nd); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(l,k,j,i) = (*this)(i,j,k,l); + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] != B[i] ) + return false; - return C; + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor4::RT() const +inline bool tensor2d::operator== (const tensor2 &B) const { - tensor4 C(m_nd); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(i,j,l,k) = (*this)(i,j,k,l); + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = 0 ; j < mNd ; ++j ) { + if ( i == j ) { if ( mData[i] != B(i,i) ) return false; } + else { if ( B(i,j) ) return false; } + } + } - return C; + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor4 tensor4::LT() const +inline bool tensor2d::operator== (const tensor2s &B) const { - tensor4 C(m_nd); + assert( mNd == B.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) - C(j,i,k,l) = (*this)(i,j,k,l); + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = i ; j < mNd ; ++j ) { + if ( i == j ) { if ( mData[i] != B(i,i) ) return false; } + else { if ( B(i,j) ) return false; } + } + } - return C; + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2::T() const +inline bool vector::operator== (const vector &B) const { - tensor2 C(m_nd); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - C(j,i) = (*this)(i,j); + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] != B[i] ) + return false; - return C; + return true; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// structure check +// ================================================================================================= template -inline tensor2s tensor2s::T() const +inline bool tensor2::issymmetric() const { - tensor2s C(m_nd); - - for ( size_t i = 0 ; i < m_size ; ++i ) - C[i] = (*this)[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i+1 ; j < mNd ; ++j ) + if ( mData[ i*mNd + j ] != mData[ j*mNd + i ] ) + return false; - return C; + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d tensor2d::T() const +inline bool tensor2::isdiagonal() const { - tensor2d C(m_nd); - - for ( size_t i = 0 ; i < m_size ; ++i ) - C[i] = (*this)[i]; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + if ( i != j ) + if ( mData[ i*mNd + j ] ) + return false; - return C; + return true; } // ------------------------------------------------------------------------------------------------- template -inline tensor2 transpose(const tensor2 &A) +inline bool tensor2s::isdiagonal() const { - return A.T(); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i+1 ; j < mNd ; ++j ) + if ( mData[i*mNd-(i-1)*i/2+j-i] ) + return false; + + return true; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra: absolute value +// ================================================================================================= template -inline tensor2s transpose(const tensor2s &A) +inline void tensor4::abs() { - return A.T(); + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); } // ------------------------------------------------------------------------------------------------- template -inline tensor2d transpose(const tensor2d &A) +inline void tensor2::abs() { - return A.T(); + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 transpose(const tensor4 &A) +inline void tensor2s::abs() { - return A.T(); + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 transposeR(const tensor4 &A) +inline void tensor2d::abs() { - return A.RT(); + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); } // ------------------------------------------------------------------------------------------------- template -inline tensor4 transposeL(const tensor4 &A) +inline void vector::abs() { - return A.LT(); + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); } // ================================================================================================= -// miscellaneous tensor operations +// basic algebra: location of the minimum // ================================================================================================= template -inline X tensor2::trace() const +inline std::vector tensor4::argmin() const { - X C = static_cast(0); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += (*this)(i,i); - - return C; + return decompress( std::min_element(begin(),end()) - begin() ); } // ------------------------------------------------------------------------------------------------- template -inline X tensor2s::trace() const +inline std::vector tensor2::argmin() const { - X C = static_cast(0); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - C += (*this)(i,i); - - return C; + return decompress( std::min_element(begin(),end()) - begin() ); } // ------------------------------------------------------------------------------------------------- template -inline X tensor2d::trace() const +inline std::vector tensor2s::argmin() const { - X C = static_cast(0); - - for ( size_t i = 0 ; i < m_size ; ++i ) - C += (*this)[i]; - - return C; + return decompress( std::min_element(begin(),end()) - begin() ); } // ------------------------------------------------------------------------------------------------- template -inline X tensor2::det() const +inline std::vector tensor2d::argmin() const { - if ( m_nd==2 ) - return m_data[0] * m_data[3] - m_data[1] * m_data[2]; + size_t i = std::min_element(begin(),end()) - begin(); - if ( m_nd==3 ) - return ( m_data[0] * m_data[4] * m_data[8] + - m_data[1] * m_data[5] * m_data[6] + - m_data[2] * m_data[3] * m_data[7] ) - - ( m_data[2] * m_data[4] * m_data[6] + - m_data[1] * m_data[3] * m_data[8] + - m_data[0] * m_data[5] * m_data[7] ); + std::vector out(mNd); - throw std::runtime_error("'det' only implemented in 2D/3D, use e.g. 'Eigen'"); + std::fill(out.begin(), out.end(), i); + + return out; } // ------------------------------------------------------------------------------------------------- template -inline X tensor2s::det() const +inline std::vector vector::argmin() const { - if ( m_nd==2 ) - return m_data[0] * m_data[2] - m_data[1] * m_data[1]; + return decompress( std::min_element(begin(),end()) - begin() ); +} - if ( m_nd==3 ) - return ( m_data[0] * m_data[3] * m_data[5] + - static_cast(2) * m_data[1] * m_data[2] * m_data[4] ) - - ( m_data[4] * m_data[4] * m_data[0] + - m_data[2] * m_data[2] * m_data[3] + - m_data[1] * m_data[1] * m_data[5] ); +// ================================================================================================= +// basic algebra: location of the maximum +// ================================================================================================= - throw std::runtime_error("'det' only implemented in 2D/3D, use e.g. 'Eigen'"); +template +inline std::vector tensor4::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); } // ------------------------------------------------------------------------------------------------- template -inline X tensor2d::det() const +inline std::vector tensor2::argmax() const { - X C = static_cast(1); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - C *= (*this)[i]; - - return C; + return decompress( std::max_element(begin(),end()) - begin() ); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 tensor2::inv() const +inline std::vector tensor2s::argmax() const { - // compute determinant - X D = det(); - - // allocate result - tensor2 C(m_nd); - - if ( m_nd==2 ) - { - C[0] = m_data[3] / D; - C[1] = static_cast(-1) * m_data[1] / D; - C[2] = static_cast(-1) * m_data[2] / D; - C[3] = m_data[0] / D; - - return C; - } - - if ( m_nd==3 ) - { - C[0] = (m_data[4]*m_data[8]-m_data[5]*m_data[7]) / D; - C[1] = (m_data[2]*m_data[7]-m_data[1]*m_data[8]) / D; - C[2] = (m_data[1]*m_data[5]-m_data[2]*m_data[4]) / D; - C[3] = (m_data[5]*m_data[6]-m_data[3]*m_data[8]) / D; - C[4] = (m_data[0]*m_data[8]-m_data[2]*m_data[6]) / D; - C[5] = (m_data[2]*m_data[3]-m_data[0]*m_data[5]) / D; - C[6] = (m_data[3]*m_data[7]-m_data[4]*m_data[6]) / D; - C[7] = (m_data[1]*m_data[6]-m_data[0]*m_data[7]) / D; - C[8] = (m_data[0]*m_data[4]-m_data[1]*m_data[3]) / D; - - return C; - } - - throw std::runtime_error("'inv' only implemented in 2D/3D, use e.g. 'Eigen'"); + return decompress( std::max_element(begin(),end()) - begin() ); } // ------------------------------------------------------------------------------------------------- template -inline tensor2s tensor2s::inv() const +inline std::vector tensor2d::argmax() const { - // compute determinant - X D = det(); - - // allocate result - tensor2s C(m_nd); - - if ( m_nd==2 ) - { - C[0] = m_data[2] / D; - C[1] = static_cast(-1) * m_data[1] / D; - C[2] = m_data[0] / D; - - return C; - } + size_t i = std::max_element(begin(),end()) - begin(); - if ( m_nd==3 ) - { - C[0] = (m_data[3]*m_data[5]-m_data[4]*m_data[4]) / D; - C[1] = (m_data[2]*m_data[4]-m_data[1]*m_data[5]) / D; - C[2] = (m_data[1]*m_data[4]-m_data[2]*m_data[3]) / D; - C[3] = (m_data[0]*m_data[5]-m_data[2]*m_data[2]) / D; - C[4] = (m_data[2]*m_data[1]-m_data[0]*m_data[4]) / D; - C[5] = (m_data[0]*m_data[3]-m_data[1]*m_data[1]) / D; + std::vector out(mNd); - return C; - } + std::fill(out.begin(), out.end(), i); - throw std::runtime_error("'inv' only implemented in 2D/3D, use e.g. 'Eigen'"); + return out; } // ------------------------------------------------------------------------------------------------- template -inline tensor2d tensor2d::inv() const +inline std::vector vector::argmax() const { - // allocate result - tensor2d C(m_nd); + return decompress( std::max_element(begin(),end()) - begin() ); +} - for ( size_t i = 0; i < m_nd ; ++i ) - C[i] = static_cast(1) / m_data[i]; +// ================================================================================================= +// basic algebra: minimum +// ================================================================================================= - return C; +template +inline X tensor4::minCoeff() const +{ + return *std::min_element(begin(),end()); } // ------------------------------------------------------------------------------------------------- template -inline tensor2 inv(const tensor2 &A) +inline X tensor2::minCoeff() const { - return A.inv(); + return *std::min_element(begin(),end()); } // ------------------------------------------------------------------------------------------------- template -inline tensor2s inv(const tensor2s &A) +inline X tensor2s::minCoeff() const { - return A.inv(); + return *std::min_element(begin(),end()); } // ------------------------------------------------------------------------------------------------- template -inline tensor2d inv(const tensor2d &A) +inline X tensor2d::minCoeff() const { - return A.inv(); + return *std::min_element(begin(),end()); } // ------------------------------------------------------------------------------------------------- template -inline X det(const tensor2 &A) +inline X vector::minCoeff() const { - return A.det(); + return *std::min_element(begin(),end()); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra: maximum +// ================================================================================================= template -inline X det(const tensor2s &A) +inline X tensor4::maxCoeff() const { - return A.det(); + return *std::max_element(begin(),end()); } // ------------------------------------------------------------------------------------------------- template -inline X det(const tensor2d &A) +inline X tensor2::maxCoeff() const { - return A.det(); + return *std::max_element(begin(),end()); } // ------------------------------------------------------------------------------------------------- template -inline X trace(const tensor2 &A) +inline X tensor2s::maxCoeff() const { - return A.trace(); + return *std::max_element(begin(),end()); } // ------------------------------------------------------------------------------------------------- template -inline X trace(const tensor2s &A) +inline X tensor2d::maxCoeff() const { - return A.trace(); + return *std::max_element(begin(),end()); } // ------------------------------------------------------------------------------------------------- template -inline X trace(const tensor2d &A) +inline X vector::maxCoeff() const { - return A.trace(); + return *std::max_element(begin(),end()); } // ================================================================================================= -// equality operators +// basic algebra: sum // ================================================================================================= template -inline bool tensor4::operator== (const tensor4 &B) const +inline X tensor4::sum() const { - assert( m_size == B.size() ); - assert( m_nd == B.ndim() ); + X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - if ( m_data[i] != B[i] ) - return false; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; - return true; + return out; } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2::operator== (const tensor2 &B) const +inline X tensor2::sum() const { - assert( m_nd == B.ndim() ); + X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - if ( m_data[i] != B[i] ) - return false; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; - return true; + return out; } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2::operator== (const tensor2s &B) const +inline X tensor2s::sum() const { - assert( m_nd == B.ndim() ); + X out = static_cast(0); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - if ( m_data[i*m_nd+j] != B(i,j) ) - return false; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; - return true; + return out; } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2::operator== (const tensor2d &B) const +inline X tensor2d::sum() const { - assert( m_nd == B.ndim() ); + X out = static_cast(0); - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - if ( m_data[i*m_nd+j] != B(i,j) ) - return false; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; - return true; + return out; } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2s::operator== (const tensor2s &B) const +inline X vector::sum() const { - assert( ndim() == B.ndim() ); + X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - if ( m_data[i] != B[i] ) - return false; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; - return true; + return out; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra: mean +// ================================================================================================= template -inline bool tensor2s::operator== (const tensor2 &B) const +inline double tensor4::mean() const { - assert( ndim() == B.ndim() ); - - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = i ; j < m_nd ; ++j ) { - if ( m_data[i*m_nd-(i-1)*i/2+j-i] != B(i,j) ) return false; - if ( m_data[i*m_nd-(i-1)*i/2+j-i] != B(j,i) ) return false; - } - } - - return true; + return static_cast(this->sum())/static_cast(mSize); } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2s::operator== (const tensor2d &B) const +inline double tensor2::mean() const { - assert( ndim() == B.ndim() ); - - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = i ; j < m_nd ; ++j ) - if ( m_data[i*m_nd-(i-1)*i/2+j-i] != B(i,j) ) return false; - - return true; + return static_cast(this->sum())/static_cast(mSize); } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2d::operator== (const tensor2d &B) const +inline double tensor2s::mean() const { - assert( m_nd == B.ndim() ); - - for ( size_t i = 0 ; i < m_size ; ++i ) - if ( m_data[i] != B[i] ) - return false; - - return true; + return static_cast(this->sum())/static_cast(mSize); } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2d::operator== (const tensor2 &B) const +inline double tensor2d::mean() const { - assert( m_nd == B.ndim() ); + return static_cast(this->sum())/static_cast(mSize); +} - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = 0 ; j < m_nd ; ++j ) { - if ( i == j ) { if ( m_data[i] != B(i,i) ) return false; } - else { if ( B(i,j) ) return false; } - } - } +// ------------------------------------------------------------------------------------------------- - return true; +template +inline double vector::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra: weighted average +// ================================================================================================= template -inline bool tensor2d::operator== (const tensor2s &B) const +inline double tensor4::average(const tensor4 &weights, bool norm) const { - assert( m_nd == B.ndim() ); + assert( mNd = weights.ndim() ); - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = i ; j < m_nd ; ++j ) { - if ( i == j ) { if ( m_data[i] != B(i,i) ) return false; } - else { if ( B(i,j) ) return false; } - } - } + X out = static_cast(0); - return true; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); } // ------------------------------------------------------------------------------------------------- template -inline bool vector::operator== (const vector &B) const +inline double tensor2::average(const tensor2 &weights, bool norm) const { - for ( size_t i = 0 ; i < m_size ; ++i ) - if ( m_data[i] != B[i] ) - return false; + assert( mNd = weights.ndim() ); - return true; + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); } -// ================================================================================================= -// structure check -// ================================================================================================= +// ------------------------------------------------------------------------------------------------- template -inline bool tensor2::issymmetric() const +inline double tensor2s::average(const tensor2s &weights, bool norm) const { - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = i+1 ; j < m_nd ; ++j ) - if ( m_data[ i*m_nd + j ] != m_data[ j*m_nd + i ] ) - return false; + assert( mNd = weights.ndim() ); - return true; + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2::isdiagonal() const +inline double tensor2d::average(const tensor2d &weights, bool norm) const { - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - if ( i != j ) - if ( m_data[ i*m_nd + j ] ) - return false; + assert( mNd = weights.ndim() ); - return true; + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); } // ------------------------------------------------------------------------------------------------- template -inline bool tensor2s::isdiagonal() const +inline double vector::average(const vector &weights, bool norm) const { - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = i+1 ; j < m_nd ; ++j ) - if ( m_data[i*m_nd-(i-1)*i/2+j-i] ) - return false; + assert( mNd = weights.ndim() ); - return true; + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); } // ================================================================================================= -// basic algebra +// basic algebra: norm // ================================================================================================= template @@ -5027,8 +5861,8 @@ inline X tensor4::norm() const { X C = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - C += std::abs(m_data[i]); + for ( size_t i = 0 ; i < mSize ; ++i ) + C += std::abs(mData[i]); return C; } @@ -5040,8 +5874,8 @@ inline X tensor2::norm() const { X C = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - C += std::abs(m_data[i]); + for ( size_t i = 0 ; i < mSize ; ++i ) + C += std::abs(mData[i]); return C; } @@ -5053,8 +5887,8 @@ inline X tensor2s::norm() const { X C = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - C += std::abs(m_data[i]); + for ( size_t i = 0 ; i < mSize ; ++i ) + C += std::abs(mData[i]); return C; } @@ -5066,8 +5900,8 @@ inline X tensor2d::norm() const { X C = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - C += std::abs(m_data[i]); + for ( size_t i = 0 ; i < mSize ; ++i ) + C += std::abs(mData[i]); return C; } @@ -5079,21 +5913,23 @@ inline X vector::norm() const { X C = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - C += std::abs(m_data[i]); + for ( size_t i = 0 ; i < mSize ; ++i ) + C += std::abs(mData[i]); return C; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra: length +// ================================================================================================= template inline X vector::length() const { X C = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - C += std::pow(m_data[i],2.); + for ( size_t i = 0 ; i < mSize ; ++i ) + C += std::pow(mData[i],2.); return std::sqrt(C); } @@ -5107,8 +5943,8 @@ inline void vector::setUnitLength() if ( C <= static_cast(0) ) return; - for ( size_t i = 0 ; i < m_size ; ++i ) - m_data[i] /= C; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= C; } // ================================================================================================= @@ -5118,13 +5954,13 @@ inline void vector::setUnitLength() template inline void tensor4::printf(std::string fmt) const { - std::string gmt = std::to_string(std::to_string(m_nd).size()); + std::string gmt = std::to_string(std::to_string(mNd).size()); fmt = "(%"+gmt+"d,%"+gmt+"d,%"+gmt+"d,%"+gmt+"d) "+fmt+"\n"; - for ( size_t i = 0 ; i < m_nd ; ++i ) - for ( size_t j = 0 ; j < m_nd ; ++j ) - for ( size_t k = 0 ; k < m_nd ; ++k ) - for ( size_t l = 0 ; l < m_nd ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) std::printf(fmt.c_str(), i, j, k, l, (*this)(i,j,k,l) ); } @@ -5133,10 +5969,10 @@ inline void tensor4::printf(std::string fmt) const template inline void tensor2::printf(std::string fmt) const { - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = 0 ; j < m_nd ; ++j ) { - if ( j != m_nd-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); - else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = 0 ; j < mNd ; ++j ) { + if ( j != mNd-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } } @@ -5146,10 +5982,10 @@ inline void tensor2::printf(std::string fmt) const template inline void tensor2s::printf(std::string fmt) const { - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = 0 ; j < m_nd ; ++j ) { - if ( j != m_nd-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); - else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = 0 ; j < mNd ; ++j ) { + if ( j != mNd-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } } @@ -5159,10 +5995,10 @@ inline void tensor2s::printf(std::string fmt) const template inline void tensor2d::printf(std::string fmt) const { - for ( size_t i = 0 ; i < m_nd ; ++i ) { - for ( size_t j = 0 ; j < m_nd ; ++j ) { - if ( j != m_nd-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); - else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = 0 ; j < mNd ; ++j ) { + if ( j != mNd-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } } @@ -5172,9 +6008,9 @@ inline void tensor2d::printf(std::string fmt) const template inline void vector::printf(std::string fmt) const { - for ( size_t j = 0 ; j < m_nd ; ++j ) { - if ( j != m_nd-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); - else std::printf((fmt + ";\n").c_str(), (*this)(j)); + for ( size_t j = 0 ; j < mNd ; ++j ) { + if ( j != mNd-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); + else std::printf((fmt + ";\n").c_str(), (*this)(j)); } } diff --git a/src/cppmat/tensor.h b/src/cppmat/tensor.h index ab3a2c3..ba68a65 100644 --- a/src/cppmat/tensor.h +++ b/src/cppmat/tensor.h @@ -10,8 +10,6 @@ // ------------------------------------------------------------------------------------------------- #include "cppmat.h" -#include "tensor2.h" -#include "tensor3.h" // ------------------------------------------------------------------------------------------------- @@ -27,14 +25,14 @@ class tensor4 { private: - std::vector m_data; // data container - size_t m_nd=0; // number of dimensions (rank == 4 -> shape == [m_nd,m_nd,m_nd,m_nd]) - size_t m_size=0; // == m_data.size() == m_nd*m_nd*m_nd*m_nd + std::vector mData; // data container + size_t mNd=0; // number of dimensions (rank == 4 -> shape == [mNd,mNd,mNd,mNd]) + size_t mSize=0; // == mData.size() == mNd*mNd*mNd*mNd public: // constructor - tensor4(){}; + tensor4() = default; tensor4(size_t nd); // constructor: initialize @@ -49,8 +47,7 @@ class tensor4 static tensor4 II (size_t nd); // constructor: initialize by copying from external object - template - static tensor4 Copy(size_t nd, Iterator first, Iterator last); + template static tensor4 Copy(size_t nd, Iterator first, Iterator last); // resize void resize(size_t nd); @@ -69,16 +66,30 @@ class tensor4 X& operator()(size_t i, size_t j, size_t k, size_t l); const X& operator()(size_t i, size_t j, size_t k, size_t l) const; + // index operators: plain storage -> array-indices (i -> a,b,c,d) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b,c,d -> i) + size_t compress(size_t a, size_t b, size_t c, size_t d) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b, size_t c, size_t d); + auto item(size_t a, size_t b, size_t c, size_t d) const; + // basic initialization void setArange(); void setZero(); @@ -114,7 +125,23 @@ class tensor4 bool operator== (const tensor4 &B) const; // A_ijkl == B_ijkl // basic algebra - X norm() const; // sum(| A_ijkl |) + // - tensor norm: sum(| A_ijkl |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor4 &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -130,14 +157,14 @@ class tensor2 { private: - std::vector m_data; // data container - size_t m_nd=0; // number of dimensions (rank == 2 -> shape == [m_nd,m_nd]) - size_t m_size=0; // == m_data.size() == m_nd*m_nd + std::vector mData; // data container + size_t mNd=0; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + size_t mSize=0; // == mData.size() == mNd*mNd public: // constructor - tensor2(){}; + tensor2() = default; tensor2(size_t nd); // constructor: initialize @@ -148,8 +175,7 @@ class tensor2 static tensor2 I (size_t nd); // constructor: initialize by copying from external object - template - static tensor2 Copy(size_t nd, Iterator first, Iterator last); + template static tensor2 Copy(size_t nd, Iterator first, Iterator last); // cast into another object template U cast() const; @@ -171,16 +197,30 @@ class tensor2 X& operator()(size_t i, size_t j); const X& operator()(size_t i, size_t j) const; + // index operators: plain storage -> array-indices (i -> a,b) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b -> i) + size_t compress(size_t a, size_t b) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b); + auto item(size_t a, size_t b) const; + // basic initialization void setArange(); void setZero(); @@ -233,7 +273,23 @@ class tensor2 bool isdiagonal() const; // A_ij == 0, i != j // basic algebra - X norm() const; // sum(| A_ij |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2 &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -249,14 +305,14 @@ class tensor2s { private: - std::vector m_data; // data container - size_t m_nd=0; // number of dimensions (rank == 2 -> shape == [m_nd,m_nd]) - size_t m_size=0; // == m_data.size() == (m_nd+1)*m_nd/2 + std::vector mData; // data container + size_t mNd=0; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + size_t mSize=0; // == mData.size() == (mNd+1)*mNd/2 public: // constructor - tensor2s(){}; + tensor2s() = default; tensor2s(size_t nd); // constructor: initialize @@ -267,12 +323,8 @@ class tensor2s static tensor2s I (size_t nd); // constructor: initialize by copying from external object - template - static tensor2s Copy(size_t nd, Iterator first, Iterator last); - - // constructor: initialize by copying from external object, stored as "tensor2" - template - static tensor2s CopyDense(size_t nd, Iterator first, Iterator last); + template static tensor2s Copy (size_t nd, Iterator first, Iterator last); + template static tensor2s CopyDense(size_t nd, Iterator first, Iterator last); // cast into another object template U cast() const; @@ -297,22 +349,36 @@ class tensor2s X& operator()(size_t i, size_t j); const X& operator()(size_t i, size_t j) const; + // index operators: plain storage -> array-indices (i -> a,b) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b -> i) + size_t compress(size_t a, size_t b) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b); + auto item(size_t a, size_t b) const; + // basic initialization void setArange(); void setZero(); void setOnes(); void setConstant(X D); - template void setCopy(Iterator first, Iterator last); + template void setCopy (Iterator first, Iterator last); template void setCopyDense(Iterator first, Iterator last); void setI(); @@ -355,7 +421,23 @@ class tensor2s bool isdiagonal() const; // A_ij == 0, i != j // basic algebra - X norm() const; // sum(| A_ij |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2s &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -371,10 +453,10 @@ class tensor2d { private: - std::vector m_data; // data container - size_t m_nd=0; // number of dimensions (rank == 2 -> shape == [m_nd,m_nd]) - size_t m_size=0; // == m_data.size() == m_nd - X m_zero[1]; // dummy parameter, used to return "0" for any off-diagonal entry + std::vector mData; // data container + size_t mNd=0; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + size_t mSize=0; // == mData.size() == mNd + X mZero[1]; // dummy parameter, used to return "0" for any off-diagonal entry public: @@ -390,12 +472,8 @@ class tensor2d static tensor2d I (size_t nd); // constructor: initialize by copying from external object - template - static tensor2d Copy(size_t nd, Iterator first, Iterator last); - - // constructor: initialize by copying from external object, stored as "tensor2" - template - static tensor2d CopyDense(size_t nd, Iterator first, Iterator last); + template static tensor2d Copy (size_t nd, Iterator first, Iterator last); + template static tensor2d CopyDense(size_t nd, Iterator first, Iterator last); // cast into another object template U cast() const; @@ -425,18 +503,22 @@ class tensor2d X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + // basic initialization void setArange(); void setZero(); void setOnes(); void setConstant(X D); - template void setCopy(Iterator first, Iterator last); + template void setCopy (Iterator first, Iterator last); template void setCopyDense(Iterator first, Iterator last); void setI(); @@ -476,7 +558,23 @@ class tensor2d bool operator== (const tensor2d &B) const; // A_ij == B_ij // basic algebra - X norm() const; // sum(| A_ii |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2d &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -492,14 +590,14 @@ class vector { private: - std::vector m_data; // data container - size_t m_nd=0; // number of dimensions (rank == 1 -> shape == [m_nd]) - size_t m_size=0; // == m_data.size() == m_nd + std::vector mData; // data container + size_t mNd=0; // number of dimensions (rank == 1 -> shape == [mNd]) + size_t mSize=0; // == mData.size() == mNd public: // constructor - vector(){}; + vector() = default; vector(size_t nd); // constructor: initialize @@ -509,8 +607,7 @@ class vector static vector Constant(size_t nd, X D); // constructor: initialize by copying from external object - template - static vector Copy(size_t nd, Iterator first, Iterator last); + template static vector Copy(size_t nd, Iterator first, Iterator last); // resize void resize(size_t nd); @@ -533,12 +630,20 @@ class vector X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a); + auto item(size_t a) const; + // basic initialization void setArange(); void setZero(); @@ -568,9 +673,27 @@ class vector bool operator== (const vector &B) const; // A_i == B_i // basic algebra - X norm() const; // sum(| A_i |) - X length() const; // sqrt(sum(pow(A_i,2.))) - void setUnitLength(); // A_i /= A.length() + // - vector norm: sum(| A_ij |) + X norm() const; + // - vector length: sqrt(sum(pow(A_i,2.))) + X length() const; + // - set vector length to unity: A_i /= A.length() + void setUnitLength(); + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const vector &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; diff --git a/src/cppmat/tensor2.cpp b/src/cppmat/tensor2.cpp index df54e0e..77a1b27 100644 --- a/src/cppmat/tensor2.cpp +++ b/src/cppmat/tensor2.cpp @@ -23,7 +23,7 @@ namespace cartesian2d { template inline tensor4 tensor4::Arange() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -37,7 +37,7 @@ inline tensor4 tensor4::Arange() template inline tensor4 tensor4::Zero() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -51,7 +51,7 @@ inline tensor4 tensor4::Zero() template inline tensor4 tensor4::Ones() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -65,7 +65,7 @@ inline tensor4 tensor4::Ones() template inline tensor4 tensor4::Constant(X D) { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -79,7 +79,7 @@ inline tensor4 tensor4::Constant(X D) template inline tensor4 tensor4::I() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -93,7 +93,7 @@ inline tensor4 tensor4::I() template inline tensor4 tensor4::Irt() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -107,7 +107,7 @@ inline tensor4 tensor4::Irt() template inline tensor4 tensor4::Is() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -121,7 +121,7 @@ inline tensor4 tensor4::Is() template inline tensor4 tensor4::Id() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -135,7 +135,7 @@ inline tensor4 tensor4::Id() template inline tensor4 tensor4::II() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -150,7 +150,7 @@ template template inline tensor4 tensor4::Copy(Iterator first) { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -165,7 +165,7 @@ template template inline tensor4 tensor4::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -179,7 +179,7 @@ inline tensor4 tensor4::Copy(Iterator first, Iterator last) template inline size_t tensor4::Size() { - return 16; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -187,7 +187,7 @@ inline size_t tensor4::Size() template inline tensor2 tensor2::Arange() { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -201,7 +201,7 @@ inline tensor2 tensor2::Arange() template inline tensor2 tensor2::Zero() { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -215,7 +215,7 @@ inline tensor2 tensor2::Zero() template inline tensor2 tensor2::Ones() { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -229,7 +229,7 @@ inline tensor2 tensor2::Ones() template inline tensor2 tensor2::Constant(X D) { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -243,7 +243,7 @@ inline tensor2 tensor2::Constant(X D) template inline tensor2 tensor2::I() { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -258,7 +258,7 @@ template template inline tensor2 tensor2::Copy(Iterator first) { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -273,7 +273,7 @@ template template inline tensor2 tensor2::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -287,7 +287,7 @@ inline tensor2 tensor2::Copy(Iterator first, Iterator last) template inline size_t tensor2::Size() { - return 4; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -295,7 +295,7 @@ inline size_t tensor2::Size() template inline tensor2s tensor2s::Arange() { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -309,7 +309,7 @@ inline tensor2s tensor2s::Arange() template inline tensor2s tensor2s::Zero() { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -323,7 +323,7 @@ inline tensor2s tensor2s::Zero() template inline tensor2s tensor2s::Ones() { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -337,7 +337,7 @@ inline tensor2s tensor2s::Ones() template inline tensor2s tensor2s::Constant(X D) { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -351,7 +351,7 @@ inline tensor2s tensor2s::Constant(X D) template inline tensor2s tensor2s::I() { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -366,7 +366,7 @@ template template inline tensor2s tensor2s::Copy(Iterator first) { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -381,7 +381,7 @@ template template inline tensor2s tensor2s::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -396,7 +396,7 @@ template template inline tensor2s tensor2s::CopyDense(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -410,7 +410,7 @@ inline tensor2s tensor2s::CopyDense(Iterator first, Iterator last) template inline size_t tensor2s::Size() { - return 3; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -419,7 +419,7 @@ template inline tensor2d::tensor2d() { // set dummy parameter - m_zero[0] = static_cast(0); + mZero[0] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -427,7 +427,7 @@ inline tensor2d::tensor2d() template inline tensor2d tensor2d::Arange() { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -441,7 +441,7 @@ inline tensor2d tensor2d::Arange() template inline tensor2d tensor2d::Zero() { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -455,7 +455,7 @@ inline tensor2d tensor2d::Zero() template inline tensor2d tensor2d::Ones() { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -469,7 +469,7 @@ inline tensor2d tensor2d::Ones() template inline tensor2d tensor2d::Constant(X D) { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -483,7 +483,7 @@ inline tensor2d tensor2d::Constant(X D) template inline tensor2d tensor2d::I() { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -498,7 +498,7 @@ template template inline tensor2d tensor2d::Copy(Iterator first) { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -513,7 +513,7 @@ template template inline tensor2d tensor2d::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -528,7 +528,7 @@ template template inline tensor2d tensor2d::CopyDense(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -542,7 +542,7 @@ inline tensor2d tensor2d::CopyDense(Iterator first, Iterator last) template inline size_t tensor2d::Size() { - return 2; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -550,7 +550,7 @@ inline size_t tensor2d::Size() template inline vector vector::Arange() { - // allocate tensor + // call basic constructor vector out; // initialize @@ -564,7 +564,7 @@ inline vector vector::Arange() template inline vector vector::Zero() { - // allocate tensor + // call basic constructor vector out; // initialize @@ -578,7 +578,7 @@ inline vector vector::Zero() template inline vector vector::Ones() { - // allocate tensor + // call basic constructor vector out; // initialize @@ -592,7 +592,7 @@ inline vector vector::Ones() template inline vector vector::Constant(X D) { - // allocate tensor + // call basic constructor vector out; // initialize @@ -607,7 +607,7 @@ template template inline vector vector::Copy(Iterator first) { - // allocate tensor + // call basic constructor vector out; // initialize @@ -622,7 +622,7 @@ template template inline vector vector::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor vector out; // initialize @@ -636,12 +636,12 @@ inline vector vector::Copy(Iterator first, Iterator last) template inline size_t vector::Size() { - return 2; + return mSize; } // ================================================================================================= -// cast to different class / type +// cast to different class // ================================================================================================= template<> @@ -650,9 +650,9 @@ inline tensor2s tensor2::cast>() const { tensor2s out; - out[0] = m_data[0]; - out[1] = ( m_data[1] + m_data[2] ) / 2.; - out[2] = m_data[3]; + out[0] = mData[0]; + out[1] = ( mData[1] + mData[2] ) / 2.; + out[2] = mData[3]; return out; } @@ -665,8 +665,8 @@ inline tensor2d tensor2::cast>() const { tensor2d out; - out[0] = m_data[0]; - out[1] = m_data[3]; + out[0] = mData[0]; + out[1] = mData[3]; return out; } @@ -679,9 +679,9 @@ inline tensor2 tensor2s::cast>() const { tensor2 out; - out[0] = m_data[0]; - out[1] = out[2] = m_data[1]; - out[3] = m_data[2]; + out[0] = mData[0]; + out[1] = out[2] = mData[1]; + out[3] = mData[2]; return out; } @@ -694,8 +694,8 @@ inline tensor2d tensor2s::cast>() const { tensor2d out; - out[0] = m_data[0]; - out[1] = m_data[2]; + out[0] = mData[0]; + out[1] = mData[2]; return out; } @@ -708,8 +708,8 @@ inline tensor2 tensor2d::cast>() const { tensor2 out; - out[0] = m_data[0]; - out[3] = m_data[1]; + out[0] = mData[0]; + out[3] = mData[1]; out[1] = out[2] = 0.0; @@ -724,15 +724,17 @@ inline tensor2s tensor2d::cast>() const { tensor2s out; - out[0] = m_data[0]; - out[2] = m_data[1]; + out[0] = mData[0]; + out[2] = mData[1]; out[1] = 0.0; return out; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// automatic cast to different class +// ================================================================================================= #ifndef CPPMAT_NOCONVERT template @@ -740,9 +742,9 @@ inline tensor2s::operator tensor2 () const { tensor2 out; - out[0] = m_data[0]; - out[1] = out[2] = m_data[1]; - out[3] = m_data[2]; + out[0] = mData[0]; + out[1] = out[2] = mData[1]; + out[3] = mData[2]; return out; } @@ -756,8 +758,8 @@ inline tensor2d::operator tensor2 () const { tensor2 out; - out[0] = m_data[0]; - out[3] = m_data[1]; + out[0] = mData[0]; + out[3] = mData[1]; out[1] = out[2] = static_cast(0); @@ -773,8 +775,8 @@ inline tensor2d::operator tensor2s () const { tensor2s out; - out[0] = m_data[0]; - out[2] = m_data[1]; + out[0] = mData[0]; + out[2] = mData[1]; out[1] = static_cast(0); @@ -786,23 +788,25 @@ inline tensor2d::operator tensor2s () const // get dimensions // ================================================================================================= -template inline size_t tensor4 ::size() const { return 16; } -template inline size_t tensor2 ::size() const { return 4; } -template inline size_t tensor2s::size() const { return 3; } -template inline size_t tensor2d::size() const { return 2; } -template inline size_t vector ::size() const { return 2; } -template inline size_t tensor4 ::ndim() const { return 2; } -template inline size_t tensor2 ::ndim() const { return 2; } -template inline size_t tensor2s::ndim() const { return 2; } -template inline size_t tensor2d::ndim() const { return 2; } -template inline size_t vector ::ndim() const { return 2; } +template inline size_t tensor4 ::size() const { return mSize; } +template inline size_t tensor2 ::size() const { return mSize; } +template inline size_t tensor2s::size() const { return mSize; } +template inline size_t tensor2d::size() const { return mSize; } +template inline size_t vector ::size() const { return mSize; } +template inline size_t tensor4 ::ndim() const { return mNd; } +template inline size_t tensor2 ::ndim() const { return mNd; } +template inline size_t tensor2s::ndim() const { return mNd; } +template inline size_t tensor2d::ndim() const { return mNd; } +template inline size_t vector ::ndim() const { return mNd; } // ------------------------------------------------------------------------------------------------- template inline std::vector tensor4::shape() const { - std::vector out(4, 2); + std::vector out(4); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -812,7 +816,9 @@ inline std::vector tensor4::shape() const template inline std::vector tensor2::shape() const { - std::vector out(2, 2); + std::vector out(2); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -822,7 +828,9 @@ inline std::vector tensor2::shape() const template inline std::vector vector::shape() const { - std::vector out(1, 2); + std::vector out(1); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -875,15 +883,15 @@ inline std::vector vector::strides(bool bytes) const } // ================================================================================================= -// index operators +// index operators : operator[...] // ================================================================================================= template inline X& tensor4::operator[](size_t i) { - assert( i < 16 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -891,9 +899,9 @@ inline X& tensor4::operator[](size_t i) template inline const X& tensor4::operator[](size_t i) const { - assert( i < 16 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -901,9 +909,9 @@ inline const X& tensor4::operator[](size_t i) const template inline X& tensor2::operator[](size_t i) { - assert( i < 4 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -911,9 +919,9 @@ inline X& tensor2::operator[](size_t i) template inline const X& tensor2::operator[](size_t i) const { - assert( i < 4 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -921,9 +929,9 @@ inline const X& tensor2::operator[](size_t i) const template inline X& tensor2s::operator[](size_t i) { - assert( i < 3 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -931,9 +939,9 @@ inline X& tensor2s::operator[](size_t i) template inline const X& tensor2s::operator[](size_t i) const { - assert( i < 3 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -941,9 +949,9 @@ inline const X& tensor2s::operator[](size_t i) const template inline X& tensor2d::operator[](size_t i) { - assert( i < 2 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -951,9 +959,9 @@ inline X& tensor2d::operator[](size_t i) template inline const X& tensor2d::operator[](size_t i) const { - assert( i < 2 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -961,9 +969,9 @@ inline const X& tensor2d::operator[](size_t i) const template inline X& vector::operator[](size_t i) { - assert( i < 2 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -971,22 +979,24 @@ inline X& vector::operator[](size_t i) template inline const X& vector::operator[](size_t i) const { - assert( i < 2 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// index operators : operator(...) +// ================================================================================================= template inline X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) { - assert( i < 2 ); - assert( j < 2 ); - assert( k < 2 ); - assert( l < 2 ); + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); - return m_data[i*8+j*4+k*2+l]; + return mData[i*8+j*4+k*2+l]; } // ------------------------------------------------------------------------------------------------- @@ -994,12 +1004,12 @@ inline X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) template inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) const { - assert( i < 2 ); - assert( j < 2 ); - assert( k < 2 ); - assert( l < 2 ); + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); - return m_data[i*8+j*4+k*2+l]; + return mData[i*8+j*4+k*2+l]; } // ------------------------------------------------------------------------------------------------- @@ -1007,10 +1017,10 @@ inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) c template inline X& tensor2::operator()(size_t i, size_t j) { - assert( i < 2 ); - assert( j < 2 ); + assert( i < mNd ); + assert( j < mNd ); - return m_data[i*2+j]; + return mData[i*2+j]; } // ------------------------------------------------------------------------------------------------- @@ -1018,10 +1028,10 @@ inline X& tensor2::operator()(size_t i, size_t j) template inline const X& tensor2::operator()(size_t i, size_t j) const { - assert( i < 2 ); - assert( j < 2 ); + assert( i < mNd ); + assert( j < mNd ); - return m_data[i*2+j]; + return mData[i*2+j]; } // ------------------------------------------------------------------------------------------------- @@ -1029,16 +1039,16 @@ inline const X& tensor2::operator()(size_t i, size_t j) const template inline X& tensor2s::operator()(size_t i, size_t j) { - assert( i < 2 ); - assert( j < 2 ); + assert( i < mNd ); + assert( j < mNd ); if ( i == 0 ) { - if ( j == 0 ) return m_data[0]; - else return m_data[1]; + if ( j == 0 ) return mData[0]; + else return mData[1]; } else { - if ( j == 0 ) return m_data[1]; - else return m_data[2]; + if ( j == 0 ) return mData[1]; + else return mData[2]; } } @@ -1047,16 +1057,16 @@ inline X& tensor2s::operator()(size_t i, size_t j) template inline const X& tensor2s::operator()(size_t i, size_t j) const { - assert( i < 2 ); - assert( j < 2 ); + assert( i < mNd ); + assert( j < mNd ); if ( i == 0 ) { - if ( j == 0 ) return m_data[0]; - else return m_data[1]; + if ( j == 0 ) return mData[0]; + else return mData[1]; } else { - if ( j == 0 ) return m_data[1]; - else return m_data[2]; + if ( j == 0 ) return mData[1]; + else return mData[2]; } } @@ -1065,11 +1075,11 @@ inline const X& tensor2s::operator()(size_t i, size_t j) const template inline X& tensor2d::operator()(size_t i, size_t j) { - assert( i < 2 ); - assert( j < 2 ); + assert( i < mNd ); + assert( j < mNd ); - if (i == j) return m_data[i]; - else return m_zero[0]; + if (i == j) return mData[i]; + else return mZero[0]; } // ------------------------------------------------------------------------------------------------- @@ -1077,11 +1087,11 @@ inline X& tensor2d::operator()(size_t i, size_t j) template inline const X& tensor2d::operator()(size_t i, size_t j) const { - assert( i < 2 ); - assert( j < 2 ); + assert( i < mNd ); + assert( j < mNd ); - if (i == j) return m_data[i]; - else return m_zero[0]; + if (i == j) return mData[i]; + else return mZero[0]; } // ------------------------------------------------------------------------------------------------- @@ -1089,9 +1099,9 @@ inline const X& tensor2d::operator()(size_t i, size_t j) const template inline X& vector::operator()(size_t i) { - assert( i < 2 ); + assert( i < mNd ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -1099,45 +1109,344 @@ inline X& vector::operator()(size_t i) template inline const X& vector::operator()(size_t i) const { - assert( i < 2 ); + assert( i < mNd ); + + return mData[i]; +} + +// ================================================================================================= +// index operators : compress(...) +// ================================================================================================= + +template +inline size_t tensor4::compress(size_t i, size_t j, size_t k, size_t l) const +{ + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline size_t tensor2::compress(size_t i, size_t j) const +{ + assert( i < mNd ); + assert( j < mNd ); + + return i*mNd+j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline size_t tensor2s::compress(size_t i, size_t j) const +{ + assert( i < mNd ); + assert( j < mNd ); + + if (i <= j) return i*mNd - (i-1)*i/2 + j - i; + else return j*mNd - (j-1)*j/2 + i - j; +} + +// ================================================================================================= +// index operators : decompress(...) +// ================================================================================================= + +template +inline std::vector tensor4::decompress(size_t i) const +{ + // check input + assert( i < mSize ); + + // allocate array-index + std::vector idx(4); + + // reconstruct + idx[0] = (i - i%(mNd*mNd*mNd)) / (mNd*mNd*mNd); i -= idx[0] * (mNd*mNd*mNd); + idx[1] = (i - i%(mNd*mNd) ) / (mNd*mNd); i -= idx[1] * (mNd*mNd); + idx[2] = (i - i% mNd ) / mNd; i -= idx[2] * mNd; + idx[3] = i; + + return idx; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2::decompress(size_t i) const +{ + // check input + assert( i < mSize ); + + // allocate array-index + std::vector idx(2); + + // reconstruct + idx[1] = i % mNd; + idx[0] = ( i - idx[1] ) / mNd; + + return idx; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2s::decompress(size_t i) const +{ + // check input + assert( i < mSize ); + + // allocate array-index + std::vector idx(2); + + // reconstruct + idx[0] = 0; + size_t keyafter; + do + { + idx[0]++; + keyafter = idx[0] * mNd - (idx[0] - 1) * idx[0] / 2; + } while ( i >= keyafter ); + idx[0]--; + idx[1] = mNd - keyafter + i; - return m_data[i]; + return idx; } // ================================================================================================= // pointers / iterators // ================================================================================================= -template inline X* tensor4 ::data() { return std::begin(m_data); } -template inline const X* tensor4 ::data() const { return std::begin(m_data); } -template inline auto tensor4 ::begin() { return std::begin(m_data); } -template inline auto tensor4 ::begin() const { return std::begin(m_data); } -template inline auto tensor4 ::end() { return std::begin(m_data) + 16;} -template inline auto tensor4 ::end() const { return std::begin(m_data) + 16;} -template inline X* tensor2 ::data() { return std::begin(m_data); } -template inline const X* tensor2 ::data() const { return std::begin(m_data); } -template inline auto tensor2 ::begin() { return std::begin(m_data); } -template inline auto tensor2 ::begin() const { return std::begin(m_data); } -template inline auto tensor2 ::end() { return std::begin(m_data) + 4; } -template inline auto tensor2 ::end() const { return std::begin(m_data) + 4; } -template inline X* tensor2s::data() { return std::begin(m_data); } -template inline const X* tensor2s::data() const { return std::begin(m_data); } -template inline auto tensor2s::begin() { return std::begin(m_data); } -template inline auto tensor2s::begin() const { return std::begin(m_data); } -template inline auto tensor2s::end() { return std::begin(m_data) + 3; } -template inline auto tensor2s::end() const { return std::begin(m_data) + 3; } -template inline X* tensor2d::data() { return std::begin(m_data); } -template inline const X* tensor2d::data() const { return std::begin(m_data); } -template inline auto tensor2d::begin() { return std::begin(m_data); } -template inline auto tensor2d::begin() const { return std::begin(m_data); } -template inline auto tensor2d::end() { return std::begin(m_data) + 2; } -template inline auto tensor2d::end() const { return std::begin(m_data) + 2; } -template inline X* vector ::data() { return std::begin(m_data); } -template inline const X* vector ::data() const { return std::begin(m_data); } -template inline auto vector ::begin() { return std::begin(m_data); } -template inline auto vector ::begin() const { return std::begin(m_data); } -template inline auto vector ::end() { return std::begin(m_data) + 2; } -template inline auto vector ::end() const { return std::begin(m_data) + 2; } +template inline X* tensor4 ::data() { return std::begin(mData); } +template inline const X* tensor4 ::data() const { return std::begin(mData); } +template inline auto tensor4 ::begin() { return std::begin(mData); } +template inline auto tensor4 ::begin() const { return std::begin(mData); } +template inline auto tensor4 ::end() { return std::begin(mData) + mSize; } +template inline auto tensor4 ::end() const { return std::begin(mData) + mSize; } +template inline X* tensor2 ::data() { return std::begin(mData); } +template inline const X* tensor2 ::data() const { return std::begin(mData); } +template inline auto tensor2 ::begin() { return std::begin(mData); } +template inline auto tensor2 ::begin() const { return std::begin(mData); } +template inline auto tensor2 ::end() { return std::begin(mData) + mSize; } +template inline auto tensor2 ::end() const { return std::begin(mData) + mSize; } +template inline X* tensor2s::data() { return std::begin(mData); } +template inline const X* tensor2s::data() const { return std::begin(mData); } +template inline auto tensor2s::begin() { return std::begin(mData); } +template inline auto tensor2s::begin() const { return std::begin(mData); } +template inline auto tensor2s::end() { return std::begin(mData) + mSize; } +template inline auto tensor2s::end() const { return std::begin(mData) + mSize; } +template inline X* tensor2d::data() { return std::begin(mData); } +template inline const X* tensor2d::data() const { return std::begin(mData); } +template inline auto tensor2d::begin() { return std::begin(mData); } +template inline auto tensor2d::begin() const { return std::begin(mData); } +template inline auto tensor2d::end() { return std::begin(mData) + mSize; } +template inline auto tensor2d::end() const { return std::begin(mData) + mSize; } +template inline X* vector ::data() { return std::begin(mData); } +template inline const X* vector ::data() const { return std::begin(mData); } +template inline auto vector ::begin() { return std::begin(mData); } +template inline auto vector ::begin() const { return std::begin(mData); } +template inline auto vector ::end() { return std::begin(mData) + mSize; } +template inline auto vector ::end() const { return std::begin(mData) + mSize; } + +// ================================================================================================= +// iterators : index() +// ================================================================================================= + +template +inline auto tensor4::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor4::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2s::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2s::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2d::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2d::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto vector::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto vector::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ================================================================================================= +// iterators : item() +// ================================================================================================= + +template +inline auto tensor4::item(size_t i, size_t j, size_t k, size_t l) +{ + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return begin() + i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor4::item(size_t i, size_t j, size_t k, size_t l) const +{ + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return begin() + i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2::item(size_t i, size_t j) +{ + assert( i < mNd ); + assert( j < mNd ); + + return begin() + i*mNd+j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2::item(size_t i, size_t j) const +{ + assert( i < mNd ); + assert( j < mNd ); + + return begin() + i*mNd+j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2s::item(size_t i, size_t j) +{ + assert( i < mNd ); + assert( j < mNd ); + + if (i <= j) return begin() + i*mNd - (i-1)*i/2 + j - i; + else return begin() + j*mNd - (j-1)*j/2 + i - j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2s::item(size_t i, size_t j) const +{ + assert( i < mNd ); + assert( j < mNd ); + + if (i <= j) return begin() + i*mNd - (i-1)*i/2 + j - i; + else return begin() + j*mNd - (j-1)*j/2 + i - j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto vector::item(size_t i) +{ + assert( i < mNd ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto vector::item(size_t i) const +{ + assert( i < mNd ); + + return begin() + i; +} // ================================================================================================= // basic initialization - tensor4 @@ -1146,7 +1455,7 @@ template inline auto vector ::end() const { return std::begin template inline void tensor4::setArange() { - for ( size_t i = 0 ; i < 16 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1154,7 +1463,7 @@ inline void tensor4::setArange() template inline void tensor4::setZero() { - for ( size_t i = 0 ; i < 16 ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -1162,7 +1471,7 @@ inline void tensor4::setZero() template inline void tensor4::setOnes() { - for ( size_t i = 0 ; i < 16 ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -1170,7 +1479,7 @@ inline void tensor4::setOnes() template inline void tensor4::setConstant(X D) { - for ( size_t i = 0 ; i < 16 ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -1182,10 +1491,10 @@ inline void tensor4::setCopy(Iterator first) // copy input for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] = first[i ]; - m_data[i+1] = first[i+1]; - m_data[i+2] = first[i+2]; - m_data[i+3] = first[i+3]; + mData[i ] = first[i ]; + mData[i+1] = first[i+1]; + mData[i+2] = first[i+2]; + mData[i+3] = first[i+3]; } } @@ -1204,10 +1513,10 @@ inline void tensor4::setCopy(Iterator first, Iterator last) // copy input for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] = first[i ]; - m_data[i+1] = first[i+1]; - m_data[i+2] = first[i+2]; - m_data[i+3] = first[i+3]; + mData[i ] = first[i ]; + mData[i+1] = first[i+1]; + mData[i+2] = first[i+2]; + mData[i+3] = first[i+3]; } } @@ -1216,12 +1525,12 @@ inline void tensor4::setCopy(Iterator first, Iterator last) template inline void tensor4::setI() { - this->setZero(); + setZero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) if ( i == l and j == k ) (*this)(i,j,k,l) = static_cast(1); } @@ -1231,12 +1540,12 @@ inline void tensor4::setI() template inline void tensor4::setIrt() { - this->setZero(); + setZero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) if ( i == k and j == l ) (*this)(i,j,k,l) = static_cast(1); } @@ -1254,7 +1563,7 @@ inline void tensor4::setIs() template inline void tensor4::setId() { - return tensor4::Is() - tensor4::II()/static_cast(2); + return tensor4::Is() - tensor4::II()/static_cast(mNd); } // ------------------------------------------------------------------------------------------------- @@ -1262,12 +1571,12 @@ inline void tensor4::setId() template inline void tensor4::setII() { - this->setZero(); + setZero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) if ( i == j and k == l ) (*this)(i,j,k,l) = static_cast(1); } @@ -1279,7 +1588,7 @@ inline void tensor4::setII() template inline void tensor2::setArange() { - for ( size_t i = 0 ; i < 4 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1287,7 +1596,7 @@ inline void tensor2::setArange() template inline void tensor2::setZero() { - m_data[0] = m_data[1] = m_data[2] = m_data[3] = static_cast(0); + mData[0] = mData[1] = mData[2] = mData[3] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -1295,7 +1604,7 @@ inline void tensor2::setZero() template inline void tensor2::setOnes() { - m_data[0] = m_data[1] = m_data[2] = m_data[3] = static_cast(1); + mData[0] = mData[1] = mData[2] = mData[3] = static_cast(1); } // ------------------------------------------------------------------------------------------------- @@ -1303,7 +1612,7 @@ inline void tensor2::setOnes() template inline void tensor2::setConstant(X D) { - m_data[0] = m_data[1] = m_data[2] = m_data[3] = D; + mData[0] = mData[1] = mData[2] = mData[3] = D; } // ------------------------------------------------------------------------------------------------- @@ -1313,10 +1622,10 @@ template inline void tensor2::setCopy(Iterator first) { // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; - m_data[3] = first[3]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; + mData[3] = first[3]; } // ------------------------------------------------------------------------------------------------- @@ -1332,10 +1641,10 @@ inline void tensor2::setCopy(Iterator first, Iterator last) assert( 4 == last - first ); // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; - m_data[3] = first[3]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; + mData[3] = first[3]; } // ------------------------------------------------------------------------------------------------- @@ -1343,10 +1652,10 @@ inline void tensor2::setCopy(Iterator first, Iterator last) template inline void tensor2::setI() { - m_data[0] = static_cast(1); - m_data[1] = static_cast(0); - m_data[2] = static_cast(0); - m_data[3] = static_cast(1); + mData[0] = static_cast(1); + mData[1] = static_cast(0); + mData[2] = static_cast(0); + mData[3] = static_cast(1); } // ================================================================================================= @@ -1356,7 +1665,7 @@ inline void tensor2::setI() template inline void tensor2s::setArange() { - for ( size_t i = 0 ; i < 3 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1364,7 +1673,7 @@ inline void tensor2s::setArange() template inline void tensor2s::setZero() { - m_data[0] = m_data[1] = m_data[2] = static_cast(0); + mData[0] = mData[1] = mData[2] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -1372,7 +1681,7 @@ inline void tensor2s::setZero() template inline void tensor2s::setOnes() { - m_data[0] = m_data[1] = m_data[2] = static_cast(1); + mData[0] = mData[1] = mData[2] = static_cast(1); } // ------------------------------------------------------------------------------------------------- @@ -1380,7 +1689,7 @@ inline void tensor2s::setOnes() template inline void tensor2s::setConstant(X D) { - m_data[0] = m_data[1] = m_data[2] = D; + mData[0] = mData[1] = mData[2] = D; } // ------------------------------------------------------------------------------------------------- @@ -1390,9 +1699,9 @@ template inline void tensor2s::setCopy(Iterator first) { // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; } // ------------------------------------------------------------------------------------------------- @@ -1408,9 +1717,9 @@ inline void tensor2s::setCopy(Iterator first, Iterator last) assert( 3 == last - first ); // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; } // ------------------------------------------------------------------------------------------------- @@ -1423,9 +1732,9 @@ inline void tensor2s::setCopyDense(Iterator first) assert( first[1] == first[2] ); // copy from input (ignores lower diagonal terms) - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[3]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[3]; } // ------------------------------------------------------------------------------------------------- @@ -1438,15 +1747,15 @@ inline void tensor2s::setCopyDense(Iterator first, Iterator last) UNUSED(last); // check size - assert( 4 == last - first ); + assert( mNd*mNd == last-first ); // check for symmetry assert( first[1] == first[2] ); // copy from input (ignores lower diagonal terms) - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[3]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[3]; } // ------------------------------------------------------------------------------------------------- @@ -1454,9 +1763,9 @@ inline void tensor2s::setCopyDense(Iterator first, Iterator last) template inline void tensor2s::setI() { - m_data[0] = static_cast(1); - m_data[1] = static_cast(0); - m_data[2] = static_cast(1); + mData[0] = static_cast(1); + mData[1] = static_cast(0); + mData[2] = static_cast(1); } // ================================================================================================= @@ -1466,7 +1775,7 @@ inline void tensor2s::setI() template inline void tensor2d::setArange() { - for ( size_t i = 0 ; i < 2 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1474,7 +1783,7 @@ inline void tensor2d::setArange() template inline void tensor2d::setZero() { - m_data[0] = m_data[1] = static_cast(0); + mData[0] = mData[1] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -1482,7 +1791,7 @@ inline void tensor2d::setZero() template inline void tensor2d::setOnes() { - m_data[0] = m_data[1] = static_cast(1); + mData[0] = mData[1] = static_cast(1); } // ------------------------------------------------------------------------------------------------- @@ -1490,7 +1799,7 @@ inline void tensor2d::setOnes() template inline void tensor2d::setConstant(X D) { - m_data[0] = m_data[1] = D; + mData[0] = mData[1] = D; } // ------------------------------------------------------------------------------------------------- @@ -1500,8 +1809,8 @@ template inline void tensor2d::setCopy(Iterator first) { // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; + mData[0] = first[0]; + mData[1] = first[1]; } // ------------------------------------------------------------------------------------------------- @@ -1517,8 +1826,8 @@ inline void tensor2d::setCopy(Iterator first, Iterator last) assert( 2 == last - first ); // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; + mData[0] = first[0]; + mData[1] = first[1]; } // ------------------------------------------------------------------------------------------------- @@ -1532,8 +1841,8 @@ inline void tensor2d::setCopyDense(Iterator first) assert( ! first[2] ); // copy from input (ignores off-diagonal terms) - m_data[0] = first[0]; - m_data[1] = first[3]; + mData[0] = first[0]; + mData[1] = first[3]; } // ------------------------------------------------------------------------------------------------- @@ -1546,15 +1855,15 @@ inline void tensor2d::setCopyDense(Iterator first, Iterator last) UNUSED(last); // check size - assert( 4 == last - first ); + assert( mNd*mNd == last-first ); // check the input to be diagonal assert( ! first[1] ); assert( ! first[2] ); // copy from input (ignores off-diagonal terms) - m_data[0] = first[0]; - m_data[1] = first[3]; + mData[0] = first[0]; + mData[1] = first[3]; } // ------------------------------------------------------------------------------------------------- @@ -1562,7 +1871,7 @@ inline void tensor2d::setCopyDense(Iterator first, Iterator last) template inline void tensor2d::setI() { - m_data[0] = m_data[1] = static_cast(1); + mData[0] = mData[1] = static_cast(1); } // ================================================================================================= @@ -1572,7 +1881,7 @@ inline void tensor2d::setI() template inline void vector::setArange() { - for ( size_t i = 0 ; i < 2 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1580,7 +1889,7 @@ inline void vector::setArange() template inline void vector::setZero() { - m_data[0] = m_data[1] = static_cast(0); + mData[0] = mData[1] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -1588,7 +1897,7 @@ inline void vector::setZero() template inline void vector::setOnes() { - m_data[0] = m_data[1] = static_cast(1); + mData[0] = mData[1] = static_cast(1); } // ------------------------------------------------------------------------------------------------- @@ -1596,7 +1905,7 @@ inline void vector::setOnes() template inline void vector::setConstant(X D) { - m_data[0] = m_data[1] = D; + mData[0] = mData[1] = D; } // ------------------------------------------------------------------------------------------------- @@ -1606,8 +1915,8 @@ template inline void vector::setCopy(Iterator first) { // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; + mData[0] = first[0]; + mData[1] = first[1]; } // ------------------------------------------------------------------------------------------------- @@ -1623,8 +1932,8 @@ inline void vector::setCopy(Iterator first, Iterator last) assert( 2 == last - first ); // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; + mData[0] = first[0]; + mData[1] = first[1]; } // ================================================================================================= @@ -1636,10 +1945,10 @@ inline tensor4& tensor4::operator*= (const tensor4 &B) { for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] *= B[i ]; - m_data[i+1] *= B[i+1]; - m_data[i+2] *= B[i+2]; - m_data[i+3] *= B[i+3]; + mData[i ] *= B[i ]; + mData[i+1] *= B[i+1]; + mData[i+2] *= B[i+2]; + mData[i+3] *= B[i+3]; } return *this; @@ -1652,10 +1961,10 @@ inline tensor4& tensor4::operator/= (const tensor4 &B) { for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] /= B[i ]; - m_data[i+1] /= B[i+1]; - m_data[i+2] /= B[i+2]; - m_data[i+3] /= B[i+3]; + mData[i ] /= B[i ]; + mData[i+1] /= B[i+1]; + mData[i+2] /= B[i+2]; + mData[i+3] /= B[i+3]; } return *this; @@ -1668,10 +1977,10 @@ inline tensor4& tensor4::operator+= (const tensor4 &B) { for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] += B[i ]; - m_data[i+1] += B[i+1]; - m_data[i+2] += B[i+2]; - m_data[i+3] += B[i+3]; + mData[i ] += B[i ]; + mData[i+1] += B[i+1]; + mData[i+2] += B[i+2]; + mData[i+3] += B[i+3]; } return *this; @@ -1684,10 +1993,10 @@ inline tensor4& tensor4::operator-= (const tensor4 &B) { for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] -= B[i ]; - m_data[i+1] -= B[i+1]; - m_data[i+2] -= B[i+2]; - m_data[i+3] -= B[i+3]; + mData[i ] -= B[i ]; + mData[i+1] -= B[i+1]; + mData[i+2] -= B[i+2]; + mData[i+3] -= B[i+3]; } return *this; @@ -1700,10 +2009,10 @@ inline tensor4& tensor4::operator*= (const X &B) { for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] *= B; - m_data[i+1] *= B; - m_data[i+2] *= B; - m_data[i+3] *= B; + mData[i ] *= B; + mData[i+1] *= B; + mData[i+2] *= B; + mData[i+3] *= B; } return *this; @@ -1716,10 +2025,10 @@ inline tensor4& tensor4::operator/= (const X &B) { for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] /= B; - m_data[i+1] /= B; - m_data[i+2] /= B; - m_data[i+3] /= B; + mData[i ] /= B; + mData[i+1] /= B; + mData[i+2] /= B; + mData[i+3] /= B; } return *this; @@ -1732,10 +2041,10 @@ inline tensor4& tensor4::operator+= (const X &B) { for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] += B; - m_data[i+1] += B; - m_data[i+2] += B; - m_data[i+3] += B; + mData[i ] += B; + mData[i+1] += B; + mData[i+2] += B; + mData[i+3] += B; } return *this; @@ -1748,10 +2057,10 @@ inline tensor4& tensor4::operator-= (const X &B) { for ( size_t i = 0 ; i < 16 ; i += 4 ) { - m_data[i ] -= B; - m_data[i+1] -= B; - m_data[i+2] -= B; - m_data[i+3] -= B; + mData[i ] -= B; + mData[i+1] -= B; + mData[i+2] -= B; + mData[i+3] -= B; } return *this; @@ -1764,10 +2073,10 @@ inline tensor4& tensor4::operator-= (const X &B) template inline tensor2& tensor2::operator*= (const tensor2 &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; - m_data[2] *= B[2]; - m_data[3] *= B[3]; + mData[0] *= B[0]; + mData[1] *= B[1]; + mData[2] *= B[2]; + mData[3] *= B[3]; return *this; } @@ -1777,10 +2086,10 @@ inline tensor2& tensor2::operator*= (const tensor2 &B) template inline tensor2& tensor2::operator/= (const tensor2 &B) { - m_data[0] /= B[0]; - m_data[1] /= B[1]; - m_data[2] /= B[2]; - m_data[3] /= B[3]; + mData[0] /= B[0]; + mData[1] /= B[1]; + mData[2] /= B[2]; + mData[3] /= B[3]; return *this; } @@ -1790,10 +2099,10 @@ inline tensor2& tensor2::operator/= (const tensor2 &B) template inline tensor2& tensor2::operator+= (const tensor2 &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; - m_data[2] += B[2]; - m_data[3] += B[3]; + mData[0] += B[0]; + mData[1] += B[1]; + mData[2] += B[2]; + mData[3] += B[3]; return *this; } @@ -1803,10 +2112,10 @@ inline tensor2& tensor2::operator+= (const tensor2 &B) template inline tensor2& tensor2::operator-= (const tensor2 &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; - m_data[2] -= B[2]; - m_data[3] -= B[3]; + mData[0] -= B[0]; + mData[1] -= B[1]; + mData[2] -= B[2]; + mData[3] -= B[3]; return *this; } @@ -1816,9 +2125,9 @@ inline tensor2& tensor2::operator-= (const tensor2 &B) template inline tensor2& tensor2::operator*= (const tensor2s &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; m_data[2] *= B[1]; - m_data[3] *= B[2]; + mData[0] *= B[0]; + mData[1] *= B[1]; mData[2] *= B[1]; + mData[3] *= B[2]; return *this; } @@ -1828,9 +2137,9 @@ inline tensor2& tensor2::operator*= (const tensor2s &B) template inline tensor2& tensor2::operator/= (const tensor2s &B) { - m_data[0] /= B[0]; - m_data[1] /= B[1]; m_data[2] /= B[1]; - m_data[3] /= B[2]; + mData[0] /= B[0]; + mData[1] /= B[1]; mData[2] /= B[1]; + mData[3] /= B[2]; return *this; } @@ -1840,9 +2149,9 @@ inline tensor2& tensor2::operator/= (const tensor2s &B) template inline tensor2& tensor2::operator+= (const tensor2s &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; m_data[2] += B[1]; - m_data[3] += B[2]; + mData[0] += B[0]; + mData[1] += B[1]; mData[2] += B[1]; + mData[3] += B[2]; return *this; } @@ -1852,9 +2161,9 @@ inline tensor2& tensor2::operator+= (const tensor2s &B) template inline tensor2& tensor2::operator-= (const tensor2s &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; m_data[2] -= B[1]; - m_data[3] -= B[2]; + mData[0] -= B[0]; + mData[1] -= B[1]; mData[2] -= B[1]; + mData[3] -= B[2]; return *this; } @@ -1864,9 +2173,9 @@ inline tensor2& tensor2::operator-= (const tensor2s &B) template inline tensor2& tensor2::operator*= (const tensor2d &B) { - m_data[0] *= B[0]; - m_data[3] *= B[1]; - m_data[1] = m_data[2] = static_cast(0); + mData[0] *= B[0]; + mData[3] *= B[1]; + mData[1] = mData[2] = static_cast(0); return *this; } @@ -1876,8 +2185,8 @@ inline tensor2& tensor2::operator*= (const tensor2d &B) template inline tensor2& tensor2::operator+= (const tensor2d &B) { - m_data[0] += B[0]; - m_data[3] += B[1]; + mData[0] += B[0]; + mData[3] += B[1]; return *this; } @@ -1887,8 +2196,8 @@ inline tensor2& tensor2::operator+= (const tensor2d &B) template inline tensor2& tensor2::operator-= (const tensor2d &B) { - m_data[0] -= B[0]; - m_data[3] -= B[1]; + mData[0] -= B[0]; + mData[3] -= B[1]; return *this; } @@ -1898,10 +2207,10 @@ inline tensor2& tensor2::operator-= (const tensor2d &B) template inline tensor2& tensor2::operator*= (const X &B) { - m_data[0] *= B; - m_data[1] *= B; - m_data[2] *= B; - m_data[3] *= B; + mData[0] *= B; + mData[1] *= B; + mData[2] *= B; + mData[3] *= B; return *this; } @@ -1911,10 +2220,10 @@ inline tensor2& tensor2::operator*= (const X &B) template inline tensor2& tensor2::operator/= (const X &B) { - m_data[0] /= B; - m_data[1] /= B; - m_data[2] /= B; - m_data[3] /= B; + mData[0] /= B; + mData[1] /= B; + mData[2] /= B; + mData[3] /= B; return *this; } @@ -1924,10 +2233,10 @@ inline tensor2& tensor2::operator/= (const X &B) template inline tensor2& tensor2::operator+= (const X &B) { - m_data[0] += B; - m_data[1] += B; - m_data[2] += B; - m_data[3] += B; + mData[0] += B; + mData[1] += B; + mData[2] += B; + mData[3] += B; return *this; } @@ -1937,10 +2246,10 @@ inline tensor2& tensor2::operator+= (const X &B) template inline tensor2& tensor2::operator-= (const X &B) { - m_data[0] -= B; - m_data[1] -= B; - m_data[2] -= B; - m_data[3] -= B; + mData[0] -= B; + mData[1] -= B; + mData[2] -= B; + mData[3] -= B; return *this; } @@ -1952,9 +2261,9 @@ inline tensor2& tensor2::operator-= (const X &B) template inline tensor2s& tensor2s::operator*= (const tensor2s &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; - m_data[2] *= B[2]; + mData[0] *= B[0]; + mData[1] *= B[1]; + mData[2] *= B[2]; return *this; } @@ -1964,9 +2273,9 @@ inline tensor2s& tensor2s::operator*= (const tensor2s &B) template inline tensor2s& tensor2s::operator/= (const tensor2s &B) { - m_data[0] /= B[0]; - m_data[1] /= B[1]; - m_data[2] /= B[2]; + mData[0] /= B[0]; + mData[1] /= B[1]; + mData[2] /= B[2]; return *this; } @@ -1976,9 +2285,9 @@ inline tensor2s& tensor2s::operator/= (const tensor2s &B) template inline tensor2s& tensor2s::operator+= (const tensor2s &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; - m_data[2] += B[2]; + mData[0] += B[0]; + mData[1] += B[1]; + mData[2] += B[2]; return *this; } @@ -1988,9 +2297,9 @@ inline tensor2s& tensor2s::operator+= (const tensor2s &B) template inline tensor2s& tensor2s::operator-= (const tensor2s &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; - m_data[2] -= B[2]; + mData[0] -= B[0]; + mData[1] -= B[1]; + mData[2] -= B[2]; return *this; } @@ -2000,9 +2309,9 @@ inline tensor2s& tensor2s::operator-= (const tensor2s &B) template inline tensor2s& tensor2s::operator*= (const tensor2d &B) { - m_data[0] *= B[0]; - m_data[2] *= B[1]; - m_data[1] = static_cast(0); + mData[0] *= B[0]; + mData[2] *= B[1]; + mData[1] = static_cast(0); return *this; } @@ -2012,8 +2321,8 @@ inline tensor2s& tensor2s::operator*= (const tensor2d &B) template inline tensor2s& tensor2s::operator+= (const tensor2d &B) { - m_data[0] += B[0]; - m_data[2] += B[1]; + mData[0] += B[0]; + mData[2] += B[1]; return *this; } @@ -2023,8 +2332,8 @@ inline tensor2s& tensor2s::operator+= (const tensor2d &B) template inline tensor2s& tensor2s::operator-= (const tensor2d &B) { - m_data[0] -= B[0]; - m_data[2] -= B[1]; + mData[0] -= B[0]; + mData[2] -= B[1]; return *this; } @@ -2034,9 +2343,9 @@ inline tensor2s& tensor2s::operator-= (const tensor2d &B) template inline tensor2s& tensor2s::operator*= (const X &B) { - m_data[0] *= B; - m_data[1] *= B; - m_data[2] *= B; + mData[0] *= B; + mData[1] *= B; + mData[2] *= B; return *this; } @@ -2046,9 +2355,9 @@ inline tensor2s& tensor2s::operator*= (const X &B) template inline tensor2s& tensor2s::operator/= (const X &B) { - m_data[0] /= B; - m_data[1] /= B; - m_data[2] /= B; + mData[0] /= B; + mData[1] /= B; + mData[2] /= B; return *this; } @@ -2058,9 +2367,9 @@ inline tensor2s& tensor2s::operator/= (const X &B) template inline tensor2s& tensor2s::operator+= (const X &B) { - m_data[0] += B; - m_data[1] += B; - m_data[2] += B; + mData[0] += B; + mData[1] += B; + mData[2] += B; return *this; } @@ -2070,9 +2379,9 @@ inline tensor2s& tensor2s::operator+= (const X &B) template inline tensor2s& tensor2s::operator-= (const X &B) { - m_data[0] -= B; - m_data[1] -= B; - m_data[2] -= B; + mData[0] -= B; + mData[1] -= B; + mData[2] -= B; return *this; } @@ -2084,8 +2393,8 @@ inline tensor2s& tensor2s::operator-= (const X &B) template inline tensor2d& tensor2d::operator*= (const tensor2d &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; + mData[0] *= B[0]; + mData[1] *= B[1]; return *this; } @@ -2095,8 +2404,8 @@ inline tensor2d& tensor2d::operator*= (const tensor2d &B) template inline tensor2d& tensor2d::operator+= (const tensor2d &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; + mData[0] += B[0]; + mData[1] += B[1]; return *this; } @@ -2106,8 +2415,8 @@ inline tensor2d& tensor2d::operator+= (const tensor2d &B) template inline tensor2d& tensor2d::operator-= (const tensor2d &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; + mData[0] -= B[0]; + mData[1] -= B[1]; return *this; } @@ -2117,8 +2426,8 @@ inline tensor2d& tensor2d::operator-= (const tensor2d &B) template inline tensor2d& tensor2d::operator*= (const tensor2 &B) { - m_data[0] *= B[0]; - m_data[1] *= B[3]; + mData[0] *= B[0]; + mData[1] *= B[3]; return *this; } @@ -2128,8 +2437,8 @@ inline tensor2d& tensor2d::operator*= (const tensor2 &B) template inline tensor2d& tensor2d::operator/= (const tensor2 &B) { - m_data[0] /= B[0]; - m_data[1] /= B[3]; + mData[0] /= B[0]; + mData[1] /= B[3]; return *this; } @@ -2139,8 +2448,8 @@ inline tensor2d& tensor2d::operator/= (const tensor2 &B) template inline tensor2d& tensor2d::operator*= (const tensor2s &B) { - m_data[0] *= B[0]; - m_data[1] *= B[2]; + mData[0] *= B[0]; + mData[1] *= B[2]; return *this; } @@ -2150,8 +2459,8 @@ inline tensor2d& tensor2d::operator*= (const tensor2s &B) template inline tensor2d& tensor2d::operator/= (const tensor2s &B) { - m_data[0] /= B[0]; - m_data[1] /= B[2]; + mData[0] /= B[0]; + mData[1] /= B[2]; return *this; } @@ -2161,8 +2470,8 @@ inline tensor2d& tensor2d::operator/= (const tensor2s &B) template inline tensor2d& tensor2d::operator*= (const X &B) { - m_data[0] *= B; - m_data[1] *= B; + mData[0] *= B; + mData[1] *= B; return *this; } @@ -2172,8 +2481,8 @@ inline tensor2d& tensor2d::operator*= (const X &B) template inline tensor2d& tensor2d::operator/= (const X &B) { - m_data[0] /= B; - m_data[1] /= B; + mData[0] /= B; + mData[1] /= B; return *this; } @@ -2183,8 +2492,8 @@ inline tensor2d& tensor2d::operator/= (const X &B) template inline tensor2d& tensor2d::operator+= (const X &B) { - m_data[0] += B; - m_data[1] += B; + mData[0] += B; + mData[1] += B; return *this; } @@ -2194,8 +2503,8 @@ inline tensor2d& tensor2d::operator+= (const X &B) template inline tensor2d& tensor2d::operator-= (const X &B) { - m_data[0] -= B; - m_data[1] -= B; + mData[0] -= B; + mData[1] -= B; return *this; } @@ -2207,8 +2516,8 @@ inline tensor2d& tensor2d::operator-= (const X &B) template inline vector& vector::operator*= (const vector &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; + mData[0] *= B[0]; + mData[1] *= B[1]; return *this; } @@ -2218,8 +2527,8 @@ inline vector& vector::operator*= (const vector &B) template inline vector& vector::operator/= (const vector &B) { - m_data[0] /= B[0]; - m_data[1] /= B[1]; + mData[0] /= B[0]; + mData[1] /= B[1]; return *this; } @@ -2229,8 +2538,8 @@ inline vector& vector::operator/= (const vector &B) template inline vector& vector::operator+= (const vector &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; + mData[0] += B[0]; + mData[1] += B[1]; return *this; } @@ -2240,8 +2549,8 @@ inline vector& vector::operator+= (const vector &B) template inline vector& vector::operator-= (const vector &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; + mData[0] -= B[0]; + mData[1] -= B[1]; return *this; } @@ -2251,8 +2560,8 @@ inline vector& vector::operator-= (const vector &B) template inline vector& vector::operator*= (const X &B) { - m_data[0] *= B; - m_data[1] *= B; + mData[0] *= B; + mData[1] *= B; return *this; } @@ -2262,8 +2571,8 @@ inline vector& vector::operator*= (const X &B) template inline vector& vector::operator/= (const X &B) { - m_data[0] /= B; - m_data[1] /= B; + mData[0] /= B; + mData[1] /= B; return *this; } @@ -2273,8 +2582,8 @@ inline vector& vector::operator/= (const X &B) template inline vector& vector::operator+= (const X &B) { - m_data[0] += B; - m_data[1] += B; + mData[0] += B; + mData[1] += B; return *this; } @@ -2284,8 +2593,8 @@ inline vector& vector::operator+= (const X &B) template inline vector& vector::operator-= (const X &B) { - m_data[0] -= B; - m_data[1] -= B; + mData[0] -= B; + mData[1] -= B; return *this; } @@ -5210,12 +5519,12 @@ inline tensor4 tensor4::ddot(const tensor4 &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) - for ( size_t m = 0 ; m < 2 ; ++m ) - for ( size_t n = 0 ; n < 2 ; ++n ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + for ( size_t m = 0 ; m < mNd ; ++m ) + for ( size_t n = 0 ; n < mNd ; ++n ) C(i,j,m,n) += (*this)(i,j,k,l) * B(l,k,m,n); return C; @@ -5228,10 +5537,10 @@ inline tensor2 tensor4::ddot(const tensor2 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j) += (*this)(i,j,k,l) * B(l,k); return C; @@ -5244,10 +5553,10 @@ inline tensor2 tensor4::ddot(const tensor2s &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j) += (*this)(i,j,k,l) * B(l,k); return C; @@ -5260,9 +5569,9 @@ inline tensor2 tensor4::ddot(const tensor2d &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,j) += (*this)(i,j,k,k) * B(k,k); return C; @@ -5275,10 +5584,10 @@ inline tensor2 tensor2::ddot(const tensor4 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(k,l) += (*this)(i,j) * B(j,i,k,l); return C; @@ -5291,8 +5600,8 @@ inline X tensor2::ddot(const tensor2 &B) const { X C = static_cast(0); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C += (*this)(i,j) * B(j,i); return C; @@ -5305,8 +5614,8 @@ inline X tensor2::ddot(const tensor2s &B) const { X C = static_cast(0); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C += (*this)(i,j) * B(j,i); return C; @@ -5317,7 +5626,7 @@ inline X tensor2::ddot(const tensor2s &B) const template inline X tensor2::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[3]*B[1]; + return mData[0]*B[0] + mData[3]*B[1]; } // ------------------------------------------------------------------------------------------------- @@ -5327,10 +5636,10 @@ inline tensor2 tensor2s::ddot(const tensor4 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(k,l) += (*this)(i,j) * B(j,i,k,l); return C; @@ -5343,8 +5652,8 @@ inline X tensor2s::ddot(const tensor2 &B) const { X C = static_cast(0); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C += (*this)(i,j) * B(j,i); return C; @@ -5357,9 +5666,9 @@ inline X tensor2s::ddot(const tensor2s &B) const { X C; - C = m_data[0] * B[0]; - C += m_data[1] * B[1] * static_cast(2); - C += m_data[2] * B[2]; + C = mData[0] * B[0]; + C += mData[1] * B[1] * static_cast(2); + C += mData[2] * B[2]; return C; } @@ -5369,7 +5678,7 @@ inline X tensor2s::ddot(const tensor2s &B) const template inline X tensor2s::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[2]*B[1]; + return mData[0]*B[0] + mData[2]*B[1]; } // ------------------------------------------------------------------------------------------------- @@ -5379,10 +5688,10 @@ inline tensor2 tensor2d::ddot(const tensor4 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) - C(k,l) += m_data[i]*B(i,i,k,l); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(k,l) += mData[i]*B(i,i,k,l); return C; } @@ -5392,7 +5701,7 @@ inline tensor2 tensor2d::ddot(const tensor4 &B) const template inline X tensor2d::ddot(const tensor2 &B) const { - return m_data[0]*B[0] + m_data[1]*B[3]; + return mData[0]*B[0] + mData[1]*B[3]; } // ------------------------------------------------------------------------------------------------- @@ -5400,7 +5709,7 @@ inline X tensor2d::ddot(const tensor2 &B) const template inline X tensor2d::ddot(const tensor2s &B) const { - return m_data[0]*B[0] + m_data[1]*B[2]; + return mData[0]*B[0] + mData[1]*B[2]; } // ------------------------------------------------------------------------------------------------- @@ -5408,7 +5717,7 @@ inline X tensor2d::ddot(const tensor2s &B) const template inline X tensor2d::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[1]*B[1]; + return mData[0]*B[0] + mData[1]*B[1]; } @@ -5419,9 +5728,9 @@ inline tensor2 tensor2::dot(const tensor2 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,j) * B(j,k); return C; @@ -5434,9 +5743,9 @@ inline tensor2 tensor2::dot(const tensor2s &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,j) * B(j,k); return C; @@ -5449,8 +5758,8 @@ inline tensor2 tensor2::dot(const tensor2d &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i,j) += (*this)(i,j) * B(j,j); return C; @@ -5463,8 +5772,8 @@ inline vector tensor2::dot(const vector &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i) += (*this)(i,j) * B(j); return C; @@ -5477,9 +5786,9 @@ inline tensor2 tensor2s::dot(const tensor2 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,j) * B(j,k); return C; @@ -5492,9 +5801,9 @@ inline tensor2 tensor2s::dot(const tensor2s &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,j) * B(j,k); return C; @@ -5507,8 +5816,8 @@ inline tensor2 tensor2s::dot(const tensor2d &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i,j) += (*this)(i,j) * B(j,j); return C; @@ -5521,8 +5830,8 @@ inline vector tensor2s::dot(const vector &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i) += (*this)(i,j) * B(j); return C; @@ -5535,8 +5844,8 @@ inline tensor2 tensor2d::dot(const tensor2 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,i) * B(i,k); return C; @@ -5549,8 +5858,8 @@ inline tensor2 tensor2d::dot(const tensor2s &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,i) * B(i,k); return C; @@ -5563,7 +5872,7 @@ inline tensor2d tensor2d::dot(const tensor2d &B) const { tensor2d C = tensor2d::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) + for ( size_t i = 0 ; i < mNd ; ++i ) C(i,i) += (*this)(i,i) * B(i,i); return C; @@ -5576,7 +5885,7 @@ inline vector tensor2d::dot(const vector &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) + for ( size_t i = 0 ; i < mNd ; ++i ) C(i) += (*this)(i,i) * B(i); return C; @@ -5589,8 +5898,8 @@ inline vector vector::dot(const tensor2 &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(j) += (*this)(i) * B(i,j); return C; @@ -5603,8 +5912,8 @@ inline vector vector::dot(const tensor2s &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(j) += (*this)(i) * B(i,j); return C; @@ -5617,7 +5926,7 @@ inline vector vector::dot(const tensor2d &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) + for ( size_t i = 0 ; i < mNd ; ++i ) C(i) += (*this)(i) * B(i,i); return C; @@ -5630,7 +5939,7 @@ inline X vector::dot(const vector &B) const { X C = static_cast(0); - for ( size_t i = 0 ; i < 2 ; ++i ) + for ( size_t i = 0 ; i < mNd ; ++i ) C += (*this)(i) * B(i); return C; @@ -5643,10 +5952,10 @@ inline tensor4 tensor2::dyadic(const tensor2 &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; @@ -5659,10 +5968,10 @@ inline tensor4 tensor2::dyadic(const tensor2s &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; @@ -5675,9 +5984,9 @@ inline tensor4 tensor2::dyadic(const tensor2d &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,j,k,k) += (*this)(i,j) * B(k,k); return C; @@ -5690,10 +5999,10 @@ inline tensor4 tensor2s::dyadic(const tensor2 &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; @@ -5706,10 +6015,10 @@ inline tensor4 tensor2s::dyadic(const tensor2s &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; @@ -5722,9 +6031,9 @@ inline tensor4 tensor2s::dyadic(const tensor2d &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,j,k,k) += (*this)(i,j) * B(k,k); return C; @@ -5737,9 +6046,9 @@ inline tensor4 tensor2d::dyadic(const tensor2 &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,i,k,l) += (*this)(i,i) * B(k,l); return C; @@ -5752,9 +6061,9 @@ inline tensor4 tensor2d::dyadic(const tensor2s &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,i,k,l) += (*this)(i,i) * B(k,l); return C; @@ -5767,8 +6076,8 @@ inline tensor4 tensor2d::dyadic(const tensor2d &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t k = 0 ; k < 2 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,i,k,k) += (*this)(i,i) * B(k,k); return C; @@ -5781,8 +6090,8 @@ inline tensor2 vector::dyadic(const vector &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i,j) += (*this)(i) * B(j); return C; @@ -6133,10 +6442,10 @@ inline tensor4 tensor4::T() const { tensor4 C; - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(l,k,j,i) = (*this)(i,j,k,l); return C; @@ -6149,10 +6458,10 @@ inline tensor4 tensor4::RT() const { tensor4 C; - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,l,k) = (*this)(i,j,k,l); return C; @@ -6165,10 +6474,10 @@ inline tensor4 tensor4::LT() const { tensor4 C; - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(j,i,k,l) = (*this)(i,j,k,l); return C; @@ -6181,10 +6490,10 @@ inline tensor2 tensor2::T() const { tensor2 C; - C[0] = m_data[0]; - C[2] = m_data[1]; - C[1] = m_data[2]; - C[3] = m_data[3]; + C[0] = mData[0]; + C[2] = mData[1]; + C[1] = mData[2]; + C[3] = mData[3]; return C; } @@ -6196,9 +6505,9 @@ inline tensor2s tensor2s::T() const { tensor2s C; - C[0] = m_data[0]; - C[1] = m_data[1]; - C[2] = m_data[2]; + C[0] = mData[0]; + C[1] = mData[1]; + C[2] = mData[2]; return C; } @@ -6210,8 +6519,8 @@ inline tensor2d tensor2d::T() const { tensor2d C; - C[0] = m_data[0]; - C[1] = m_data[1]; + C[0] = mData[0]; + C[1] = mData[1]; return C; } @@ -6271,7 +6580,7 @@ inline tensor4 transposeL(const tensor4 &A) template inline X tensor2::trace() const { - return m_data[0] + m_data[3]; + return mData[0] + mData[3]; } // ------------------------------------------------------------------------------------------------- @@ -6279,7 +6588,7 @@ inline X tensor2::trace() const template inline X tensor2s::trace() const { - return m_data[0] + m_data[2]; + return mData[0] + mData[2]; } // ------------------------------------------------------------------------------------------------- @@ -6287,7 +6596,7 @@ inline X tensor2s::trace() const template inline X tensor2d::trace() const { - return m_data[0] + m_data[1]; + return mData[0] + mData[1]; } // ------------------------------------------------------------------------------------------------- @@ -6295,7 +6604,7 @@ inline X tensor2d::trace() const template inline X tensor2::det() const { - return m_data[0] * m_data[3] - m_data[1] * m_data[2]; + return mData[0] * mData[3] - mData[1] * mData[2]; } // ------------------------------------------------------------------------------------------------- @@ -6303,7 +6612,7 @@ inline X tensor2::det() const template inline X tensor2s::det() const { - return m_data[0] * m_data[2] - m_data[1] * m_data[1]; + return mData[0] * mData[2] - mData[1] * mData[1]; } // ------------------------------------------------------------------------------------------------- @@ -6311,7 +6620,7 @@ inline X tensor2s::det() const template inline X tensor2d::det() const { - return m_data[0] * m_data[1]; + return mData[0] * mData[1]; } // ------------------------------------------------------------------------------------------------- @@ -6325,10 +6634,10 @@ inline tensor2 tensor2::inv() const // allocate result tensor2 C; - C[0] = m_data[3] / D; - C[1] = static_cast(-1) * m_data[1] / D; - C[2] = static_cast(-1) * m_data[2] / D; - C[3] = m_data[0] / D; + C[0] = mData[3] / D; + C[1] = static_cast(-1) * mData[1] / D; + C[2] = static_cast(-1) * mData[2] / D; + C[3] = mData[0] / D; return C; } @@ -6344,9 +6653,9 @@ inline tensor2s tensor2s::inv() const // allocate result tensor2s C; - C[0] = m_data[2] / D; - C[1] = static_cast(-1) * m_data[1] / D; - C[2] = m_data[0] / D; + C[0] = mData[2] / D; + C[1] = static_cast(-1) * mData[1] / D; + C[2] = mData[0] / D; return C; } @@ -6359,8 +6668,8 @@ inline tensor2d tensor2d::inv() const // allocate result tensor2d C; - C[0] = static_cast(1) / m_data[0]; - C[1] = static_cast(1) / m_data[1]; + C[0] = static_cast(1) / mData[0]; + C[1] = static_cast(1) / mData[1]; return C; } @@ -6444,8 +6753,8 @@ inline X trace(const tensor2d &A) template inline bool tensor4::operator== (const tensor4 &B) const { - for ( size_t i = 0 ; i < 16 ; ++i ) - if ( m_data[i] != B[i] ) + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] != B[i] ) return false; return true; @@ -6456,10 +6765,10 @@ inline bool tensor4::operator== (const tensor4 &B) const template inline bool tensor2::operator== (const tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; - if ( m_data[3] != B[3] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; + if ( mData[3] != B[3] ) return false; return true; } @@ -6469,10 +6778,10 @@ inline bool tensor2::operator== (const tensor2 &B) const template inline bool tensor2::operator== (const tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[1] ) return false; - if ( m_data[3] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[1] ) return false; + if ( mData[3] != B[2] ) return false; return true; } @@ -6482,10 +6791,10 @@ inline bool tensor2::operator== (const tensor2s &B) const template inline bool tensor2::operator== (const tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[3] != B[1] ) return false; - if ( m_data[1] ) return false; - if ( m_data[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[3] != B[1] ) return false; + if ( mData[1] ) return false; + if ( mData[2] ) return false; return true; } @@ -6495,9 +6804,9 @@ inline bool tensor2::operator== (const tensor2d &B) const template inline bool tensor2s::operator== (const tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -6507,10 +6816,10 @@ inline bool tensor2s::operator== (const tensor2s &B) const template inline bool tensor2s::operator== (const tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[1] != B[2] ) return false; - if ( m_data[2] != B[3] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[1] != B[2] ) return false; + if ( mData[2] != B[3] ) return false; return true; } @@ -6520,9 +6829,9 @@ inline bool tensor2s::operator== (const tensor2 &B) const template inline bool tensor2s::operator== (const tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[2] != B[1] ) return false; - if ( m_data[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[2] != B[1] ) return false; + if ( mData[1] ) return false; return true; } @@ -6532,8 +6841,8 @@ inline bool tensor2s::operator== (const tensor2d &B) const template inline bool tensor2d::operator== (const tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; return true; } @@ -6543,10 +6852,10 @@ inline bool tensor2d::operator== (const tensor2d &B) const template inline bool tensor2d::operator== (const tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[3] ) return false; - if ( B[1] ) return false; - if ( B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[3] ) return false; + if ( B[1] ) return false; + if ( B[2] ) return false; return true; } @@ -6556,9 +6865,9 @@ inline bool tensor2d::operator== (const tensor2 &B) const template inline bool tensor2d::operator== (const tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[2] ) return false; - if ( B[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[2] ) return false; + if ( B[1] ) return false; return true; } @@ -6568,8 +6877,8 @@ inline bool tensor2d::operator== (const tensor2s &B) const template inline bool vector::operator== (const vector &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; return true; } @@ -6581,7 +6890,7 @@ inline bool vector::operator== (const vector &B) const template inline bool tensor2::issymmetric() const { - if ( m_data[1] != m_data[2] ) return false; + if ( mData[1] != mData[2] ) return false; return true; } @@ -6591,8 +6900,8 @@ inline bool tensor2::issymmetric() const template inline bool tensor2::isdiagonal() const { - if ( m_data[1] != static_cast(0) ) return false; - if ( m_data[2] != static_cast(0) ) return false; + if ( mData[1] != static_cast(0) ) return false; + if ( mData[2] != static_cast(0) ) return false; return true; } @@ -6602,13 +6911,431 @@ inline bool tensor2::isdiagonal() const template inline bool tensor2s::isdiagonal() const { - if ( m_data[1] != static_cast(0) ) return false; + if ( mData[1] != static_cast(0) ) return false; return true; } // ================================================================================================= -// basic algebra +// basic algebra: absolute value +// ================================================================================================= + +template +inline void tensor4::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void tensor2::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void tensor2s::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void tensor2d::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void vector::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ================================================================================================= +// basic algebra: location of the minimum +// ================================================================================================= + +template +inline std::vector tensor4::argmin() const +{ + return decompress( std::min_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2::argmin() const +{ + return decompress( std::min_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2s::argmin() const +{ + return decompress( std::min_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2d::argmin() const +{ + size_t i = std::min_element(begin(),end()) - begin(); + + std::vector out(mNd); + + std::fill(out.begin(), out.end(), i); + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector vector::argmin() const +{ + return decompress( std::min_element(begin(),end()) - begin() ); +} + +// ================================================================================================= +// basic algebra: location of the maximum +// ================================================================================================= + +template +inline std::vector tensor4::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2s::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2d::argmax() const +{ + size_t i = std::max_element(begin(),end()) - begin(); + + std::vector out(mNd); + + std::fill(out.begin(), out.end(), i); + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector vector::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ================================================================================================= +// basic algebra: minimum +// ================================================================================================= + +template +inline X tensor4::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2s::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2d::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X vector::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ================================================================================================= +// basic algebra: maximum +// ================================================================================================= + +template +inline X tensor4::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2s::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2d::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X vector::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ================================================================================================= +// basic algebra: sum +// ================================================================================================= + +template +inline X tensor4::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2s::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2d::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X vector::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ================================================================================================= +// basic algebra: mean +// ================================================================================================= + +template +inline double tensor4::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2s::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2d::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double vector::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ================================================================================================= +// basic algebra: weighted average +// ================================================================================================= + +template +inline double tensor4::average(const tensor4 &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2::average(const tensor2 &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2s::average(const tensor2s &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2d::average(const tensor2d &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double vector::average(const vector &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ================================================================================================= +// basic algebra: norm // ================================================================================================= template @@ -6618,10 +7345,10 @@ inline X tensor4::norm() const for ( size_t i = 0 ; i < 16 ; i += 4 ) { - C += std::abs(m_data[i ]); - C += std::abs(m_data[i+1]); - C += std::abs(m_data[i+2]); - C += std::abs(m_data[i+3]); + C += std::abs(mData[i ]); + C += std::abs(mData[i+1]); + C += std::abs(mData[i+2]); + C += std::abs(mData[i+3]); } return C; @@ -6634,10 +7361,10 @@ inline X tensor2::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); - C += std::abs(m_data[3]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); + C += std::abs(mData[3]); return C; } @@ -6649,9 +7376,9 @@ inline X tensor2s::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); return C; } @@ -6663,8 +7390,8 @@ inline X tensor2d::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); return C; } @@ -6676,21 +7403,23 @@ inline X vector::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); return C; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra: length +// ================================================================================================= template inline X vector::length() const { X C; - C = std::pow(m_data[0],2.); - C += std::pow(m_data[1],2.); + C = std::pow(mData[0],2.); + C += std::pow(mData[1],2.); return std::sqrt(C); } @@ -6704,8 +7433,8 @@ inline void vector::setUnitLength() if ( C <= static_cast(0) ) return; - m_data[0] /= C; - m_data[1] /= C; + mData[0] /= C; + mData[1] /= C; } // ================================================================================================= @@ -6715,13 +7444,13 @@ inline void vector::setUnitLength() template inline void tensor4::printf(std::string fmt) const { - std::string gmt = std::to_string(std::to_string(2).size()); + std::string gmt = std::to_string(std::to_string(mNd).size()); fmt = "(%"+gmt+"d,%"+gmt+"d,%"+gmt+"d,%"+gmt+"d) "+fmt+"\n"; - for ( size_t i = 0 ; i < 2 ; ++i ) - for ( size_t j = 0 ; j < 2 ; ++j ) - for ( size_t k = 0 ; k < 2 ; ++k ) - for ( size_t l = 0 ; l < 2 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) std::printf(fmt.c_str(), i, j, k, l, (*this)(i,j,k,l) ); } @@ -6757,7 +7486,7 @@ inline void tensor2d::printf(std::string fmt) const template inline void vector::printf(std::string fmt) const { - std::printf((fmt + "," + fmt + "\n").c_str(), m_data[0], m_data[1]); + std::printf((fmt + "," + fmt + "\n").c_str(), mData[0], mData[1]); } // ------------------------------------------------------------------------------------------------- diff --git a/src/cppmat/tensor2.h b/src/cppmat/tensor2.h index b8feced..422d3a6 100644 --- a/src/cppmat/tensor2.h +++ b/src/cppmat/tensor2.h @@ -31,12 +31,14 @@ class tensor4 { private: - X m_data[16]; // data container + X mData[16]; // data container + static const size_t mNd=2; // number of dimensions (rank == 4 -> shape == [mNd,mNd,mNd,mNd]) + static const size_t mSize=16; // == mData.size() == mNd*mNd*mNd*mNd public: // constructor - tensor4(){}; + tensor4() = default; // constructor: initialize static tensor4 Arange(); @@ -70,16 +72,30 @@ class tensor4 X& operator()(size_t i, size_t j, size_t k, size_t l); const X& operator()(size_t i, size_t j, size_t k, size_t l) const; + // index operators: plain storage -> array-indices (i -> a,b,c,d) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b,c,d -> i) + size_t compress(size_t a, size_t b, size_t c, size_t d) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b, size_t c, size_t d); + auto item(size_t a, size_t b, size_t c, size_t d) const; + // basic initialization void setArange(); void setZero(); @@ -116,7 +132,23 @@ class tensor4 bool operator== (const tensor4 &B) const; // A_ijkl == B_ijkl // basic algebra - X norm() const; // sum(| A_ijkl |) + // - tensor norm: sum(| A_ijkl |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor4 &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -132,12 +164,14 @@ class tensor2 { private: - X m_data[4]; // data container + X mData[4]; // data container + static const size_t mNd=2; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + static const size_t mSize=4; // == mData.size() == mNd*mNd public: // constructor - tensor2(){}; + tensor2() = default; // constructor: initialize static tensor2 Arange(); @@ -170,16 +204,30 @@ class tensor2 X& operator()(size_t i, size_t j); const X& operator()(size_t i, size_t j) const; + // index operators: plain storage -> array-indices (i -> a,b) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b -> i) + size_t compress(size_t a, size_t b) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b); + auto item(size_t a, size_t b) const; + // basic initialization void setArange(); void setZero(); @@ -233,7 +281,23 @@ class tensor2 bool isdiagonal() const; // A_ij == 0, i != j // basic algebra - X norm() const; // sum(| A_ij |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2 &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -249,12 +313,14 @@ class tensor2s { private: - X m_data[3]; // data container + X mData[3]; // data container + static const size_t mNd=2; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + static const size_t mSize=3; // == mData.size() == (mNd+1)*mNd/2 public: // constructor - tensor2s(){}; + tensor2s() = default; // constructor: initialize static tensor2s Arange(); @@ -291,16 +357,30 @@ class tensor2s X& operator()(size_t i, size_t j); const X& operator()(size_t i, size_t j) const; + // index operators: plain storage -> array-indices (i -> a,b) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b -> i) + size_t compress(size_t a, size_t b) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b); + auto item(size_t a, size_t b) const; + // basic initialization void setArange(); void setZero(); @@ -351,7 +431,23 @@ class tensor2s bool isdiagonal() const; // A_ij == 0, i != j // basic algebra - X norm() const; // sum(| A_ij |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2s &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -367,8 +463,10 @@ class tensor2d { private: - X m_data[2]; // data container - X m_zero[1]; // dummy parameter, used to return "0" for any off-diagonal entry + X mData[2]; // data container + static const size_t mNd=2; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + static const size_t mSize=2; // == mData.size() == mNd + X mZero[1]; // dummy parameter, used to return "0" for any off-diagonal entry public: @@ -415,12 +513,16 @@ class tensor2d X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + // basic initialization void setArange(); void setZero(); @@ -468,7 +570,23 @@ class tensor2d bool operator== (const tensor2d &B) const; // A_ij == B_ij // basic algebra - X norm() const; // sum(| A_ii |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2d &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -484,12 +602,14 @@ class vector { private: - X m_data[2]; // data container + X mData[2]; // data container + static const size_t mNd=2; // number of dimensions (rank == 1 -> shape == [mNd]) + static const size_t mSize=2; // == mData.size() == mNd public: // constructor - vector(){}; + vector() = default; // constructor: initialize static vector Arange(); @@ -522,12 +642,20 @@ class vector X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a); + auto item(size_t a) const; + // basic initialization void setArange(); void setZero(); @@ -557,9 +685,27 @@ class vector bool operator== (const vector &B) const; // A_i == B_i // basic algebra - X norm() const; // sum(| A_i |) - X length() const; // sqrt(sum(pow(A_i,2.))) - void setUnitLength(); // A_i /= A.length() + // - vector norm: sum(| A_ij |) + X norm() const; + // - vector length: sqrt(sum(pow(A_i,2.))) + X length() const; + // - set vector length to unity: A_i /= A.length() + void setUnitLength(); + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const vector &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; diff --git a/src/cppmat/tensor3.cpp b/src/cppmat/tensor3.cpp index f2a1e59..cd64ac6 100644 --- a/src/cppmat/tensor3.cpp +++ b/src/cppmat/tensor3.cpp @@ -23,7 +23,7 @@ namespace cartesian3d { template inline tensor4 tensor4::Arange() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -37,7 +37,7 @@ inline tensor4 tensor4::Arange() template inline tensor4 tensor4::Zero() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -51,7 +51,7 @@ inline tensor4 tensor4::Zero() template inline tensor4 tensor4::Ones() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -65,7 +65,7 @@ inline tensor4 tensor4::Ones() template inline tensor4 tensor4::Constant(X D) { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -79,7 +79,7 @@ inline tensor4 tensor4::Constant(X D) template inline tensor4 tensor4::I() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -93,7 +93,7 @@ inline tensor4 tensor4::I() template inline tensor4 tensor4::Irt() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -107,7 +107,7 @@ inline tensor4 tensor4::Irt() template inline tensor4 tensor4::Is() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -121,7 +121,7 @@ inline tensor4 tensor4::Is() template inline tensor4 tensor4::Id() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -135,7 +135,7 @@ inline tensor4 tensor4::Id() template inline tensor4 tensor4::II() { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -150,7 +150,7 @@ template template inline tensor4 tensor4::Copy(Iterator first) { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -165,7 +165,7 @@ template template inline tensor4 tensor4::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor4 out; // initialize @@ -179,7 +179,7 @@ inline tensor4 tensor4::Copy(Iterator first, Iterator last) template inline size_t tensor4::Size() { - return 81; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -187,7 +187,7 @@ inline size_t tensor4::Size() template inline tensor2 tensor2::Arange() { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -201,7 +201,7 @@ inline tensor2 tensor2::Arange() template inline tensor2 tensor2::Zero() { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -215,7 +215,7 @@ inline tensor2 tensor2::Zero() template inline tensor2 tensor2::Ones() { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -229,7 +229,7 @@ inline tensor2 tensor2::Ones() template inline tensor2 tensor2::Constant(X D) { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -243,7 +243,7 @@ inline tensor2 tensor2::Constant(X D) template inline tensor2 tensor2::I() { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -258,7 +258,7 @@ template template inline tensor2 tensor2::Copy(Iterator first) { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -273,7 +273,7 @@ template template inline tensor2 tensor2::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2 out; // initialize @@ -287,7 +287,7 @@ inline tensor2 tensor2::Copy(Iterator first, Iterator last) template inline size_t tensor2::Size() { - return 9; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -295,7 +295,7 @@ inline size_t tensor2::Size() template inline tensor2s tensor2s::Arange() { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -309,7 +309,7 @@ inline tensor2s tensor2s::Arange() template inline tensor2s tensor2s::Zero() { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -323,7 +323,7 @@ inline tensor2s tensor2s::Zero() template inline tensor2s tensor2s::Ones() { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -337,7 +337,7 @@ inline tensor2s tensor2s::Ones() template inline tensor2s tensor2s::Constant(X D) { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -351,7 +351,7 @@ inline tensor2s tensor2s::Constant(X D) template inline tensor2s tensor2s::I() { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -366,7 +366,7 @@ template template inline tensor2s tensor2s::Copy(Iterator first) { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -381,7 +381,7 @@ template template inline tensor2s tensor2s::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -396,7 +396,7 @@ template template inline tensor2s tensor2s::CopyDense(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2s out; // initialize @@ -410,7 +410,7 @@ inline tensor2s tensor2s::CopyDense(Iterator first, Iterator last) template inline size_t tensor2s::Size() { - return 6; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -419,7 +419,7 @@ template inline tensor2d::tensor2d() { // set dummy parameter - m_zero[0] = static_cast(0); + mZero[0] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -427,7 +427,7 @@ inline tensor2d::tensor2d() template inline tensor2d tensor2d::Arange() { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -441,7 +441,7 @@ inline tensor2d tensor2d::Arange() template inline tensor2d tensor2d::Zero() { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -455,7 +455,7 @@ inline tensor2d tensor2d::Zero() template inline tensor2d tensor2d::Ones() { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -469,7 +469,7 @@ inline tensor2d tensor2d::Ones() template inline tensor2d tensor2d::Constant(X D) { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -483,7 +483,7 @@ inline tensor2d tensor2d::Constant(X D) template inline tensor2d tensor2d::I() { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -498,7 +498,7 @@ template template inline tensor2d tensor2d::Copy(Iterator first) { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -513,7 +513,7 @@ template template inline tensor2d tensor2d::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -528,7 +528,7 @@ template template inline tensor2d tensor2d::CopyDense(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor tensor2d out; // initialize @@ -542,7 +542,7 @@ inline tensor2d tensor2d::CopyDense(Iterator first, Iterator last) template inline size_t tensor2d::Size() { - return 3; + return mSize; } // ------------------------------------------------------------------------------------------------- @@ -550,7 +550,7 @@ inline size_t tensor2d::Size() template inline vector vector::Arange() { - // allocate tensor + // call basic constructor vector out; // initialize @@ -564,7 +564,7 @@ inline vector vector::Arange() template inline vector vector::Zero() { - // allocate tensor + // call basic constructor vector out; // initialize @@ -578,7 +578,7 @@ inline vector vector::Zero() template inline vector vector::Ones() { - // allocate tensor + // call basic constructor vector out; // initialize @@ -592,7 +592,7 @@ inline vector vector::Ones() template inline vector vector::Constant(X D) { - // allocate tensor + // call basic constructor vector out; // initialize @@ -607,7 +607,7 @@ template template inline vector vector::Copy(Iterator first) { - // allocate tensor + // call basic constructor vector out; // initialize @@ -622,7 +622,7 @@ template template inline vector vector::Copy(Iterator first, Iterator last) { - // allocate tensor + // call basic constructor vector out; // initialize @@ -636,12 +636,12 @@ inline vector vector::Copy(Iterator first, Iterator last) template inline size_t vector::Size() { - return 2; + return mSize; } // ================================================================================================= -// cast to different class / type +// cast to different class // ================================================================================================= template<> @@ -650,12 +650,12 @@ inline tensor2s tensor2::cast>() const { tensor2s out; - out[0] = m_data[0]; - out[1] = ( m_data[1] + m_data[3] ) / 2.; - out[2] = ( m_data[2] + m_data[6] ) / 2.; - out[3] = m_data[4]; - out[4] = ( m_data[5] + m_data[7] ) / 2.; - out[5] = m_data[8]; + out[0] = mData[0]; + out[1] = ( mData[1] + mData[3] ) / 2.; + out[2] = ( mData[2] + mData[6] ) / 2.; + out[3] = mData[4]; + out[4] = ( mData[5] + mData[7] ) / 2.; + out[5] = mData[8]; return out; } @@ -668,9 +668,9 @@ inline tensor2d tensor2::cast>() const { tensor2d out; - out[0] = m_data[0]; - out[1] = m_data[4]; - out[2] = m_data[8]; + out[0] = mData[0]; + out[1] = mData[4]; + out[2] = mData[8]; return out; } @@ -683,12 +683,12 @@ inline tensor2 tensor2s::cast>() const { tensor2 out; - out[0] = m_data[0]; - out[1] = out[3] = m_data[1]; - out[2] = out[6] = m_data[2]; - out[4] = m_data[3]; - out[5] = out[7] = m_data[4]; - out[8] = m_data[5]; + out[0] = mData[0]; + out[1] = out[3] = mData[1]; + out[2] = out[6] = mData[2]; + out[4] = mData[3]; + out[5] = out[7] = mData[4]; + out[8] = mData[5]; return out; } @@ -701,9 +701,9 @@ inline tensor2d tensor2s::cast>() const { tensor2d out; - out[0] = m_data[0]; - out[1] = m_data[3]; - out[2] = m_data[5]; + out[0] = mData[0]; + out[1] = mData[3]; + out[2] = mData[5]; return out; } @@ -716,9 +716,9 @@ inline tensor2 tensor2d::cast>() const { tensor2 out; - out[0] = m_data[0]; - out[4] = m_data[1]; - out[8] = m_data[2]; + out[0] = mData[0]; + out[4] = mData[1]; + out[8] = mData[2]; out[1] = out[2] = out[3] = out[5] = out[6] = out[7] = 0.0; @@ -733,16 +733,18 @@ inline tensor2s tensor2d::cast>() const { tensor2s out; - out[0] = m_data[0]; - out[3] = m_data[1]; - out[5] = m_data[2]; + out[0] = mData[0]; + out[3] = mData[1]; + out[5] = mData[2]; out[1] = out[2] = out[4] = 0.0; return out; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// automatic cast to different class +// ================================================================================================= #ifndef CPPMAT_NOCONVERT template @@ -750,12 +752,12 @@ inline tensor2s::operator tensor2 () const { tensor2 out; - out[0] = m_data[0]; - out[1] = out[3] = m_data[1]; - out[2] = out[6] = m_data[2]; - out[4] = m_data[3]; - out[5] = out[7] = m_data[4]; - out[8] = m_data[5]; + out[0] = mData[0]; + out[1] = out[3] = mData[1]; + out[2] = out[6] = mData[2]; + out[4] = mData[3]; + out[5] = out[7] = mData[4]; + out[8] = mData[5]; return out; } @@ -769,9 +771,9 @@ inline tensor2d::operator tensor2 () const { tensor2 out; - out[0] = m_data[0]; - out[4] = m_data[1]; - out[8] = m_data[2]; + out[0] = mData[0]; + out[4] = mData[1]; + out[8] = mData[2]; out[1] = out[2] = out[3] = out[5] = out[6] = out[7] = static_cast(0); @@ -787,9 +789,9 @@ inline tensor2d::operator tensor2s () const { tensor2s out; - out[0] = m_data[0]; - out[3] = m_data[1]; - out[5] = m_data[2]; + out[0] = mData[0]; + out[3] = mData[1]; + out[5] = mData[2]; out[1] = out[2] = out[4] = static_cast(0); @@ -801,23 +803,25 @@ inline tensor2d::operator tensor2s () const // get dimensions // ================================================================================================= -template inline size_t tensor4 ::size() const { return 81; } -template inline size_t tensor2 ::size() const { return 9; } -template inline size_t tensor2s::size() const { return 6; } -template inline size_t tensor2d::size() const { return 3; } -template inline size_t vector ::size() const { return 3; } -template inline size_t tensor4 ::ndim() const { return 3; } -template inline size_t tensor2 ::ndim() const { return 3; } -template inline size_t tensor2s::ndim() const { return 3; } -template inline size_t tensor2d::ndim() const { return 3; } -template inline size_t vector ::ndim() const { return 3; } +template inline size_t tensor4 ::size() const { return mSize; } +template inline size_t tensor2 ::size() const { return mSize; } +template inline size_t tensor2s::size() const { return mSize; } +template inline size_t tensor2d::size() const { return mSize; } +template inline size_t vector ::size() const { return mSize; } +template inline size_t tensor4 ::ndim() const { return mNd; } +template inline size_t tensor2 ::ndim() const { return mNd; } +template inline size_t tensor2s::ndim() const { return mNd; } +template inline size_t tensor2d::ndim() const { return mNd; } +template inline size_t vector ::ndim() const { return mNd; } // ------------------------------------------------------------------------------------------------- template inline std::vector tensor4::shape() const { - std::vector out(4, 3); + std::vector out(4); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -827,7 +831,9 @@ inline std::vector tensor4::shape() const template inline std::vector tensor2::shape() const { - std::vector out(2, 3); + std::vector out(2); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -837,7 +843,9 @@ inline std::vector tensor2::shape() const template inline std::vector vector::shape() const { - std::vector out(1, 3); + std::vector out(1); + + std::fill(out.begin(), out.end(), mNd); return out; } @@ -890,15 +898,15 @@ inline std::vector vector::strides(bool bytes) const } // ================================================================================================= -// index operators +// index operators : operator[...] // ================================================================================================= template inline X& tensor4::operator[](size_t i) { - assert( i < 81 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -906,9 +914,9 @@ inline X& tensor4::operator[](size_t i) template inline const X& tensor4::operator[](size_t i) const { - assert( i < 81 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -916,9 +924,9 @@ inline const X& tensor4::operator[](size_t i) const template inline X& tensor2::operator[](size_t i) { - assert( i < 9 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -926,9 +934,9 @@ inline X& tensor2::operator[](size_t i) template inline const X& tensor2::operator[](size_t i) const { - assert( i < 9 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -936,9 +944,9 @@ inline const X& tensor2::operator[](size_t i) const template inline X& tensor2s::operator[](size_t i) { - assert( i < 6 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -946,9 +954,9 @@ inline X& tensor2s::operator[](size_t i) template inline const X& tensor2s::operator[](size_t i) const { - assert( i < 6 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -956,9 +964,9 @@ inline const X& tensor2s::operator[](size_t i) const template inline X& tensor2d::operator[](size_t i) { - assert( i < 3 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -966,9 +974,9 @@ inline X& tensor2d::operator[](size_t i) template inline const X& tensor2d::operator[](size_t i) const { - assert( i < 3 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -976,9 +984,9 @@ inline const X& tensor2d::operator[](size_t i) const template inline X& vector::operator[](size_t i) { - assert( i < 3 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -986,22 +994,24 @@ inline X& vector::operator[](size_t i) template inline const X& vector::operator[](size_t i) const { - assert( i < 3 ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// index operators : operator(...) +// ================================================================================================= template inline X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) { - assert( i < 3 ); - assert( j < 3 ); - assert( k < 3 ); - assert( l < 3 ); + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); - return m_data[i*27+j*9+k*3+l]; + return mData[i*27+j*9+k*3+l]; } // ------------------------------------------------------------------------------------------------- @@ -1009,12 +1019,12 @@ inline X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) template inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) const { - assert( i < 3 ); - assert( j < 3 ); - assert( k < 3 ); - assert( l < 3 ); + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); - return m_data[i*27+j*9+k*3+l]; + return mData[i*27+j*9+k*3+l]; } // ------------------------------------------------------------------------------------------------- @@ -1022,10 +1032,10 @@ inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) c template inline X& tensor2::operator()(size_t i, size_t j) { - assert( i < 3 ); - assert( j < 3 ); + assert( i < mNd ); + assert( j < mNd ); - return m_data[i*3+j]; + return mData[i*3+j]; } // ------------------------------------------------------------------------------------------------- @@ -1033,10 +1043,10 @@ inline X& tensor2::operator()(size_t i, size_t j) template inline const X& tensor2::operator()(size_t i, size_t j) const { - assert( i < 3 ); - assert( j < 3 ); + assert( i < mNd ); + assert( j < mNd ); - return m_data[i*3+j]; + return mData[i*3+j]; } // ------------------------------------------------------------------------------------------------- @@ -1044,23 +1054,23 @@ inline const X& tensor2::operator()(size_t i, size_t j) const template inline X& tensor2s::operator()(size_t i, size_t j) { - assert( i < 3 ); - assert( j < 3 ); + assert( i < mNd ); + assert( j < mNd ); if ( i == 0 ) { - if ( j == 0 ) return m_data[0]; - if ( j == 1 ) return m_data[1]; - else return m_data[2]; + if ( j == 0 ) return mData[0]; + if ( j == 1 ) return mData[1]; + else return mData[2]; } if ( i == 1 ) { - if ( j == 0 ) return m_data[1]; - if ( j == 1 ) return m_data[3]; - else return m_data[4]; + if ( j == 0 ) return mData[1]; + if ( j == 1 ) return mData[3]; + else return mData[4]; } else { - if ( j == 0 ) return m_data[2]; - if ( j == 1 ) return m_data[4]; - else return m_data[5]; + if ( j == 0 ) return mData[2]; + if ( j == 1 ) return mData[4]; + else return mData[5]; } } @@ -1069,23 +1079,23 @@ inline X& tensor2s::operator()(size_t i, size_t j) template inline const X& tensor2s::operator()(size_t i, size_t j) const { - assert( i < 3 ); - assert( j < 3 ); + assert( i < mNd ); + assert( j < mNd ); if ( i == 0 ) { - if ( j == 0 ) return m_data[0]; - if ( j == 1 ) return m_data[1]; - else return m_data[2]; + if ( j == 0 ) return mData[0]; + if ( j == 1 ) return mData[1]; + else return mData[2]; } if ( i == 1 ) { - if ( j == 0 ) return m_data[1]; - if ( j == 1 ) return m_data[3]; - else return m_data[4]; + if ( j == 0 ) return mData[1]; + if ( j == 1 ) return mData[3]; + else return mData[4]; } else { - if ( j == 0 ) return m_data[2]; - if ( j == 1 ) return m_data[4]; - else return m_data[5]; + if ( j == 0 ) return mData[2]; + if ( j == 1 ) return mData[4]; + else return mData[5]; } } @@ -1094,11 +1104,11 @@ inline const X& tensor2s::operator()(size_t i, size_t j) const template inline X& tensor2d::operator()(size_t i, size_t j) { - assert( i < 3 ); - assert( j < 3 ); + assert( i < mNd ); + assert( j < mNd ); - if (i == j) return m_data[i]; - else return m_zero[0]; + if (i == j) return mData[i]; + else return mZero[0]; } // ------------------------------------------------------------------------------------------------- @@ -1106,11 +1116,11 @@ inline X& tensor2d::operator()(size_t i, size_t j) template inline const X& tensor2d::operator()(size_t i, size_t j) const { - assert( i < 3 ); - assert( j < 3 ); + assert( i < mNd ); + assert( j < mNd ); - if (i == j) return m_data[i]; - else return m_zero[0]; + if (i == j) return mData[i]; + else return mZero[0]; } // ------------------------------------------------------------------------------------------------- @@ -1118,9 +1128,9 @@ inline const X& tensor2d::operator()(size_t i, size_t j) const template inline X& vector::operator()(size_t i) { - assert( i < 3 ); + assert( i < mNd ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- @@ -1128,45 +1138,344 @@ inline X& vector::operator()(size_t i) template inline const X& vector::operator()(size_t i) const { - assert( i < 3 ); + assert( i < mNd ); + + return mData[i]; +} + +// ================================================================================================= +// index operators : compress(...) +// ================================================================================================= + +template +inline size_t tensor4::compress(size_t i, size_t j, size_t k, size_t l) const +{ + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline size_t tensor2::compress(size_t i, size_t j) const +{ + assert( i < mNd ); + assert( j < mNd ); + + return i*mNd+j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline size_t tensor2s::compress(size_t i, size_t j) const +{ + assert( i < mNd ); + assert( j < mNd ); - return m_data[i]; + if (i <= j) return i*mNd - (i-1)*i/2 + j - i; + else return j*mNd - (j-1)*j/2 + i - j; +} + +// ================================================================================================= +// index operators : decompress(...) +// ================================================================================================= + +template +inline std::vector tensor4::decompress(size_t i) const +{ + // check input + assert( i < mSize ); + + // allocate array-index + std::vector idx(4); + + // reconstruct + idx[0] = (i - i%(mNd*mNd*mNd)) / (mNd*mNd*mNd); i -= idx[0] * (mNd*mNd*mNd); + idx[1] = (i - i%(mNd*mNd) ) / (mNd*mNd); i -= idx[1] * (mNd*mNd); + idx[2] = (i - i% mNd ) / mNd; i -= idx[2] * mNd; + idx[3] = i; + + return idx; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2::decompress(size_t i) const +{ + // check input + assert( i < mSize ); + + // allocate array-index + std::vector idx(2); + + // reconstruct + idx[1] = i % mNd; + idx[0] = ( i - idx[1] ) / mNd; + + return idx; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2s::decompress(size_t i) const +{ + // check input + assert( i < mSize ); + + // allocate array-index + std::vector idx(2); + + // reconstruct + idx[0] = 0; + size_t keyafter; + do + { + idx[0]++; + keyafter = idx[0] * mNd - (idx[0] - 1) * idx[0] / 2; + } while ( i >= keyafter ); + idx[0]--; + idx[1] = mNd - keyafter + i; + + return idx; } // ================================================================================================= // pointers / iterators // ================================================================================================= -template inline X* tensor4 ::data() { return std::begin(m_data); } -template inline const X* tensor4 ::data() const { return std::begin(m_data); } -template inline auto tensor4 ::begin() { return std::begin(m_data); } -template inline auto tensor4 ::begin() const { return std::begin(m_data); } -template inline auto tensor4 ::end() { return std::begin(m_data) + 81; } -template inline auto tensor4 ::end() const { return std::begin(m_data) + 81; } -template inline X* tensor2 ::data() { return std::begin(m_data); } -template inline const X* tensor2 ::data() const { return std::begin(m_data); } -template inline auto tensor2 ::begin() { return std::begin(m_data); } -template inline auto tensor2 ::begin() const { return std::begin(m_data); } -template inline auto tensor2 ::end() { return std::begin(m_data) + 9; } -template inline auto tensor2 ::end() const { return std::begin(m_data) + 9; } -template inline X* tensor2s::data() { return std::begin(m_data); } -template inline const X* tensor2s::data() const { return std::begin(m_data); } -template inline auto tensor2s::begin() { return std::begin(m_data); } -template inline auto tensor2s::begin() const { return std::begin(m_data); } -template inline auto tensor2s::end() { return std::begin(m_data) + 6; } -template inline auto tensor2s::end() const { return std::begin(m_data) + 6; } -template inline X* tensor2d::data() { return std::begin(m_data); } -template inline const X* tensor2d::data() const { return std::begin(m_data); } -template inline auto tensor2d::begin() { return std::begin(m_data); } -template inline auto tensor2d::begin() const { return std::begin(m_data); } -template inline auto tensor2d::end() { return std::begin(m_data) + 3; } -template inline auto tensor2d::end() const { return std::begin(m_data) + 3; } -template inline X* vector ::data() { return std::begin(m_data); } -template inline const X* vector ::data() const { return std::begin(m_data); } -template inline auto vector ::begin() { return std::begin(m_data); } -template inline auto vector ::begin() const { return std::begin(m_data); } -template inline auto vector ::end() { return std::begin(m_data) + 3; } -template inline auto vector ::end() const { return std::begin(m_data) + 3; } +template inline X* tensor4 ::data() { return std::begin(mData); } +template inline const X* tensor4 ::data() const { return std::begin(mData); } +template inline auto tensor4 ::begin() { return std::begin(mData); } +template inline auto tensor4 ::begin() const { return std::begin(mData); } +template inline auto tensor4 ::end() { return std::begin(mData) + mSize; } +template inline auto tensor4 ::end() const { return std::begin(mData) + mSize; } +template inline X* tensor2 ::data() { return std::begin(mData); } +template inline const X* tensor2 ::data() const { return std::begin(mData); } +template inline auto tensor2 ::begin() { return std::begin(mData); } +template inline auto tensor2 ::begin() const { return std::begin(mData); } +template inline auto tensor2 ::end() { return std::begin(mData) + mSize; } +template inline auto tensor2 ::end() const { return std::begin(mData) + mSize; } +template inline X* tensor2s::data() { return std::begin(mData); } +template inline const X* tensor2s::data() const { return std::begin(mData); } +template inline auto tensor2s::begin() { return std::begin(mData); } +template inline auto tensor2s::begin() const { return std::begin(mData); } +template inline auto tensor2s::end() { return std::begin(mData) + mSize; } +template inline auto tensor2s::end() const { return std::begin(mData) + mSize; } +template inline X* tensor2d::data() { return std::begin(mData); } +template inline const X* tensor2d::data() const { return std::begin(mData); } +template inline auto tensor2d::begin() { return std::begin(mData); } +template inline auto tensor2d::begin() const { return std::begin(mData); } +template inline auto tensor2d::end() { return std::begin(mData) + mSize; } +template inline auto tensor2d::end() const { return std::begin(mData) + mSize; } +template inline X* vector ::data() { return std::begin(mData); } +template inline const X* vector ::data() const { return std::begin(mData); } +template inline auto vector ::begin() { return std::begin(mData); } +template inline auto vector ::begin() const { return std::begin(mData); } +template inline auto vector ::end() { return std::begin(mData) + mSize; } +template inline auto vector ::end() const { return std::begin(mData) + mSize; } + +// ================================================================================================= +// iterators : index() +// ================================================================================================= + +template +inline auto tensor4::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor4::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2s::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2s::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2d::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2d::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto vector::index(size_t i) +{ + assert( i < mSize ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto vector::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ================================================================================================= +// iterators : item() +// ================================================================================================= + +template +inline auto tensor4::item(size_t i, size_t j, size_t k, size_t l) +{ + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return begin() + i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor4::item(size_t i, size_t j, size_t k, size_t l) const +{ + assert( i < mNd ); + assert( j < mNd ); + assert( k < mNd ); + assert( l < mNd ); + + return begin() + i*mNd*mNd*mNd+j*mNd*mNd+k*mNd+l; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2::item(size_t i, size_t j) +{ + assert( i < mNd ); + assert( j < mNd ); + + return begin() + i*mNd+j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2::item(size_t i, size_t j) const +{ + assert( i < mNd ); + assert( j < mNd ); + + return begin() + i*mNd+j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2s::item(size_t i, size_t j) +{ + assert( i < mNd ); + assert( j < mNd ); + + if (i <= j) return begin() + i*mNd - (i-1)*i/2 + j - i; + else return begin() + j*mNd - (j-1)*j/2 + i - j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto tensor2s::item(size_t i, size_t j) const +{ + assert( i < mNd ); + assert( j < mNd ); + + if (i <= j) return begin() + i*mNd - (i-1)*i/2 + j - i; + else return begin() + j*mNd - (j-1)*j/2 + i - j; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto vector::item(size_t i) +{ + assert( i < mNd ); + + return begin() + i; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto vector::item(size_t i) const +{ + assert( i < mNd ); + + return begin() + i; +} // ================================================================================================= // basic initialization - tensor4 @@ -1175,7 +1484,7 @@ template inline auto vector ::end() const { return std::begin template inline void tensor4::setArange() { - for ( size_t i = 0 ; i < 81 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1183,7 +1492,7 @@ inline void tensor4::setArange() template inline void tensor4::setZero() { - for ( size_t i = 0 ; i < 81 ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -1191,7 +1500,7 @@ inline void tensor4::setZero() template inline void tensor4::setOnes() { - for ( size_t i = 0 ; i < 81 ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -1199,7 +1508,7 @@ inline void tensor4::setOnes() template inline void tensor4::setConstant(X D) { - for ( size_t i = 0 ; i < 81 ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -1211,9 +1520,9 @@ inline void tensor4::setCopy(Iterator first) // copy input for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] = first[i ]; - m_data[i+1] = first[i+1]; - m_data[i+2] = first[i+2]; + mData[i ] = first[i ]; + mData[i+1] = first[i+1]; + mData[i+2] = first[i+2]; } } @@ -1232,9 +1541,9 @@ inline void tensor4::setCopy(Iterator first, Iterator last) // copy input for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] = first[i ]; - m_data[i+1] = first[i+1]; - m_data[i+2] = first[i+2]; + mData[i ] = first[i ]; + mData[i+1] = first[i+1]; + mData[i+2] = first[i+2]; } } @@ -1243,12 +1552,12 @@ inline void tensor4::setCopy(Iterator first, Iterator last) template inline void tensor4::setI() { - this->setZero(); + setZero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) if ( i == l and j == k ) (*this)(i,j,k,l) = static_cast(1); } @@ -1258,12 +1567,12 @@ inline void tensor4::setI() template inline void tensor4::setIrt() { - this->setZero(); + setZero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) if ( i == k and j == l ) (*this)(i,j,k,l) = static_cast(1); } @@ -1281,7 +1590,7 @@ inline void tensor4::setIs() template inline void tensor4::setId() { - return tensor4::Is() - tensor4::II()/static_cast(3); + return tensor4::Is() - tensor4::II()/static_cast(mNd); } // ------------------------------------------------------------------------------------------------- @@ -1289,12 +1598,12 @@ inline void tensor4::setId() template inline void tensor4::setII() { - this->setZero(); + setZero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) if ( i == j and k == l ) (*this)(i,j,k,l) = static_cast(1); } @@ -1306,7 +1615,7 @@ inline void tensor4::setII() template inline void tensor2::setArange() { - for ( size_t i = 0 ; i < 9 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1314,7 +1623,7 @@ inline void tensor2::setArange() template inline void tensor2::setZero() { - for ( size_t i = 0 ; i < 9 ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- @@ -1322,7 +1631,7 @@ inline void tensor2::setZero() template inline void tensor2::setOnes() { - for ( size_t i = 0 ; i < 9 ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- @@ -1330,7 +1639,7 @@ inline void tensor2::setOnes() template inline void tensor2::setConstant(X D) { - for ( size_t i = 0 ; i < 9 ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- @@ -1342,9 +1651,9 @@ inline void tensor2::setCopy(Iterator first) // copy input for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] = first[i ]; - m_data[i+1] = first[i+1]; - m_data[i+2] = first[i+2]; + mData[i ] = first[i ]; + mData[i+1] = first[i+1]; + mData[i+2] = first[i+2]; } } @@ -1363,9 +1672,9 @@ inline void tensor2::setCopy(Iterator first, Iterator last) // copy input for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] = first[i ]; - m_data[i+1] = first[i+1]; - m_data[i+2] = first[i+2]; + mData[i ] = first[i ]; + mData[i+1] = first[i+1]; + mData[i+2] = first[i+2]; } } @@ -1374,15 +1683,15 @@ inline void tensor2::setCopy(Iterator first, Iterator last) template inline void tensor2::setI() { - m_data[0] = static_cast(1); - m_data[1] = static_cast(0); - m_data[2] = static_cast(0); - m_data[3] = static_cast(0); - m_data[4] = static_cast(1); - m_data[5] = static_cast(0); - m_data[6] = static_cast(0); - m_data[7] = static_cast(0); - m_data[8] = static_cast(1); + mData[0] = static_cast(1); + mData[1] = static_cast(0); + mData[2] = static_cast(0); + mData[3] = static_cast(0); + mData[4] = static_cast(1); + mData[5] = static_cast(0); + mData[6] = static_cast(0); + mData[7] = static_cast(0); + mData[8] = static_cast(1); } // ================================================================================================= @@ -1392,7 +1701,7 @@ inline void tensor2::setI() template inline void tensor2s::setArange() { - for ( size_t i = 0 ; i < 6 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1400,7 +1709,7 @@ inline void tensor2s::setArange() template inline void tensor2s::setZero() { - m_data[0] = m_data[1] = m_data[2] = m_data[3] = m_data[4] = m_data[5] = static_cast(0); + mData[0] = mData[1] = mData[2] = mData[3] = mData[4] = mData[5] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -1408,7 +1717,7 @@ inline void tensor2s::setZero() template inline void tensor2s::setOnes() { - m_data[0] = m_data[1] = m_data[2] = m_data[3] = m_data[4] = m_data[5] = static_cast(1); + mData[0] = mData[1] = mData[2] = mData[3] = mData[4] = mData[5] = static_cast(1); } // ------------------------------------------------------------------------------------------------- @@ -1416,7 +1725,7 @@ inline void tensor2s::setOnes() template inline void tensor2s::setConstant(X D) { - m_data[0] = m_data[1] = m_data[2] = m_data[3] = m_data[4] = m_data[5] = D; + mData[0] = mData[1] = mData[2] = mData[3] = mData[4] = mData[5] = D; } // ------------------------------------------------------------------------------------------------- @@ -1426,12 +1735,12 @@ template inline void tensor2s::setCopy(Iterator first) { // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; - m_data[3] = first[3]; - m_data[4] = first[4]; - m_data[5] = first[5]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; + mData[3] = first[3]; + mData[4] = first[4]; + mData[5] = first[5]; } // ------------------------------------------------------------------------------------------------- @@ -1447,12 +1756,12 @@ inline void tensor2s::setCopy(Iterator first, Iterator last) assert( 6 == last - first ); // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; - m_data[3] = first[3]; - m_data[4] = first[4]; - m_data[5] = first[5]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; + mData[3] = first[3]; + mData[4] = first[4]; + mData[5] = first[5]; } // ------------------------------------------------------------------------------------------------- @@ -1467,12 +1776,12 @@ inline void tensor2s::setCopyDense(Iterator first) assert( first[5] == first[7] ); // copy from input (ignores lower diagonal terms) - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; - m_data[3] = first[4]; - m_data[4] = first[5]; - m_data[5] = first[8]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; + mData[3] = first[4]; + mData[4] = first[5]; + mData[5] = first[8]; } // ------------------------------------------------------------------------------------------------- @@ -1493,12 +1802,12 @@ inline void tensor2s::setCopyDense(Iterator first, Iterator last) assert( first[5] == first[7] ); // copy from input (ignores lower diagonal terms) - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; - m_data[3] = first[4]; - m_data[4] = first[5]; - m_data[5] = first[8]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; + mData[3] = first[4]; + mData[4] = first[5]; + mData[5] = first[8]; } // ------------------------------------------------------------------------------------------------- @@ -1506,12 +1815,12 @@ inline void tensor2s::setCopyDense(Iterator first, Iterator last) template inline void tensor2s::setI() { - m_data[0] = static_cast(1); - m_data[1] = static_cast(0); - m_data[2] = static_cast(0); - m_data[3] = static_cast(1); - m_data[4] = static_cast(0); - m_data[5] = static_cast(1); + mData[0] = static_cast(1); + mData[1] = static_cast(0); + mData[2] = static_cast(0); + mData[3] = static_cast(1); + mData[4] = static_cast(0); + mData[5] = static_cast(1); } // ================================================================================================= @@ -1521,7 +1830,7 @@ inline void tensor2s::setI() template inline void tensor2d::setArange() { - for ( size_t i = 0 ; i < 3 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1529,7 +1838,7 @@ inline void tensor2d::setArange() template inline void tensor2d::setZero() { - m_data[0] = m_data[1] = m_data[2] = static_cast(0); + mData[0] = mData[1] = mData[2] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -1537,7 +1846,7 @@ inline void tensor2d::setZero() template inline void tensor2d::setOnes() { - m_data[0] = m_data[1] = m_data[2] = static_cast(1); + mData[0] = mData[1] = mData[2] = static_cast(1); } // ------------------------------------------------------------------------------------------------- @@ -1545,7 +1854,7 @@ inline void tensor2d::setOnes() template inline void tensor2d::setConstant(X D) { - m_data[0] = m_data[1] = m_data[2] = D; + mData[0] = mData[1] = mData[2] = D; } // ------------------------------------------------------------------------------------------------- @@ -1555,9 +1864,9 @@ template inline void tensor2d::setCopy(Iterator first) { // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; } // ------------------------------------------------------------------------------------------------- @@ -1573,9 +1882,9 @@ inline void tensor2d::setCopy(Iterator first, Iterator last) assert( 3 == last - first ); // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; } // ------------------------------------------------------------------------------------------------- @@ -1593,9 +1902,9 @@ inline void tensor2d::setCopyDense(Iterator first) assert( ! first[7] ); // copy from input (ignores off-diagonal terms) - m_data[0] = first[0]; - m_data[1] = first[4]; - m_data[2] = first[8]; + mData[0] = first[0]; + mData[1] = first[4]; + mData[2] = first[8]; } // ------------------------------------------------------------------------------------------------- @@ -1619,9 +1928,9 @@ inline void tensor2d::setCopyDense(Iterator first, Iterator last) assert( ! first[7] ); // copy from input (ignores off-diagonal terms) - m_data[0] = first[0]; - m_data[1] = first[4]; - m_data[2] = first[8]; + mData[0] = first[0]; + mData[1] = first[4]; + mData[2] = first[8]; } // ------------------------------------------------------------------------------------------------- @@ -1629,7 +1938,7 @@ inline void tensor2d::setCopyDense(Iterator first, Iterator last) template inline void tensor2d::setI() { - m_data[0] = m_data[1] = m_data[2] = static_cast(1); + mData[0] = mData[1] = mData[2] = static_cast(1); } // ================================================================================================= @@ -1639,7 +1948,7 @@ inline void tensor2d::setI() template inline void vector::setArange() { - for ( size_t i = 0 ; i < 3 ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- @@ -1647,7 +1956,7 @@ inline void vector::setArange() template inline void vector::setZero() { - m_data[0] = m_data[1] = m_data[2] = static_cast(0); + mData[0] = mData[1] = mData[2] = static_cast(0); } // ------------------------------------------------------------------------------------------------- @@ -1655,7 +1964,7 @@ inline void vector::setZero() template inline void vector::setOnes() { - m_data[0] = m_data[1] = m_data[2] = static_cast(1); + mData[0] = mData[1] = mData[2] = static_cast(1); } // ------------------------------------------------------------------------------------------------- @@ -1663,7 +1972,7 @@ inline void vector::setOnes() template inline void vector::setConstant(X D) { - m_data[0] = m_data[1] = m_data[2] = D; + mData[0] = mData[1] = mData[2] = D; } // ------------------------------------------------------------------------------------------------- @@ -1673,9 +1982,9 @@ template inline void vector::setCopy(Iterator first) { // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; } // ------------------------------------------------------------------------------------------------- @@ -1691,9 +2000,9 @@ inline void vector::setCopy(Iterator first, Iterator last) assert( 3 == last - first ); // copy input - m_data[0] = first[0]; - m_data[1] = first[1]; - m_data[2] = first[2]; + mData[0] = first[0]; + mData[1] = first[1]; + mData[2] = first[2]; } // ================================================================================================= @@ -1705,9 +2014,9 @@ inline tensor4& tensor4::operator*= (const tensor4 &B) { for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] *= B[i ]; - m_data[i+1] *= B[i+1]; - m_data[i+2] *= B[i+2]; + mData[i ] *= B[i ]; + mData[i+1] *= B[i+1]; + mData[i+2] *= B[i+2]; } return *this; @@ -1720,9 +2029,9 @@ inline tensor4& tensor4::operator/= (const tensor4 &B) { for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] /= B[i ]; - m_data[i+1] /= B[i+1]; - m_data[i+2] /= B[i+2]; + mData[i ] /= B[i ]; + mData[i+1] /= B[i+1]; + mData[i+2] /= B[i+2]; } return *this; @@ -1735,9 +2044,9 @@ inline tensor4& tensor4::operator+= (const tensor4 &B) { for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] += B[i ]; - m_data[i+1] += B[i+1]; - m_data[i+2] += B[i+2]; + mData[i ] += B[i ]; + mData[i+1] += B[i+1]; + mData[i+2] += B[i+2]; } return *this; @@ -1750,9 +2059,9 @@ inline tensor4& tensor4::operator-= (const tensor4 &B) { for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] -= B[i ]; - m_data[i+1] -= B[i+1]; - m_data[i+2] -= B[i+2]; + mData[i ] -= B[i ]; + mData[i+1] -= B[i+1]; + mData[i+2] -= B[i+2]; } return *this; @@ -1765,9 +2074,9 @@ inline tensor4& tensor4::operator*= (const X &B) { for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] *= B; - m_data[i+1] *= B; - m_data[i+2] *= B; + mData[i ] *= B; + mData[i+1] *= B; + mData[i+2] *= B; } return *this; @@ -1780,9 +2089,9 @@ inline tensor4& tensor4::operator/= (const X &B) { for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] /= B; - m_data[i+1] /= B; - m_data[i+2] /= B; + mData[i ] /= B; + mData[i+1] /= B; + mData[i+2] /= B; } return *this; @@ -1795,9 +2104,9 @@ inline tensor4& tensor4::operator+= (const X &B) { for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] += B; - m_data[i+1] += B; - m_data[i+2] += B; + mData[i ] += B; + mData[i+1] += B; + mData[i+2] += B; } return *this; @@ -1810,9 +2119,9 @@ inline tensor4& tensor4::operator-= (const X &B) { for ( size_t i = 0 ; i < 81 ; i += 3 ) { - m_data[i ] -= B; - m_data[i+1] -= B; - m_data[i+2] -= B; + mData[i ] -= B; + mData[i+1] -= B; + mData[i+2] -= B; } return *this; @@ -1827,9 +2136,9 @@ inline tensor2& tensor2::operator*= (const tensor2 &B) { for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] *= B[i ]; - m_data[i+1] *= B[i+1]; - m_data[i+2] *= B[i+2]; + mData[i ] *= B[i ]; + mData[i+1] *= B[i+1]; + mData[i+2] *= B[i+2]; } return *this; @@ -1842,9 +2151,9 @@ inline tensor2& tensor2::operator/= (const tensor2 &B) { for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] /= B[i ]; - m_data[i+1] /= B[i+1]; - m_data[i+2] /= B[i+2]; + mData[i ] /= B[i ]; + mData[i+1] /= B[i+1]; + mData[i+2] /= B[i+2]; } return *this; @@ -1857,9 +2166,9 @@ inline tensor2& tensor2::operator+= (const tensor2 &B) { for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] += B[i ]; - m_data[i+1] += B[i+1]; - m_data[i+2] += B[i+2]; + mData[i ] += B[i ]; + mData[i+1] += B[i+1]; + mData[i+2] += B[i+2]; } return *this; @@ -1872,9 +2181,9 @@ inline tensor2& tensor2::operator-= (const tensor2 &B) { for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] -= B[i ]; - m_data[i+1] -= B[i+1]; - m_data[i+2] -= B[i+2]; + mData[i ] -= B[i ]; + mData[i+1] -= B[i+1]; + mData[i+2] -= B[i+2]; } return *this; @@ -1885,12 +2194,12 @@ inline tensor2& tensor2::operator-= (const tensor2 &B) template inline tensor2& tensor2::operator*= (const tensor2s &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; m_data[3] *= B[1]; - m_data[2] *= B[2]; m_data[6] *= B[2]; - m_data[4] *= B[3]; - m_data[5] *= B[4]; m_data[7] *= B[4]; - m_data[8] *= B[5]; + mData[0] *= B[0]; + mData[1] *= B[1]; mData[3] *= B[1]; + mData[2] *= B[2]; mData[6] *= B[2]; + mData[4] *= B[3]; + mData[5] *= B[4]; mData[7] *= B[4]; + mData[8] *= B[5]; return *this; } @@ -1900,12 +2209,12 @@ inline tensor2& tensor2::operator*= (const tensor2s &B) template inline tensor2& tensor2::operator/= (const tensor2s &B) { - m_data[0] /= B[0]; - m_data[1] /= B[1]; m_data[3] /= B[1]; - m_data[2] /= B[2]; m_data[6] /= B[2]; - m_data[4] /= B[3]; - m_data[5] /= B[4]; m_data[7] /= B[4]; - m_data[8] /= B[5]; + mData[0] /= B[0]; + mData[1] /= B[1]; mData[3] /= B[1]; + mData[2] /= B[2]; mData[6] /= B[2]; + mData[4] /= B[3]; + mData[5] /= B[4]; mData[7] /= B[4]; + mData[8] /= B[5]; return *this; } @@ -1915,12 +2224,12 @@ inline tensor2& tensor2::operator/= (const tensor2s &B) template inline tensor2& tensor2::operator+= (const tensor2s &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; m_data[3] += B[1]; - m_data[2] += B[2]; m_data[6] += B[2]; - m_data[4] += B[3]; - m_data[5] += B[4]; m_data[7] += B[4]; - m_data[8] += B[5]; + mData[0] += B[0]; + mData[1] += B[1]; mData[3] += B[1]; + mData[2] += B[2]; mData[6] += B[2]; + mData[4] += B[3]; + mData[5] += B[4]; mData[7] += B[4]; + mData[8] += B[5]; return *this; } @@ -1930,12 +2239,12 @@ inline tensor2& tensor2::operator+= (const tensor2s &B) template inline tensor2& tensor2::operator-= (const tensor2s &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; m_data[3] -= B[1]; - m_data[2] -= B[2]; m_data[6] -= B[2]; - m_data[4] -= B[3]; - m_data[5] -= B[4]; m_data[7] -= B[4]; - m_data[8] -= B[5]; + mData[0] -= B[0]; + mData[1] -= B[1]; mData[3] -= B[1]; + mData[2] -= B[2]; mData[6] -= B[2]; + mData[4] -= B[3]; + mData[5] -= B[4]; mData[7] -= B[4]; + mData[8] -= B[5]; return *this; } @@ -1945,10 +2254,10 @@ inline tensor2& tensor2::operator-= (const tensor2s &B) template inline tensor2& tensor2::operator*= (const tensor2d &B) { - m_data[0] *= B[0]; - m_data[4] *= B[1]; - m_data[8] *= B[2]; - m_data[1] = m_data[2] = m_data[3] = m_data[5] = m_data[6] = m_data[7] = static_cast(0); + mData[0] *= B[0]; + mData[4] *= B[1]; + mData[8] *= B[2]; + mData[1] = mData[2] = mData[3] = mData[5] = mData[6] = mData[7] = static_cast(0); return *this; } @@ -1958,9 +2267,9 @@ inline tensor2& tensor2::operator*= (const tensor2d &B) template inline tensor2& tensor2::operator+= (const tensor2d &B) { - m_data[0] += B[0]; - m_data[4] += B[1]; - m_data[8] += B[2]; + mData[0] += B[0]; + mData[4] += B[1]; + mData[8] += B[2]; return *this; } @@ -1970,9 +2279,9 @@ inline tensor2& tensor2::operator+= (const tensor2d &B) template inline tensor2& tensor2::operator-= (const tensor2d &B) { - m_data[0] -= B[0]; - m_data[4] -= B[1]; - m_data[8] -= B[2]; + mData[0] -= B[0]; + mData[4] -= B[1]; + mData[8] -= B[2]; return *this; } @@ -1984,9 +2293,9 @@ inline tensor2& tensor2::operator*= (const X &B) { for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] *= B; - m_data[i+1] *= B; - m_data[i+2] *= B; + mData[i ] *= B; + mData[i+1] *= B; + mData[i+2] *= B; } return *this; @@ -1999,9 +2308,9 @@ inline tensor2& tensor2::operator/= (const X &B) { for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] /= B; - m_data[i+1] /= B; - m_data[i+2] /= B; + mData[i ] /= B; + mData[i+1] /= B; + mData[i+2] /= B; } return *this; @@ -2014,9 +2323,9 @@ inline tensor2& tensor2::operator+= (const X &B) { for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] += B; - m_data[i+1] += B; - m_data[i+2] += B; + mData[i ] += B; + mData[i+1] += B; + mData[i+2] += B; } return *this; @@ -2029,9 +2338,9 @@ inline tensor2& tensor2::operator-= (const X &B) { for ( size_t i = 0 ; i < 9 ; i += 3 ) { - m_data[i ] -= B; - m_data[i+1] -= B; - m_data[i+2] -= B; + mData[i ] -= B; + mData[i+1] -= B; + mData[i+2] -= B; } return *this; @@ -2044,12 +2353,12 @@ inline tensor2& tensor2::operator-= (const X &B) template inline tensor2s& tensor2s::operator*= (const tensor2s &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; - m_data[2] *= B[2]; - m_data[3] *= B[3]; - m_data[4] *= B[4]; - m_data[5] *= B[5]; + mData[0] *= B[0]; + mData[1] *= B[1]; + mData[2] *= B[2]; + mData[3] *= B[3]; + mData[4] *= B[4]; + mData[5] *= B[5]; return *this; } @@ -2059,12 +2368,12 @@ inline tensor2s& tensor2s::operator*= (const tensor2s &B) template inline tensor2s& tensor2s::operator/= (const tensor2s &B) { - m_data[0] /= B[0]; - m_data[1] /= B[1]; - m_data[2] /= B[2]; - m_data[3] /= B[3]; - m_data[4] /= B[4]; - m_data[5] /= B[5]; + mData[0] /= B[0]; + mData[1] /= B[1]; + mData[2] /= B[2]; + mData[3] /= B[3]; + mData[4] /= B[4]; + mData[5] /= B[5]; return *this; } @@ -2074,12 +2383,12 @@ inline tensor2s& tensor2s::operator/= (const tensor2s &B) template inline tensor2s& tensor2s::operator+= (const tensor2s &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; - m_data[2] += B[2]; - m_data[3] += B[3]; - m_data[4] += B[4]; - m_data[5] += B[5]; + mData[0] += B[0]; + mData[1] += B[1]; + mData[2] += B[2]; + mData[3] += B[3]; + mData[4] += B[4]; + mData[5] += B[5]; return *this; } @@ -2089,12 +2398,12 @@ inline tensor2s& tensor2s::operator+= (const tensor2s &B) template inline tensor2s& tensor2s::operator-= (const tensor2s &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; - m_data[2] -= B[2]; - m_data[3] -= B[3]; - m_data[4] -= B[4]; - m_data[5] -= B[5]; + mData[0] -= B[0]; + mData[1] -= B[1]; + mData[2] -= B[2]; + mData[3] -= B[3]; + mData[4] -= B[4]; + mData[5] -= B[5]; return *this; } @@ -2104,10 +2413,10 @@ inline tensor2s& tensor2s::operator-= (const tensor2s &B) template inline tensor2s& tensor2s::operator*= (const tensor2d &B) { - m_data[0] *= B[0]; - m_data[3] *= B[1]; - m_data[5] *= B[2]; - m_data[1] = m_data[2] = m_data[4] = static_cast(0); + mData[0] *= B[0]; + mData[3] *= B[1]; + mData[5] *= B[2]; + mData[1] = mData[2] = mData[4] = static_cast(0); return *this; } @@ -2117,9 +2426,9 @@ inline tensor2s& tensor2s::operator*= (const tensor2d &B) template inline tensor2s& tensor2s::operator+= (const tensor2d &B) { - m_data[0] += B[0]; - m_data[3] += B[1]; - m_data[5] += B[2]; + mData[0] += B[0]; + mData[3] += B[1]; + mData[5] += B[2]; return *this; } @@ -2129,9 +2438,9 @@ inline tensor2s& tensor2s::operator+= (const tensor2d &B) template inline tensor2s& tensor2s::operator-= (const tensor2d &B) { - m_data[0] -= B[0]; - m_data[3] -= B[1]; - m_data[5] -= B[2]; + mData[0] -= B[0]; + mData[3] -= B[1]; + mData[5] -= B[2]; return *this; } @@ -2141,12 +2450,12 @@ inline tensor2s& tensor2s::operator-= (const tensor2d &B) template inline tensor2s& tensor2s::operator*= (const X &B) { - m_data[0] *= B; - m_data[1] *= B; - m_data[2] *= B; - m_data[3] *= B; - m_data[4] *= B; - m_data[5] *= B; + mData[0] *= B; + mData[1] *= B; + mData[2] *= B; + mData[3] *= B; + mData[4] *= B; + mData[5] *= B; return *this; } @@ -2156,12 +2465,12 @@ inline tensor2s& tensor2s::operator*= (const X &B) template inline tensor2s& tensor2s::operator/= (const X &B) { - m_data[0] /= B; - m_data[1] /= B; - m_data[2] /= B; - m_data[3] /= B; - m_data[4] /= B; - m_data[5] /= B; + mData[0] /= B; + mData[1] /= B; + mData[2] /= B; + mData[3] /= B; + mData[4] /= B; + mData[5] /= B; return *this; } @@ -2171,12 +2480,12 @@ inline tensor2s& tensor2s::operator/= (const X &B) template inline tensor2s& tensor2s::operator+= (const X &B) { - m_data[0] += B; - m_data[1] += B; - m_data[2] += B; - m_data[3] += B; - m_data[4] += B; - m_data[5] += B; + mData[0] += B; + mData[1] += B; + mData[2] += B; + mData[3] += B; + mData[4] += B; + mData[5] += B; return *this; } @@ -2186,12 +2495,12 @@ inline tensor2s& tensor2s::operator+= (const X &B) template inline tensor2s& tensor2s::operator-= (const X &B) { - m_data[0] -= B; - m_data[1] -= B; - m_data[2] -= B; - m_data[3] -= B; - m_data[4] -= B; - m_data[5] -= B; + mData[0] -= B; + mData[1] -= B; + mData[2] -= B; + mData[3] -= B; + mData[4] -= B; + mData[5] -= B; return *this; } @@ -2203,9 +2512,9 @@ inline tensor2s& tensor2s::operator-= (const X &B) template inline tensor2d& tensor2d::operator*= (const tensor2d &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; - m_data[2] *= B[2]; + mData[0] *= B[0]; + mData[1] *= B[1]; + mData[2] *= B[2]; return *this; } @@ -2215,9 +2524,9 @@ inline tensor2d& tensor2d::operator*= (const tensor2d &B) template inline tensor2d& tensor2d::operator+= (const tensor2d &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; - m_data[2] += B[2]; + mData[0] += B[0]; + mData[1] += B[1]; + mData[2] += B[2]; return *this; } @@ -2227,9 +2536,9 @@ inline tensor2d& tensor2d::operator+= (const tensor2d &B) template inline tensor2d& tensor2d::operator-= (const tensor2d &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; - m_data[2] -= B[2]; + mData[0] -= B[0]; + mData[1] -= B[1]; + mData[2] -= B[2]; return *this; } @@ -2239,9 +2548,9 @@ inline tensor2d& tensor2d::operator-= (const tensor2d &B) template inline tensor2d& tensor2d::operator*= (const tensor2 &B) { - m_data[0] *= B[0]; - m_data[1] *= B[4]; - m_data[2] *= B[8]; + mData[0] *= B[0]; + mData[1] *= B[4]; + mData[2] *= B[8]; return *this; } @@ -2251,9 +2560,9 @@ inline tensor2d& tensor2d::operator*= (const tensor2 &B) template inline tensor2d& tensor2d::operator/= (const tensor2 &B) { - m_data[0] /= B[0]; - m_data[1] /= B[4]; - m_data[2] /= B[8]; + mData[0] /= B[0]; + mData[1] /= B[4]; + mData[2] /= B[8]; return *this; } @@ -2263,9 +2572,9 @@ inline tensor2d& tensor2d::operator/= (const tensor2 &B) template inline tensor2d& tensor2d::operator*= (const tensor2s &B) { - m_data[0] *= B[0]; - m_data[1] *= B[3]; - m_data[2] *= B[5]; + mData[0] *= B[0]; + mData[1] *= B[3]; + mData[2] *= B[5]; return *this; } @@ -2275,9 +2584,9 @@ inline tensor2d& tensor2d::operator*= (const tensor2s &B) template inline tensor2d& tensor2d::operator/= (const tensor2s &B) { - m_data[0] /= B[0]; - m_data[1] /= B[3]; - m_data[2] /= B[5]; + mData[0] /= B[0]; + mData[1] /= B[3]; + mData[2] /= B[5]; return *this; } @@ -2287,9 +2596,9 @@ inline tensor2d& tensor2d::operator/= (const tensor2s &B) template inline tensor2d& tensor2d::operator*= (const X &B) { - m_data[0] *= B; - m_data[1] *= B; - m_data[2] *= B; + mData[0] *= B; + mData[1] *= B; + mData[2] *= B; return *this; } @@ -2299,9 +2608,9 @@ inline tensor2d& tensor2d::operator*= (const X &B) template inline tensor2d& tensor2d::operator/= (const X &B) { - m_data[0] /= B; - m_data[1] /= B; - m_data[2] /= B; + mData[0] /= B; + mData[1] /= B; + mData[2] /= B; return *this; } @@ -2311,9 +2620,9 @@ inline tensor2d& tensor2d::operator/= (const X &B) template inline tensor2d& tensor2d::operator+= (const X &B) { - m_data[0] += B; - m_data[1] += B; - m_data[2] += B; + mData[0] += B; + mData[1] += B; + mData[2] += B; return *this; } @@ -2323,9 +2632,9 @@ inline tensor2d& tensor2d::operator+= (const X &B) template inline tensor2d& tensor2d::operator-= (const X &B) { - m_data[0] -= B; - m_data[1] -= B; - m_data[2] -= B; + mData[0] -= B; + mData[1] -= B; + mData[2] -= B; return *this; } @@ -2337,9 +2646,9 @@ inline tensor2d& tensor2d::operator-= (const X &B) template inline vector& vector::operator*= (const vector &B) { - m_data[0] *= B[0]; - m_data[1] *= B[1]; - m_data[2] *= B[2]; + mData[0] *= B[0]; + mData[1] *= B[1]; + mData[2] *= B[2]; return *this; } @@ -2349,9 +2658,9 @@ inline vector& vector::operator*= (const vector &B) template inline vector& vector::operator/= (const vector &B) { - m_data[0] /= B[0]; - m_data[1] /= B[1]; - m_data[2] /= B[2]; + mData[0] /= B[0]; + mData[1] /= B[1]; + mData[2] /= B[2]; return *this; } @@ -2361,9 +2670,9 @@ inline vector& vector::operator/= (const vector &B) template inline vector& vector::operator+= (const vector &B) { - m_data[0] += B[0]; - m_data[1] += B[1]; - m_data[2] += B[2]; + mData[0] += B[0]; + mData[1] += B[1]; + mData[2] += B[2]; return *this; } @@ -2373,9 +2682,9 @@ inline vector& vector::operator+= (const vector &B) template inline vector& vector::operator-= (const vector &B) { - m_data[0] -= B[0]; - m_data[1] -= B[1]; - m_data[2] -= B[2]; + mData[0] -= B[0]; + mData[1] -= B[1]; + mData[2] -= B[2]; return *this; } @@ -2385,9 +2694,9 @@ inline vector& vector::operator-= (const vector &B) template inline vector& vector::operator*= (const X &B) { - m_data[0] *= B; - m_data[1] *= B; - m_data[2] *= B; + mData[0] *= B; + mData[1] *= B; + mData[2] *= B; return *this; } @@ -2397,9 +2706,9 @@ inline vector& vector::operator*= (const X &B) template inline vector& vector::operator/= (const X &B) { - m_data[0] /= B; - m_data[1] /= B; - m_data[2] /= B; + mData[0] /= B; + mData[1] /= B; + mData[2] /= B; return *this; } @@ -2409,9 +2718,9 @@ inline vector& vector::operator/= (const X &B) template inline vector& vector::operator+= (const X &B) { - m_data[0] += B; - m_data[1] += B; - m_data[2] += B; + mData[0] += B; + mData[1] += B; + mData[2] += B; return *this; } @@ -2421,9 +2730,9 @@ inline vector& vector::operator+= (const X &B) template inline vector& vector::operator-= (const X &B) { - m_data[0] -= B; - m_data[1] -= B; - m_data[2] -= B; + mData[0] -= B; + mData[1] -= B; + mData[2] -= B; return *this; } @@ -5713,12 +6022,12 @@ inline tensor4 tensor4::ddot(const tensor4 &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) - for ( size_t m = 0 ; m < 3 ; ++m ) - for ( size_t n = 0 ; n < 3 ; ++n ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + for ( size_t m = 0 ; m < mNd ; ++m ) + for ( size_t n = 0 ; n < mNd ; ++n ) C(i,j,m,n) += (*this)(i,j,k,l) * B(l,k,m,n); return C; @@ -5731,10 +6040,10 @@ inline tensor2 tensor4::ddot(const tensor2 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j) += (*this)(i,j,k,l) * B(l,k); return C; @@ -5747,10 +6056,10 @@ inline tensor2 tensor4::ddot(const tensor2s &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j) += (*this)(i,j,k,l) * B(l,k); return C; @@ -5763,9 +6072,9 @@ inline tensor2 tensor4::ddot(const tensor2d &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,j) += (*this)(i,j,k,k) * B(k,k); return C; @@ -5778,10 +6087,10 @@ inline tensor2 tensor2::ddot(const tensor4 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(k,l) += (*this)(i,j) * B(j,i,k,l); return C; @@ -5794,8 +6103,8 @@ inline X tensor2::ddot(const tensor2 &B) const { X C = static_cast(0); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C += (*this)(i,j) * B(j,i); return C; @@ -5808,8 +6117,8 @@ inline X tensor2::ddot(const tensor2s &B) const { X C = static_cast(0); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C += (*this)(i,j) * B(j,i); return C; @@ -5820,7 +6129,7 @@ inline X tensor2::ddot(const tensor2s &B) const template inline X tensor2::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[4]*B[1] + m_data[8]*B[2]; + return mData[0]*B[0] + mData[4]*B[1] + mData[8]*B[2]; } // ------------------------------------------------------------------------------------------------- @@ -5830,10 +6139,10 @@ inline tensor2 tensor2s::ddot(const tensor4 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(k,l) += (*this)(i,j) * B(j,i,k,l); return C; @@ -5846,8 +6155,8 @@ inline X tensor2s::ddot(const tensor2 &B) const { X C = static_cast(0); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C += (*this)(i,j) * B(j,i); return C; @@ -5860,12 +6169,12 @@ inline X tensor2s::ddot(const tensor2s &B) const { X C; - C = m_data[0] * B[0]; - C += m_data[1] * B[1] * static_cast(2); - C += m_data[2] * B[2] * static_cast(2); - C += m_data[3] * B[3]; - C += m_data[4] * B[4] * static_cast(2); - C += m_data[5] * B[5]; + C = mData[0] * B[0]; + C += mData[1] * B[1] * static_cast(2); + C += mData[2] * B[2] * static_cast(2); + C += mData[3] * B[3]; + C += mData[4] * B[4] * static_cast(2); + C += mData[5] * B[5]; return C; } @@ -5875,7 +6184,7 @@ inline X tensor2s::ddot(const tensor2s &B) const template inline X tensor2s::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[3]*B[1] + m_data[5]*B[2]; + return mData[0]*B[0] + mData[3]*B[1] + mData[5]*B[2]; } // ------------------------------------------------------------------------------------------------- @@ -5885,10 +6194,10 @@ inline tensor2 tensor2d::ddot(const tensor4 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) - C(k,l) += m_data[i]*B(i,i,k,l); + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) + C(k,l) += mData[i]*B(i,i,k,l); return C; } @@ -5898,7 +6207,7 @@ inline tensor2 tensor2d::ddot(const tensor4 &B) const template inline X tensor2d::ddot(const tensor2 &B) const { - return m_data[0]*B[0] + m_data[1]*B[4] + m_data[2]*B[8]; + return mData[0]*B[0] + mData[1]*B[4] + mData[2]*B[8]; } // ------------------------------------------------------------------------------------------------- @@ -5906,7 +6215,7 @@ inline X tensor2d::ddot(const tensor2 &B) const template inline X tensor2d::ddot(const tensor2s &B) const { - return m_data[0]*B[0] + m_data[1]*B[3] + m_data[2]*B[5]; + return mData[0]*B[0] + mData[1]*B[3] + mData[2]*B[5]; } // ------------------------------------------------------------------------------------------------- @@ -5914,7 +6223,7 @@ inline X tensor2d::ddot(const tensor2s &B) const template inline X tensor2d::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[1]*B[1] + m_data[2]*B[2]; + return mData[0]*B[0] + mData[1]*B[1] + mData[2]*B[2]; } @@ -5925,9 +6234,9 @@ inline tensor2 tensor2::dot(const tensor2 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,j) * B(j,k); return C; @@ -5940,9 +6249,9 @@ inline tensor2 tensor2::dot(const tensor2s &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,j) * B(j,k); return C; @@ -5955,8 +6264,8 @@ inline tensor2 tensor2::dot(const tensor2d &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i,j) += (*this)(i,j) * B(j,j); return C; @@ -5969,8 +6278,8 @@ inline vector tensor2::dot(const vector &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i) += (*this)(i,j) * B(j); return C; @@ -5983,9 +6292,9 @@ inline tensor2 tensor2s::dot(const tensor2 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,j) * B(j,k); return C; @@ -5998,9 +6307,9 @@ inline tensor2 tensor2s::dot(const tensor2s &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,j) * B(j,k); return C; @@ -6013,8 +6322,8 @@ inline tensor2 tensor2s::dot(const tensor2d &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i,j) += (*this)(i,j) * B(j,j); return C; @@ -6027,8 +6336,8 @@ inline vector tensor2s::dot(const vector &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i) += (*this)(i,j) * B(j); return C; @@ -6041,8 +6350,8 @@ inline tensor2 tensor2d::dot(const tensor2 &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,i) * B(i,k); return C; @@ -6055,8 +6364,8 @@ inline tensor2 tensor2d::dot(const tensor2s &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,k) += (*this)(i,i) * B(i,k); return C; @@ -6069,7 +6378,7 @@ inline tensor2d tensor2d::dot(const tensor2d &B) const { tensor2d C = tensor2d::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) + for ( size_t i = 0 ; i < mNd ; ++i ) C(i,i) += (*this)(i,i) * B(i,i); return C; @@ -6082,7 +6391,7 @@ inline vector tensor2d::dot(const vector &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) + for ( size_t i = 0 ; i < mNd ; ++i ) C(i) += (*this)(i,i) * B(i); return C; @@ -6095,8 +6404,8 @@ inline vector vector::dot(const tensor2 &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(j) += (*this)(i) * B(i,j); return C; @@ -6109,8 +6418,8 @@ inline vector vector::dot(const tensor2s &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(j) += (*this)(i) * B(i,j); return C; @@ -6123,7 +6432,7 @@ inline vector vector::dot(const tensor2d &B) const { vector C = vector::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) + for ( size_t i = 0 ; i < mNd ; ++i ) C(i) += (*this)(i) * B(i,i); return C; @@ -6136,7 +6445,7 @@ inline X vector::dot(const vector &B) const { X C = static_cast(0); - for ( size_t i = 0 ; i < 3 ; ++i ) + for ( size_t i = 0 ; i < mNd ; ++i ) C += (*this)(i) * B(i); return C; @@ -6149,10 +6458,10 @@ inline tensor4 tensor2::dyadic(const tensor2 &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; @@ -6165,10 +6474,10 @@ inline tensor4 tensor2::dyadic(const tensor2s &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; @@ -6181,9 +6490,9 @@ inline tensor4 tensor2::dyadic(const tensor2d &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,j,k,k) += (*this)(i,j) * B(k,k); return C; @@ -6196,10 +6505,10 @@ inline tensor4 tensor2s::dyadic(const tensor2 &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; @@ -6212,10 +6521,10 @@ inline tensor4 tensor2s::dyadic(const tensor2s &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,k,l) += (*this)(i,j) * B(k,l); return C; @@ -6228,9 +6537,9 @@ inline tensor4 tensor2s::dyadic(const tensor2d &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,j,k,k) += (*this)(i,j) * B(k,k); return C; @@ -6243,9 +6552,9 @@ inline tensor4 tensor2d::dyadic(const tensor2 &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,i,k,l) += (*this)(i,i) * B(k,l); return C; @@ -6258,9 +6567,9 @@ inline tensor4 tensor2d::dyadic(const tensor2s &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,i,k,l) += (*this)(i,i) * B(k,l); return C; @@ -6273,8 +6582,8 @@ inline tensor4 tensor2d::dyadic(const tensor2d &B) const { tensor4 C = tensor4::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t k = 0 ; k < 3 ; ++k ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t k = 0 ; k < mNd ; ++k ) C(i,i,k,k) += (*this)(i,i) * B(k,k); return C; @@ -6287,8 +6596,8 @@ inline tensor2 vector::dyadic(const vector &B) const { tensor2 C = tensor2::Zero(); - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) C(i,j) += (*this)(i) * B(j); return C; @@ -6301,9 +6610,9 @@ inline vector vector::cross(const vector &B) const { vector C; - C[0] = m_data[1]*B[2]-B[1]*m_data[2] ; - C[1] = static_cast(-1)*(m_data[0]*B[2]-B[0]*m_data[2]); - C[2] = m_data[0]*B[1]-B[0]*m_data[1] ; + C[0] = mData[1]*B[2]-B[1]*mData[2] ; + C[1] = static_cast(-1)*(mData[0]*B[2]-B[0]*mData[2]); + C[2] = mData[0]*B[1]-B[0]*mData[1] ; return C; } @@ -6661,10 +6970,10 @@ inline tensor4 tensor4::T() const { tensor4 C; - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(l,k,j,i) = (*this)(i,j,k,l); return C; @@ -6677,10 +6986,10 @@ inline tensor4 tensor4::RT() const { tensor4 C; - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(i,j,l,k) = (*this)(i,j,k,l); return C; @@ -6693,10 +7002,10 @@ inline tensor4 tensor4::LT() const { tensor4 C; - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) C(j,i,k,l) = (*this)(i,j,k,l); return C; @@ -6709,15 +7018,15 @@ inline tensor2 tensor2::T() const { tensor2 C; - C[0] = m_data[0]; - C[3] = m_data[1]; - C[6] = m_data[2]; - C[1] = m_data[3]; - C[4] = m_data[4]; - C[7] = m_data[5]; - C[2] = m_data[6]; - C[5] = m_data[7]; - C[8] = m_data[8]; + C[0] = mData[0]; + C[3] = mData[1]; + C[6] = mData[2]; + C[1] = mData[3]; + C[4] = mData[4]; + C[7] = mData[5]; + C[2] = mData[6]; + C[5] = mData[7]; + C[8] = mData[8]; return C; } @@ -6729,12 +7038,12 @@ inline tensor2s tensor2s::T() const { tensor2s C; - C[0] = m_data[0]; - C[1] = m_data[1]; - C[2] = m_data[2]; - C[3] = m_data[3]; - C[4] = m_data[4]; - C[5] = m_data[5]; + C[0] = mData[0]; + C[1] = mData[1]; + C[2] = mData[2]; + C[3] = mData[3]; + C[4] = mData[4]; + C[5] = mData[5]; return C; } @@ -6746,9 +7055,9 @@ inline tensor2d tensor2d::T() const { tensor2d C; - C[0] = m_data[0]; - C[1] = m_data[1]; - C[2] = m_data[2]; + C[0] = mData[0]; + C[1] = mData[1]; + C[2] = mData[2]; return C; } @@ -6808,7 +7117,7 @@ inline tensor4 transposeL(const tensor4 &A) template inline X tensor2::trace() const { - return m_data[0] + m_data[4] + m_data[8]; + return mData[0] + mData[4] + mData[8]; } // ------------------------------------------------------------------------------------------------- @@ -6816,7 +7125,7 @@ inline X tensor2::trace() const template inline X tensor2s::trace() const { - return m_data[0] + m_data[3] + m_data[5]; + return mData[0] + mData[3] + mData[5]; } // ------------------------------------------------------------------------------------------------- @@ -6824,7 +7133,7 @@ inline X tensor2s::trace() const template inline X tensor2d::trace() const { - return m_data[0] + m_data[1] + m_data[2]; + return mData[0] + mData[1] + mData[2]; } // ------------------------------------------------------------------------------------------------- @@ -6832,12 +7141,12 @@ inline X tensor2d::trace() const template inline X tensor2::det() const { - return ( m_data[0] * m_data[4] * m_data[8] + - m_data[1] * m_data[5] * m_data[6] + - m_data[2] * m_data[3] * m_data[7] ) - - ( m_data[2] * m_data[4] * m_data[6] + - m_data[1] * m_data[3] * m_data[8] + - m_data[0] * m_data[5] * m_data[7] ); + return ( mData[0] * mData[4] * mData[8] + + mData[1] * mData[5] * mData[6] + + mData[2] * mData[3] * mData[7] ) - + ( mData[2] * mData[4] * mData[6] + + mData[1] * mData[3] * mData[8] + + mData[0] * mData[5] * mData[7] ); } // ------------------------------------------------------------------------------------------------- @@ -6845,11 +7154,11 @@ inline X tensor2::det() const template inline X tensor2s::det() const { - return ( m_data[0] * m_data[3] * m_data[5] + - static_cast(2) * m_data[1] * m_data[2] * m_data[4] ) - - ( m_data[4] * m_data[4] * m_data[0] + - m_data[2] * m_data[2] * m_data[3] + - m_data[1] * m_data[1] * m_data[5] ); + return ( mData[0] * mData[3] * mData[5] + + static_cast(2) * mData[1] * mData[2] * mData[4] ) - + ( mData[4] * mData[4] * mData[0] + + mData[2] * mData[2] * mData[3] + + mData[1] * mData[1] * mData[5] ); } // ------------------------------------------------------------------------------------------------- @@ -6857,7 +7166,7 @@ inline X tensor2s::det() const template inline X tensor2d::det() const { - return m_data[0] * m_data[1] * m_data[2]; + return mData[0] * mData[1] * mData[2]; } // ------------------------------------------------------------------------------------------------- @@ -6871,15 +7180,15 @@ inline tensor2 tensor2::inv() const // allocate result tensor2 C; - C[0] = (m_data[4]*m_data[8]-m_data[5]*m_data[7]) / D; - C[1] = (m_data[2]*m_data[7]-m_data[1]*m_data[8]) / D; - C[2] = (m_data[1]*m_data[5]-m_data[2]*m_data[4]) / D; - C[3] = (m_data[5]*m_data[6]-m_data[3]*m_data[8]) / D; - C[4] = (m_data[0]*m_data[8]-m_data[2]*m_data[6]) / D; - C[5] = (m_data[2]*m_data[3]-m_data[0]*m_data[5]) / D; - C[6] = (m_data[3]*m_data[7]-m_data[4]*m_data[6]) / D; - C[7] = (m_data[1]*m_data[6]-m_data[0]*m_data[7]) / D; - C[8] = (m_data[0]*m_data[4]-m_data[1]*m_data[3]) / D; + C[0] = (mData[4]*mData[8]-mData[5]*mData[7]) / D; + C[1] = (mData[2]*mData[7]-mData[1]*mData[8]) / D; + C[2] = (mData[1]*mData[5]-mData[2]*mData[4]) / D; + C[3] = (mData[5]*mData[6]-mData[3]*mData[8]) / D; + C[4] = (mData[0]*mData[8]-mData[2]*mData[6]) / D; + C[5] = (mData[2]*mData[3]-mData[0]*mData[5]) / D; + C[6] = (mData[3]*mData[7]-mData[4]*mData[6]) / D; + C[7] = (mData[1]*mData[6]-mData[0]*mData[7]) / D; + C[8] = (mData[0]*mData[4]-mData[1]*mData[3]) / D; return C; } @@ -6894,12 +7203,12 @@ inline tensor2s tensor2s::inv() const // allocate result tensor2s C; - C[0] = (m_data[3]*m_data[5]-m_data[4]*m_data[4]) / D; - C[1] = (m_data[2]*m_data[4]-m_data[1]*m_data[5]) / D; - C[2] = (m_data[1]*m_data[4]-m_data[2]*m_data[3]) / D; - C[3] = (m_data[0]*m_data[5]-m_data[2]*m_data[2]) / D; - C[4] = (m_data[2]*m_data[1]-m_data[0]*m_data[4]) / D; - C[5] = (m_data[0]*m_data[3]-m_data[1]*m_data[1]) / D; + C[0] = (mData[3]*mData[5]-mData[4]*mData[4]) / D; + C[1] = (mData[2]*mData[4]-mData[1]*mData[5]) / D; + C[2] = (mData[1]*mData[4]-mData[2]*mData[3]) / D; + C[3] = (mData[0]*mData[5]-mData[2]*mData[2]) / D; + C[4] = (mData[2]*mData[1]-mData[0]*mData[4]) / D; + C[5] = (mData[0]*mData[3]-mData[1]*mData[1]) / D; return C; } @@ -6911,9 +7220,9 @@ inline tensor2d tensor2d::inv() const // allocate result tensor2d C; - C[0] = static_cast(1) / m_data[0]; - C[1] = static_cast(1) / m_data[1]; - C[2] = static_cast(1) / m_data[2]; + C[0] = static_cast(1) / mData[0]; + C[1] = static_cast(1) / mData[1]; + C[2] = static_cast(1) / mData[2]; return C; } @@ -6997,8 +7306,8 @@ inline X trace(const tensor2d &A) template inline bool tensor4::operator== (const tensor4 &B) const { - for ( size_t i = 0 ; i < 81 ; ++i ) - if ( m_data[i] != B[i] ) + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] != B[i] ) return false; return true; @@ -7009,8 +7318,8 @@ inline bool tensor4::operator== (const tensor4 &B) const template inline bool tensor2::operator== (const tensor2 &B) const { - for ( size_t i = 0 ; i < 9 ; ++i ) - if ( m_data[i] != B[i] ) + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] != B[i] ) return false; return true; @@ -7021,9 +7330,9 @@ inline bool tensor2::operator== (const tensor2 &B) const template inline bool tensor2::operator== (const tensor2s &B) const { - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - if ( m_data[i*3+j] != B(i,j) ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + if ( mData[i*3+j] != B(i,j) ) return false; return true; @@ -7034,9 +7343,9 @@ inline bool tensor2::operator== (const tensor2s &B) const template inline bool tensor2::operator== (const tensor2d &B) const { - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - if ( m_data[i*3+j] != B(i,j) ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + if ( mData[i*3+j] != B(i,j) ) return false; return true; @@ -7047,12 +7356,12 @@ inline bool tensor2::operator== (const tensor2d &B) const template inline bool tensor2s::operator== (const tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; - if ( m_data[3] != B[3] ) return false; - if ( m_data[4] != B[4] ) return false; - if ( m_data[5] != B[5] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; + if ( mData[3] != B[3] ) return false; + if ( mData[4] != B[4] ) return false; + if ( mData[5] != B[5] ) return false; return true; } @@ -7062,10 +7371,10 @@ inline bool tensor2s::operator== (const tensor2s &B) const template inline bool tensor2s::operator== (const tensor2 &B) const { - for ( size_t i = 0 ; i < 3 ; ++i ) { - for ( size_t j = i ; j < 3 ; ++j ) { - if ( m_data[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; - if ( m_data[i*3-(i-1)*i/2+j-i] != B(j,i) ) return false; + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = i ; j < mNd ; ++j ) { + if ( mData[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; + if ( mData[i*3-(i-1)*i/2+j-i] != B(j,i) ) return false; } } @@ -7077,9 +7386,9 @@ inline bool tensor2s::operator== (const tensor2 &B) const template inline bool tensor2s::operator== (const tensor2d &B) const { - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = i ; j < 3 ; ++j ) - if ( m_data[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i ; j < mNd ; ++j ) + if ( mData[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; return true; } @@ -7089,9 +7398,9 @@ inline bool tensor2s::operator== (const tensor2d &B) const template inline bool tensor2d::operator== (const tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -7101,10 +7410,10 @@ inline bool tensor2d::operator== (const tensor2d &B) const template inline bool tensor2d::operator== (const tensor2 &B) const { - for ( size_t i = 0 ; i < 3 ; ++i ) { - for ( size_t j = 0 ; j < 3 ; ++j ) { - if ( i == j ) { if ( m_data[i] != B(i,i) ) return false; } - else { if ( B(i,j) ) return false; } + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = 0 ; j < mNd ; ++j ) { + if ( i == j ) { if ( mData[i] != B(i,i) ) return false; } + else { if ( B(i,j) ) return false; } } } @@ -7116,10 +7425,10 @@ inline bool tensor2d::operator== (const tensor2 &B) const template inline bool tensor2d::operator== (const tensor2s &B) const { - for ( size_t i = 0 ; i < 3 ; ++i ) { - for ( size_t j = i ; j < 3 ; ++j ) { - if ( i == j ) { if ( m_data[i] != B(i,i) ) return false; } - else { if ( B(i,j) ) return false; } + for ( size_t i = 0 ; i < mNd ; ++i ) { + for ( size_t j = i ; j < mNd ; ++j ) { + if ( i == j ) { if ( mData[i] != B(i,i) ) return false; } + else { if ( B(i,j) ) return false; } } } @@ -7131,9 +7440,9 @@ inline bool tensor2d::operator== (const tensor2s &B) const template inline bool vector::operator== (const vector &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -7144,9 +7453,9 @@ inline bool vector::operator== (const vector &B) const template inline bool tensor2::issymmetric() const { - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = i+1 ; j < 3 ; ++j ) - if ( m_data[i*3+j] != m_data[j*3+i] ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i+1 ; j < mNd ; ++j ) + if ( mData[i*3+j] != mData[j*3+i] ) return false; return true; @@ -7157,10 +7466,10 @@ inline bool tensor2::issymmetric() const template inline bool tensor2::isdiagonal() const { - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) if ( i != j ) - if ( m_data[i*3+j] ) + if ( mData[i*3+j] ) return false; return true; @@ -7171,16 +7480,434 @@ inline bool tensor2::isdiagonal() const template inline bool tensor2s::isdiagonal() const { - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = i+1 ; j < 3 ; ++j ) - if ( m_data[i*3-(i-1)*i/2+j-i] ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = i+1 ; j < mNd ; ++j ) + if ( mData[i*3-(i-1)*i/2+j-i] ) return false; return true; } // ================================================================================================= -// basic algebra +// basic algebra: absolute value +// ================================================================================================= + +template +inline void tensor4::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void tensor2::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void tensor2s::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void tensor2d::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline void vector::abs() +{ + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] = std::abs(mData[i]); +} + +// ================================================================================================= +// basic algebra: location of the minimum +// ================================================================================================= + +template +inline std::vector tensor4::argmin() const +{ + return decompress( std::min_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2::argmin() const +{ + return decompress( std::min_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2s::argmin() const +{ + return decompress( std::min_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2d::argmin() const +{ + size_t i = std::min_element(begin(),end()) - begin(); + + std::vector out(mNd); + + std::fill(out.begin(), out.end(), i); + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector vector::argmin() const +{ + return decompress( std::min_element(begin(),end()) - begin() ); +} + +// ================================================================================================= +// basic algebra: location of the maximum +// ================================================================================================= + +template +inline std::vector tensor4::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2s::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector tensor2d::argmax() const +{ + size_t i = std::max_element(begin(),end()) - begin(); + + std::vector out(mNd); + + std::fill(out.begin(), out.end(), i); + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector vector::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ================================================================================================= +// basic algebra: minimum +// ================================================================================================= + +template +inline X tensor4::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2s::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2d::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X vector::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ================================================================================================= +// basic algebra: maximum +// ================================================================================================= + +template +inline X tensor4::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2s::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2d::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X vector::maxCoeff() const +{ + return *std::max_element(begin(),end()); +} + +// ================================================================================================= +// basic algebra: sum +// ================================================================================================= + +template +inline X tensor4::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2s::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X tensor2d::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline X vector::sum() const +{ + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; + + return out; +} + +// ================================================================================================= +// basic algebra: mean +// ================================================================================================= + +template +inline double tensor4::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2s::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2d::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double vector::mean() const +{ + return static_cast(this->sum())/static_cast(mSize); +} + +// ================================================================================================= +// basic algebra: weighted average +// ================================================================================================= + +template +inline double tensor4::average(const tensor4 &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2::average(const tensor2 &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2s::average(const tensor2s &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double tensor2d::average(const tensor2d &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ------------------------------------------------------------------------------------------------- + +template +inline double vector::average(const vector &weights, bool norm) const +{ + assert( mNd = weights.ndim() ); + + X out = static_cast(0); + + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ================================================================================================= +// basic algebra: norm // ================================================================================================= template @@ -7190,9 +7917,9 @@ inline X tensor4::norm() const for ( size_t i = 0 ; i < 81 ; i += 3 ) { - C += std::abs(m_data[i ]); - C += std::abs(m_data[i+1]); - C += std::abs(m_data[i+2]); + C += std::abs(mData[i ]); + C += std::abs(mData[i+1]); + C += std::abs(mData[i+2]); } return C; @@ -7207,9 +7934,9 @@ inline X tensor2::norm() const for ( size_t i = 0 ; i < 9 ; i += 3 ) { - C += std::abs(m_data[i ]); - C += std::abs(m_data[i+1]); - C += std::abs(m_data[i+2]); + C += std::abs(mData[i ]); + C += std::abs(mData[i+1]); + C += std::abs(mData[i+2]); } return C; @@ -7222,12 +7949,12 @@ inline X tensor2s::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); - C += std::abs(m_data[3]); - C += std::abs(m_data[4]); - C += std::abs(m_data[5]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); + C += std::abs(mData[3]); + C += std::abs(mData[4]); + C += std::abs(mData[5]); return C; } @@ -7239,9 +7966,9 @@ inline X tensor2d::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); return C; } @@ -7253,23 +7980,25 @@ inline X vector::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); return C; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra: length +// ================================================================================================= template inline X vector::length() const { X C; - C = std::pow(m_data[0],2.); - C += std::pow(m_data[1],2.); - C += std::pow(m_data[2],2.); + C = std::pow(mData[0],2.); + C += std::pow(mData[1],2.); + C += std::pow(mData[2],2.); return std::sqrt(C); } @@ -7283,9 +8012,9 @@ inline void vector::setUnitLength() if ( C <= static_cast(0) ) return; - m_data[0] /= C; - m_data[1] /= C; - m_data[2] /= C; + mData[0] /= C; + mData[1] /= C; + mData[2] /= C; } // ================================================================================================= @@ -7295,13 +8024,13 @@ inline void vector::setUnitLength() template inline void tensor4::printf(std::string fmt) const { - std::string gmt = std::to_string(std::to_string(3).size()); + std::string gmt = std::to_string(std::to_string(mNd).size()); fmt = "(%"+gmt+"d,%"+gmt+"d,%"+gmt+"d,%"+gmt+"d) "+fmt+"\n"; - for ( size_t i = 0 ; i < 3 ; ++i ) - for ( size_t j = 0 ; j < 3 ; ++j ) - for ( size_t k = 0 ; k < 3 ; ++k ) - for ( size_t l = 0 ; l < 3 ; ++l ) + for ( size_t i = 0 ; i < mNd ; ++i ) + for ( size_t j = 0 ; j < mNd ; ++j ) + for ( size_t k = 0 ; k < mNd ; ++k ) + for ( size_t l = 0 ; l < mNd ; ++l ) std::printf(fmt.c_str(), i, j, k, l, (*this)(i,j,k,l) ); } @@ -7340,7 +8069,7 @@ inline void tensor2d::printf(std::string fmt) const template inline void vector::printf(std::string fmt) const { - std::printf((fmt + "," + fmt + "," + fmt + "\n").c_str(), m_data[0], m_data[1], m_data[2]); + std::printf((fmt + "," + fmt + "," + fmt + "\n").c_str(), mData[0], mData[1], mData[2]); } // ------------------------------------------------------------------------------------------------- diff --git a/src/cppmat/tensor3.h b/src/cppmat/tensor3.h index 865b258..6d3139b 100644 --- a/src/cppmat/tensor3.h +++ b/src/cppmat/tensor3.h @@ -31,12 +31,14 @@ class tensor4 { private: - X m_data[81]; // data container + X mData[81]; // data container + static const size_t mNd=3; // number of dimensions (rank == 4 -> shape == [mNd,mNd,mNd,mNd]) + static const size_t mSize=81; // == mData.size() == mNd*mNd*mNd*mNd public: // constructor - tensor4(){}; + tensor4() = default; // constructor: initialize static tensor4 Arange(); @@ -70,16 +72,30 @@ class tensor4 X& operator()(size_t i, size_t j, size_t k, size_t l); const X& operator()(size_t i, size_t j, size_t k, size_t l) const; + // index operators: plain storage -> array-indices (i -> a,b,c,d) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b,c,d -> i) + size_t compress(size_t a, size_t b, size_t c, size_t d) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b, size_t c, size_t d); + auto item(size_t a, size_t b, size_t c, size_t d) const; + // basic initialization void setArange(); void setZero(); @@ -116,7 +132,23 @@ class tensor4 bool operator== (const tensor4 &B) const; // A_ijkl == B_ijkl // basic algebra - X norm() const; // sum(| A_ijkl |) + // - tensor norm: sum(| A_ijkl |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor4 &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -132,12 +164,14 @@ class tensor2 { private: - X m_data[9]; // data container + X mData[9]; // data container + static const size_t mNd=3; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + static const size_t mSize=9; // == mData.size() == mNd*mNd public: // constructor - tensor2(){}; + tensor2() = default; // constructor: initialize static tensor2 Arange(); @@ -170,16 +204,30 @@ class tensor2 X& operator()(size_t i, size_t j); const X& operator()(size_t i, size_t j) const; + // index operators: plain storage -> array-indices (i -> a,b) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b -> i) + size_t compress(size_t a, size_t b) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b); + auto item(size_t a, size_t b) const; + // basic initialization void setArange(); void setZero(); @@ -233,7 +281,23 @@ class tensor2 bool isdiagonal() const; // A_ij == 0, i != j // basic algebra - X norm() const; // sum(| A_ij |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2 &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -249,12 +313,14 @@ class tensor2s { private: - X m_data[6]; // data container + X mData[6]; // data container + static const size_t mNd=3; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + static const size_t mSize=6; // == mData.size() == (mNd+1)*mNd/2 public: // constructor - tensor2s(){}; + tensor2s() = default; // constructor: initialize static tensor2s Arange(); @@ -291,16 +357,30 @@ class tensor2s X& operator()(size_t i, size_t j); const X& operator()(size_t i, size_t j) const; + // index operators: plain storage -> array-indices (i -> a,b) + std::vector decompress(size_t i) const; + + // index operators: array-indices -> plain storage (a,b -> i) + size_t compress(size_t a, size_t b) const; + // pointer to data X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a, size_t b); + auto item(size_t a, size_t b) const; + // basic initialization void setArange(); void setZero(); @@ -351,7 +431,23 @@ class tensor2s bool isdiagonal() const; // A_ij == 0, i != j // basic algebra - X norm() const; // sum(| A_ij |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2s &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -367,8 +463,10 @@ class tensor2d { private: - X m_data[3]; // data container - X m_zero[1]; // dummy parameter, used to return "0" for any off-diagonal entry + X mData[3]; // data container + static const size_t mNd=3; // number of dimensions (rank == 2 -> shape == [mNd,mNd]) + static const size_t mSize=3; // == mData.size() == mNd + X mZero[1]; // dummy parameter, used to return "0" for any off-diagonal entry public: @@ -415,12 +513,16 @@ class tensor2d X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + // basic initialization void setArange(); void setZero(); @@ -468,7 +570,23 @@ class tensor2d bool operator== (const tensor2d &B) const; // A_ij == B_ij // basic algebra - X norm() const; // sum(| A_ii |) + // - tensor norm: sum(| A_ij |) + X norm() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const tensor2d &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -484,12 +602,14 @@ class vector { private: - X m_data[3]; // data container + X mData[3]; // data container + static const size_t mNd=3; // number of dimensions (rank == 1 -> shape == [mNd]) + static const size_t mSize=3; // == mData.size() == mNd public: // constructor - vector(){}; + vector() = default; // constructor: initialize static vector Arange(); @@ -522,12 +642,20 @@ class vector X* data(); const X* data() const; - // iterators + // iterator to first and last entry auto begin(); auto begin() const; auto end(); auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i); + auto index(size_t i) const; + + // iterator to specific entry: access using array-indices + auto item(size_t a); + auto item(size_t a) const; + // basic initialization void setArange(); void setZero(); @@ -558,9 +686,27 @@ class vector bool operator== (const vector &B) const; // A_i == B_i // basic algebra - X norm() const; // sum(| A_i |) - X length() const; // sqrt(sum(pow(A_i,2.))) - void setUnitLength(); // A_i /= A.length() + // - vector norm: sum(| A_ij |) + X norm() const; + // - vector length: sqrt(sum(pow(A_i,2.))) + X length() const; + // - set vector length to unity: A_i /= A.length() + void setUnitLength(); + // - absolute value + void abs(); + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean + double mean() const; + // - weighted average + double average(const vector &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; diff --git a/src/cppmat/tiny_matrix.cpp b/src/cppmat/tiny_matrix.cpp index c0aa268..866a55f 100644 --- a/src/cppmat/tiny_matrix.cpp +++ b/src/cppmat/tiny_matrix.cpp @@ -20,11 +20,11 @@ namespace tiny { // constructors // ================================================================================================= -template -inline matrix matrix::Arange() +template +inline matrix matrix::Arange() { // call basic constructor - matrix out; + matrix out; // initialize out.setArange(); @@ -34,11 +34,11 @@ inline matrix matrix::Arange() // ------------------------------------------------------------------------------------------------- -template -inline matrix matrix::Zero() +template +inline matrix matrix::Zero() { // call basic constructor - matrix out; + matrix out; // initialize out.setZero(); @@ -48,11 +48,11 @@ inline matrix matrix::Zero() // ------------------------------------------------------------------------------------------------- -template -inline matrix matrix::Ones() +template +inline matrix matrix::Ones() { // call basic constructor - matrix out; + matrix out; // initialize out.setOnes(); @@ -62,11 +62,11 @@ inline matrix matrix::Ones() // ------------------------------------------------------------------------------------------------- -template -inline matrix matrix::Constant(X D) +template +inline matrix matrix::Constant(X D) { // call basic constructor - matrix out; + matrix out; // initialize out.setConstant(D); @@ -76,12 +76,12 @@ inline matrix matrix::Constant(X D) // ------------------------------------------------------------------------------------------------- -template +template template -inline matrix matrix::Copy(Iterator first) +inline matrix matrix::Copy(Iterator first) { // call basic constructor - matrix out; + matrix out; // initialize out.setCopy(first); @@ -91,12 +91,12 @@ inline matrix matrix::Copy(Iterator first) // ------------------------------------------------------------------------------------------------- -template +template template -inline matrix matrix::Copy(Iterator first, Iterator last) +inline matrix matrix::Copy(Iterator first, Iterator last) { // call basic constructor - matrix out; + matrix out; // initialize out.setCopy(first,last); @@ -106,50 +106,50 @@ inline matrix matrix::Copy(Iterator first, Iterator last) // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::Size() +template +inline size_t matrix::Size() { - return m*n; + return M*N; } // ================================================================================================= // get dimensions // ================================================================================================= -template -inline size_t matrix::size() const +template +inline size_t matrix::size() const { - return m*n; + return mSize; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::ndim() const +template +inline size_t matrix::ndim() const { return 2; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::rows() const +template +inline size_t matrix::rows() const { - return m; + return M; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::cols() const +template +inline size_t matrix::cols() const { - return n; + return N; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::shape(int i) const +template +inline size_t matrix::shape(int i) const { // check axis: (0,1) or (-1,-2) assert( i < 2 ); @@ -159,44 +159,44 @@ inline size_t matrix::shape(int i) const i = ( 2 + (i%2) ) % 2; // return shape - if ( i == 0 ) return m; - else return n; + if ( i == 0 ) return M; + else return N; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::shape(size_t i) const +template +inline size_t matrix::shape(size_t i) const { // check axis: (0,1) assert( i < 2 ); // return shape - if ( i == 0 ) return m; - else return n; + if ( i == 0 ) return M; + else return N; } // ------------------------------------------------------------------------------------------------- -template -inline std::vector matrix::shape() const +template +inline std::vector matrix::shape() const { std::vector ret(2); - ret[0] = m; - ret[1] = n; + ret[0] = M; + ret[1] = N; return ret; } // ------------------------------------------------------------------------------------------------- -template -inline std::vector matrix::strides(bool bytes) const +template +inline std::vector matrix::strides(bool bytes) const { std::vector ret(2); - ret[0] = n; + ret[0] = N; ret[1] = 1; if ( bytes ) { @@ -211,75 +211,75 @@ inline std::vector matrix::strides(bool bytes) const // index operators : operator[...] // ================================================================================================= -template -inline X& matrix::operator[](size_t i) +template +inline X& matrix::operator[](size_t i) { - assert( i < m*n ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- -template -inline const X& matrix::operator[](size_t i) const +template +inline const X& matrix::operator[](size_t i) const { - assert( i < m*n ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ================================================================================================= // index operators : operator(...) // ================================================================================================= -template -inline X& matrix::operator()(size_t a) +template +inline X& matrix::operator()(size_t a) { - assert( a < m ); + assert( a < M ); - return m_data[a*n]; + return mData[a*N]; } // ------------------------------------------------------------------------------------------------- -template -inline const X& matrix::operator()(size_t a) const +template +inline const X& matrix::operator()(size_t a) const { - assert( a < m ); + assert( a < M ); - return m_data[a*n]; + return mData[a*N]; } // ------------------------------------------------------------------------------------------------- -template -inline X& matrix::operator()(size_t a, size_t b) +template +inline X& matrix::operator()(size_t a, size_t b) { - assert( a < m ); - assert( b < n ); + assert( a < M ); + assert( b < N ); - return m_data[a*n+b]; + return mData[a*N+b]; } // ------------------------------------------------------------------------------------------------- -template -inline const X& matrix::operator()(size_t a, size_t b) const +template +inline const X& matrix::operator()(size_t a, size_t b) const { - assert( a < m ); - assert( b < n ); + assert( a < M ); + assert( b < N ); - return m_data[a*n+b]; + return mData[a*N+b]; } // ================================================================================================= // index operators : at(...) // ================================================================================================= -template +template template -inline X& matrix::at(Iterator first, Iterator last) +inline X& matrix::at(Iterator first, Iterator last) { // check input assert( last-first > 0 ); @@ -295,14 +295,14 @@ inline X& matrix::at(Iterator first, Iterator last) // optional index if ( last-first == 2 ) b = first[1]; - return m_data[a*n+b]; + return mData[a*N+b]; } // ------------------------------------------------------------------------------------------------- -template +template template -inline const X& matrix::at(Iterator first, Iterator last) const +inline const X& matrix::at(Iterator first, Iterator last) const { // check input assert( last-first > 0 ); @@ -318,48 +318,48 @@ inline const X& matrix::at(Iterator first, Iterator last) const // optional index if ( last-first == 2 ) b = first[1]; - return m_data[a*n+b]; + return mData[a*N+b]; } // ================================================================================================= // index operators : compress(...) // ================================================================================================= -template -inline size_t matrix::compress(size_t a) const +template +inline size_t matrix::compress(size_t a) const { - assert( a < m ); + assert( a < M ); - return a*n; + return a*N; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::compress(size_t a, size_t b) const +template +inline size_t matrix::compress(size_t a, size_t b) const { - assert( a < m ); - assert( b < n ); + assert( a < M ); + assert( b < N ); - return a*n+b; + return a*N+b; } // ================================================================================================= // index operators : decompress(...) // ================================================================================================= -template -inline std::vector matrix::decompress(size_t i) const +template +inline std::vector matrix::decompress(size_t i) const { // check input - assert( i < m*n ); + assert( i < mSize ); // allocate array-index std::vector idx(2); // reconstruct - idx[1] = i % n; - idx[0] = ( i - idx[1] ) / n; + idx[1] = i % N; + idx[0] = ( i - idx[1] ) / N; return idx; } @@ -368,315 +368,312 @@ inline std::vector matrix::decompress(size_t i) const // pointer to data // ================================================================================================= -template -inline X* matrix::data() +template +inline X* matrix::data() { - return std::begin(m_data); + return std::begin(mData); } // ------------------------------------------------------------------------------------------------- -template -inline const X* matrix::data() const +template +inline const X* matrix::data() const { - return std::begin(m_data); + return std::begin(mData); } // ================================================================================================= // iterators : begin() and end() // ================================================================================================= -template -inline auto matrix::begin() +template +inline auto matrix::begin() { - return std::begin(m_data); + return std::begin(mData); } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::begin() const +template +inline auto matrix::begin() const { - return std::begin(m_data); + return std::begin(mData); } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::end() +template +inline auto matrix::end() { - return std::begin(m_data) + m*n; + return std::begin(mData) + mSize; } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::end() const +template +inline auto matrix::end() const { - return std::begin(m_data) + m*n; + return std::begin(mData) + mSize; } // ================================================================================================= // iterators : beginRow() and endRow() // ================================================================================================= -template -inline auto matrix::beginRow(size_t a) +template +inline auto matrix::beginRow(size_t a) { - assert( a < m ); + assert( a < M ); - return std::begin(m_data) + a*n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::beginRow(size_t a) const +template +inline auto matrix::beginRow(size_t a) const { - assert( a < m ); + assert( a < M ); - return std::begin(m_data) + a*n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::endRow(size_t a) +template +inline auto matrix::endRow(size_t a) { - assert( a < m ); + assert( a < M ); - return std::begin(m_data) + (a+1)*n; + return begin() + (a+1)*N; } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::endRow(size_t a) const +template +inline auto matrix::endRow(size_t a) const { - assert( a < m ); + assert( a < M ); - return std::begin(m_data) + (a+1)*n; + return begin() + (a+1)*N; } // ================================================================================================= // iterators : index() // ================================================================================================= -template -inline auto matrix::index(size_t i) +template +inline auto matrix::index(size_t i) { - assert( i < m*n ); + assert( i < mSize ); - return std::begin(m_data) + i; + return begin() + i; } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::index(size_t i) const +template +inline auto matrix::index(size_t i) const { - assert( i < m*n ); + assert( i < mSize ); - return std::begin(m_data) + i; + return begin() + i; } // ================================================================================================= // iterators : item() // ================================================================================================= -template -inline auto matrix::item(size_t a) +template +inline auto matrix::item(size_t a) { - assert( a < m ); + assert( a < M ); - return std::begin(m_data) + a*n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::item(size_t a) const +template +inline auto matrix::item(size_t a) const { - assert( a < m ); + assert( a < M ); - return std::begin(m_data) + a*n; + return begin() + a*N; } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::item(size_t a, size_t b) +template +inline auto matrix::item(size_t a, size_t b) { - assert( a < m ); - assert( b < n ); + assert( a < M ); + assert( b < N ); - return std::begin(m_data) + a*n+b; + return begin() + a*N+b; } // ------------------------------------------------------------------------------------------------- -template -inline auto matrix::item(size_t a, size_t b) const +template +inline auto matrix::item(size_t a, size_t b) const { - assert( a < m ); - assert( b < n ); + assert( a < M ); + assert( b < N ); - return std::begin(m_data) + a*n+b; + return begin() + a*N+b; } // ================================================================================================= // basic initialization // ================================================================================================= -template -inline void matrix::setArange() +template +inline void matrix::setArange() { - for ( size_t i = 0 ; i < m*n ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- -template -inline void matrix::setZero() +template +inline void matrix::setZero() { - for ( size_t i = 0 ; i < m*n ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- -template -inline void matrix::setOnes() +template +inline void matrix::setOnes() { - for ( size_t i = 0 ; i < m*n ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- -template -inline void matrix::setConstant(X D) +template +inline void matrix::setConstant(X D) { - for ( size_t i = 0 ; i < m*n ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- -template +template template -inline void matrix::setCopy(Iterator first) +inline void matrix::setCopy(Iterator first) { - // copy - std::copy(first, first+m*n, std::begin(m_data)); + std::copy(first, first+mSize, begin()); } // ------------------------------------------------------------------------------------------------- -template +template template -inline void matrix::setCopy(Iterator first, Iterator last) +inline void matrix::setCopy(Iterator first, Iterator last) { - // check size - assert( m*n == last - first ); + assert( mSize == last - first ); - // copy - std::copy(first, last, std::begin(m_data)); + std::copy(first, last, begin()); } // ================================================================================================= // arithmetic operators // ================================================================================================= -template -inline matrix& matrix::operator*= (const matrix &B) +template +inline matrix& matrix::operator*= (const matrix &B) { - for ( size_t i = 0 ; i < m*n ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline matrix& matrix::operator/= (const matrix &B) +template +inline matrix& matrix::operator/= (const matrix &B) { - for ( size_t i = 0 ; i < m*n ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline matrix& matrix::operator+= (const matrix &B) +template +inline matrix& matrix::operator+= (const matrix &B) { - for ( size_t i = 0 ; i < m*n ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline matrix& matrix::operator-= (const matrix &B) +template +inline matrix& matrix::operator-= (const matrix &B) { - for ( size_t i = 0 ; i < m*n ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline matrix& matrix::operator*= (const X &B) +template +inline matrix& matrix::operator*= (const X &B) { - for ( size_t i = 0 ; i < m*n ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline matrix& matrix::operator/= (const X &B) +template +inline matrix& matrix::operator/= (const X &B) { - for ( size_t i = 0 ; i < m*n ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline matrix& matrix::operator+= (const X &B) +template +inline matrix& matrix::operator+= (const X &B) { - for ( size_t i = 0 ; i < m*n ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline matrix& matrix::operator-= (const X &B) +template +inline matrix& matrix::operator-= (const X &B) { - for ( size_t i = 0 ; i < m*n ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline matrix operator* (const matrix &A, const matrix &B) +template +inline matrix operator* (const matrix &A, const matrix &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] * B[i]; @@ -686,10 +683,10 @@ inline matrix operator* (const matrix &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator/ (const matrix &A, const matrix &B) +template +inline matrix operator/ (const matrix &A, const matrix &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] / B[i]; @@ -699,10 +696,10 @@ inline matrix operator/ (const matrix &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator+ (const matrix &A, const matrix &B) +template +inline matrix operator+ (const matrix &A, const matrix &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] + B[i]; @@ -712,10 +709,10 @@ inline matrix operator+ (const matrix &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator- (const matrix &A, const matrix &B) +template +inline matrix operator- (const matrix &A, const matrix &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] - B[i]; @@ -725,10 +722,10 @@ inline matrix operator- (const matrix &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator* (const matrix &A, const X &B) +template +inline matrix operator* (const matrix &A, const X &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] * B; @@ -738,10 +735,10 @@ inline matrix operator* (const matrix &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator/ (const matrix &A, const X &B) +template +inline matrix operator/ (const matrix &A, const X &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] / B; @@ -751,10 +748,10 @@ inline matrix operator/ (const matrix &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator+ (const matrix &A, const X &B) +template +inline matrix operator+ (const matrix &A, const X &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] + B; @@ -764,10 +761,10 @@ inline matrix operator+ (const matrix &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator- (const matrix &A, const X &B) +template +inline matrix operator- (const matrix &A, const X &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] - B; @@ -777,10 +774,10 @@ inline matrix operator- (const matrix &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator* (const X &A, const matrix &B) +template +inline matrix operator* (const X &A, const matrix &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A * B[i]; @@ -790,10 +787,10 @@ inline matrix operator* (const X &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator/ (const X &A, const matrix &B) +template +inline matrix operator/ (const X &A, const matrix &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A / B[i]; @@ -803,10 +800,10 @@ inline matrix operator/ (const X &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator+ (const X &A, const matrix &B) +template +inline matrix operator+ (const X &A, const matrix &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A + B[i]; @@ -816,10 +813,10 @@ inline matrix operator+ (const X &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline matrix operator- (const X &A, const matrix &B) +template +inline matrix operator- (const X &A, const matrix &B) { - matrix C; + matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A - B[i]; @@ -831,16 +828,16 @@ inline matrix operator- (const X &A, const matrix &B) // basic algebra : location of the minimum/maximum // ================================================================================================= -template -inline std::vector matrix::argmin() const +template +inline std::vector matrix::argmin() const { return decompress( std::min_element(begin(),end()) - begin() ); } // ------------------------------------------------------------------------------------------------- -template -inline std::vector matrix::argmax() const +template +inline std::vector matrix::argmax() const { return decompress( std::max_element(begin(),end()) - begin() ); } @@ -849,8 +846,8 @@ inline std::vector matrix::argmax() const // basic algebra : minimum // ================================================================================================= -template -inline X matrix::minCoeff() const +template +inline X matrix::minCoeff() const { return *std::min_element(begin(),end()); } @@ -859,8 +856,8 @@ inline X matrix::minCoeff() const // basic algebra : maximum // ================================================================================================= -template -inline X matrix::maxCoeff() const +template +inline X matrix::maxCoeff() const { return *std::max_element(begin(),end()); } @@ -869,13 +866,13 @@ inline X matrix::maxCoeff() const // basic algebra : sum // ================================================================================================= -template -inline X matrix::sum() const +template +inline X matrix::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m*n ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } @@ -884,26 +881,26 @@ inline X matrix::sum() const // basic algebra : mean // ================================================================================================= -template -inline double matrix::mean() const +template +inline double matrix::mean() const { - return static_cast(this->sum())/static_cast(m*n); + return static_cast(this->sum())/static_cast(mSize); } // ================================================================================================= // basic algebra : weighted average // ================================================================================================= -template -inline double matrix::average(const matrix &weights, bool norm) const +template +inline double matrix::average(const matrix &weights, bool norm) const { - assert( m == weights.shape(0) ); - assert( n == weights.shape(1) ); + assert( M == weights.shape(0) ); + assert( N == weights.shape(1) ); X out = static_cast(0); - for ( size_t i = 0 ; i < m*n ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; if ( norm ) return static_cast(out)/static_cast(weights.sum()); else return static_cast(out); @@ -913,10 +910,10 @@ inline double matrix::average(const matrix &weights, bool norm) co // basic algebra : absolute value // ================================================================================================= -template -inline void matrix::abs() +template +inline void matrix::abs() { - for ( auto &i : m_data ) + for ( auto &i : mData ) i = std::abs(i); } @@ -924,12 +921,12 @@ inline void matrix::abs() // formatted print // ================================================================================================= -template -inline void matrix::printf(std::string fmt) const +template +inline void matrix::printf(std::string fmt) const { - for ( size_t i = 0 ; i < m ; ++i ) { - for ( size_t j = 0 ; j < n ; ++j ) { - if ( j != n-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < M ; ++i ) { + for ( size_t j = 0 ; j < N ; ++j ) { + if ( j != N-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } @@ -937,17 +934,17 @@ inline void matrix::printf(std::string fmt) const // ------------------------------------------------------------------------------------------------- -template -inline std::ostream& operator<<(std::ostream& out, const matrix& src) +template +inline std::ostream& operator<<(std::ostream& out, const matrix& src) { auto w = out.width(); auto p = out.precision(); - for ( size_t i = 0 ; i < m ; ++i ) { - for ( size_t j = 0 ; j < n ; ++j ) { + for ( size_t i = 0 ; i < M ; ++i ) { + for ( size_t j = 0 ; j < N ; ++j ) { out << std::setw(w) << std::setprecision(p) << src(i,j); - if ( j != n-1 ) out << ", "; - else if ( i != m-1 ) out << ";" << std::endl; + if ( j != N-1 ) out << ", "; + else if ( i != M-1 ) out << ";" << std::endl; else out << ";"; } } diff --git a/src/cppmat/tiny_matrix.h b/src/cppmat/tiny_matrix.h index 4d61cae..cdc577a 100644 --- a/src/cppmat/tiny_matrix.h +++ b/src/cppmat/tiny_matrix.h @@ -20,27 +20,28 @@ namespace tiny { // cppmat::tiny::matrix // ================================================================================================= -template +template class matrix { private: - X m_data[m*n]; // data container + X mData[M*N]; // data container + static const size_t mSize=M*N; // total size public: // constructor - matrix(){}; + matrix() = default; // constructor: initialize - static matrix Arange(); - static matrix Zero(); - static matrix Ones(); - static matrix Constant(X D); + static matrix Arange(); + static matrix Zero(); + static matrix Ones(); + static matrix Constant(X D); // constructor: initialize by copying from external object - template static matrix Copy(Iterator first); - template static matrix Copy(Iterator first, Iterator last); + template static matrix Copy(Iterator first); + template static matrix Copy(Iterator first, Iterator last); // information without constructing static size_t Size(); @@ -112,14 +113,14 @@ class matrix template void setCopy(Iterator first, Iterator last); // arithmetic operators - matrix& operator*= (const matrix &B); - matrix& operator/= (const matrix &B); - matrix& operator+= (const matrix &B); - matrix& operator-= (const matrix &B); - matrix& operator*= (const X &B); - matrix& operator/= (const X &B); - matrix& operator+= (const X &B); - matrix& operator-= (const X &B); + matrix& operator*= (const matrix &B); + matrix& operator/= (const matrix &B); + matrix& operator+= (const matrix &B); + matrix& operator-= (const matrix &B); + matrix& operator*= (const X &B); + matrix& operator/= (const X &B); + matrix& operator+= (const X &B); + matrix& operator-= (const X &B); // basic algebra // - absolute value @@ -136,7 +137,7 @@ class matrix // - mean double mean() const; // - weighted average - double average(const matrix &weights, bool norm=true) const; + double average(const matrix &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -144,41 +145,41 @@ class matrix }; // arithmetic operators -template -inline matrix operator* (const matrix &A, const matrix &B); +template +inline matrix operator* (const matrix &A, const matrix &B); -template -inline matrix operator/ (const matrix &A, const matrix &B); +template +inline matrix operator/ (const matrix &A, const matrix &B); -template -inline matrix operator+ (const matrix &A, const matrix &B); +template +inline matrix operator+ (const matrix &A, const matrix &B); -template -inline matrix operator- (const matrix &A, const matrix &B); +template +inline matrix operator- (const matrix &A, const matrix &B); -template -inline matrix operator* (const matrix &A, const X &B); +template +inline matrix operator* (const matrix &A, const X &B); -template -inline matrix operator/ (const matrix &A, const X &B); +template +inline matrix operator/ (const matrix &A, const X &B); -template -inline matrix operator+ (const matrix &A, const X &B); +template +inline matrix operator+ (const matrix &A, const X &B); -template -inline matrix operator- (const matrix &A, const X &B); +template +inline matrix operator- (const matrix &A, const X &B); -template -inline matrix operator* (const X &A, const matrix &B); +template +inline matrix operator* (const X &A, const matrix &B); -template -inline matrix operator/ (const X &A, const matrix &B); +template +inline matrix operator/ (const X &A, const matrix &B); -template -inline matrix operator+ (const X &A, const matrix &B); +template +inline matrix operator+ (const X &A, const matrix &B); -template -inline matrix operator- (const X &A, const matrix &B); +template +inline matrix operator- (const X &A, const matrix &B); // ================================================================================================= diff --git a/src/cppmat/tiny_vector.cpp b/src/cppmat/tiny_vector.cpp index 12da1f1..00e2c86 100644 --- a/src/cppmat/tiny_vector.cpp +++ b/src/cppmat/tiny_vector.cpp @@ -20,11 +20,11 @@ namespace tiny { // constructors // ================================================================================================= -template -inline vector vector::Arange() +template +inline vector vector::Arange() { // call basic constructor - vector out; + vector out; // initialize out.setArange(); @@ -34,11 +34,11 @@ inline vector vector::Arange() // ------------------------------------------------------------------------------------------------- -template -inline vector vector::Zero() +template +inline vector vector::Zero() { // call basic constructor - vector out; + vector out; // initialize out.setZero(); @@ -48,11 +48,11 @@ inline vector vector::Zero() // ------------------------------------------------------------------------------------------------- -template -inline vector vector::Ones() +template +inline vector vector::Ones() { // call basic constructor - vector out; + vector out; // initialize out.setOnes(); @@ -62,11 +62,11 @@ inline vector vector::Ones() // ------------------------------------------------------------------------------------------------- -template -inline vector vector::Constant(X D) +template +inline vector vector::Constant(X D) { // call basic constructor - vector out; + vector out; // initialize out.setConstant(D); @@ -76,12 +76,12 @@ inline vector vector::Constant(X D) // ------------------------------------------------------------------------------------------------- -template +template template -inline vector vector::Copy(Iterator first) +inline vector vector::Copy(Iterator first) { // call basic constructor - vector out; + vector out; // initialize out.setCopy(first); @@ -91,12 +91,12 @@ inline vector vector::Copy(Iterator first) // ------------------------------------------------------------------------------------------------- -template +template template -inline vector vector::Copy(Iterator first, Iterator last) +inline vector vector::Copy(Iterator first, Iterator last) { // call basic constructor - vector out; + vector out; // initialize out.setCopy(first,last); @@ -106,70 +106,70 @@ inline vector vector::Copy(Iterator first, Iterator last) // ------------------------------------------------------------------------------------------------- -template -inline size_t vector::Size() +template +inline size_t vector::Size() { - return n; + return N; } // ================================================================================================= // get dimensions // ================================================================================================= -template -inline size_t vector::size() const +template +inline size_t vector::size() const { - return n; + return mSize; } // ------------------------------------------------------------------------------------------------- -template -inline size_t vector::ndim() const +template +inline size_t vector::ndim() const { return 1; } // ------------------------------------------------------------------------------------------------- -template -inline size_t vector::shape(int i) const +template +inline size_t vector::shape(int i) const { // check axis: (0) or (-1) assert( i < 1 ); assert( i >= -1 ); - return n; + return N; } // ------------------------------------------------------------------------------------------------- -template -inline size_t vector::shape(size_t i) const +template +inline size_t vector::shape(size_t i) const { // check axis: (0) assert( i < 1 ); - return n; + return N; } // ------------------------------------------------------------------------------------------------- -template -inline std::vector vector::shape() const +template +inline std::vector vector::shape() const { std::vector ret(1); - ret[0] = n; + ret[0] = N; return ret; } // ------------------------------------------------------------------------------------------------- -template -inline std::vector vector::strides(bool bytes) const +template +inline std::vector vector::strides(bool bytes) const { std::vector ret(1); @@ -185,295 +185,292 @@ inline std::vector vector::strides(bool bytes) const // index operators : operator[...] // ================================================================================================= -template -inline X& vector::operator[](size_t i) +template +inline X& vector::operator[](size_t i) { - assert( i < n ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ------------------------------------------------------------------------------------------------- -template -inline const X& vector::operator[](size_t i) const +template +inline const X& vector::operator[](size_t i) const { - assert( i < n ); + assert( i < mSize ); - return m_data[i]; + return mData[i]; } // ================================================================================================= // index operators : operator(...) // ================================================================================================= -template -inline X& vector::operator()(size_t a) +template +inline X& vector::operator()(size_t a) { - assert( a < n ); + assert( a < N ); - return m_data[a]; + return mData[a]; } // ------------------------------------------------------------------------------------------------- -template -inline const X& vector::operator()(size_t a) const +template +inline const X& vector::operator()(size_t a) const { - assert( a < n ); + assert( a < N ); - return m_data[a]; + return mData[a]; } // ================================================================================================= // pointer to data // ================================================================================================= -template -inline X* vector::data() +template +inline X* vector::data() { - return std::begin(m_data); + return std::begin(mData); } // ------------------------------------------------------------------------------------------------- -template -inline const X* vector::data() const +template +inline const X* vector::data() const { - return std::begin(m_data); + return std::begin(mData); } // ================================================================================================= // iterators : begin() and end() // ================================================================================================= -template -inline auto vector::begin() +template +inline auto vector::begin() { - return std::begin(m_data); + return std::begin(mData); } // ------------------------------------------------------------------------------------------------- -template -inline auto vector::begin() const +template +inline auto vector::begin() const { - return std::begin(m_data); + return std::begin(mData); } // ------------------------------------------------------------------------------------------------- -template -inline auto vector::end() +template +inline auto vector::end() { - return std::begin(m_data) + n; + return std::begin(mData) + N; } // ------------------------------------------------------------------------------------------------- -template -inline auto vector::end() const +template +inline auto vector::end() const { - return std::begin(m_data) + n; + return std::begin(mData) + N; } // ================================================================================================= // iterators : index() // ================================================================================================= -template -inline auto vector::index(size_t i) +template +inline auto vector::index(size_t i) { - assert( i < n ); + assert( i < mSize ); - return std::begin(m_data) + i; + return begin() + i; } // ------------------------------------------------------------------------------------------------- -template -inline auto vector::index(size_t i) const +template +inline auto vector::index(size_t i) const { - assert( i < n ); + assert( i < mSize ); - return std::begin(m_data) + i; + return begin() + i; } // ================================================================================================= // iterators : item() // ================================================================================================= -template -inline auto vector::item(size_t a) +template +inline auto vector::item(size_t a) { - assert( a < n ); + assert( a < N ); - return std::begin(m_data) + a; + return begin() + a; } // ------------------------------------------------------------------------------------------------- -template -inline auto vector::item(size_t a) const +template +inline auto vector::item(size_t a) const { - assert( a < n ); + assert( a < N ); - return std::begin(m_data) + a; + return begin() + a; } // ================================================================================================= // basic initialization // ================================================================================================= -template -inline void vector::setArange() +template +inline void vector::setArange() { - for ( size_t i = 0 ; i < n ; ++i ) m_data[i] = static_cast(i); + for ( size_t i = 0 ; i < mSize ; ++i ) mData[i] = static_cast(i); } // ------------------------------------------------------------------------------------------------- -template -inline void vector::setZero() +template +inline void vector::setZero() { - for ( size_t i = 0 ; i < n ; ++i ) m_data[i] = static_cast(0); + std::fill(begin(), end(), static_cast(0)); } // ------------------------------------------------------------------------------------------------- -template -inline void vector::setOnes() +template +inline void vector::setOnes() { - for ( size_t i = 0 ; i < n ; ++i ) m_data[i] = static_cast(1); + std::fill(begin(), end(), static_cast(1)); } // ------------------------------------------------------------------------------------------------- -template -inline void vector::setConstant(X D) +template +inline void vector::setConstant(X D) { - for ( size_t i = 0 ; i < n ; ++i ) m_data[i] = D; + std::fill(begin(), end(), D); } // ------------------------------------------------------------------------------------------------- -template +template template -inline void vector::setCopy(Iterator first) +inline void vector::setCopy(Iterator first) { - // copy - std::copy(first, first+n, std::begin(m_data)); + std::copy(first, first+N, begin()); } // ------------------------------------------------------------------------------------------------- -template +template template -inline void vector::setCopy(Iterator first, Iterator last) +inline void vector::setCopy(Iterator first, Iterator last) { - // check size - assert( n == last - first ); + assert( mSize == last - first ); - // copy - std::copy(first, last, std::begin(m_data)); + std::copy(first, last, begin()); } // ================================================================================================= // arithmetic operators // ================================================================================================= -template -inline vector& vector::operator*= (const vector &B) +template +inline vector& vector::operator*= (const vector &B) { - for ( size_t i = 0 ; i < n ; ++i ) - m_data[i] *= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B[i]; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline vector& vector::operator/= (const vector &B) +template +inline vector& vector::operator/= (const vector &B) { - for ( size_t i = 0 ; i < n ; ++i ) - m_data[i] /= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B[i]; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline vector& vector::operator+= (const vector &B) +template +inline vector& vector::operator+= (const vector &B) { - for ( size_t i = 0 ; i < n ; ++i ) - m_data[i] += B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B[i]; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline vector& vector::operator-= (const vector &B) +template +inline vector& vector::operator-= (const vector &B) { - for ( size_t i = 0 ; i < n ; ++i ) - m_data[i] -= B[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B[i]; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline vector& vector::operator*= (const X &B) +template +inline vector& vector::operator*= (const X &B) { - for ( size_t i = 0 ; i < n ; ++i ) - m_data[i] *= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] *= B; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline vector& vector::operator/= (const X &B) +template +inline vector& vector::operator/= (const X &B) { - for ( size_t i = 0 ; i < n ; ++i ) - m_data[i] /= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] /= B; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline vector& vector::operator+= (const X &B) +template +inline vector& vector::operator+= (const X &B) { - for ( size_t i = 0 ; i < n ; ++i ) - m_data[i] += B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] += B; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline vector& vector::operator-= (const X &B) +template +inline vector& vector::operator-= (const X &B) { - for ( size_t i = 0 ; i < n ; ++i ) - m_data[i] -= B; + for ( size_t i = 0 ; i < mSize ; ++i ) + mData[i] -= B; return *this; } // ------------------------------------------------------------------------------------------------- -template -inline vector operator* (const vector &A, const vector &B) +template +inline vector operator* (const vector &A, const vector &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] * B[i]; @@ -483,10 +480,10 @@ inline vector operator* (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator/ (const vector &A, const vector &B) +template +inline vector operator/ (const vector &A, const vector &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] / B[i]; @@ -496,10 +493,10 @@ inline vector operator/ (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator+ (const vector &A, const vector &B) +template +inline vector operator+ (const vector &A, const vector &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] + B[i]; @@ -509,10 +506,10 @@ inline vector operator+ (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator- (const vector &A, const vector &B) +template +inline vector operator- (const vector &A, const vector &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] - B[i]; @@ -522,10 +519,10 @@ inline vector operator- (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator* (const vector &A, const X &B) +template +inline vector operator* (const vector &A, const X &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] * B; @@ -535,10 +532,10 @@ inline vector operator* (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator/ (const vector &A, const X &B) +template +inline vector operator/ (const vector &A, const X &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] / B; @@ -548,10 +545,10 @@ inline vector operator/ (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator+ (const vector &A, const X &B) +template +inline vector operator+ (const vector &A, const X &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] + B; @@ -561,10 +558,10 @@ inline vector operator+ (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator- (const vector &A, const X &B) +template +inline vector operator- (const vector &A, const X &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] - B; @@ -574,10 +571,10 @@ inline vector operator- (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator* (const X &A, const vector &B) +template +inline vector operator* (const X &A, const vector &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A * B[i]; @@ -587,10 +584,10 @@ inline vector operator* (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator/ (const X &A, const vector &B) +template +inline vector operator/ (const X &A, const vector &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A / B[i]; @@ -600,10 +597,10 @@ inline vector operator/ (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator+ (const X &A, const vector &B) +template +inline vector operator+ (const X &A, const vector &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A + B[i]; @@ -613,10 +610,10 @@ inline vector operator+ (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline vector operator- (const X &A, const vector &B) +template +inline vector operator- (const X &A, const vector &B) { - vector C; + vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A - B[i]; @@ -628,16 +625,16 @@ inline vector operator- (const X &A, const vector &B) // basic algebra : location of the minimum/maximum // ================================================================================================= -template -inline size_t vector::argmin() const +template +inline size_t vector::argmin() const { return std::min_element(begin(),end()) - begin(); } // ------------------------------------------------------------------------------------------------- -template -inline size_t vector::argmax() const +template +inline size_t vector::argmax() const { return std::max_element(begin(),end()) - begin(); } @@ -646,8 +643,8 @@ inline size_t vector::argmax() const // basic algebra : minimum // ================================================================================================= -template -inline X vector::minCoeff() const +template +inline X vector::minCoeff() const { return *std::min_element(begin(),end()); } @@ -656,8 +653,8 @@ inline X vector::minCoeff() const // basic algebra : maximum // ================================================================================================= -template -inline X vector::maxCoeff() const +template +inline X vector::maxCoeff() const { return *std::max_element(begin(),end()); } @@ -666,13 +663,13 @@ inline X vector::maxCoeff() const // basic algebra : sum // ================================================================================================= -template -inline X vector::sum() const +template +inline X vector::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < n ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } @@ -681,23 +678,23 @@ inline X vector::sum() const // basic algebra : mean // ================================================================================================= -template -inline double vector::mean() const +template +inline double vector::mean() const { - return static_cast(this->sum())/static_cast(n); + return static_cast(this->sum())/static_cast(mSize); } // ================================================================================================= // basic algebra : weighted average // ================================================================================================= -template -inline double vector::average(const vector &weights, bool norm) const +template +inline double vector::average(const vector &weights, bool norm) const { X out = static_cast(0); - for ( size_t i = 0 ; i < n ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; if ( norm ) return static_cast(out)/static_cast(weights.sum()); else return static_cast(out); @@ -707,21 +704,21 @@ inline double vector::average(const vector &weights, bool norm) const // find all non-zero entries // ================================================================================================= -template -inline cppmat::vector vector::where() const +template +inline cppmat::vector vector::where() const { size_t nnz = 0; - for ( size_t i = 0 ; i < n ; ++i ) - if ( m_data[i] ) + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] ) ++nnz; cppmat::vector out(nnz); size_t j = 0; - for ( size_t i = 0 ; i < n ; ++i ) { - if ( m_data[i] ) { + for ( size_t i = 0 ; i < mSize ; ++i ) { + if ( mData[i] ) { out[j] = i; ++j; } @@ -734,10 +731,10 @@ inline cppmat::vector vector::where() const // basic algebra : absolute value // ================================================================================================= -template -inline void vector::abs() +template +inline void vector::abs() { - for ( auto &i : m_data ) + for ( auto &i : mData ) i = std::abs(i); } @@ -745,26 +742,26 @@ inline void vector::abs() // formatted print // ================================================================================================= -template -inline void vector::printf(std::string fmt) const +template +inline void vector::printf(std::string fmt) const { - for ( size_t j = 0 ; j < n ; ++j ) { - if ( j != n-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); + for ( size_t j = 0 ; j < N ; ++j ) { + if ( j != N-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); else std::printf((fmt + ";\n").c_str(), (*this)(j)); } } // ------------------------------------------------------------------------------------------------- -template -inline std::ostream& operator<<(std::ostream& out, const vector& src) +template +inline std::ostream& operator<<(std::ostream& out, const vector& src) { auto w = out.width(); auto p = out.precision(); - for ( size_t j = 0 ; j < n ; ++j ) { + for ( size_t j = 0 ; j < N ; ++j ) { out << std::setw(w) << std::setprecision(p) << src(j); - if ( j != n-1 ) out << ", "; + if ( j != N-1 ) out << ", "; } return out; diff --git a/src/cppmat/tiny_vector.h b/src/cppmat/tiny_vector.h index 55db3d9..b5f3f90 100644 --- a/src/cppmat/tiny_vector.h +++ b/src/cppmat/tiny_vector.h @@ -20,27 +20,28 @@ namespace tiny { // cppmat::tiny::vector // ================================================================================================= -template +template class vector { private: - X m_data[n]; // data container + X mData[N]; // data container + static const size_t mSize=N; // total size public: // constructor - vector(){}; + vector() = default; // constructor: initialize - static vector Arange(); - static vector Zero(); - static vector Ones(); - static vector Constant(X D); + static vector Arange(); + static vector Zero(); + static vector Ones(); + static vector Constant(X D); // constructor: initialize by copying from external object - template static vector Copy(Iterator first); - template static vector Copy(Iterator first, Iterator last); + template static vector Copy(Iterator first); + template static vector Copy(Iterator first, Iterator last); // information without constructing static size_t Size(); @@ -88,14 +89,14 @@ class vector template void setCopy(Iterator first, Iterator last); // arithmetic operators - vector& operator*= (const vector &B); - vector& operator/= (const vector &B); - vector& operator+= (const vector &B); - vector& operator-= (const vector &B); - vector& operator*= (const X &B); - vector& operator/= (const X &B); - vector& operator+= (const X &B); - vector& operator-= (const X &B); + vector& operator*= (const vector &B); + vector& operator/= (const vector &B); + vector& operator+= (const vector &B); + vector& operator-= (const vector &B); + vector& operator*= (const X &B); + vector& operator/= (const X &B); + vector& operator+= (const X &B); + vector& operator-= (const X &B); // basic algebra // - absolute value @@ -112,7 +113,7 @@ class vector // - mean double mean() const; // - weighted average - double average(const vector &weights, bool norm=true) const; + double average(const vector &weights, bool norm=true) const; // find all non-zero entries cppmat::vector where() const; @@ -123,41 +124,41 @@ class vector }; // arithmetic operators -template -inline vector operator* (const vector &A, const vector &B); +template +inline vector operator* (const vector &A, const vector &B); -template -inline vector operator/ (const vector &A, const vector &B); +template +inline vector operator/ (const vector &A, const vector &B); -template -inline vector operator+ (const vector &A, const vector &B); +template +inline vector operator+ (const vector &A, const vector &B); -template -inline vector operator- (const vector &A, const vector &B); +template +inline vector operator- (const vector &A, const vector &B); -template -inline vector operator* (const vector &A, const X &B); +template +inline vector operator* (const vector &A, const X &B); -template -inline vector operator/ (const vector &A, const X &B); +template +inline vector operator/ (const vector &A, const X &B); -template -inline vector operator+ (const vector &A, const X &B); +template +inline vector operator+ (const vector &A, const X &B); -template -inline vector operator- (const vector &A, const X &B); +template +inline vector operator- (const vector &A, const X &B); -template -inline vector operator* (const X &A, const vector &B); +template +inline vector operator* (const X &A, const vector &B); -template -inline vector operator/ (const X &A, const vector &B); +template +inline vector operator/ (const X &A, const vector &B); -template -inline vector operator+ (const X &A, const vector &B); +template +inline vector operator+ (const X &A, const vector &B); -template -inline vector operator- (const X &A, const vector &B); +template +inline vector operator- (const X &A, const vector &B); // ================================================================================================= diff --git a/src/cppmat/view_tensor2.cpp b/src/cppmat/view_tensor2.cpp index dbe0462..1fc2b31 100644 --- a/src/cppmat/view_tensor2.cpp +++ b/src/cppmat/view_tensor2.cpp @@ -21,14 +21,6 @@ namespace cartesian2d { // constructors // ================================================================================================= -template -inline tensor4::tensor4() -{ - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - template inline tensor4 tensor4::Map(const X *D) { @@ -43,14 +35,6 @@ inline tensor4 tensor4::Map(const X *D) // ------------------------------------------------------------------------------------------------- -template -inline tensor2::tensor2() -{ - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - template inline tensor2 tensor2::Map(const X *D) { @@ -65,14 +49,6 @@ inline tensor2 tensor2::Map(const X *D) // ------------------------------------------------------------------------------------------------- -template -inline tensor2s::tensor2s() -{ - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - template inline tensor2s tensor2s::Map(const X *D) { @@ -90,8 +66,6 @@ inline tensor2s tensor2s::Map(const X *D) template inline tensor2d::tensor2d() { - m_data = nullptr; - m_zero[0] = static_cast(0); } @@ -111,14 +85,6 @@ inline tensor2d tensor2d::Map(const X *D) // ------------------------------------------------------------------------------------------------- -template -inline vector::vector() -{ - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - template inline vector vector::Map(const X *D) { @@ -135,11 +101,11 @@ inline vector vector::Map(const X *D) // map external pointer // ================================================================================================= -template inline void tensor4 ::setMap(const X *D) { m_data = D; } -template inline void tensor2 ::setMap(const X *D) { m_data = D; } -template inline void tensor2s::setMap(const X *D) { m_data = D; } -template inline void tensor2d::setMap(const X *D) { m_data = D; } -template inline void vector ::setMap(const X *D) { m_data = D; } +template inline void tensor4 ::setMap(const X *D) { mData = D; } +template inline void tensor2 ::setMap(const X *D) { mData = D; } +template inline void tensor2s::setMap(const X *D) { mData = D; } +template inline void tensor2d::setMap(const X *D) { mData = D; } +template inline void vector ::setMap(const X *D) { mData = D; } // ================================================================================================= // cast to different class / type @@ -151,9 +117,9 @@ inline reg::tensor2s tensor2::cast>() cons { reg::tensor2s out; - out[0] = m_data[0]; - out[1] = ( m_data[1] + m_data[2] ) / 2.; - out[2] = m_data[3]; + out[0] = mData[0]; + out[1] = ( mData[1] + mData[2] ) / 2.; + out[2] = mData[3]; return out; } @@ -166,8 +132,8 @@ inline reg::tensor2d tensor2::cast>() cons { reg::tensor2d out; - out[0] = m_data[0]; - out[1] = m_data[3]; + out[0] = mData[0]; + out[1] = mData[3]; return out; } @@ -180,9 +146,9 @@ inline reg::tensor2 tensor2s::cast>() const { reg::tensor2 out; - out[0] = m_data[0]; - out[1] = out[2] = m_data[1]; - out[3] = m_data[2]; + out[0] = mData[0]; + out[1] = out[2] = mData[1]; + out[3] = mData[2]; return out; } @@ -195,8 +161,8 @@ inline reg::tensor2d tensor2s::cast>() con { reg::tensor2d out; - out[0] = m_data[0]; - out[1] = m_data[2]; + out[0] = mData[0]; + out[1] = mData[2]; return out; } @@ -209,8 +175,8 @@ inline reg::tensor2 tensor2d::cast>() const { reg::tensor2 out; - out[0] = m_data[0]; - out[3] = m_data[1]; + out[0] = mData[0]; + out[3] = mData[1]; out[1] = out[2] = 0.0; @@ -225,8 +191,8 @@ inline reg::tensor2s tensor2d::cast>() con { reg::tensor2s out; - out[0] = m_data[0]; - out[2] = m_data[1]; + out[0] = mData[0]; + out[2] = mData[1]; out[1] = 0.0; @@ -329,18 +295,18 @@ inline std::vector vector::strides(bool bytes) const // index operators // ================================================================================================= -template inline const X& tensor4 ::operator[](size_t i) const { return m_data[i]; } -template inline const X& tensor2 ::operator[](size_t i) const { return m_data[i]; } -template inline const X& tensor2s::operator[](size_t i) const { return m_data[i]; } -template inline const X& tensor2d::operator[](size_t i) const { return m_data[i]; } -template inline const X& vector ::operator[](size_t i) const { return m_data[i]; } +template inline const X& tensor4 ::operator[](size_t i) const { return mData[i]; } +template inline const X& tensor2 ::operator[](size_t i) const { return mData[i]; } +template inline const X& tensor2s::operator[](size_t i) const { return mData[i]; } +template inline const X& tensor2d::operator[](size_t i) const { return mData[i]; } +template inline const X& vector ::operator[](size_t i) const { return mData[i]; } // ------------------------------------------------------------------------------------------------- template inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) const { - return m_data[i*8+j*4+k*2+l]; + return mData[i*8+j*4+k*2+l]; } // ------------------------------------------------------------------------------------------------- @@ -348,7 +314,7 @@ inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) c template inline const X& tensor2::operator()(size_t i, size_t j) const { - return m_data[i*2+j]; + return mData[i*2+j]; } // ------------------------------------------------------------------------------------------------- @@ -357,12 +323,12 @@ template inline const X& tensor2s::operator()(size_t i, size_t j) const { if ( i == 0 ) { - if ( j == 0 ) return m_data[0]; - else return m_data[1]; + if ( j == 0 ) return mData[0]; + else return mData[1]; } else { - if ( j == 0 ) return m_data[1]; - else return m_data[2]; + if ( j == 0 ) return mData[1]; + else return mData[2]; } } @@ -371,7 +337,7 @@ inline const X& tensor2s::operator()(size_t i, size_t j) const template inline const X& tensor2d::operator()(size_t i, size_t j) const { - if (i == j) return m_data[i]; + if (i == j) return mData[i]; else return m_zero[0]; } @@ -380,28 +346,28 @@ inline const X& tensor2d::operator()(size_t i, size_t j) const template inline const X& vector::operator()(size_t i) const { - return m_data[i]; + return mData[i]; } // ================================================================================================= // pointers / iterators // ================================================================================================= -template inline const X* tensor4 ::data() const { return &m_data[0]; } -template inline auto tensor4 ::begin() const { return &m_data[0]; } -template inline auto tensor4 ::end() const { return &m_data[0] + 16; } -template inline const X* tensor2 ::data() const { return &m_data[0]; } -template inline auto tensor2 ::begin() const { return &m_data[0]; } -template inline auto tensor2 ::end() const { return &m_data[0] + 4; } -template inline const X* tensor2s::data() const { return &m_data[0]; } -template inline auto tensor2s::begin() const { return &m_data[0]; } -template inline auto tensor2s::end() const { return &m_data[0] + 3; } -template inline const X* tensor2d::data() const { return &m_data[0]; } -template inline auto tensor2d::begin() const { return &m_data[0]; } -template inline auto tensor2d::end() const { return &m_data[0] + 2; } -template inline const X* vector ::data() const { return &m_data[0]; } -template inline auto vector ::begin() const { return &m_data[0]; } -template inline auto vector ::end() const { return &m_data[0] + 2; } +template inline const X* tensor4 ::data() const { return &mData[0]; } +template inline auto tensor4 ::begin() const { return &mData[0]; } +template inline auto tensor4 ::end() const { return &mData[0] + 16; } +template inline const X* tensor2 ::data() const { return &mData[0]; } +template inline auto tensor2 ::begin() const { return &mData[0]; } +template inline auto tensor2 ::end() const { return &mData[0] + 4; } +template inline const X* tensor2s::data() const { return &mData[0]; } +template inline auto tensor2s::begin() const { return &mData[0]; } +template inline auto tensor2s::end() const { return &mData[0] + 3; } +template inline const X* tensor2d::data() const { return &mData[0]; } +template inline auto tensor2d::begin() const { return &mData[0]; } +template inline auto tensor2d::end() const { return &mData[0] + 2; } +template inline const X* vector ::data() const { return &mData[0]; } +template inline auto vector ::begin() const { return &mData[0]; } +template inline auto vector ::end() const { return &mData[0] + 2; } // ================================================================================================= // arithmetic operators @@ -1681,7 +1647,7 @@ inline X tensor2::ddot(const tensor2s &B) const template inline X tensor2::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[3]*B[1]; + return mData[0]*B[0] + mData[3]*B[1]; } // ------------------------------------------------------------------------------------------------- @@ -1721,9 +1687,9 @@ inline X tensor2s::ddot(const tensor2s &B) const { X C; - C = m_data[0] * B[0]; - C += m_data[1] * B[1] * static_cast(2); - C += m_data[2] * B[2]; + C = mData[0] * B[0]; + C += mData[1] * B[1] * static_cast(2); + C += mData[2] * B[2]; return C; } @@ -1733,7 +1699,7 @@ inline X tensor2s::ddot(const tensor2s &B) const template inline X tensor2s::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[2]*B[1]; + return mData[0]*B[0] + mData[2]*B[1]; } // ------------------------------------------------------------------------------------------------- @@ -1746,7 +1712,7 @@ inline reg::tensor2 tensor2d::ddot(const tensor4 &B) const for ( size_t i = 0 ; i < 2 ; ++i ) for ( size_t k = 0 ; k < 2 ; ++k ) for ( size_t l = 0 ; l < 2 ; ++l ) - C(k,l) += m_data[i]*B(i,i,k,l); + C(k,l) += mData[i]*B(i,i,k,l); return C; } @@ -1756,7 +1722,7 @@ inline reg::tensor2 tensor2d::ddot(const tensor4 &B) const template inline X tensor2d::ddot(const tensor2 &B) const { - return m_data[0]*B[0] + m_data[1]*B[3]; + return mData[0]*B[0] + mData[1]*B[3]; } // ------------------------------------------------------------------------------------------------- @@ -1764,7 +1730,7 @@ inline X tensor2d::ddot(const tensor2 &B) const template inline X tensor2d::ddot(const tensor2s &B) const { - return m_data[0]*B[0] + m_data[1]*B[2]; + return mData[0]*B[0] + mData[1]*B[2]; } // ------------------------------------------------------------------------------------------------- @@ -1772,7 +1738,7 @@ inline X tensor2d::ddot(const tensor2s &B) const template inline X tensor2d::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[1]*B[1]; + return mData[0]*B[0] + mData[1]*B[1]; } @@ -2545,10 +2511,10 @@ inline reg::tensor2 tensor2::T() const { reg::tensor2 C; - C[0] = m_data[0]; - C[2] = m_data[1]; - C[1] = m_data[2]; - C[3] = m_data[3]; + C[0] = mData[0]; + C[2] = mData[1]; + C[1] = mData[2]; + C[3] = mData[3]; return C; } @@ -2560,9 +2526,9 @@ inline reg::tensor2s tensor2s::T() const { reg::tensor2s C; - C[0] = m_data[0]; - C[1] = m_data[1]; - C[2] = m_data[2]; + C[0] = mData[0]; + C[1] = mData[1]; + C[2] = mData[2]; return C; } @@ -2574,8 +2540,8 @@ inline reg::tensor2d tensor2d::T() const { reg::tensor2d C; - C[0] = m_data[0]; - C[1] = m_data[1]; + C[0] = mData[0]; + C[1] = mData[1]; return C; } @@ -2635,7 +2601,7 @@ inline reg::tensor4 transposeL(const tensor4 &A) template inline X tensor2::trace() const { - return m_data[0] + m_data[3]; + return mData[0] + mData[3]; } // ------------------------------------------------------------------------------------------------- @@ -2643,7 +2609,7 @@ inline X tensor2::trace() const template inline X tensor2s::trace() const { - return m_data[0] + m_data[2]; + return mData[0] + mData[2]; } // ------------------------------------------------------------------------------------------------- @@ -2651,7 +2617,7 @@ inline X tensor2s::trace() const template inline X tensor2d::trace() const { - return m_data[0] + m_data[1]; + return mData[0] + mData[1]; } // ------------------------------------------------------------------------------------------------- @@ -2659,7 +2625,7 @@ inline X tensor2d::trace() const template inline X tensor2::det() const { - return m_data[0] * m_data[3] - m_data[1] * m_data[2]; + return mData[0] * mData[3] - mData[1] * mData[2]; } // ------------------------------------------------------------------------------------------------- @@ -2667,7 +2633,7 @@ inline X tensor2::det() const template inline X tensor2s::det() const { - return m_data[0] * m_data[2] - m_data[1] * m_data[1]; + return mData[0] * mData[2] - mData[1] * mData[1]; } // ------------------------------------------------------------------------------------------------- @@ -2675,7 +2641,7 @@ inline X tensor2s::det() const template inline X tensor2d::det() const { - return m_data[0] * m_data[1]; + return mData[0] * mData[1]; } // ------------------------------------------------------------------------------------------------- @@ -2689,10 +2655,10 @@ inline reg::tensor2 tensor2::inv() const // allocate result reg::tensor2 C; - C[0] = m_data[3] / D; - C[1] = static_cast(-1) * m_data[1] / D; - C[2] = static_cast(-1) * m_data[2] / D; - C[3] = m_data[0] / D; + C[0] = mData[3] / D; + C[1] = static_cast(-1) * mData[1] / D; + C[2] = static_cast(-1) * mData[2] / D; + C[3] = mData[0] / D; return C; } @@ -2708,9 +2674,9 @@ inline reg::tensor2s tensor2s::inv() const // allocate result reg::tensor2s C; - C[0] = m_data[2] / D; - C[1] = static_cast(-1) * m_data[1] / D; - C[2] = m_data[0] / D; + C[0] = mData[2] / D; + C[1] = static_cast(-1) * mData[1] / D; + C[2] = mData[0] / D; return C; } @@ -2723,8 +2689,8 @@ inline reg::tensor2d tensor2d::inv() const // allocate result reg::tensor2d C; - C[0] = static_cast(1) / m_data[0]; - C[1] = static_cast(1) / m_data[1]; + C[0] = static_cast(1) / mData[0]; + C[1] = static_cast(1) / mData[1]; return C; } @@ -2809,7 +2775,7 @@ template inline bool tensor4::operator== (const tensor4 &B) const { for ( size_t i = 0 ; i < 16 ; ++i ) - if ( m_data[i] != B[i] ) + if ( mData[i] != B[i] ) return false; return true; @@ -2821,7 +2787,7 @@ template inline bool tensor4::operator== (const reg::tensor4 &B) const { for ( size_t i = 0 ; i < 16 ; ++i ) - if ( m_data[i] != B[i] ) + if ( mData[i] != B[i] ) return false; return true; @@ -2832,10 +2798,10 @@ inline bool tensor4::operator== (const reg::tensor4 &B) const template inline bool tensor2::operator== (const tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; - if ( m_data[3] != B[3] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; + if ( mData[3] != B[3] ) return false; return true; } @@ -2845,10 +2811,10 @@ inline bool tensor2::operator== (const tensor2 &B) const template inline bool tensor2::operator== (const tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[1] ) return false; - if ( m_data[3] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[1] ) return false; + if ( mData[3] != B[2] ) return false; return true; } @@ -2858,10 +2824,10 @@ inline bool tensor2::operator== (const tensor2s &B) const template inline bool tensor2::operator== (const tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[3] != B[1] ) return false; - if ( m_data[1] ) return false; - if ( m_data[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[3] != B[1] ) return false; + if ( mData[1] ) return false; + if ( mData[2] ) return false; return true; } @@ -2871,10 +2837,10 @@ inline bool tensor2::operator== (const tensor2d &B) const template inline bool tensor2::operator== (const reg::tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; - if ( m_data[3] != B[3] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; + if ( mData[3] != B[3] ) return false; return true; } @@ -2884,10 +2850,10 @@ inline bool tensor2::operator== (const reg::tensor2 &B) const template inline bool tensor2::operator== (const reg::tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[1] ) return false; - if ( m_data[3] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[1] ) return false; + if ( mData[3] != B[2] ) return false; return true; } @@ -2897,10 +2863,10 @@ inline bool tensor2::operator== (const reg::tensor2s &B) const template inline bool tensor2::operator== (const reg::tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[3] != B[1] ) return false; - if ( m_data[1] ) return false; - if ( m_data[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[3] != B[1] ) return false; + if ( mData[1] ) return false; + if ( mData[2] ) return false; return true; } @@ -2910,9 +2876,9 @@ inline bool tensor2::operator== (const reg::tensor2d &B) const template inline bool tensor2s::operator== (const tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -2922,10 +2888,10 @@ inline bool tensor2s::operator== (const tensor2s &B) const template inline bool tensor2s::operator== (const tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[1] != B[2] ) return false; - if ( m_data[2] != B[3] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[1] != B[2] ) return false; + if ( mData[2] != B[3] ) return false; return true; } @@ -2935,9 +2901,9 @@ inline bool tensor2s::operator== (const tensor2 &B) const template inline bool tensor2s::operator== (const tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[2] != B[1] ) return false; - if ( m_data[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[2] != B[1] ) return false; + if ( mData[1] ) return false; return true; } @@ -2947,9 +2913,9 @@ inline bool tensor2s::operator== (const tensor2d &B) const template inline bool tensor2s::operator== (const reg::tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -2959,10 +2925,10 @@ inline bool tensor2s::operator== (const reg::tensor2s &B) const template inline bool tensor2s::operator== (const reg::tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[1] != B[2] ) return false; - if ( m_data[2] != B[3] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[1] != B[2] ) return false; + if ( mData[2] != B[3] ) return false; return true; } @@ -2972,9 +2938,9 @@ inline bool tensor2s::operator== (const reg::tensor2 &B) const template inline bool tensor2s::operator== (const reg::tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[2] != B[1] ) return false; - if ( m_data[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[2] != B[1] ) return false; + if ( mData[1] ) return false; return true; } @@ -2984,8 +2950,8 @@ inline bool tensor2s::operator== (const reg::tensor2d &B) const template inline bool tensor2d::operator== (const tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; return true; } @@ -2995,8 +2961,8 @@ inline bool tensor2d::operator== (const tensor2d &B) const template inline bool tensor2d::operator== (const tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[3] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[3] ) return false; if ( B[1] ) return false; if ( B[2] ) return false; @@ -3008,8 +2974,8 @@ inline bool tensor2d::operator== (const tensor2 &B) const template inline bool tensor2d::operator== (const tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[2] ) return false; if ( B[1] ) return false; return true; @@ -3020,8 +2986,8 @@ inline bool tensor2d::operator== (const tensor2s &B) const template inline bool tensor2d::operator== (const reg::tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; return true; } @@ -3031,8 +2997,8 @@ inline bool tensor2d::operator== (const reg::tensor2d &B) const template inline bool tensor2d::operator== (const reg::tensor2 &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[3] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[3] ) return false; if ( B[1] ) return false; if ( B[2] ) return false; @@ -3044,8 +3010,8 @@ inline bool tensor2d::operator== (const reg::tensor2 &B) const template inline bool tensor2d::operator== (const reg::tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[2] ) return false; if ( B[1] ) return false; return true; @@ -3056,8 +3022,8 @@ inline bool tensor2d::operator== (const reg::tensor2s &B) const template inline bool vector::operator== (const vector &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; return true; } @@ -3067,8 +3033,8 @@ inline bool vector::operator== (const vector &B) const template inline bool vector::operator== (const reg::vector &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; return true; } @@ -3080,7 +3046,7 @@ inline bool vector::operator== (const reg::vector &B) const template inline bool tensor2::issymmetric() const { - if ( m_data[1] != m_data[2] ) return false; + if ( mData[1] != mData[2] ) return false; return true; } @@ -3090,8 +3056,8 @@ inline bool tensor2::issymmetric() const template inline bool tensor2::isdiagonal() const { - if ( m_data[1] != static_cast(0) ) return false; - if ( m_data[2] != static_cast(0) ) return false; + if ( mData[1] != static_cast(0) ) return false; + if ( mData[2] != static_cast(0) ) return false; return true; } @@ -3101,7 +3067,7 @@ inline bool tensor2::isdiagonal() const template inline bool tensor2s::isdiagonal() const { - if ( m_data[1] != static_cast(0) ) return false; + if ( mData[1] != static_cast(0) ) return false; return true; } @@ -3117,10 +3083,10 @@ inline X tensor4::norm() const for ( size_t i = 0 ; i < 16 ; i += 4 ) { - C += std::abs(m_data[i ]); - C += std::abs(m_data[i+1]); - C += std::abs(m_data[i+2]); - C += std::abs(m_data[i+3]); + C += std::abs(mData[i ]); + C += std::abs(mData[i+1]); + C += std::abs(mData[i+2]); + C += std::abs(mData[i+3]); } return C; @@ -3133,10 +3099,10 @@ inline X tensor2::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); - C += std::abs(m_data[3]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); + C += std::abs(mData[3]); return C; } @@ -3148,9 +3114,9 @@ inline X tensor2s::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); return C; } @@ -3162,8 +3128,8 @@ inline X tensor2d::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); return C; } @@ -3175,8 +3141,8 @@ inline X vector::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); return C; } @@ -3188,8 +3154,8 @@ inline X vector::length() const { X C; - C = std::pow(m_data[0],2.); - C += std::pow(m_data[1],2.); + C = std::pow(mData[0],2.); + C += std::pow(mData[1],2.); return std::sqrt(C); } @@ -3243,7 +3209,7 @@ inline void tensor2d::printf(std::string fmt) const template inline void vector::printf(std::string fmt) const { - std::printf((fmt + "," + fmt + "\n").c_str(), m_data[0], m_data[1]); + std::printf((fmt + "," + fmt + "\n").c_str(), mData[0], mData[1]); } // ------------------------------------------------------------------------------------------------- diff --git a/src/cppmat/view_tensor2.h b/src/cppmat/view_tensor2.h index 15ef730..b7e4e5e 100644 --- a/src/cppmat/view_tensor2.h +++ b/src/cppmat/view_tensor2.h @@ -32,12 +32,12 @@ class tensor4 { private: - const X *m_data; // pointer to data (points outside) + const X *mData=nullptr; // pointer to data (points outside) public: // constructor - tensor4(); + tensor4() = default; // constructor: map external pointer static tensor4 Map(const X *D); @@ -94,12 +94,12 @@ class tensor2 { private: - const X *m_data; // pointer to data (points outside) + const X *mData=nullptr; // pointer to data (points outside) public: // constructor - tensor2(); + tensor2() = default; // constructor: map external pointer static tensor2 Map(const X *D); @@ -175,12 +175,12 @@ class tensor2s { private: - const X *m_data; // pointer to data (points outside) + const X *mData=nullptr; // pointer to data (points outside) public: // constructor - tensor2s(); + tensor2s() = default; // constructor: map external pointer static tensor2s Map(const X *D); @@ -253,8 +253,8 @@ class tensor2d { private: - const X *m_data; // pointer to data (points outside) - X m_zero[1]; // dummy parameter, used to return "0" for any off-diagonal entry + const X *mData=nullptr; // pointer to data (points outside) + X m_zero[1]; // dummy parameter, used to return "0" for any off-diagonal entry public: @@ -329,12 +329,12 @@ class vector { private: - const X *m_data; // pointer to data (points outside) + const X *mData=nullptr; // pointer to data (points outside) public: // constructor - vector(); + vector() = default; // constructor: map external pointer static vector Map(const X *D); diff --git a/src/cppmat/view_tensor3.cpp b/src/cppmat/view_tensor3.cpp index 91467aa..bed69a7 100644 --- a/src/cppmat/view_tensor3.cpp +++ b/src/cppmat/view_tensor3.cpp @@ -21,14 +21,6 @@ namespace cartesian3d { // constructors // ================================================================================================= -template -inline tensor4::tensor4() -{ - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - template inline tensor4 tensor4::Map(const X *D) { @@ -43,14 +35,6 @@ inline tensor4 tensor4::Map(const X *D) // ------------------------------------------------------------------------------------------------- -template -inline tensor2::tensor2() -{ - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - template inline tensor2 tensor2::Map(const X *D) { @@ -65,14 +49,6 @@ inline tensor2 tensor2::Map(const X *D) // ------------------------------------------------------------------------------------------------- -template -inline tensor2s::tensor2s() -{ - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - template inline tensor2s tensor2s::Map(const X *D) { @@ -90,8 +66,6 @@ inline tensor2s tensor2s::Map(const X *D) template inline tensor2d::tensor2d() { - m_data = nullptr; - m_zero[0] = static_cast(0); } @@ -111,14 +85,6 @@ inline tensor2d tensor2d::Map(const X *D) // ------------------------------------------------------------------------------------------------- -template -inline vector::vector() -{ - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - template inline vector vector::Map(const X *D) { @@ -135,11 +101,11 @@ inline vector vector::Map(const X *D) // map external pointer // ================================================================================================= -template inline void tensor4 ::setMap(const X *D) { m_data = D; } -template inline void tensor2 ::setMap(const X *D) { m_data = D; } -template inline void tensor2s::setMap(const X *D) { m_data = D; } -template inline void tensor2d::setMap(const X *D) { m_data = D; } -template inline void vector ::setMap(const X *D) { m_data = D; } +template inline void tensor4 ::setMap(const X *D) { mData = D; } +template inline void tensor2 ::setMap(const X *D) { mData = D; } +template inline void tensor2s::setMap(const X *D) { mData = D; } +template inline void tensor2d::setMap(const X *D) { mData = D; } +template inline void vector ::setMap(const X *D) { mData = D; } // ================================================================================================= // cast to different class / type @@ -151,12 +117,12 @@ inline reg::tensor2s tensor2::cast>() cons { reg::tensor2s out; - out[0] = m_data[0]; - out[1] = ( m_data[1] + m_data[3] ) / 2.; - out[2] = ( m_data[2] + m_data[6] ) / 2.; - out[3] = m_data[4]; - out[4] = ( m_data[5] + m_data[7] ) / 2.; - out[5] = m_data[8]; + out[0] = mData[0]; + out[1] = ( mData[1] + mData[3] ) / 2.; + out[2] = ( mData[2] + mData[6] ) / 2.; + out[3] = mData[4]; + out[4] = ( mData[5] + mData[7] ) / 2.; + out[5] = mData[8]; return out; } @@ -169,9 +135,9 @@ inline reg::tensor2d tensor2::cast>() cons { reg::tensor2d out; - out[0] = m_data[0]; - out[1] = m_data[4]; - out[2] = m_data[8]; + out[0] = mData[0]; + out[1] = mData[4]; + out[2] = mData[8]; return out; } @@ -184,12 +150,12 @@ inline reg::tensor2 tensor2s::cast>() const { reg::tensor2 out; - out[0] = m_data[0]; - out[1] = out[3] = m_data[1]; - out[2] = out[6] = m_data[2]; - out[4] = m_data[3]; - out[5] = out[7] = m_data[4]; - out[8] = m_data[5]; + out[0] = mData[0]; + out[1] = out[3] = mData[1]; + out[2] = out[6] = mData[2]; + out[4] = mData[3]; + out[5] = out[7] = mData[4]; + out[8] = mData[5]; return out; } @@ -202,9 +168,9 @@ inline reg::tensor2d tensor2s::cast>() con { reg::tensor2d out; - out[0] = m_data[0]; - out[1] = m_data[3]; - out[2] = m_data[5]; + out[0] = mData[0]; + out[1] = mData[3]; + out[2] = mData[5]; return out; } @@ -217,9 +183,9 @@ inline reg::tensor2 tensor2d::cast>() const { reg::tensor2 out; - out[0] = m_data[0]; - out[4] = m_data[1]; - out[8] = m_data[2]; + out[0] = mData[0]; + out[4] = mData[1]; + out[8] = mData[2]; out[1] = out[2] = out[3] = out[5] = out[6] = out[7] = 0.0; @@ -234,9 +200,9 @@ inline reg::tensor2s tensor2d::cast>() con { reg::tensor2s out; - out[0] = m_data[0]; - out[3] = m_data[1]; - out[5] = m_data[2]; + out[0] = mData[0]; + out[3] = mData[1]; + out[5] = mData[2]; out[1] = out[2] = out[4] = 0.0; @@ -339,18 +305,18 @@ inline std::vector vector::strides(bool bytes) const // index operators // ================================================================================================= -template inline const X& tensor4 ::operator[](size_t i) const { return m_data[i]; } -template inline const X& tensor2 ::operator[](size_t i) const { return m_data[i]; } -template inline const X& tensor2s::operator[](size_t i) const { return m_data[i]; } -template inline const X& tensor2d::operator[](size_t i) const { return m_data[i]; } -template inline const X& vector ::operator[](size_t i) const { return m_data[i]; } +template inline const X& tensor4 ::operator[](size_t i) const { return mData[i]; } +template inline const X& tensor2 ::operator[](size_t i) const { return mData[i]; } +template inline const X& tensor2s::operator[](size_t i) const { return mData[i]; } +template inline const X& tensor2d::operator[](size_t i) const { return mData[i]; } +template inline const X& vector ::operator[](size_t i) const { return mData[i]; } // ------------------------------------------------------------------------------------------------- template inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) const { - return m_data[i*27+j*9+k*3+l]; + return mData[i*27+j*9+k*3+l]; } // ------------------------------------------------------------------------------------------------- @@ -358,7 +324,7 @@ inline const X& tensor4::operator()(size_t i, size_t j, size_t k, size_t l) c template inline const X& tensor2::operator()(size_t i, size_t j) const { - return m_data[i*3+j]; + return mData[i*3+j]; } // ------------------------------------------------------------------------------------------------- @@ -367,19 +333,19 @@ template inline const X& tensor2s::operator()(size_t i, size_t j) const { if ( i == 0 ) { - if ( j == 0 ) return m_data[0]; - if ( j == 1 ) return m_data[1]; - else return m_data[2]; + if ( j == 0 ) return mData[0]; + if ( j == 1 ) return mData[1]; + else return mData[2]; } if ( i == 1 ) { - if ( j == 0 ) return m_data[1]; - if ( j == 1 ) return m_data[3]; - else return m_data[4]; + if ( j == 0 ) return mData[1]; + if ( j == 1 ) return mData[3]; + else return mData[4]; } else { - if ( j == 0 ) return m_data[2]; - if ( j == 1 ) return m_data[4]; - else return m_data[5]; + if ( j == 0 ) return mData[2]; + if ( j == 1 ) return mData[4]; + else return mData[5]; } } @@ -388,7 +354,7 @@ inline const X& tensor2s::operator()(size_t i, size_t j) const template inline const X& tensor2d::operator()(size_t i, size_t j) const { - if (i == j) return m_data[i]; + if (i == j) return mData[i]; else return m_zero[0]; } @@ -397,28 +363,28 @@ inline const X& tensor2d::operator()(size_t i, size_t j) const template inline const X& vector::operator()(size_t i) const { - return m_data[i]; + return mData[i]; } // ================================================================================================= // pointers / iterators // ================================================================================================= -template inline const X* tensor4 ::data() const { return &m_data[0]; } -template inline auto tensor4 ::begin() const { return &m_data[0]; } -template inline auto tensor4 ::end() const { return &m_data[0] + 81; } -template inline const X* tensor2 ::data() const { return &m_data[0]; } -template inline auto tensor2 ::begin() const { return &m_data[0]; } -template inline auto tensor2 ::end() const { return &m_data[0] + 9; } -template inline const X* tensor2s::data() const { return &m_data[0]; } -template inline auto tensor2s::begin() const { return &m_data[0]; } -template inline auto tensor2s::end() const { return &m_data[0] + 6; } -template inline const X* tensor2d::data() const { return &m_data[0]; } -template inline auto tensor2d::begin() const { return &m_data[0]; } -template inline auto tensor2d::end() const { return &m_data[0] + 3; } -template inline const X* vector ::data() const { return &m_data[0]; } -template inline auto vector ::begin() const { return &m_data[0]; } -template inline auto vector ::end() const { return &m_data[0] + 3; } +template inline const X* tensor4 ::data() const { return &mData[0]; } +template inline auto tensor4 ::begin() const { return &mData[0]; } +template inline auto tensor4 ::end() const { return &mData[0] + 81; } +template inline const X* tensor2 ::data() const { return &mData[0]; } +template inline auto tensor2 ::begin() const { return &mData[0]; } +template inline auto tensor2 ::end() const { return &mData[0] + 9; } +template inline const X* tensor2s::data() const { return &mData[0]; } +template inline auto tensor2s::begin() const { return &mData[0]; } +template inline auto tensor2s::end() const { return &mData[0] + 6; } +template inline const X* tensor2d::data() const { return &mData[0]; } +template inline auto tensor2d::begin() const { return &mData[0]; } +template inline auto tensor2d::end() const { return &mData[0] + 3; } +template inline const X* vector ::data() const { return &mData[0]; } +template inline auto vector ::begin() const { return &mData[0]; } +template inline auto vector ::end() const { return &mData[0] + 3; } // ================================================================================================= // arithmetic operators @@ -1839,7 +1805,7 @@ inline X tensor2::ddot(const tensor2s &B) const template inline X tensor2::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[4]*B[1] + m_data[8]*B[2]; + return mData[0]*B[0] + mData[4]*B[1] + mData[8]*B[2]; } // ------------------------------------------------------------------------------------------------- @@ -1879,12 +1845,12 @@ inline X tensor2s::ddot(const tensor2s &B) const { X C; - C = m_data[0] * B[0]; - C += m_data[1] * B[1] * static_cast(2); - C += m_data[2] * B[2] * static_cast(2); - C += m_data[3] * B[3]; - C += m_data[4] * B[4] * static_cast(2); - C += m_data[5] * B[5]; + C = mData[0] * B[0]; + C += mData[1] * B[1] * static_cast(2); + C += mData[2] * B[2] * static_cast(2); + C += mData[3] * B[3]; + C += mData[4] * B[4] * static_cast(2); + C += mData[5] * B[5]; return C; } @@ -1894,7 +1860,7 @@ inline X tensor2s::ddot(const tensor2s &B) const template inline X tensor2s::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[3]*B[1] + m_data[5]*B[2]; + return mData[0]*B[0] + mData[3]*B[1] + mData[5]*B[2]; } // ------------------------------------------------------------------------------------------------- @@ -1907,7 +1873,7 @@ inline reg::tensor2 tensor2d::ddot(const tensor4 &B) const for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t k = 0 ; k < 3 ; ++k ) for ( size_t l = 0 ; l < 3 ; ++l ) - C(k,l) += m_data[i]*B(i,i,k,l); + C(k,l) += mData[i]*B(i,i,k,l); return C; } @@ -1917,7 +1883,7 @@ inline reg::tensor2 tensor2d::ddot(const tensor4 &B) const template inline X tensor2d::ddot(const tensor2 &B) const { - return m_data[0]*B[0] + m_data[1]*B[4] + m_data[2]*B[8]; + return mData[0]*B[0] + mData[1]*B[4] + mData[2]*B[8]; } // ------------------------------------------------------------------------------------------------- @@ -1925,7 +1891,7 @@ inline X tensor2d::ddot(const tensor2 &B) const template inline X tensor2d::ddot(const tensor2s &B) const { - return m_data[0]*B[0] + m_data[1]*B[3] + m_data[2]*B[5]; + return mData[0]*B[0] + mData[1]*B[3] + mData[2]*B[5]; } // ------------------------------------------------------------------------------------------------- @@ -1933,7 +1899,7 @@ inline X tensor2d::ddot(const tensor2s &B) const template inline X tensor2d::ddot(const tensor2d &B) const { - return m_data[0]*B[0] + m_data[1]*B[1] + m_data[2]*B[2]; + return mData[0]*B[0] + mData[1]*B[1] + mData[2]*B[2]; } @@ -2320,9 +2286,9 @@ inline reg::vector vector::cross(const vector &B) const { reg::vector C; - C[0] = m_data[1]*B[2]-B[1]*m_data[2] ; - C[1] = static_cast(-1)*(m_data[0]*B[2]-B[0]*m_data[2]); - C[2] = m_data[0]*B[1]-B[0]*m_data[1] ; + C[0] = mData[1]*B[2]-B[1]*mData[2] ; + C[1] = static_cast(-1)*(mData[0]*B[2]-B[0]*mData[2]); + C[2] = mData[0]*B[1]-B[0]*mData[1] ; return C; } @@ -2728,15 +2694,15 @@ inline reg::tensor2 tensor2::T() const { reg::tensor2 C; - C[0] = m_data[0]; - C[3] = m_data[1]; - C[6] = m_data[2]; - C[1] = m_data[3]; - C[4] = m_data[4]; - C[7] = m_data[5]; - C[2] = m_data[6]; - C[5] = m_data[7]; - C[8] = m_data[8]; + C[0] = mData[0]; + C[3] = mData[1]; + C[6] = mData[2]; + C[1] = mData[3]; + C[4] = mData[4]; + C[7] = mData[5]; + C[2] = mData[6]; + C[5] = mData[7]; + C[8] = mData[8]; return C; } @@ -2748,12 +2714,12 @@ inline reg::tensor2s tensor2s::T() const { reg::tensor2s C; - C[0] = m_data[0]; - C[1] = m_data[1]; - C[2] = m_data[2]; - C[3] = m_data[3]; - C[4] = m_data[4]; - C[5] = m_data[5]; + C[0] = mData[0]; + C[1] = mData[1]; + C[2] = mData[2]; + C[3] = mData[3]; + C[4] = mData[4]; + C[5] = mData[5]; return C; } @@ -2765,9 +2731,9 @@ inline reg::tensor2d tensor2d::T() const { reg::tensor2d C; - C[0] = m_data[0]; - C[1] = m_data[1]; - C[2] = m_data[2]; + C[0] = mData[0]; + C[1] = mData[1]; + C[2] = mData[2]; return C; } @@ -2827,7 +2793,7 @@ inline reg::tensor4 transposeL(const tensor4 &A) template inline X tensor2::trace() const { - return m_data[0] + m_data[4] + m_data[8]; + return mData[0] + mData[4] + mData[8]; } // ------------------------------------------------------------------------------------------------- @@ -2835,7 +2801,7 @@ inline X tensor2::trace() const template inline X tensor2s::trace() const { - return m_data[0] + m_data[3] + m_data[5]; + return mData[0] + mData[3] + mData[5]; } // ------------------------------------------------------------------------------------------------- @@ -2843,7 +2809,7 @@ inline X tensor2s::trace() const template inline X tensor2d::trace() const { - return m_data[0] + m_data[1] + m_data[2]; + return mData[0] + mData[1] + mData[2]; } // ------------------------------------------------------------------------------------------------- @@ -2851,12 +2817,12 @@ inline X tensor2d::trace() const template inline X tensor2::det() const { - return ( m_data[0] * m_data[4] * m_data[8] + - m_data[1] * m_data[5] * m_data[6] + - m_data[2] * m_data[3] * m_data[7] ) - - ( m_data[2] * m_data[4] * m_data[6] + - m_data[1] * m_data[3] * m_data[8] + - m_data[0] * m_data[5] * m_data[7] ); + return ( mData[0] * mData[4] * mData[8] + + mData[1] * mData[5] * mData[6] + + mData[2] * mData[3] * mData[7] ) - + ( mData[2] * mData[4] * mData[6] + + mData[1] * mData[3] * mData[8] + + mData[0] * mData[5] * mData[7] ); } // ------------------------------------------------------------------------------------------------- @@ -2864,11 +2830,11 @@ inline X tensor2::det() const template inline X tensor2s::det() const { - return ( m_data[0] * m_data[3] * m_data[5] + - static_cast(2) * m_data[1] * m_data[2] * m_data[4] ) - - ( m_data[4] * m_data[4] * m_data[0] + - m_data[2] * m_data[2] * m_data[3] + - m_data[1] * m_data[1] * m_data[5] ); + return ( mData[0] * mData[3] * mData[5] + + static_cast(2) * mData[1] * mData[2] * mData[4] ) - + ( mData[4] * mData[4] * mData[0] + + mData[2] * mData[2] * mData[3] + + mData[1] * mData[1] * mData[5] ); } // ------------------------------------------------------------------------------------------------- @@ -2876,7 +2842,7 @@ inline X tensor2s::det() const template inline X tensor2d::det() const { - return m_data[0] * m_data[1] * m_data[2]; + return mData[0] * mData[1] * mData[2]; } // ------------------------------------------------------------------------------------------------- @@ -2890,15 +2856,15 @@ inline reg::tensor2 tensor2::inv() const // allocate result reg::tensor2 C; - C[0] = (m_data[4]*m_data[8]-m_data[5]*m_data[7]) / D; - C[1] = (m_data[2]*m_data[7]-m_data[1]*m_data[8]) / D; - C[2] = (m_data[1]*m_data[5]-m_data[2]*m_data[4]) / D; - C[3] = (m_data[5]*m_data[6]-m_data[3]*m_data[8]) / D; - C[4] = (m_data[0]*m_data[8]-m_data[2]*m_data[6]) / D; - C[5] = (m_data[2]*m_data[3]-m_data[0]*m_data[5]) / D; - C[6] = (m_data[3]*m_data[7]-m_data[4]*m_data[6]) / D; - C[7] = (m_data[1]*m_data[6]-m_data[0]*m_data[7]) / D; - C[8] = (m_data[0]*m_data[4]-m_data[1]*m_data[3]) / D; + C[0] = (mData[4]*mData[8]-mData[5]*mData[7]) / D; + C[1] = (mData[2]*mData[7]-mData[1]*mData[8]) / D; + C[2] = (mData[1]*mData[5]-mData[2]*mData[4]) / D; + C[3] = (mData[5]*mData[6]-mData[3]*mData[8]) / D; + C[4] = (mData[0]*mData[8]-mData[2]*mData[6]) / D; + C[5] = (mData[2]*mData[3]-mData[0]*mData[5]) / D; + C[6] = (mData[3]*mData[7]-mData[4]*mData[6]) / D; + C[7] = (mData[1]*mData[6]-mData[0]*mData[7]) / D; + C[8] = (mData[0]*mData[4]-mData[1]*mData[3]) / D; return C; } @@ -2913,12 +2879,12 @@ inline reg::tensor2s tensor2s::inv() const // allocate result reg::tensor2s C; - C[0] = (m_data[3]*m_data[5]-m_data[4]*m_data[4]) / D; - C[1] = (m_data[2]*m_data[4]-m_data[1]*m_data[5]) / D; - C[2] = (m_data[1]*m_data[4]-m_data[2]*m_data[3]) / D; - C[3] = (m_data[0]*m_data[5]-m_data[2]*m_data[2]) / D; - C[4] = (m_data[2]*m_data[1]-m_data[0]*m_data[4]) / D; - C[5] = (m_data[0]*m_data[3]-m_data[1]*m_data[1]) / D; + C[0] = (mData[3]*mData[5]-mData[4]*mData[4]) / D; + C[1] = (mData[2]*mData[4]-mData[1]*mData[5]) / D; + C[2] = (mData[1]*mData[4]-mData[2]*mData[3]) / D; + C[3] = (mData[0]*mData[5]-mData[2]*mData[2]) / D; + C[4] = (mData[2]*mData[1]-mData[0]*mData[4]) / D; + C[5] = (mData[0]*mData[3]-mData[1]*mData[1]) / D; return C; } @@ -2930,9 +2896,9 @@ inline reg::tensor2d tensor2d::inv() const // allocate result reg::tensor2d C; - C[0] = static_cast(1) / m_data[0]; - C[1] = static_cast(1) / m_data[1]; - C[2] = static_cast(1) / m_data[2]; + C[0] = static_cast(1) / mData[0]; + C[1] = static_cast(1) / mData[1]; + C[2] = static_cast(1) / mData[2]; return C; } @@ -3017,7 +2983,7 @@ template inline bool tensor4::operator== (const tensor4 &B) const { for ( size_t i = 0 ; i < 81 ; ++i ) - if ( m_data[i] != B[i] ) + if ( mData[i] != B[i] ) return false; return true; @@ -3029,7 +2995,7 @@ template inline bool tensor4::operator== (const reg::tensor4 &B) const { for ( size_t i = 0 ; i < 81 ; ++i ) - if ( m_data[i] != B[i] ) + if ( mData[i] != B[i] ) return false; return true; @@ -3041,7 +3007,7 @@ template inline bool tensor2::operator== (const tensor2 &B) const { for ( size_t i = 0 ; i < 9 ; ++i ) - if ( m_data[i] != B[i] ) + if ( mData[i] != B[i] ) return false; return true; @@ -3054,7 +3020,7 @@ inline bool tensor2::operator== (const tensor2s &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = 0 ; j < 3 ; ++j ) - if ( m_data[i*3+j] != B(i,j) ) + if ( mData[i*3+j] != B(i,j) ) return false; return true; @@ -3067,7 +3033,7 @@ inline bool tensor2::operator== (const tensor2d &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = 0 ; j < 3 ; ++j ) - if ( m_data[i*3+j] != B(i,j) ) + if ( mData[i*3+j] != B(i,j) ) return false; return true; @@ -3079,7 +3045,7 @@ template inline bool tensor2::operator== (const reg::tensor2 &B) const { for ( size_t i = 0 ; i < 9 ; ++i ) - if ( m_data[i] != B[i] ) + if ( mData[i] != B[i] ) return false; return true; @@ -3092,7 +3058,7 @@ inline bool tensor2::operator== (const reg::tensor2s &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = 0 ; j < 3 ; ++j ) - if ( m_data[i*3+j] != B(i,j) ) + if ( mData[i*3+j] != B(i,j) ) return false; return true; @@ -3105,7 +3071,7 @@ inline bool tensor2::operator== (const reg::tensor2d &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = 0 ; j < 3 ; ++j ) - if ( m_data[i*3+j] != B(i,j) ) + if ( mData[i*3+j] != B(i,j) ) return false; return true; @@ -3116,12 +3082,12 @@ inline bool tensor2::operator== (const reg::tensor2d &B) const template inline bool tensor2s::operator== (const tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; - if ( m_data[3] != B[3] ) return false; - if ( m_data[4] != B[4] ) return false; - if ( m_data[5] != B[5] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; + if ( mData[3] != B[3] ) return false; + if ( mData[4] != B[4] ) return false; + if ( mData[5] != B[5] ) return false; return true; } @@ -3133,8 +3099,8 @@ inline bool tensor2s::operator== (const tensor2 &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) { for ( size_t j = i ; j < 3 ; ++j ) { - if ( m_data[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; - if ( m_data[i*3-(i-1)*i/2+j-i] != B(j,i) ) return false; + if ( mData[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; + if ( mData[i*3-(i-1)*i/2+j-i] != B(j,i) ) return false; } } @@ -3148,7 +3114,7 @@ inline bool tensor2s::operator== (const tensor2d &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = i ; j < 3 ; ++j ) - if ( m_data[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; + if ( mData[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; return true; } @@ -3158,12 +3124,12 @@ inline bool tensor2s::operator== (const tensor2d &B) const template inline bool tensor2s::operator== (const reg::tensor2s &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; - if ( m_data[3] != B[3] ) return false; - if ( m_data[4] != B[4] ) return false; - if ( m_data[5] != B[5] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; + if ( mData[3] != B[3] ) return false; + if ( mData[4] != B[4] ) return false; + if ( mData[5] != B[5] ) return false; return true; } @@ -3175,8 +3141,8 @@ inline bool tensor2s::operator== (const reg::tensor2 &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) { for ( size_t j = i ; j < 3 ; ++j ) { - if ( m_data[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; - if ( m_data[i*3-(i-1)*i/2+j-i] != B(j,i) ) return false; + if ( mData[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; + if ( mData[i*3-(i-1)*i/2+j-i] != B(j,i) ) return false; } } @@ -3190,7 +3156,7 @@ inline bool tensor2s::operator== (const reg::tensor2d &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = i ; j < 3 ; ++j ) - if ( m_data[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; + if ( mData[i*3-(i-1)*i/2+j-i] != B(i,j) ) return false; return true; } @@ -3200,9 +3166,9 @@ inline bool tensor2s::operator== (const reg::tensor2d &B) const template inline bool tensor2d::operator== (const tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -3214,7 +3180,7 @@ inline bool tensor2d::operator== (const tensor2 &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) { for ( size_t j = 0 ; j < 3 ; ++j ) { - if ( i == j ) { if ( m_data[i] != B(i,i) ) return false; } + if ( i == j ) { if ( mData[i] != B(i,i) ) return false; } else { if ( B(i,j) ) return false; } } } @@ -3229,7 +3195,7 @@ inline bool tensor2d::operator== (const tensor2s &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) { for ( size_t j = i ; j < 3 ; ++j ) { - if ( i == j ) { if ( m_data[i] != B(i,i) ) return false; } + if ( i == j ) { if ( mData[i] != B(i,i) ) return false; } else { if ( B(i,j) ) return false; } } } @@ -3242,9 +3208,9 @@ inline bool tensor2d::operator== (const tensor2s &B) const template inline bool tensor2d::operator== (const reg::tensor2d &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -3256,7 +3222,7 @@ inline bool tensor2d::operator== (const reg::tensor2 &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) { for ( size_t j = 0 ; j < 3 ; ++j ) { - if ( i == j ) { if ( m_data[i] != B(i,i) ) return false; } + if ( i == j ) { if ( mData[i] != B(i,i) ) return false; } else { if ( B(i,j) ) return false; } } } @@ -3271,7 +3237,7 @@ inline bool tensor2d::operator== (const reg::tensor2s &B) const { for ( size_t i = 0 ; i < 3 ; ++i ) { for ( size_t j = i ; j < 3 ; ++j ) { - if ( i == j ) { if ( m_data[i] != B(i,i) ) return false; } + if ( i == j ) { if ( mData[i] != B(i,i) ) return false; } else { if ( B(i,j) ) return false; } } } @@ -3284,9 +3250,9 @@ inline bool tensor2d::operator== (const reg::tensor2s &B) const template inline bool vector::operator== (const vector &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -3295,9 +3261,9 @@ inline bool vector::operator== (const vector &B) const template inline bool vector::operator== (const reg::vector &B) const { - if ( m_data[0] != B[0] ) return false; - if ( m_data[1] != B[1] ) return false; - if ( m_data[2] != B[2] ) return false; + if ( mData[0] != B[0] ) return false; + if ( mData[1] != B[1] ) return false; + if ( mData[2] != B[2] ) return false; return true; } @@ -3310,7 +3276,7 @@ inline bool tensor2::issymmetric() const { for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = i+1 ; j < 3 ; ++j ) - if ( m_data[i*3+j] != m_data[j*3+i] ) + if ( mData[i*3+j] != mData[j*3+i] ) return false; return true; @@ -3324,7 +3290,7 @@ inline bool tensor2::isdiagonal() const for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = 0 ; j < 3 ; ++j ) if ( i != j ) - if ( m_data[i*3+j] ) + if ( mData[i*3+j] ) return false; return true; @@ -3337,7 +3303,7 @@ inline bool tensor2s::isdiagonal() const { for ( size_t i = 0 ; i < 3 ; ++i ) for ( size_t j = i+1 ; j < 3 ; ++j ) - if ( m_data[i*3-(i-1)*i/2+j-i] ) + if ( mData[i*3-(i-1)*i/2+j-i] ) return false; return true; @@ -3354,9 +3320,9 @@ inline X tensor4::norm() const for ( size_t i = 0 ; i < 81 ; i += 3 ) { - C += std::abs(m_data[i ]); - C += std::abs(m_data[i+1]); - C += std::abs(m_data[i+2]); + C += std::abs(mData[i ]); + C += std::abs(mData[i+1]); + C += std::abs(mData[i+2]); } return C; @@ -3371,9 +3337,9 @@ inline X tensor2::norm() const for ( size_t i = 0 ; i < 9 ; i += 3 ) { - C += std::abs(m_data[i ]); - C += std::abs(m_data[i+1]); - C += std::abs(m_data[i+2]); + C += std::abs(mData[i ]); + C += std::abs(mData[i+1]); + C += std::abs(mData[i+2]); } return C; @@ -3386,12 +3352,12 @@ inline X tensor2s::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); - C += std::abs(m_data[3]); - C += std::abs(m_data[4]); - C += std::abs(m_data[5]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); + C += std::abs(mData[3]); + C += std::abs(mData[4]); + C += std::abs(mData[5]); return C; } @@ -3403,9 +3369,9 @@ inline X tensor2d::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); return C; } @@ -3417,9 +3383,9 @@ inline X vector::norm() const { X C; - C = std::abs(m_data[0]); - C += std::abs(m_data[1]); - C += std::abs(m_data[2]); + C = std::abs(mData[0]); + C += std::abs(mData[1]); + C += std::abs(mData[2]); return C; } @@ -3431,9 +3397,9 @@ inline X vector::length() const { X C; - C = std::pow(m_data[0],2.); - C += std::pow(m_data[1],2.); - C += std::pow(m_data[2],2.); + C = std::pow(mData[0],2.); + C += std::pow(mData[1],2.); + C += std::pow(mData[2],2.); return std::sqrt(C); } @@ -3490,7 +3456,7 @@ inline void tensor2d::printf(std::string fmt) const template inline void vector::printf(std::string fmt) const { - std::printf((fmt + "," + fmt + "," + fmt + "\n").c_str(), m_data[0], m_data[1], m_data[2]); + std::printf((fmt + "," + fmt + "," + fmt + "\n").c_str(), mData[0], mData[1], mData[2]); } // ------------------------------------------------------------------------------------------------- diff --git a/src/cppmat/view_tensor3.h b/src/cppmat/view_tensor3.h index be63bd9..43269d8 100644 --- a/src/cppmat/view_tensor3.h +++ b/src/cppmat/view_tensor3.h @@ -32,12 +32,12 @@ class tensor4 { private: - const X *m_data; // pointer to data (points outside) + const X *mData=nullptr; // pointer to data (points outside) public: // constructor - tensor4(); + tensor4() = default; // constructor: map external pointer static tensor4 Map(const X *D); @@ -94,12 +94,12 @@ class tensor2 { private: - const X *m_data; // pointer to data (points outside) + const X *mData=nullptr; // pointer to data (points outside) public: // constructor - tensor2(); + tensor2() = default; // constructor: map external pointer static tensor2 Map(const X *D); @@ -175,12 +175,12 @@ class tensor2s { private: - const X *m_data; // pointer to data (points outside) + const X *mData=nullptr; // pointer to data (points outside) public: // constructor - tensor2s(); + tensor2s() = default; // constructor: map external pointer static tensor2s Map(const X *D); @@ -253,8 +253,8 @@ class tensor2d { private: - const X *m_data; // pointer to data (points outside) - X m_zero[1]; // dummy parameter, used to return "0" for any off-diagonal entry + const X *mData=nullptr; // pointer to data (points outside) + X m_zero[1]; // dummy parameter, used to return "0" for any off-diagonal entry public: @@ -329,12 +329,12 @@ class vector { private: - const X *m_data; // pointer to data (points outside) + const X *mData=nullptr; // pointer to data (points outside) public: // constructor - vector(); + vector() = default; // constructor: map external pointer static vector Map(const X *D); diff --git a/src/cppmat/view_tiny_matrix.cpp b/src/cppmat/view_tiny_matrix.cpp index 5917287..25251a6 100644 --- a/src/cppmat/view_tiny_matrix.cpp +++ b/src/cppmat/view_tiny_matrix.cpp @@ -4,8 +4,8 @@ ================================================================================================= */ -#ifndef CPPMAT_VIEW_MATRIX_CPP -#define CPPMAT_VIEW_MATRIX_CPP +#ifndef CPPMAT_VIEW_TINY_MATRIX_CPP +#define CPPMAT_VIEW_TINY_MATRIX_CPP // ------------------------------------------------------------------------------------------------- @@ -15,24 +15,17 @@ namespace cppmat { namespace view { +namespace tiny { // ================================================================================================= // constructors // ================================================================================================= -template -inline matrix::matrix() +template +inline matrix matrix::Map(const X *D) { - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline matrix matrix::Map(const X *D) -{ - // allocate matrix - matrix out; + // call basic constructor + matrix out; // initialize out.setMap(D); @@ -40,148 +33,315 @@ inline matrix matrix::Map(const X *D) return out; } +// ------------------------------------------------------------------------------------------------- + +template +inline size_t matrix::Size() +{ + return M*N; +} + // ================================================================================================= // map external pointer // ================================================================================================= -template -inline void matrix::setMap(const X *D) +template +inline void matrix::setMap(const X *D) { - m_data = D; + mData = D; } // ================================================================================================= // get dimensions // ================================================================================================= -template -inline size_t matrix::size() const +template +inline size_t matrix::size() const { - return m_size; + return mSize; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::ndim() const +template +inline size_t matrix::ndim() const { return 2; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::shape(int i) const +template +inline size_t matrix::rows() const { - i = ( i < 0 ) ? i + 2 : ( i >= 2 ) ? i - 2 : i ; + return M; +} - if ( i == 0 ) return m; - if ( i == 1 ) return n; +// ------------------------------------------------------------------------------------------------- - assert( false ); - return 0; +template +inline size_t matrix::cols() const +{ + return N; } // ------------------------------------------------------------------------------------------------- -template -inline size_t matrix::shape(size_t i) const +template +inline size_t matrix::shape(int i) const { - if ( i == 0 ) return m; - if ( i == 1 ) return n; + // check axis: (0,1) or (-1,-2) + assert( i < 2 ); + assert( i >= -2 ); + + // correct periodic index + i = ( 2 + (i%2) ) % 2; - assert( false ); - return 0; + // return shape + if ( i == 0 ) return M; + else return N; } // ------------------------------------------------------------------------------------------------- -template -inline std::vector matrix::shape() const +template +inline size_t matrix::shape(size_t i) const +{ + // check axis: (0,1) + assert( i < 2 ); + + // return shape + if ( i == 0 ) return M; + else return N; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline std::vector matrix::shape() const { std::vector ret(2); - ret[0] = m; - ret[1] = n; + ret[0] = M; + ret[1] = N; return ret; } // ------------------------------------------------------------------------------------------------- -template -inline std::vector matrix::strides(bool bytes) const +template +inline std::vector matrix::strides(bool bytes) const { std::vector ret(2); - ret[0] = n; + ret[0] = N; ret[1] = 1; - if ( bytes ) - for ( size_t i = 0 ; i < 2 ; ++i ) - ret[i] *= sizeof(X); + if ( bytes ) { + ret[0] *= sizeof(X); + ret[1] *= sizeof(X); + } return ret; } // ================================================================================================= -// index operators +// index operators : operator[...] +// ================================================================================================= + +template +inline const X& matrix::operator[](size_t i) const +{ + assert( i < mSize ); + + return mData[i]; +} + +// ================================================================================================= +// index operators : operator(...) // ================================================================================================= -template inline const X& matrix::operator[](size_t i) const +template +inline const X& matrix::operator()(size_t a) const { - return m_data[i]; + assert( a < M ); + + return mData[a*N]; } // ------------------------------------------------------------------------------------------------- -template -inline const X& matrix::operator()(size_t a) const +template +inline const X& matrix::operator()(size_t a, size_t b) const { - return m_data[a*n]; + assert( a < M ); + assert( b < N ); + + return mData[a*N+b]; +} + +// ================================================================================================= +// index operators : at(...) +// ================================================================================================= + +template +template +inline const X& matrix::at(Iterator first, Iterator last) const +{ + // check input + assert( last-first > 0 ); + assert( last-first <= 2 ); + + // suppress compiler warning + UNUSED(last); + + // index + int a = first[0]; + int b = 0; + + // optional index + if ( last-first == 2 ) b = first[1]; + + return mData[a*N+b]; +} + +// ================================================================================================= +// index operators : compress(...) +// ================================================================================================= + +template +inline size_t matrix::compress(size_t a) const +{ + assert( a < M ); + + return a*N; } // ------------------------------------------------------------------------------------------------- -template -inline const X& matrix::operator()(size_t a, size_t b) const +template +inline size_t matrix::compress(size_t a, size_t b) const +{ + assert( a < M ); + assert( b < N ); + + return a*N+b; +} + +// ================================================================================================= +// index operators : decompress(...) +// ================================================================================================= + +template +inline std::vector matrix::decompress(size_t i) const { - return m_data[a*n+b]; + // check input + assert( i < mSize ); + + // allocate array-index + std::vector idx(2); + + // reconstruct + idx[1] = i % N; + idx[0] = ( i - idx[1] ) / N; + + return idx; } // ================================================================================================= // pointer to data // ================================================================================================= -template inline const X* matrix::data() const +template +inline const X* matrix::data() const { - return &m_data[0]; + return std::begin(mData); } // ================================================================================================= -// iterators +// iterators : begin() and end() // ================================================================================================= -template inline auto matrix::begin() const +template +inline auto matrix::begin() const { - return &m_data[0]; + return std::begin(mData); } // ------------------------------------------------------------------------------------------------- -template inline auto matrix::end() const +template +inline auto matrix::end() const { - return &m_data[0] + m_size; + return std::begin(mData) + mSize; +} + +// ================================================================================================= +// iterators : beginRow() and endRow() +// ================================================================================================= + +template +inline auto matrix::beginRow(size_t a) const +{ + assert( a < M ); + + return begin() + a*N; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto matrix::endRow(size_t a) const +{ + assert( a < M ); + + return begin() + (a+1)*N; +} + +// ================================================================================================= +// iterators : index() +// ================================================================================================= + +template +inline auto matrix::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ================================================================================================= +// iterators : item() +// ================================================================================================= + +template +inline auto matrix::item(size_t a) const +{ + assert( a < M ); + + return begin() + a*N; +} + +// ------------------------------------------------------------------------------------------------- + +template +inline auto matrix::item(size_t a, size_t b) const +{ + assert( a < M ); + assert( b < N ); + + return begin() + a*N+b; } // ================================================================================================= // arithmetic operators // ================================================================================================= -template -inline reg::matrix operator* (const matrix &A, const matrix &B) +template +inline reg::matrix operator* (const matrix &A, const matrix &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] * B[i]; @@ -191,10 +351,10 @@ inline reg::matrix operator* (const matrix &A, const matrix // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator/ (const matrix &A, const matrix &B) +template +inline reg::matrix operator/ (const matrix &A, const matrix &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] / B[i]; @@ -204,10 +364,10 @@ inline reg::matrix operator/ (const matrix &A, const matrix // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator+ (const matrix &A, const matrix &B) +template +inline reg::matrix operator+ (const matrix &A, const matrix &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] + B[i]; @@ -217,10 +377,10 @@ inline reg::matrix operator+ (const matrix &A, const matrix // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator- (const matrix &A, const matrix &B) +template +inline reg::matrix operator- (const matrix &A, const matrix &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] - B[i]; @@ -230,10 +390,10 @@ inline reg::matrix operator- (const matrix &A, const matrix // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator* (const matrix &A, const X &B) +template +inline reg::matrix operator* (const matrix &A, const X &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] * B; @@ -243,10 +403,10 @@ inline reg::matrix operator* (const matrix &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator/ (const matrix &A, const X &B) +template +inline reg::matrix operator/ (const matrix &A, const X &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] / B; @@ -256,10 +416,10 @@ inline reg::matrix operator/ (const matrix &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator+ (const matrix &A, const X &B) +template +inline reg::matrix operator+ (const matrix &A, const X &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] + B; @@ -269,10 +429,10 @@ inline reg::matrix operator+ (const matrix &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator- (const matrix &A, const X &B) +template +inline reg::matrix operator- (const matrix &A, const X &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] - B; @@ -282,10 +442,10 @@ inline reg::matrix operator- (const matrix &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator* (const X &A, const matrix &B) +template +inline reg::matrix operator* (const X &A, const matrix &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A * B[i]; @@ -295,10 +455,10 @@ inline reg::matrix operator* (const X &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator/ (const X &A, const matrix &B) +template +inline reg::matrix operator/ (const X &A, const matrix &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A / B[i]; @@ -308,10 +468,10 @@ inline reg::matrix operator/ (const X &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator+ (const X &A, const matrix &B) +template +inline reg::matrix operator+ (const X &A, const matrix &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A + B[i]; @@ -321,10 +481,10 @@ inline reg::matrix operator+ (const X &A, const matrix &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::matrix operator- (const X &A, const matrix &B) +template +inline reg::matrix operator- (const X &A, const matrix &B) { - reg::matrix C; + reg::matrix C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A - B[i]; @@ -333,67 +493,98 @@ inline reg::matrix operator- (const X &A, const matrix &B) } // ================================================================================================= -// basic algebra +// basic algebra : location of the minimum/maximum // ================================================================================================= -template -inline X matrix::minCoeff() const +template +inline std::vector matrix::argmin() const { - return *std::min_element(begin(),end()); + return decompress( std::min_element(begin(),end()) - begin() ); } // ------------------------------------------------------------------------------------------------- -template -inline X matrix::maxCoeff() const +template +inline std::vector matrix::argmax() const +{ + return decompress( std::max_element(begin(),end()) - begin() ); +} + +// ================================================================================================= +// basic algebra : minimum +// ================================================================================================= + +template +inline X matrix::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ================================================================================================= +// basic algebra : maximum +// ================================================================================================= + +template +inline X matrix::maxCoeff() const { return *std::max_element(begin(),end()); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra : sum +// ================================================================================================= -template -inline X matrix::sum() const +template +inline X matrix::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra : mean +// ================================================================================================= -template -inline double matrix::mean() const +template +inline double matrix::mean() const { - return static_cast(this->sum())/static_cast(m_size); + return static_cast(this->sum())/static_cast(mSize); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra : weighted average +// ================================================================================================= -template -inline double matrix::average(const matrix &weights) const +template +inline double matrix::average(const matrix &weights, bool norm) const { + assert( M == weights.shape(0) ); + assert( N == weights.shape(1) ); + X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; - return static_cast(out)/static_cast(weights.sum()); + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); } + // ================================================================================================= // formatted print // ================================================================================================= -template -inline void matrix::printf(std::string fmt) const +template +inline void matrix::printf(std::string fmt) const { - for ( size_t i = 0 ; i < m ; ++i ) { - for ( size_t j = 0 ; j < n ; ++j ) { - if ( j != n-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); + for ( size_t i = 0 ; i < M ; ++i ) { + for ( size_t j = 0 ; j < N ; ++j ) { + if ( j != N-1 ) std::printf((fmt + "," ).c_str(), (*this)(i,j)); else std::printf((fmt + ";\n").c_str(), (*this)(i,j)); } } @@ -401,17 +592,17 @@ inline void matrix::printf(std::string fmt) const // ------------------------------------------------------------------------------------------------- -template -inline std::ostream& operator<<(std::ostream& out, const matrix& src) +template +inline std::ostream& operator<<(std::ostream& out, const matrix& src) { auto w = out.width(); auto p = out.precision(); - for ( size_t i = 0 ; i < m ; ++i ) { - for ( size_t j = 0 ; j < n ; ++j ) { + for ( size_t i = 0 ; i < M ; ++i ) { + for ( size_t j = 0 ; j < N ; ++j ) { out << std::setw(w) << std::setprecision(p) << src(i,j); - if ( j != n-1 ) out << ", "; - else if ( i != m-1 ) out << ";" << std::endl; + if ( j != N-1 ) out << ", "; + else if ( i != M-1 ) out << ";" << std::endl; else out << ";"; } } @@ -421,7 +612,7 @@ inline std::ostream& operator<<(std::ostream& out, const matrix& src) // ================================================================================================= -}} // namespace ... +}}} // namespace ... // ------------------------------------------------------------------------------------------------- diff --git a/src/cppmat/view_tiny_matrix.h b/src/cppmat/view_tiny_matrix.h index a1b48b1..6542028 100644 --- a/src/cppmat/view_tiny_matrix.h +++ b/src/cppmat/view_tiny_matrix.h @@ -4,8 +4,8 @@ ================================================================================================= */ -#ifndef CPPMAT_VIEW_MATRIX2_H -#define CPPMAT_VIEW_MATRIX2_H +#ifndef CPPMAT_VIEW_TINY_MATRIX_H +#define CPPMAT_VIEW_TINY_MATRIX_H // ------------------------------------------------------------------------------------------------- @@ -15,6 +15,7 @@ namespace cppmat { namespace view { +namespace tiny { // ================================================================================================= // alias name-space with "normal" class @@ -26,28 +27,33 @@ namespace reg = cppmat::tiny; // cppmat::view::matrix // ================================================================================================= -template +template class matrix { private: - const X *m_data; // pointer to data (points outside) - size_t m_size=m*n; // total number of entries + const X *mData=nullptr; // pointer to data (points outside) + static const size_t mSize=M*N; // total size public: // constructor - matrix(); + matrix() = default; // constructor: map external pointer - static matrix Map(const X *D); + static matrix Map(const X *D); // reset external pointer void setMap(const X *D); + // information without constructing + static size_t Size(); + // get dimensions size_t size() const; size_t ndim() const; + size_t rows() const; + size_t cols() const; size_t shape(int i) const; size_t shape(size_t i) const; std::vector shape() const; @@ -56,10 +62,21 @@ class matrix // index operators: access plain storage const X& operator[](size_t i) const; - // index operators: access using matrix indices + // index operators: access using matrix-indices const X& operator()(size_t a) const; const X& operator()(size_t a, size_t b) const; + // index operators: access using iterator + // N.B. the iterator points to list of matrix-indices (a,b) + template const X& at(Iterator first, Iterator last) const; + + // index operators: plain storage -> matrix-indices (i -> a,b) + std::vector decompress(size_t i) const; + + // index operators: matrix-indices -> plain storage (a,b -> i) + size_t compress(size_t a) const; + size_t compress(size_t a, size_t b) const; + // pointer to data const X* data() const; @@ -67,12 +84,31 @@ class matrix auto begin() const; auto end() const; + // iterator to the first and last entry of a row + auto beginRow(size_t i) const; + auto endRow(size_t i) const; + + // iterator to specific entry: access plain storage + auto index(size_t i) const; + + // iterator to specific entry: access using matrix-indices + auto item(size_t a) const; + auto item(size_t a, size_t b) const; + // basic algebra - X minCoeff() const; - X maxCoeff() const; - X sum() const; + // - location of the minimum/maximum + std::vector argmin() const; + std::vector argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean double mean() const; - double average(const matrix &weights) const; + // - weighted average + double average(const matrix &weights, bool norm=true) const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -80,45 +116,45 @@ class matrix }; // arithmetic operators -template -inline reg::matrix operator* (const matrix &A, const matrix &B); +template +inline reg::matrix operator* (const matrix &A, const matrix &B); -template -inline reg::matrix operator/ (const matrix &A, const matrix &B); +template +inline reg::matrix operator/ (const matrix &A, const matrix &B); -template -inline reg::matrix operator+ (const matrix &A, const matrix &B); +template +inline reg::matrix operator+ (const matrix &A, const matrix &B); -template -inline reg::matrix operator- (const matrix &A, const matrix &B); +template +inline reg::matrix operator- (const matrix &A, const matrix &B); -template -inline reg::matrix operator* (const matrix &A, const X &B); +template +inline reg::matrix operator* (const matrix &A, const X &B); -template -inline reg::matrix operator/ (const matrix &A, const X &B); +template +inline reg::matrix operator/ (const matrix &A, const X &B); -template -inline reg::matrix operator+ (const matrix &A, const X &B); +template +inline reg::matrix operator+ (const matrix &A, const X &B); -template -inline reg::matrix operator- (const matrix &A, const X &B); +template +inline reg::matrix operator- (const matrix &A, const X &B); -template -inline reg::matrix operator* (const X &A, const matrix &B); +template +inline reg::matrix operator* (const X &A, const matrix &B); -template -inline reg::matrix operator/ (const X &A, const matrix &B); +template +inline reg::matrix operator/ (const X &A, const matrix &B); -template -inline reg::matrix operator+ (const X &A, const matrix &B); +template +inline reg::matrix operator+ (const X &A, const matrix &B); -template -inline reg::matrix operator- (const X &A, const matrix &B); +template +inline reg::matrix operator- (const X &A, const matrix &B); // ================================================================================================= -}} // namespace ... +}}} // namespace ... // ------------------------------------------------------------------------------------------------- diff --git a/src/cppmat/view_tiny_vector.cpp b/src/cppmat/view_tiny_vector.cpp index 0e21753..5d3fd40 100644 --- a/src/cppmat/view_tiny_vector.cpp +++ b/src/cppmat/view_tiny_vector.cpp @@ -4,8 +4,8 @@ ================================================================================================= */ -#ifndef CPPMAT_VIEW_VECTOR_CPP -#define CPPMAT_VIEW_VECTOR_CPP +#ifndef CPPMAT_VIEW_TINY_VECTOR_CPP +#define CPPMAT_VIEW_TINY_VECTOR_CPP // ------------------------------------------------------------------------------------------------- @@ -15,24 +15,17 @@ namespace cppmat { namespace view { +namespace tiny { // ================================================================================================= // constructors // ================================================================================================= -template -inline vector::vector() +template +inline vector vector::Map(const X *D) { - m_data = nullptr; -} - -// ------------------------------------------------------------------------------------------------- - -template -inline vector vector::Map(const X *D) -{ - // allocate matrix - vector out; + // call basic constructor + vector out; // initialize out.setMap(D); @@ -40,75 +33,82 @@ inline vector vector::Map(const X *D) return out; } +// ------------------------------------------------------------------------------------------------- + +template +inline size_t vector::Size() +{ + return N; +} + // ================================================================================================= // map external pointer // ================================================================================================= -template -inline void vector::setMap(const X *D) +template +inline void vector::setMap(const X *D) { - m_data = D; + mData = D; } // ================================================================================================= // get dimensions // ================================================================================================= -template -inline size_t vector::size() const +template +inline size_t vector::size() const { - return m_size; + return mSize; } // ------------------------------------------------------------------------------------------------- -template -inline size_t vector::ndim() const +template +inline size_t vector::ndim() const { return 1; } // ------------------------------------------------------------------------------------------------- -template -inline size_t vector::shape(size_t i) const +template +inline size_t vector::shape(int i) const { - if ( i == 0 ) return n; + // check axis: (0) or (-1) + assert( i < 1 ); + assert( i >= -1 ); - assert( false ); - return 0; + return N; } // ------------------------------------------------------------------------------------------------- -template -inline size_t vector::shape(int i) const +template +inline size_t vector::shape(size_t i) const { - i = ( i < 0 ) ? i + 1 : ( i >= 1 ) ? i - 1 : i ; + // check axis: (0) + assert( i < 1 ); - if ( i == 0 ) return n; + return N; - assert( false ); - return 0; } - // ------------------------------------------------------------------------------------------------- -template -inline std::vector vector::shape() const +template +inline std::vector vector::shape() const { std::vector ret(1); - ret[0] = n; + ret[0] = N; return ret; } // ------------------------------------------------------------------------------------------------- -template -inline std::vector vector::strides(bool bytes) const +template +inline std::vector vector::strides(bool bytes) const { std::vector ret(1); @@ -121,53 +121,86 @@ inline std::vector vector::strides(bool bytes) const } // ================================================================================================= -// index operators +// index operators : operator[...] // ================================================================================================= -template inline const X& vector::operator[](size_t i) const +template +inline const X& vector::operator[](size_t i) const { - return m_data[i]; + assert( i < mSize ); + + return mData[i]; } // ------------------------------------------------------------------------------------------------- -template -inline const X& vector::operator()(size_t a) const +template +inline const X& vector::operator()(size_t a) const { - return m_data[a]; + assert( a < N ); + + return mData[a]; } // ================================================================================================= -// pointers / iterators +// pointer to data // ================================================================================================= -template inline const X* vector::data() const +template +inline const X* vector::data() const { - return &m_data[0]; + return std::begin(mData); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// iterators : begin() and end() +// ================================================================================================= -template inline auto vector::begin() const +template +inline auto vector::begin() const { - return &m_data[0]; + return std::begin(mData); } // ------------------------------------------------------------------------------------------------- -template inline auto vector::end() const +template +inline auto vector::end() const { - return &m_data[0] + m_size; + return std::begin(mData) + N; +} + +// ================================================================================================= +// iterators : index() +// ================================================================================================= +template +inline auto vector::index(size_t i) const +{ + assert( i < mSize ); + + return begin() + i; +} + +// ================================================================================================= +// iterators : item() +// ================================================================================================= + +template +inline auto vector::item(size_t a) const +{ + assert( a < N ); + + return begin() + a; } // ================================================================================================= // arithmetic operators // ================================================================================================= -template -inline reg::vector operator* (const vector &A, const vector &B) +template +inline reg::vector operator* (const vector &A, const vector &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] * B[i]; @@ -177,10 +210,10 @@ inline reg::vector operator* (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator/ (const vector &A, const vector &B) +template +inline reg::vector operator/ (const vector &A, const vector &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] / B[i]; @@ -190,10 +223,10 @@ inline reg::vector operator/ (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator+ (const vector &A, const vector &B) +template +inline reg::vector operator+ (const vector &A, const vector &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] + B[i]; @@ -203,10 +236,10 @@ inline reg::vector operator+ (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator- (const vector &A, const vector &B) +template +inline reg::vector operator- (const vector &A, const vector &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] - B[i]; @@ -216,10 +249,10 @@ inline reg::vector operator- (const vector &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator* (const vector &A, const X &B) +template +inline reg::vector operator* (const vector &A, const X &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] * B; @@ -229,10 +262,10 @@ inline reg::vector operator* (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator/ (const vector &A, const X &B) +template +inline reg::vector operator/ (const vector &A, const X &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] / B; @@ -242,10 +275,10 @@ inline reg::vector operator/ (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator+ (const vector &A, const X &B) +template +inline reg::vector operator+ (const vector &A, const X &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] + B; @@ -255,10 +288,10 @@ inline reg::vector operator+ (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator- (const vector &A, const X &B) +template +inline reg::vector operator- (const vector &A, const X &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A[i] - B; @@ -268,10 +301,10 @@ inline reg::vector operator- (const vector &A, const X &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator* (const X &A, const vector &B) +template +inline reg::vector operator* (const X &A, const vector &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A * B[i]; @@ -281,10 +314,10 @@ inline reg::vector operator* (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator/ (const X &A, const vector &B) +template +inline reg::vector operator/ (const X &A, const vector &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A / B[i]; @@ -294,10 +327,10 @@ inline reg::vector operator/ (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator+ (const X &A, const vector &B) +template +inline reg::vector operator+ (const X &A, const vector &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A + B[i]; @@ -307,10 +340,10 @@ inline reg::vector operator+ (const X &A, const vector &B) // ------------------------------------------------------------------------------------------------- -template -inline reg::vector operator- (const X &A, const vector &B) +template +inline reg::vector operator- (const X &A, const vector &B) { - reg::vector C; + reg::vector C; for ( size_t i = 0 ; i < C.size() ; ++i ) C[i] = A - B[i]; @@ -319,81 +352,135 @@ inline reg::vector operator- (const X &A, const vector &B) } // ================================================================================================= -// basic algebra +// basic algebra : location of the minimum/maximum // ================================================================================================= -template -inline X vector::minCoeff() const +template +inline size_t vector::argmin() const { - return *std::min_element(begin(),end()); + return std::min_element(begin(),end()) - begin(); } // ------------------------------------------------------------------------------------------------- -template -inline X vector::maxCoeff() const +template +inline size_t vector::argmax() const +{ + return std::max_element(begin(),end()) - begin(); +} + +// ================================================================================================= +// basic algebra : minimum +// ================================================================================================= + +template +inline X vector::minCoeff() const +{ + return *std::min_element(begin(),end()); +} + +// ================================================================================================= +// basic algebra : maximum +// ================================================================================================= + +template +inline X vector::maxCoeff() const { return *std::max_element(begin(),end()); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra : sum +// ================================================================================================= -template -inline X vector::sum() const +template +inline X vector::sum() const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i]; return out; } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra : mean +// ================================================================================================= -template -inline double vector::mean() const +template +inline double vector::mean() const { - return static_cast(this->sum())/static_cast(m_size); + return static_cast(this->sum())/static_cast(mSize); } -// ------------------------------------------------------------------------------------------------- +// ================================================================================================= +// basic algebra : weighted average +// ================================================================================================= -template -inline double vector::average(const vector &weights) const +template +inline double vector::average(const vector &weights, bool norm) const { X out = static_cast(0); - for ( size_t i = 0 ; i < m_size ; ++i ) - out += m_data[i] * weights[i]; + for ( size_t i = 0 ; i < mSize ; ++i ) + out += mData[i] * weights[i]; + + if ( norm ) return static_cast(out)/static_cast(weights.sum()); + else return static_cast(out); +} + +// ================================================================================================= +// find all non-zero entries +// ================================================================================================= + +template +inline cppmat::vector vector::where() const +{ + size_t nnz = 0; + + for ( size_t i = 0 ; i < mSize ; ++i ) + if ( mData[i] ) + ++nnz; + + cppmat::vector out(nnz); - return static_cast(out)/static_cast(weights.sum()); + size_t j = 0; + + for ( size_t i = 0 ; i < mSize ; ++i ) { + if ( mData[i] ) { + out[j] = i; + ++j; + } + } + + return out; } // ================================================================================================= // formatted print // ================================================================================================= -template -inline void vector::printf(std::string fmt) const +template +inline void vector::printf(std::string fmt) const { - for ( size_t j = 0 ; j < n ; ++j ) { - if ( j != n-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); + for ( size_t j = 0 ; j < N ; ++j ) { + if ( j != N-1 ) std::printf((fmt + "," ).c_str(), (*this)(j)); else std::printf((fmt + ";\n").c_str(), (*this)(j)); } } // ------------------------------------------------------------------------------------------------- -template -inline std::ostream& operator<<(std::ostream& out, const vector& src) +template +inline std::ostream& operator<<(std::ostream& out, const vector& src) { auto w = out.width(); auto p = out.precision(); - for ( size_t j = 0 ; j < n ; ++j ) { + for ( size_t j = 0 ; j < N ; ++j ) { out << std::setw(w) << std::setprecision(p) << src(j); - if ( j != n-1 ) out << ", "; + if ( j != N-1 ) out << ", "; } return out; @@ -401,7 +488,7 @@ inline std::ostream& operator<<(std::ostream& out, const vector& src) // ================================================================================================= -}} // namespace ... +}}} // namespace ... // ------------------------------------------------------------------------------------------------- diff --git a/src/cppmat/view_tiny_vector.h b/src/cppmat/view_tiny_vector.h index 713e6b8..5feabe2 100644 --- a/src/cppmat/view_tiny_vector.h +++ b/src/cppmat/view_tiny_vector.h @@ -4,8 +4,8 @@ ================================================================================================= */ -#ifndef CPPMAT_VIEW_VECTOR_H -#define CPPMAT_VIEW_VECTOR_H +#ifndef CPPMAT_VIEW_TINY_VECTOR_H +#define CPPMAT_VIEW_TINY_VECTOR_H // ------------------------------------------------------------------------------------------------- @@ -15,6 +15,7 @@ namespace cppmat { namespace view { +namespace tiny { // ================================================================================================= // alias name-space with "normal" class @@ -26,25 +27,28 @@ namespace reg = cppmat::tiny; // cppmat::view::vector // ================================================================================================= -template +template class vector { private: - const X *m_data; // pointer to data (points outside) - size_t m_size=n; // total number of entries + const X *mData=nullptr; // pointer to data (points outside) + static const size_t mSize=N; // total size public: // constructor - vector(); + vector() = default; // constructor: map external pointer - static vector Map(const X *D); + static vector Map(const X *D); // reset external pointer void setMap(const X *D); + // information without constructing + static size_t Size(); + // get dimensions size_t size() const; size_t ndim() const; @@ -56,7 +60,7 @@ class vector // index operators: access plain storage const X& operator[](size_t i) const; - // index operators: access using matrix indices + // index operators: access using list-index const X& operator()(size_t a) const; // pointer to data @@ -66,12 +70,30 @@ class vector auto begin() const; auto end() const; + // iterator to specific entry: access plain storage + auto index(size_t i) const; + + // iterator to specific entry: access using list-index + auto item(size_t a) const; // basic algebra - X minCoeff() const; - X maxCoeff() const; - X sum() const; + // - absolute value + void abs(); + // - location of the minimum/maximum + size_t argmin() const; + size_t argmax() const; + // - minimum + X minCoeff() const; + // - maximum + X maxCoeff() const; + // - sum + X sum() const; + // - mean double mean() const; - double average(const vector &weights) const; + // - weighted average + double average(const vector &weights, bool norm=true) const; + + // find all non-zero entries + cppmat::vector where() const; // formatted print; NB also "operator<<" is defined void printf(std::string fmt) const; @@ -79,45 +101,45 @@ class vector }; // arithmetic operators -template -inline reg::vector operator* (const vector &A, const vector &B); +template +inline reg::vector operator* (const vector &A, const vector &B); -template -inline reg::vector operator/ (const vector &A, const vector &B); +template +inline reg::vector operator/ (const vector &A, const vector &B); -template -inline reg::vector operator+ (const vector &A, const vector &B); +template +inline reg::vector operator+ (const vector &A, const vector &B); -template -inline reg::vector operator- (const vector &A, const vector &B); +template +inline reg::vector operator- (const vector &A, const vector &B); -template -inline reg::vector operator* (const vector &A, const X &B); +template +inline reg::vector operator* (const vector &A, const X &B); -template -inline reg::vector operator/ (const vector &A, const X &B); +template +inline reg::vector operator/ (const vector &A, const X &B); -template -inline reg::vector operator+ (const vector &A, const X &B); +template +inline reg::vector operator+ (const vector &A, const X &B); -template -inline reg::vector operator- (const vector &A, const X &B); +template +inline reg::vector operator- (const vector &A, const X &B); -template -inline reg::vector operator* (const X &A, const vector &B); +template +inline reg::vector operator* (const X &A, const vector &B); -template -inline reg::vector operator/ (const X &A, const vector &B); +template +inline reg::vector operator/ (const X &A, const vector &B); -template -inline reg::vector operator+ (const X &A, const vector &B); +template +inline reg::vector operator+ (const X &A, const vector &B); -template -inline reg::vector operator- (const X &A, const vector &B); +template +inline reg::vector operator- (const X &A, const vector &B); // ================================================================================================= -}} // namespace ... +}}} // namespace ... // -------------------------------------------------------------------------------------------------