Merge branch 'cnr-isti-vclab:devel' into devel
This commit is contained in:
commit
11910705b5
|
@ -1,59 +0,0 @@
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- devel
|
|
||||||
|
|
||||||
# Build worker image (VM template)
|
|
||||||
image: Visual Studio 2015
|
|
||||||
|
|
||||||
# clone directory
|
|
||||||
clone_folder: c:\projects\vcglib
|
|
||||||
# Build Configuration, i.e. Debug, Release, etc.
|
|
||||||
configuration:
|
|
||||||
- release
|
|
||||||
# - debug
|
|
||||||
|
|
||||||
environment:
|
|
||||||
matrix:
|
|
||||||
# MinGW 32bit
|
|
||||||
- QTDIR: C:\Qt\5.6\mingw49_32
|
|
||||||
SPEC: win32-g++
|
|
||||||
COMPILER: mingw32-make
|
|
||||||
#ARTIFACT: $(APPVEYOR_PROJECT_NAME)-%APPVEYOR_REPO_TAG_NAME%.%APPVEYOR_BUILD_NUMBER%-win32.zip
|
|
||||||
#ARTIFACT: $(APPVEYOR_PROJECT_NAME)-%APPVEYOR_REPO_TAG_NAME%-win32.zip
|
|
||||||
# Microsoft Visual Studio 64bit
|
|
||||||
- QTDIR: C:\Qt\5.6\msvc2015_64
|
|
||||||
VSVER: 14.0
|
|
||||||
SPEC: win32-msvc2015
|
|
||||||
COMPILER: nmake
|
|
||||||
#ARTIFACT: $(APPVEYOR_PROJECT_NAME)-%APPVEYOR_REPO_TAG_NAME%.%APPVEYOR_BUILD_NUMBER%-win64.zip
|
|
||||||
#ARTIFACT: $(APPVEYOR_PROJECT_NAME)-%APPVEYOR_REPO_TAG_NAME%-win64.zip
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Set paths, etc.
|
|
||||||
before_build:
|
|
||||||
# Set paths
|
|
||||||
#- '%QTDIR%\bin\qtenv2.bat'
|
|
||||||
- call "%QTDIR%\bin\qtenv2.bat"
|
|
||||||
# Show qmake and make version
|
|
||||||
- qmake -v
|
|
||||||
- if %COMPILER%==mingw32-make call %COMPILER% -v
|
|
||||||
# Detect architecture (32bit or 64bit)
|
|
||||||
- if %QTDIR:_64=%==%QTDIR% (set ARCH=x86) else (set ARCH=x64)
|
|
||||||
# Set more... if Microsoft Visual Studio
|
|
||||||
- if %COMPILER%==nmake call "%ProgramFiles(x86)%\Microsoft Visual Studio %VSVER%\VC\vcvarsall.bat" %ARCH%
|
|
||||||
# Show build folder
|
|
||||||
#- echo %APPVEYOR_BUILD_FOLDER%
|
|
||||||
#- echo %CONFIGURATION%
|
|
||||||
|
|
||||||
# To run your custom scripts instead of automatic MSBuild
|
|
||||||
build_script:
|
|
||||||
# Go to clone directory
|
|
||||||
- cd %APPVEYOR_BUILD_FOLDER%
|
|
||||||
- cd apps
|
|
||||||
- cd sample
|
|
||||||
# Run qmake
|
|
||||||
- qmake sample.pro -r -spec %SPEC% "CONFIG+=%CONFIGURATION%"
|
|
||||||
# Run compiler
|
|
||||||
#- '%COMPILER%'
|
|
||||||
- call %COMPILER%
|
|
|
@ -3,12 +3,13 @@
|
||||||
VCGLib is fully owned by CNR, and all the VCGLib contributors that do not work at the VCLab of CNR must first sign the contributor license agreement that you can find at the following link: https://github.com/cnr-isti-vclab/vcglib/blob/devel/docs/ContributorLicenseAgreement.pdf
|
VCGLib is fully owned by CNR, and all the VCGLib contributors that do not work at the VCLab of CNR must first sign the contributor license agreement that you can find at the following link: https://github.com/cnr-isti-vclab/vcglib/blob/devel/docs/ContributorLicenseAgreement.pdf
|
||||||
|
|
||||||
If you will sign the CLA, then we will be able to merge your pull request after reviewing it.
|
If you will sign the CLA, then we will be able to merge your pull request after reviewing it.
|
||||||
|
The validity of the CLA is two years, therefore after signing it your PRs for the next two years can be merged without further actions.
|
||||||
Please send the signed document to muntoni.alessandro@gmail.com and paolo.cignoni@isti.cnr.it .
|
Please send the signed document to muntoni.alessandro@gmail.com and paolo.cignoni@isti.cnr.it .
|
||||||
If you will not sign the CLA, we will review and then apply your changes as soon as possible.
|
If you will not sign the CLA, we will review and then apply your changes as soon as possible.
|
||||||
|
|
||||||
Before opening the PR, please leave the follwing form with a check for your particluar case:
|
Before opening the PR, please leave the following form with a check for your particular case:
|
||||||
|
|
||||||
##### Check with `[x]` what is your case:
|
##### Check with `[x]` what is your case:
|
||||||
- [ ] I already signed and sent via email the CLA;
|
- [ ] I already signed and sent via email the CLA;
|
||||||
- [ ] I wil sign and send the CLA via email as soon as possible;
|
- [ ] I will sign and send the CLA via email as soon as possible;
|
||||||
- [ ] I don't want to sign the CLA.
|
- [ ] I don't want to sign the CLA.
|
|
@ -9,12 +9,6 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Download Jom
|
|
||||||
run: |
|
|
||||||
Invoke-WebRequest -Uri "http://mirrors.ukfast.co.uk/sites/qt.io/official_releases/jom/jom_1_1_3.zip" -OutFile "jom_1_1_3.zip"
|
|
||||||
New-Item -Name "jom" -ItemType "directory"
|
|
||||||
Expand-Archive -Path jom_1_1_3.zip -DestinationPath .\jom
|
|
||||||
echo "$(Get-Location)\jom" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
|
||||||
- name: Setup env variables
|
- name: Setup env variables
|
||||||
id: envs
|
id: envs
|
||||||
run: |
|
run: |
|
||||||
|
@ -27,5 +21,5 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake -G "NMake Makefiles" -DVCG_BUILD_EXAMPLES=ON ..
|
cmake -GNinja -DVCG_BUILD_EXAMPLES=ON ..
|
||||||
jom -j4
|
ninja
|
||||||
|
|
49
.travis.yml
49
.travis.yml
|
@ -1,49 +0,0 @@
|
||||||
|
|
||||||
# Enable C++ support
|
|
||||||
language: cpp
|
|
||||||
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
- osx
|
|
||||||
|
|
||||||
|
|
||||||
# Compiler selection
|
|
||||||
compiler:
|
|
||||||
- clang
|
|
||||||
- gcc
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- gcc-4.8
|
|
||||||
- g++-4.8
|
|
||||||
- clang
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
exclude:
|
|
||||||
- os: osx
|
|
||||||
compiler: gcc
|
|
||||||
|
|
||||||
|
|
||||||
install:
|
|
||||||
# Linux Setup
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then wget --no-check-certificate http://cmake.org/files/v3.1/cmake-3.1.3-Linux-x86_64.tar.gz ;fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then tar -xzf cmake-3.1.3-Linux-x86_64.tar.gz ;fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8" ;fi ;fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export PATH=$PWD/cmake-3.1.3-Linux-x86_64/bin:$PATH ;fi
|
|
||||||
# OSX Setup
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake ;fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then wget --no-check-certificate http://cmake.org/files/v3.7/cmake-3.7.2-Darwin-x86_64.tar.gz ;fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then tar -xzf cmake-3.7.2-Darwin-x86_64.tar.gz ;fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PATH=$PWD/cmake-3.1.3-Darwin-x86_64/CMake.app/Contents/bin:$PATH ;fi
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake ;fi
|
|
||||||
|
|
||||||
# Build steps
|
|
||||||
script:
|
|
||||||
- cd apps
|
|
||||||
- mkdir build
|
|
||||||
- cd build
|
|
||||||
- cmake ..
|
|
||||||
- make
|
|
|
@ -2,7 +2,7 @@
|
||||||
# Copyright 2019, 2021, Visual Computing Lab, ISTI - Italian National Research Council
|
# Copyright 2019, 2021, Visual Computing Lab, ISTI - Italian National Research Council
|
||||||
# SPDX-License-Identifier: BSL-1.0
|
# SPDX-License-Identifier: BSL-1.0
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
project(VCGLib)
|
project(VCGLib)
|
||||||
|
|
||||||
# Eigen options
|
# Eigen options
|
||||||
|
@ -16,11 +16,6 @@ option(VCG_BUILD_EXAMPLES "Build a set of examples of the library" OFF)
|
||||||
set (VCG_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR})
|
set (VCG_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR})
|
||||||
set (VCG_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR} PARENT_SCOPE)
|
set (VCG_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR} PARENT_SCOPE)
|
||||||
|
|
||||||
# Prefer GLVND
|
|
||||||
if(POLICY CMP0072)
|
|
||||||
cmake_policy(SET CMP0072 NEW)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
### Build settings
|
### Build settings
|
||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
|
||||||
|
@ -77,6 +72,9 @@ set(VCG_HEADERS
|
||||||
vcg/complex/algorithms/polygonal_algorithms.h
|
vcg/complex/algorithms/polygonal_algorithms.h
|
||||||
vcg/complex/algorithms/inertia.h
|
vcg/complex/algorithms/inertia.h
|
||||||
vcg/complex/algorithms/mesh_assert.h
|
vcg/complex/algorithms/mesh_assert.h
|
||||||
|
vcg/complex/algorithms/occupancy_grid.h
|
||||||
|
vcg/complex/algorithms/meshtree.h
|
||||||
|
vcg/complex/algorithms/align_global.h
|
||||||
vcg/complex/algorithms/cut_tree.h
|
vcg/complex/algorithms/cut_tree.h
|
||||||
vcg/complex/algorithms/nring.h
|
vcg/complex/algorithms/nring.h
|
||||||
vcg/complex/algorithms/tetra/tetfuse_collapse.h
|
vcg/complex/algorithms/tetra/tetfuse_collapse.h
|
||||||
|
@ -234,18 +232,13 @@ set(VCG_HEADERS
|
||||||
vcg/math/linear.h
|
vcg/math/linear.h
|
||||||
vcg/math/matrix44.h
|
vcg/math/matrix44.h
|
||||||
vcg/math/eigen.h
|
vcg/math/eigen.h
|
||||||
vcg/math/old_lin_algebra.h
|
|
||||||
vcg/math/similarity2.h
|
vcg/math/similarity2.h
|
||||||
vcg/math/gen_normal.h
|
vcg/math/gen_normal.h
|
||||||
vcg/math/old_matrix44.h
|
|
||||||
vcg/math/old_deprecated_matrix.h
|
|
||||||
vcg/math/old_matrix33.h
|
|
||||||
vcg/math/polar_decomposition.h
|
vcg/math/polar_decomposition.h
|
||||||
vcg/math/base.h
|
vcg/math/base.h
|
||||||
vcg/math/histogram.h
|
vcg/math/histogram.h
|
||||||
vcg/math/legendre.h
|
vcg/math/legendre.h
|
||||||
vcg/math/matrix33.h
|
vcg/math/matrix33.h
|
||||||
vcg/math/old_matrix.h
|
|
||||||
vcg/simplex/edge/distance.h
|
vcg/simplex/edge/distance.h
|
||||||
vcg/simplex/edge/topology.h
|
vcg/simplex/edge/topology.h
|
||||||
vcg/simplex/edge/pos.h
|
vcg/simplex/edge/pos.h
|
||||||
|
@ -278,12 +271,13 @@ set(VCG_HEADERS
|
||||||
|
|
||||||
#wrap
|
#wrap
|
||||||
wrap/callback.h
|
wrap/callback.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
)
|
)
|
||||||
|
|
||||||
if (VCG_HEADER_ONLY)
|
if (VCG_HEADER_ONLY)
|
||||||
|
if (NOT TARGET vcglib) # to be sure that vcglib target is created just one time
|
||||||
add_library(vcglib INTERFACE)
|
add_library(vcglib INTERFACE)
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
vcglib INTERFACE
|
vcglib INTERFACE
|
||||||
|
@ -292,6 +286,9 @@ if (VCG_HEADER_ONLY)
|
||||||
|
|
||||||
#just to show headers in ide
|
#just to show headers in ide
|
||||||
add_custom_target(vcglib_ide SOURCES ${VCG_HEADERS})
|
add_custom_target(vcglib_ide SOURCES ${VCG_HEADERS})
|
||||||
|
else()
|
||||||
|
message(STATUS "- VCGLib - jumped - already included")
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
#TODO make vcglib that includes all the wrap sources, checking everytime
|
#TODO make vcglib that includes all the wrap sources, checking everytime
|
||||||
# if the the required targets (e.g. qt, gl, glew...) exists
|
# if the the required targets (e.g. qt, gl, glew...) exists
|
||||||
|
|
34
README.md
34
README.md
|
@ -1,37 +1,37 @@
|
||||||
The **_Visualization and Computer Graphics Library_** (VCGlib for short) is a open source, portable, C++, templated, no dependency, library for manipulation, processing, cleaning, simplifying triangle meshes.
|
The **_Visualization and Computer Graphics Library_** (VCGlib for short) is an open source, portable, and templated library written in C++, with no external dependencies, for manipulation, processing, cleaning, and simplifying triangle meshes.
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
The library, composed by more than 100k lines of code, is released under the GPL license, and it is the base of most of the software tools of the [Visual Computing Lab](http://vcg.isti.cnr.it) of the Italian National Research Council Institute ISTI, like MeshLab, metro and many others.
|
The library, composed by more than 100k lines of code, is released under the GPL license, and it is the base of most of the software tools of the [Visual Computing Lab](http://vcg.isti.cnr.it) of the Italian National Research Council Institute - ISTI, like [MeshLab](http://www.meshlab.net/), [Metro](http://vcg.isti.cnr.it/vcglib/metro.html) and many others.
|
||||||
|
|
||||||
The VCG library is tailored to mostly manage triangular meshes: The library is fairly large and offers many state of the art functionalities for processing meshes, like:
|
The VCG library is tailored to mostly manage triangular meshes: The library is fairly large and offers many state-of-the-art capabilities for processing meshes, such as:
|
||||||
|
|
||||||
- high quality quadric-error edge-collapse based simplfication,
|
- high quality quadric-error edge-collapse based simplfication
|
||||||
- efficient spatial query structures (uniform grids, hashed grids, kdtree, ...) ,
|
- efficient spatial query structures (uniform grids, hashed grids, kdtree, etc)
|
||||||
- advanced smoothing and fairing algorithms,
|
- advanced smoothing and fairing algorithms
|
||||||
- computation of curvature,
|
- computation of curvature
|
||||||
- optimization of texture coordinates,
|
- optimization of texture coordinates
|
||||||
- Hausdorff distance computation,
|
- Hausdorff distance computation
|
||||||
- geodesic paths,
|
- geodesic paths
|
||||||
- mesh repairing capabilities,
|
- mesh repairing capabilities
|
||||||
- isosurface extraction and advancing front meshing algorithms,
|
- isosurface extraction and advancing front meshing algorithms
|
||||||
- Poisson Disk sampling and other tools to sample point distributions over meshes,
|
- Poisson Disk sampling and other tools to sample point distributions over meshes
|
||||||
- subdivision surfaces
|
- subdivision surfaces
|
||||||
|
|
||||||
## Notable Applications
|
## Notable Applications
|
||||||
|
|
||||||
A number of applications have been developed using the vcglib:
|
A number of applications have been developed using the VCGlib:
|
||||||
|
|
||||||
- MeshLab: the renowed open source mesh processing is based on this library.
|
- MeshLab: the renowed open source mesh processing software
|
||||||
- Metro, the tool for measuring differences between meshes
|
- Metro, the tool for measuring differences between meshes
|
||||||
- The first high quality out-of-core mesh simplifier that was used by the Stanford Digital Michelangelo project to process their huge 3D scanned models.
|
- The first high quality out-of-core mesh simplifier that was used by the Stanford Digital Michelangelo project to process their huge 3D scanned models.
|
||||||
|
|
||||||
## Contacts
|
## Contacts
|
||||||
|
|
||||||
For any info about licensing (portion of) the library please contact us:
|
For any info about licensing (portions of) the library please contact us:
|
||||||
Paolo Cignoni (p.cignoni@isti.cnr.it)
|
Paolo Cignoni (p.cignoni@isti.cnr.it)
|
||||||
Visual Computing Lab of the Italian National Research Council - ISTI
|
Visual Computing Lab of the Italian National Research Council - ISTI
|
||||||
|
|
||||||
In case of bugs please report them [here](https://github.com/cnr-isti-vclab/vcglib/issues) .
|
In case of bugs please report them [here](https://github.com/cnr-isti-vclab/vcglib/issues).
|
||||||
|
|
|
@ -3,7 +3,8 @@ project(trimesh_curvature)
|
||||||
|
|
||||||
if (VCG_HEADER_ONLY)
|
if (VCG_HEADER_ONLY)
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
trimesh_curvature.cpp)
|
trimesh_curvature.cpp
|
||||||
|
${VCG_INCLUDE_DIRS}/wrap/ply/plylib.cpp)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(trimesh_curvature
|
add_executable(trimesh_curvature
|
||||||
|
|
|
@ -23,46 +23,86 @@
|
||||||
/*! \file trimesh_curvature.cpp
|
/*! \file trimesh_curvature.cpp
|
||||||
\ingroup code_sample
|
\ingroup code_sample
|
||||||
|
|
||||||
\brief an example showing the various techniques for computing curvatures
|
\brief an example showing various techniques for computing curvatures
|
||||||
|
|
||||||
*/
|
*/
|
||||||
#include <vcg/complex/complex.h>
|
#include <vcg/complex/complex.h>
|
||||||
|
|
||||||
#include <vcg/complex/algorithms/create/platonic.h>
|
#include <vcg/complex/algorithms/create/platonic.h>
|
||||||
#include <vcg/complex/algorithms/update/curvature.h>
|
#include <vcg/complex/algorithms/update/curvature.h>
|
||||||
|
#include <vcg/complex/algorithms/update/curvature_fitting.h>
|
||||||
|
|
||||||
#include<wrap/io_trimesh/export_off.h>
|
#include<wrap/io_trimesh/export_ply.h>
|
||||||
|
|
||||||
class MyEdge;
|
|
||||||
class MyFace;
|
class MyFace;
|
||||||
class MyVertex;
|
class MyVertex;
|
||||||
struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex> ::AsVertexType,
|
struct MyUsedTypes : public vcg::UsedTypes< vcg::Use<MyVertex> ::AsVertexType,
|
||||||
vcg::Use<MyEdge> ::AsEdgeType,
|
|
||||||
vcg::Use<MyFace> ::AsFaceType>{};
|
vcg::Use<MyFace> ::AsFaceType>{};
|
||||||
|
|
||||||
class MyVertex : public vcg::Vertex<MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::VFAdj, vcg::vertex::CurvatureDirf, vcg::vertex::Curvaturef, vcg::vertex::BitFlags >{};
|
class MyVertex : public vcg::Vertex<MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::VFAdj, vcg::vertex::Qualityf, vcg::vertex::CurvatureDirf, vcg::vertex::BitFlags >{};
|
||||||
class MyFace : public vcg::Face< MyUsedTypes, vcg::face::FFAdj, vcg::face::VFAdj, vcg::face::VertexRef, vcg::face::BitFlags > {};
|
class MyFace : public vcg::Face< MyUsedTypes, vcg::face::FFAdj, vcg::face::VFAdj, vcg::face::Normal3f, vcg::face::VertexRef, vcg::face::BitFlags > {};
|
||||||
class MyEdge : public vcg::Edge<MyUsedTypes>{};
|
class MyMesh : public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace> > {};
|
||||||
class MyMesh : public vcg::tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace> , std::vector<MyEdge> > {};
|
|
||||||
|
|
||||||
int main( int /*argc*/, char **/*argv*/ )
|
int main( int /*argc*/, char **/*argv*/ )
|
||||||
{
|
{
|
||||||
MyMesh m;
|
MyMesh m;
|
||||||
vcg::tri::Torus(m,30,10);
|
// in a torus with radii 1 and 4
|
||||||
|
// on the outside the principal curvature should be 1 and 1/5
|
||||||
|
// and internally the principal curvature should be 1 and -1/3
|
||||||
|
// Gaussian range -0.333 .. 0.200
|
||||||
|
// mean range 0.333 .. 0.600
|
||||||
|
//vcg::tri::Torus(m,4,1,32,16);
|
||||||
|
|
||||||
|
|
||||||
|
// in a sphere of radius 2 the curvature is everywhere 0.5
|
||||||
|
// Gaussian 0.25
|
||||||
|
// Mean 0.5
|
||||||
|
vcg::tri::Sphere(m,5);
|
||||||
|
vcg::tri::UpdatePosition<MyMesh>::Scale(m, 2.0);
|
||||||
|
|
||||||
vcg::tri::UpdateTopology<MyMesh>::FaceFace(m);
|
vcg::tri::UpdateTopology<MyMesh>::FaceFace(m);
|
||||||
vcg::tri::UpdateTopology<MyMesh>::VertexFace(m);
|
vcg::tri::UpdateTopology<MyMesh>::VertexFace(m);
|
||||||
|
vcg::tri::UpdateNormal<MyMesh>::PerVertexNormalizedPerFaceNormalized(m);
|
||||||
|
vcg::Distribution<float> distr;
|
||||||
|
printf("Starting mesh vn:%i fn:%i\n",m.VN(),m.FN());
|
||||||
|
|
||||||
// Two different techniques for computing Discrete Gaussian and Mean Curvature
|
// Method 1 (discrete - Optimizing 3d triangulations using discrete curvature analysis 2003)
|
||||||
// they require the presence of the vertex::Curvature component
|
vcg::tri::UpdateCurvature<MyMesh>::PerVertexAbsoluteMeanAndGaussian(m);
|
||||||
vcg::tri::UpdateCurvature<MyMesh>::PerVertex(m);
|
vcg::tri::UpdateQuality<MyMesh>::VertexFromAttributeName(m,"KG");
|
||||||
|
vcg::tri::Stat<MyMesh>::ComputePerVertexQualityDistribution(m,distr);
|
||||||
|
printf("Gaussian Curvature method 1 Min %f Max %f\n",distr.Min(),distr.Max());
|
||||||
|
vcg::tri::UpdateQuality<MyMesh>::VertexFromAttributeName(m,"KH");
|
||||||
|
vcg::tri::Stat<MyMesh>::ComputePerVertexQualityDistribution(m,distr);
|
||||||
|
printf("Mean Curvature method 1 Min %f Max %f\n",distr.Min(),distr.Max());
|
||||||
|
|
||||||
|
// Method 2 (discrete - Discrete Differential-Geometry Operators for Triangulated 2-Manifolds 2002)
|
||||||
vcg::tri::UpdateCurvature<MyMesh>::MeanAndGaussian(m);
|
vcg::tri::UpdateCurvature<MyMesh>::MeanAndGaussian(m);
|
||||||
|
vcg::tri::UpdateQuality<MyMesh>::VertexFromAttributeName(m,"KG");
|
||||||
|
vcg::tri::Stat<MyMesh>::ComputePerVertexQualityDistribution(m,distr);
|
||||||
|
printf("Gaussian Curvature method 2 Min %f Max %f\n",distr.Min(),distr.Max());
|
||||||
|
vcg::tri::UpdateQuality<MyMesh>::VertexFromAttributeName(m,"KH");
|
||||||
|
vcg::tri::Stat<MyMesh>::ComputePerVertexQualityDistribution(m,distr);
|
||||||
|
printf("Mean Curvature method 2 Min %f Max %f\n",distr.Min(),distr.Max());
|
||||||
|
vcg::tri::io::ExporterPLY<MyMesh>::Save(m,"Torus_Discrete_Mean2.ply",vcg::tri::io::Mask::IOM_VERTQUALITY);
|
||||||
|
|
||||||
// Two different techniques for computing Principal Curvature Directions
|
// Method 3 (directions - Estimating the Tensor of Curvature of a Surface from a Polyhedral Approximation - 1995)
|
||||||
// they require the presence of the vertex::CurvatureDir component
|
|
||||||
vcg::tri::UpdateCurvature<MyMesh>::PrincipalDirections(m);
|
vcg::tri::UpdateCurvature<MyMesh>::PrincipalDirections(m);
|
||||||
|
vcg::tri::UpdateQuality<MyMesh>::VertexGaussianFromCurvatureDir(m);
|
||||||
|
vcg::tri::Stat<MyMesh>::ComputePerVertexQualityDistribution(m,distr);
|
||||||
|
printf("Gaussian Curvature method 3 Min %f Max %f\n",distr.Min(),distr.Max());
|
||||||
|
vcg::tri::UpdateQuality<MyMesh>::VertexMeanFromCurvatureDir(m);
|
||||||
|
vcg::tri::Stat<MyMesh>::ComputePerVertexQualityDistribution(m,distr);
|
||||||
|
printf("Mean Curvature method 3 Min %f Max %f\n",distr.Min(),distr.Max());
|
||||||
|
|
||||||
|
// Method 4 (directions - Restricted delaunay triangulations and normal cycle )
|
||||||
vcg::tri::UpdateCurvature<MyMesh>::PrincipalDirectionsNormalCycle(m);
|
vcg::tri::UpdateCurvature<MyMesh>::PrincipalDirectionsNormalCycle(m);
|
||||||
printf("Input mesh vn:%i fn:%i\n",m.VN(),m.FN());
|
vcg::tri::UpdateQuality<MyMesh>::VertexGaussianFromCurvatureDir(m);
|
||||||
|
vcg::tri::Stat<MyMesh>::ComputePerVertexQualityDistribution(m,distr);
|
||||||
|
printf("Gaussian Curvature method 4 Min %f Max %f\n",distr.Min(),distr.Max());
|
||||||
|
vcg::tri::UpdateQuality<MyMesh>::VertexMeanFromCurvatureDir(m);
|
||||||
|
vcg::tri::Stat<MyMesh>::ComputePerVertexQualityDistribution(m,distr);
|
||||||
|
printf("Mean Curvature method 4 Min %f Max %f\n",distr.Min(),distr.Max());
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
include(../common.pri)
|
include(../common.pri)
|
||||||
TARGET = trimesh_curvature
|
TARGET = trimesh_curvature
|
||||||
SOURCES += trimesh_curvature.cpp
|
SOURCES += trimesh_curvature.cpp ../../../wrap/ply/plylib.cpp
|
||||||
|
|
|
@ -8,7 +8,7 @@ The following terms are used throughout this agreement:
|
||||||
* **Submitted** - conveyed to a Project via a pull request, commit, issue, or any form of electronic, written, or verbal communication with GitHub, contributors or maintainers.
|
* **Submitted** - conveyed to a Project via a pull request, commit, issue, or any form of electronic, written, or verbal communication with GitHub, contributors or maintainers.
|
||||||
|
|
||||||
## 1. Grant of Copyright License.
|
## 1. Grant of Copyright License.
|
||||||
Subject to the terms and conditions of this agreement, You grant to the Projects’ maintainers and to VCLab a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your contributions and such derivative works. Except for this license, You reserve all rights, title, and interest in your contributions.
|
Subject to the terms and conditions of this agreement, You grant to the Projects’ maintainers and to VCLab a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your contributions and such derivative works. Except for this license, You reserve all rights, title, and interest in your contributions. You agree that your perpetual licensing grant will be applied to all Your contributions to VCLab's Projects during the validity (two years) of this agreement.
|
||||||
|
|
||||||
## 2. Grant of Patent License.
|
## 2. Grant of Patent License.
|
||||||
Subject to the terms and conditions of this agreement, You grant to the Projects’ maintainers and to VCLab a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer your contributions, where such license applies only to those patent claims licensable by you that are necessarily infringed by your contribution or by combination of your contribution with the project to which this contribution was submitted.
|
Subject to the terms and conditions of this agreement, You grant to the Projects’ maintainers and to VCLab a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer your contributions, where such license applies only to those patent claims licensable by you that are necessarily infringed by your contribution or by combination of your contribution with the project to which this contribution was submitted.
|
||||||
|
@ -27,8 +27,6 @@ Your contribution is either your original creation, based upon previous work tha
|
||||||
|
|
|
|
||||||
**Date of birth** | **Place of birth**
|
**Date of birth** | **Place of birth**
|
||||||
|
|
|
|
||||||
**github Project Contributed** | **Contribution** (id of the pull request)
|
|
||||||
|
|
|
||||||
|
|
||||||
|
|
||||||
Signature
|
Signature
|
||||||
|
@ -37,4 +35,3 @@ Signature
|
||||||
Date
|
Date
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -28,13 +28,13 @@ The face, the edge and the vertex type are the crucial bits to understand in ord
|
||||||
\until Qualityf
|
\until Qualityf
|
||||||
|
|
||||||
\c vcg::Vertex is the VCG base class for a vertex.
|
\c vcg::Vertex is the VCG base class for a vertex.
|
||||||
\c vcg::UsedTypes declares which are the types invoved in the definition of the mesh. It is a mapping between the names of your entity types (MyVertex,MyEdge,MyFace... and the role they play in the mesh definition). The mapping is established passing the template parameters with the syntax
|
\c vcg::UsedTypes declares which are the types involved in the definition of the mesh. It is a mapping between the names of your entity types (MyVertex,MyEdge,MyFace... and the role they play in the mesh definition). The mapping is established passing the template parameters with the syntax
|
||||||
It can be annoying when you see it but it is useful that every entity involved knows the type of the others and this is the way VCG Lib does it. As you can see the three definitions of MyVertex0,1,2 differ for the remaining template parameters (the components). These specify which values will be stored with the vertex type:
|
It can be annoying when you see it but it is useful that every entity involved knows the type of the others and this is the way VCG Lib does it. As you can see the three definitions of MyVertex0,1,2 differ for the remaining template parameters (the components). These specify which values will be stored with the vertex type:
|
||||||
- MyVertex0 is a type storing coordinates as a triple of doubles and normal as a triple of floats,
|
- MyVertex0 is a type storing coordinates as a triple of doubles and normal as a triple of floats,
|
||||||
- MyVertex1 also store a color value specified as 4 bytes
|
- MyVertex1 also store a color value specified as 4 bytes
|
||||||
- MyVertex2 store a long list of different components.
|
- MyVertex2 store a long list of different components.
|
||||||
|
|
||||||
Many other compenents are implemented in the library for the simplexes, the complete list can be found
|
Many other components are implemented in the library for the simplexes, the complete list can be found
|
||||||
in the \ref VertexComponentGroup, \ref EdgeComponentGroup and \ref FaceComponentGroup pages. You can place any combination of them as
|
in the \ref VertexComponentGroup, \ref EdgeComponentGroup and \ref FaceComponentGroup pages. You can place any combination of them as
|
||||||
a template parameters of your vertex/edge/face type (note that order is rather unimportant).
|
a template parameters of your vertex/edge/face type (note that order is rather unimportant).
|
||||||
Now we have all it takes for a working definition of MyMesh type:
|
Now we have all it takes for a working definition of MyMesh type:
|
||||||
|
@ -54,15 +54,15 @@ One more comment: \c vcg::face::VertexRef is an attribute that stores 3 pointers
|
||||||
|
|
||||||
How to create a mesh
|
How to create a mesh
|
||||||
--------------------
|
--------------------
|
||||||
Once you declared your mesh type, you may want to instance an object and to fill it with vertices and triangles. The typical approach is just to open some file like in the above example. It may cross your mind that you could just make some push_back on the vertexes and faces container (data member vert and face of class vcg::tri::Trimesh). In fact this is the wrong way since there can be side effects by adding element to a container. We describe this issue and the correct way of adding mesh element in the \ref allocation page.
|
Once you declared your mesh type, you may want to instance an object and to fill it with vertices and triangles. The typical approach is just to open some file like in the above example. It may cross your mind that you could just make some push_back on the vertexes and faces container (data member vert and face of class vcg::tri::Trimesh). In fact this is the wrong way since there can be side effects by adding an element to a container. We describe this issue and the correct way of adding mesh element in the \ref allocation page.
|
||||||
|
|
||||||
The flags of the mesh elements
|
The flags of the mesh elements
|
||||||
-----------
|
-----------
|
||||||
Usually to each element of the mesh we associate a small bit vector containing useful single-bit information about vertices and faces. For example the deletion of vertex simply mark a the Deletion bit in thsi vector (more details on the various deletion/allocation issues in the \ref allocation page. More details on the various kind of flags that can be associated are in the \ref flags page.
|
Usually to each element of the mesh we associate a small bit vector containing useful single-bit information about vertices and faces. For example the deletion of vertex simply mark a the Deletion bit in this vector (more details on the various deletion/allocation issues in the \ref allocation page. More details on the various kind of flags that can be associated are in the \ref flags page.
|
||||||
|
|
||||||
How to process a mesh
|
How to process a mesh
|
||||||
-------------
|
-------------
|
||||||
The algorithms that do something on a mesh are generally written as static member functions of a class templated on the mesh type. For example the code snipped below is part of the class UpdateNormals, which contains the several algorithms to compute the value of the normal
|
The algorithms that do something on a mesh are generally written as a static member functions of a templated class on the mesh type. For example the code snipped below is part of the class UpdateNormals, which contains the several algorithms to compute the value of the normal
|
||||||
|
|
||||||
\code
|
\code
|
||||||
...
|
...
|
||||||
|
@ -73,16 +73,16 @@ class UpdateNormals{
|
||||||
static void PerFace(ComputeMeshType &m)
|
static void PerFace(ComputeMeshType &m)
|
||||||
|
|
||||||
// Calculates the vertex normal. Without exploiting or touching face normals
|
// Calculates the vertex normal. Without exploiting or touching face normals
|
||||||
// The normal of a vertex v is the weigthed average of the normals of the faces incident on v.
|
// The normal of a vertex v is the weighted average of the normals of the faces incident on v.
|
||||||
static void PerVertex(ComputeMeshType &m)
|
static void PerVertex(ComputeMeshType &m)
|
||||||
|
|
||||||
// Calculates both vertex and face normals.
|
// Calculates both vertex and face normals.
|
||||||
// The normal of a vertex v is the weigthed average of the normals of the faces incident on v.
|
// The normal of a vertex v is the weighted average of the normals of the faces incident on v.
|
||||||
static void PerVertexPerFace(ComputeMeshType &m)
|
static void PerVertexPerFace(ComputeMeshType &m)
|
||||||
...
|
...
|
||||||
};
|
};
|
||||||
\endcode
|
\endcode
|
||||||
This class is part of a kernel of classes with name UpdateValue that compute the value of the vertex or face attributes and that can be found altogether in the folder vcg/complex/trimesh/update. For example, the following example show how to compute the value of the normal and the mean and gaussian curvature per vertex:
|
This class is part of a kernel of classes with name UpdateValue that compute the value of the vertex or face attributes and that can be found altogether in the folder vcg/complex/trimesh/update. For example, the following example shows how to compute the value of the normal and the mean and gaussian curvature per vertex:
|
||||||
\code
|
\code
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
@ -92,9 +92,9 @@ This class is part of a kernel of classes with name UpdateValue that compute the
|
||||||
#include <vcg/simplex/face/base.h>
|
#include <vcg/simplex/face/base.h>
|
||||||
#include <vcg/simplex/face/component.h>
|
#include <vcg/simplex/face/component.h>
|
||||||
|
|
||||||
#include <vcg/complex/trimesh/base.h>
|
#include <vcg/complex/base.h>
|
||||||
#include <vcg/complex/trimesh/update/normals.h> //class UpdateNormals
|
#include <vcg/complex/algorithms/update/normal.h> //class UpdateNormals
|
||||||
#include <vcg/complex/trimesh/update/curvature.h> //class UpdateCurvature
|
#include <vcg/complex/algorithms/update/curvature.h> //class UpdateCurvature
|
||||||
|
|
||||||
class MyVertex;
|
class MyVertex;
|
||||||
class MyFace;
|
class MyFace;
|
||||||
|
@ -120,6 +120,5 @@ int main()
|
||||||
}
|
}
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
Other than algorithms that update values of the mesh attributes, VCG Lib provides algorithms to create a mesh from another source, for example from point sets (by means of the Ball Pivoting approach) or as isosurfaces from a volumetric dataset (by means of Marching Cubes algorithm). Those algorithm can be found in vcg/complex/trimesh/create/.
|
Other than algorithms that update values of the mesh attributes, VCG Lib provides algorithms to create a mesh from another source, for example from point sets (by means of the Ball Pivoting approach) or as isosurfaces from a volumetric dataset (by means of Marching Cubes algorithm). Those algorithms can be found in vcg/complex/trimesh/create/.
|
||||||
Finally, you can find algorithms for refinement (midpoint, Loop, Butterfly...), for smoothing, for closing holes and other that are not currently classified under any specific heading and that you can find under /vcg/complex/trimesh.*/
|
Finally, you can find algorithms for refinement (midpoint, Loop, Butterfly...), for smoothing, for closing holes and other that are not currently classified under any specific heading and that you can find under /vcg/complex/trimesh.*/
|
||||||
|
|
||||||
|
|
|
@ -3,12 +3,13 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CHOLESKY_MODULE_H
|
#ifndef EIGEN_CHOLESKY_MODULE_H
|
||||||
#define EIGEN_CHOLESKY_MODULE_H
|
#define EIGEN_CHOLESKY_MODULE_H
|
||||||
|
|
||||||
#include "Core"
|
#include "Core"
|
||||||
|
#include "Jacobi"
|
||||||
|
|
||||||
#include "src/Core/util/DisableStupidWarnings.h"
|
#include "src/Core/util/DisableStupidWarnings.h"
|
||||||
|
|
||||||
|
@ -31,7 +32,11 @@
|
||||||
#include "src/Cholesky/LLT.h"
|
#include "src/Cholesky/LLT.h"
|
||||||
#include "src/Cholesky/LDLT.h"
|
#include "src/Cholesky/LDLT.h"
|
||||||
#ifdef EIGEN_USE_LAPACKE
|
#ifdef EIGEN_USE_LAPACKE
|
||||||
|
#ifdef EIGEN_USE_MKL
|
||||||
|
#include "mkl_lapacke.h"
|
||||||
|
#else
|
||||||
#include "src/misc/lapacke.h"
|
#include "src/misc/lapacke.h"
|
||||||
|
#endif
|
||||||
#include "src/Cholesky/LLT_LAPACKE.h"
|
#include "src/Cholesky/LLT_LAPACKE.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CHOLMODSUPPORT_MODULE_H
|
#ifndef EIGEN_CHOLMODSUPPORT_MODULE_H
|
||||||
#define EIGEN_CHOLMODSUPPORT_MODULE_H
|
#define EIGEN_CHOLMODSUPPORT_MODULE_H
|
||||||
|
@ -19,7 +19,7 @@ extern "C" {
|
||||||
/** \ingroup Support_modules
|
/** \ingroup Support_modules
|
||||||
* \defgroup CholmodSupport_Module CholmodSupport module
|
* \defgroup CholmodSupport_Module CholmodSupport module
|
||||||
*
|
*
|
||||||
* This module provides an interface to the Cholmod library which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
|
* This module provides an interface to the Cholmod library which is part of the <a href="xxxp://www.suitesparse.com">suitesparse</a> package.
|
||||||
* It provides the two following main factorization classes:
|
* It provides the two following main factorization classes:
|
||||||
* - class CholmodSupernodalLLT: a supernodal LLT Cholesky factorization.
|
* - class CholmodSupernodalLLT: a supernodal LLT Cholesky factorization.
|
||||||
* - class CholmodDecomposiiton: a general L(D)LT Cholesky factorization with automatic or explicit runtime selection of the underlying factorization method (supernodal or simplicial).
|
* - class CholmodDecomposiiton: a general L(D)LT Cholesky factorization with automatic or explicit runtime selection of the underlying factorization method (supernodal or simplicial).
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CORE_H
|
#ifndef EIGEN_CORE_H
|
||||||
#define EIGEN_CORE_H
|
#define EIGEN_CORE_H
|
||||||
|
@ -14,6 +14,22 @@
|
||||||
// first thing Eigen does: stop the compiler from committing suicide
|
// first thing Eigen does: stop the compiler from committing suicide
|
||||||
#include "src/Core/util/DisableStupidWarnings.h"
|
#include "src/Core/util/DisableStupidWarnings.h"
|
||||||
|
|
||||||
|
#if defined(__CUDACC__) && !defined(EIGEN_NO_CUDA)
|
||||||
|
#define EIGEN_CUDACC __CUDACC__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__CUDA_ARCH__) && !defined(EIGEN_NO_CUDA)
|
||||||
|
#define EIGEN_CUDA_ARCH __CUDA_ARCH__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__CUDACC_VER_MAJOR__) && (__CUDACC_VER_MAJOR__ >= 9)
|
||||||
|
#define EIGEN_CUDACC_VER ((__CUDACC_VER_MAJOR__ * 10000) + (__CUDACC_VER_MINOR__ * 100))
|
||||||
|
#elif defined(__CUDACC_VER__)
|
||||||
|
#define EIGEN_CUDACC_VER __CUDACC_VER__
|
||||||
|
#else
|
||||||
|
#define EIGEN_CUDACC_VER 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// Handle NVCC/CUDA/SYCL
|
// Handle NVCC/CUDA/SYCL
|
||||||
#if defined(__CUDACC__) || defined(__SYCL_DEVICE_ONLY__)
|
#if defined(__CUDACC__) || defined(__SYCL_DEVICE_ONLY__)
|
||||||
// Do not try asserts on CUDA and SYCL!
|
// Do not try asserts on CUDA and SYCL!
|
||||||
|
@ -37,9 +53,9 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define EIGEN_DEVICE_FUNC __host__ __device__
|
#define EIGEN_DEVICE_FUNC __host__ __device__
|
||||||
// We need math_functions.hpp to ensure that that EIGEN_USING_STD_MATH macro
|
// We need cuda_runtime.h to ensure that that EIGEN_USING_STD_MATH macro
|
||||||
// works properly on the device side
|
// works properly on the device side
|
||||||
#include <math_functions.hpp>
|
#include <cuda_runtime.h>
|
||||||
#else
|
#else
|
||||||
#define EIGEN_DEVICE_FUNC
|
#define EIGEN_DEVICE_FUNC
|
||||||
#endif
|
#endif
|
||||||
|
@ -72,7 +88,7 @@
|
||||||
#include "src/Core/util/Macros.h"
|
#include "src/Core/util/Macros.h"
|
||||||
|
|
||||||
// Disable the ipa-cp-clone optimization flag with MinGW 6.x or newer (enabled by default with -O3)
|
// Disable the ipa-cp-clone optimization flag with MinGW 6.x or newer (enabled by default with -O3)
|
||||||
// See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=556 for details.
|
// See xxxp://eigen.tuxfamily.org/bz/show_bug.cgi?id=556 for details.
|
||||||
#if EIGEN_COMP_MINGW && EIGEN_GNUC_AT_LEAST(4,6)
|
#if EIGEN_COMP_MINGW && EIGEN_GNUC_AT_LEAST(4,6)
|
||||||
#pragma GCC optimize ("-fno-ipa-cp-clone")
|
#pragma GCC optimize ("-fno-ipa-cp-clone")
|
||||||
#endif
|
#endif
|
||||||
|
@ -155,12 +171,15 @@
|
||||||
#ifdef __AVX512DQ__
|
#ifdef __AVX512DQ__
|
||||||
#define EIGEN_VECTORIZE_AVX512DQ
|
#define EIGEN_VECTORIZE_AVX512DQ
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __AVX512ER__
|
||||||
|
#define EIGEN_VECTORIZE_AVX512ER
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// include files
|
// include files
|
||||||
|
|
||||||
// This extern "C" works around a MINGW-w64 compilation issue
|
// This extern "C" works around a MINGW-w64 compilation issue
|
||||||
// https://sourceforge.net/tracker/index.php?func=detail&aid=3018394&group_id=202880&atid=983354
|
// xxxps://sourceforge.net/tracker/index.php?func=detail&aid=3018394&group_id=202880&atid=983354
|
||||||
// In essence, intrin.h is included by windows.h and also declares intrinsics (just as emmintrin.h etc. below do).
|
// In essence, intrin.h is included by windows.h and also declares intrinsics (just as emmintrin.h etc. below do).
|
||||||
// However, intrin.h uses an extern "C" declaration, and g++ thus complains of duplicate declarations
|
// However, intrin.h uses an extern "C" declaration, and g++ thus complains of duplicate declarations
|
||||||
// with conflicting linkage. The linkage for intrinsics doesn't matter, but at that stage the compiler doesn't know;
|
// with conflicting linkage. The linkage for intrinsics doesn't matter, but at that stage the compiler doesn't know;
|
||||||
|
@ -229,7 +248,7 @@
|
||||||
#if defined __CUDACC__
|
#if defined __CUDACC__
|
||||||
#define EIGEN_VECTORIZE_CUDA
|
#define EIGEN_VECTORIZE_CUDA
|
||||||
#include <vector_types.h>
|
#include <vector_types.h>
|
||||||
#if defined __CUDACC_VER__ && __CUDACC_VER__ >= 70500
|
#if EIGEN_CUDACC_VER >= 70500
|
||||||
#define EIGEN_HAS_CUDA_FP16
|
#define EIGEN_HAS_CUDA_FP16
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -260,7 +279,10 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <iosfwd>
|
#include <sstream>
|
||||||
|
#ifndef EIGEN_NO_IO
|
||||||
|
#include <iosfwd>
|
||||||
|
#endif
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
@ -318,15 +340,19 @@ inline static const char *SimdInstructionSetsInUse(void) {
|
||||||
|
|
||||||
#if defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS || defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API || defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS || defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API || defined EIGEN2_SUPPORT
|
#if defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS || defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API || defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS || defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API || defined EIGEN2_SUPPORT
|
||||||
// This will generate an error message:
|
// This will generate an error message:
|
||||||
#error Eigen2-support is only available up to version 3.2. Please go to "http://eigen.tuxfamily.org/index.php?title=Eigen2" for further information
|
#error Eigen2-support is only available up to version 3.2. Please go to "xxxp://eigen.tuxfamily.org/index.php?title=Eigen2" for further information
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace Eigen {
|
||||||
|
|
||||||
// we use size_t frequently and we'll never remember to prepend it with std:: everytime just to
|
// we use size_t frequently and we'll never remember to prepend it with std:: everytime just to
|
||||||
// ensure QNX/QCC support
|
// ensure QNX/QCC support
|
||||||
using std::size_t;
|
using std::size_t;
|
||||||
// gcc 4.6.0 wants std:: for ptrdiff_t
|
// gcc 4.6.0 wants std:: for ptrdiff_t
|
||||||
using std::ptrdiff_t;
|
using std::ptrdiff_t;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/** \defgroup Core_Module Core module
|
/** \defgroup Core_Module Core module
|
||||||
* This is the main module of Eigen providing dense matrix and vector support
|
* This is the main module of Eigen providing dense matrix and vector support
|
||||||
* (both fixed and dynamic size) with all the features corresponding to a BLAS library
|
* (both fixed and dynamic size) with all the features corresponding to a BLAS library
|
||||||
|
@ -348,10 +374,13 @@ using std::ptrdiff_t;
|
||||||
#include "src/Core/MathFunctions.h"
|
#include "src/Core/MathFunctions.h"
|
||||||
#include "src/Core/GenericPacketMath.h"
|
#include "src/Core/GenericPacketMath.h"
|
||||||
#include "src/Core/MathFunctionsImpl.h"
|
#include "src/Core/MathFunctionsImpl.h"
|
||||||
|
#include "src/Core/arch/Default/ConjHelper.h"
|
||||||
|
|
||||||
#if defined EIGEN_VECTORIZE_AVX512
|
#if defined EIGEN_VECTORIZE_AVX512
|
||||||
#include "src/Core/arch/SSE/PacketMath.h"
|
#include "src/Core/arch/SSE/PacketMath.h"
|
||||||
|
#include "src/Core/arch/SSE/MathFunctions.h"
|
||||||
#include "src/Core/arch/AVX/PacketMath.h"
|
#include "src/Core/arch/AVX/PacketMath.h"
|
||||||
|
#include "src/Core/arch/AVX/MathFunctions.h"
|
||||||
#include "src/Core/arch/AVX512/PacketMath.h"
|
#include "src/Core/arch/AVX512/PacketMath.h"
|
||||||
#include "src/Core/arch/AVX512/MathFunctions.h"
|
#include "src/Core/arch/AVX512/MathFunctions.h"
|
||||||
#elif defined EIGEN_VECTORIZE_AVX
|
#elif defined EIGEN_VECTORIZE_AVX
|
||||||
|
@ -363,6 +392,7 @@ using std::ptrdiff_t;
|
||||||
#include "src/Core/arch/AVX/MathFunctions.h"
|
#include "src/Core/arch/AVX/MathFunctions.h"
|
||||||
#include "src/Core/arch/AVX/Complex.h"
|
#include "src/Core/arch/AVX/Complex.h"
|
||||||
#include "src/Core/arch/AVX/TypeCasting.h"
|
#include "src/Core/arch/AVX/TypeCasting.h"
|
||||||
|
#include "src/Core/arch/SSE/TypeCasting.h"
|
||||||
#elif defined EIGEN_VECTORIZE_SSE
|
#elif defined EIGEN_VECTORIZE_SSE
|
||||||
#include "src/Core/arch/SSE/PacketMath.h"
|
#include "src/Core/arch/SSE/PacketMath.h"
|
||||||
#include "src/Core/arch/SSE/MathFunctions.h"
|
#include "src/Core/arch/SSE/MathFunctions.h"
|
||||||
|
@ -405,6 +435,7 @@ using std::ptrdiff_t;
|
||||||
// on CUDA devices
|
// on CUDA devices
|
||||||
#include "src/Core/arch/CUDA/Complex.h"
|
#include "src/Core/arch/CUDA/Complex.h"
|
||||||
|
|
||||||
|
#include "src/Core/IO.h"
|
||||||
#include "src/Core/DenseCoeffsBase.h"
|
#include "src/Core/DenseCoeffsBase.h"
|
||||||
#include "src/Core/DenseBase.h"
|
#include "src/Core/DenseBase.h"
|
||||||
#include "src/Core/MatrixBase.h"
|
#include "src/Core/MatrixBase.h"
|
||||||
|
@ -452,7 +483,6 @@ using std::ptrdiff_t;
|
||||||
#include "src/Core/Redux.h"
|
#include "src/Core/Redux.h"
|
||||||
#include "src/Core/Visitor.h"
|
#include "src/Core/Visitor.h"
|
||||||
#include "src/Core/Fuzzy.h"
|
#include "src/Core/Fuzzy.h"
|
||||||
#include "src/Core/IO.h"
|
|
||||||
#include "src/Core/Swap.h"
|
#include "src/Core/Swap.h"
|
||||||
#include "src/Core/CommaInitializer.h"
|
#include "src/Core/CommaInitializer.h"
|
||||||
#include "src/Core/GeneralProduct.h"
|
#include "src/Core/GeneralProduct.h"
|
||||||
|
|
|
@ -3,21 +3,21 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_EIGENVALUES_MODULE_H
|
#ifndef EIGEN_EIGENVALUES_MODULE_H
|
||||||
#define EIGEN_EIGENVALUES_MODULE_H
|
#define EIGEN_EIGENVALUES_MODULE_H
|
||||||
|
|
||||||
#include "Core"
|
#include "Core"
|
||||||
|
|
||||||
#include "src/Core/util/DisableStupidWarnings.h"
|
|
||||||
|
|
||||||
#include "Cholesky"
|
#include "Cholesky"
|
||||||
#include "Jacobi"
|
#include "Jacobi"
|
||||||
#include "Householder"
|
#include "Householder"
|
||||||
#include "LU"
|
#include "LU"
|
||||||
#include "Geometry"
|
#include "Geometry"
|
||||||
|
|
||||||
|
#include "src/Core/util/DisableStupidWarnings.h"
|
||||||
|
|
||||||
/** \defgroup Eigenvalues_Module Eigenvalues module
|
/** \defgroup Eigenvalues_Module Eigenvalues module
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -45,7 +45,11 @@
|
||||||
#include "src/Eigenvalues/GeneralizedEigenSolver.h"
|
#include "src/Eigenvalues/GeneralizedEigenSolver.h"
|
||||||
#include "src/Eigenvalues/MatrixBaseEigenvalues.h"
|
#include "src/Eigenvalues/MatrixBaseEigenvalues.h"
|
||||||
#ifdef EIGEN_USE_LAPACKE
|
#ifdef EIGEN_USE_LAPACKE
|
||||||
|
#ifdef EIGEN_USE_MKL
|
||||||
|
#include "mkl_lapacke.h"
|
||||||
|
#else
|
||||||
#include "src/misc/lapacke.h"
|
#include "src/misc/lapacke.h"
|
||||||
|
#endif
|
||||||
#include "src/Eigenvalues/RealSchur_LAPACKE.h"
|
#include "src/Eigenvalues/RealSchur_LAPACKE.h"
|
||||||
#include "src/Eigenvalues/ComplexSchur_LAPACKE.h"
|
#include "src/Eigenvalues/ComplexSchur_LAPACKE.h"
|
||||||
#include "src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h"
|
#include "src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h"
|
||||||
|
|
|
@ -3,19 +3,19 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_GEOMETRY_MODULE_H
|
#ifndef EIGEN_GEOMETRY_MODULE_H
|
||||||
#define EIGEN_GEOMETRY_MODULE_H
|
#define EIGEN_GEOMETRY_MODULE_H
|
||||||
|
|
||||||
#include "Core"
|
#include "Core"
|
||||||
|
|
||||||
#include "src/Core/util/DisableStupidWarnings.h"
|
|
||||||
|
|
||||||
#include "SVD"
|
#include "SVD"
|
||||||
#include "LU"
|
#include "LU"
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
|
||||||
|
#include "src/Core/util/DisableStupidWarnings.h"
|
||||||
|
|
||||||
/** \defgroup Geometry_Module Geometry module
|
/** \defgroup Geometry_Module Geometry module
|
||||||
*
|
*
|
||||||
* This module provides support for:
|
* This module provides support for:
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_HOUSEHOLDER_MODULE_H
|
#ifndef EIGEN_HOUSEHOLDER_MODULE_H
|
||||||
#define EIGEN_HOUSEHOLDER_MODULE_H
|
#define EIGEN_HOUSEHOLDER_MODULE_H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
|
#ifndef EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
|
||||||
#define EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
|
#define EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_JACOBI_MODULE_H
|
#ifndef EIGEN_JACOBI_MODULE_H
|
||||||
#define EIGEN_JACOBI_MODULE_H
|
#define EIGEN_JACOBI_MODULE_H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_LU_MODULE_H
|
#ifndef EIGEN_LU_MODULE_H
|
||||||
#define EIGEN_LU_MODULE_H
|
#define EIGEN_LU_MODULE_H
|
||||||
|
@ -28,7 +28,11 @@
|
||||||
#include "src/LU/FullPivLU.h"
|
#include "src/LU/FullPivLU.h"
|
||||||
#include "src/LU/PartialPivLU.h"
|
#include "src/LU/PartialPivLU.h"
|
||||||
#ifdef EIGEN_USE_LAPACKE
|
#ifdef EIGEN_USE_LAPACKE
|
||||||
|
#ifdef EIGEN_USE_MKL
|
||||||
|
#include "mkl_lapacke.h"
|
||||||
|
#else
|
||||||
#include "src/misc/lapacke.h"
|
#include "src/misc/lapacke.h"
|
||||||
|
#endif
|
||||||
#include "src/LU/PartialPivLU_LAPACKE.h"
|
#include "src/LU/PartialPivLU_LAPACKE.h"
|
||||||
#endif
|
#endif
|
||||||
#include "src/LU/Determinant.h"
|
#include "src/LU/Determinant.h"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_METISSUPPORT_MODULE_H
|
#ifndef EIGEN_METISSUPPORT_MODULE_H
|
||||||
#define EIGEN_METISSUPPORT_MODULE_H
|
#define EIGEN_METISSUPPORT_MODULE_H
|
||||||
|
@ -23,7 +23,7 @@ extern "C" {
|
||||||
* \code
|
* \code
|
||||||
* #include <Eigen/MetisSupport>
|
* #include <Eigen/MetisSupport>
|
||||||
* \endcode
|
* \endcode
|
||||||
* This module defines an interface to the METIS reordering package (http://glaros.dtc.umn.edu/gkhome/views/metis).
|
* This module defines an interface to the METIS reordering package (xxxp://glaros.dtc.umn.edu/gkhome/views/metis).
|
||||||
* It can be used just as any other built-in method as explained in \link OrderingMethods_Module here. \endlink
|
* It can be used just as any other built-in method as explained in \link OrderingMethods_Module here. \endlink
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_ORDERINGMETHODS_MODULE_H
|
#ifndef EIGEN_ORDERINGMETHODS_MODULE_H
|
||||||
#define EIGEN_ORDERINGMETHODS_MODULE_H
|
#define EIGEN_ORDERINGMETHODS_MODULE_H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_PASTIXSUPPORT_MODULE_H
|
#ifndef EIGEN_PASTIXSUPPORT_MODULE_H
|
||||||
#define EIGEN_PASTIXSUPPORT_MODULE_H
|
#define EIGEN_PASTIXSUPPORT_MODULE_H
|
||||||
|
@ -24,7 +24,7 @@ extern "C" {
|
||||||
/** \ingroup Support_modules
|
/** \ingroup Support_modules
|
||||||
* \defgroup PaStiXSupport_Module PaStiXSupport module
|
* \defgroup PaStiXSupport_Module PaStiXSupport module
|
||||||
*
|
*
|
||||||
* This module provides an interface to the <a href="http://pastix.gforge.inria.fr/">PaSTiX</a> library.
|
* This module provides an interface to the <a href="xxxp://pastix.gforge.inria.fr/">PaSTiX</a> library.
|
||||||
* PaSTiX is a general \b supernodal, \b parallel and \b opensource sparse solver.
|
* PaSTiX is a general \b supernodal, \b parallel and \b opensource sparse solver.
|
||||||
* It provides the two following main factorization classes:
|
* It provides the two following main factorization classes:
|
||||||
* - class PastixLLT : a supernodal, parallel LLt Cholesky factorization.
|
* - class PastixLLT : a supernodal, parallel LLt Cholesky factorization.
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_PARDISOSUPPORT_MODULE_H
|
#ifndef EIGEN_PARDISOSUPPORT_MODULE_H
|
||||||
#define EIGEN_PARDISOSUPPORT_MODULE_H
|
#define EIGEN_PARDISOSUPPORT_MODULE_H
|
||||||
|
|
|
@ -3,19 +3,19 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_QR_MODULE_H
|
#ifndef EIGEN_QR_MODULE_H
|
||||||
#define EIGEN_QR_MODULE_H
|
#define EIGEN_QR_MODULE_H
|
||||||
|
|
||||||
#include "Core"
|
#include "Core"
|
||||||
|
|
||||||
#include "src/Core/util/DisableStupidWarnings.h"
|
|
||||||
|
|
||||||
#include "Cholesky"
|
#include "Cholesky"
|
||||||
#include "Jacobi"
|
#include "Jacobi"
|
||||||
#include "Householder"
|
#include "Householder"
|
||||||
|
|
||||||
|
#include "src/Core/util/DisableStupidWarnings.h"
|
||||||
|
|
||||||
/** \defgroup QR_Module QR module
|
/** \defgroup QR_Module QR module
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -36,7 +36,11 @@
|
||||||
#include "src/QR/ColPivHouseholderQR.h"
|
#include "src/QR/ColPivHouseholderQR.h"
|
||||||
#include "src/QR/CompleteOrthogonalDecomposition.h"
|
#include "src/QR/CompleteOrthogonalDecomposition.h"
|
||||||
#ifdef EIGEN_USE_LAPACKE
|
#ifdef EIGEN_USE_LAPACKE
|
||||||
|
#ifdef EIGEN_USE_MKL
|
||||||
|
#include "mkl_lapacke.h"
|
||||||
|
#else
|
||||||
#include "src/misc/lapacke.h"
|
#include "src/misc/lapacke.h"
|
||||||
|
#endif
|
||||||
#include "src/QR/HouseholderQR_LAPACKE.h"
|
#include "src/QR/HouseholderQR_LAPACKE.h"
|
||||||
#include "src/QR/ColPivHouseholderQR_LAPACKE.h"
|
#include "src/QR/ColPivHouseholderQR_LAPACKE.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_QTMALLOC_MODULE_H
|
#ifndef EIGEN_QTMALLOC_MODULE_H
|
||||||
#define EIGEN_QTMALLOC_MODULE_H
|
#define EIGEN_QTMALLOC_MODULE_H
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
#include "src/Core/util/DisableStupidWarnings.h"
|
#include "src/Core/util/DisableStupidWarnings.h"
|
||||||
|
|
||||||
void *qMalloc(size_t size)
|
void *qMalloc(std::size_t size)
|
||||||
{
|
{
|
||||||
return Eigen::internal::aligned_malloc(size);
|
return Eigen::internal::aligned_malloc(size);
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,10 @@ void qFree(void *ptr)
|
||||||
Eigen::internal::aligned_free(ptr);
|
Eigen::internal::aligned_free(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *qRealloc(void *ptr, size_t size)
|
void *qRealloc(void *ptr, std::size_t size)
|
||||||
{
|
{
|
||||||
void* newPtr = Eigen::internal::aligned_malloc(size);
|
void* newPtr = Eigen::internal::aligned_malloc(size);
|
||||||
memcpy(newPtr, ptr, size);
|
std::memcpy(newPtr, ptr, size);
|
||||||
Eigen::internal::aligned_free(ptr);
|
Eigen::internal::aligned_free(ptr);
|
||||||
return newPtr;
|
return newPtr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SPQRSUPPORT_MODULE_H
|
#ifndef EIGEN_SPQRSUPPORT_MODULE_H
|
||||||
#define EIGEN_SPQRSUPPORT_MODULE_H
|
#define EIGEN_SPQRSUPPORT_MODULE_H
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
/** \ingroup Support_modules
|
/** \ingroup Support_modules
|
||||||
* \defgroup SPQRSupport_Module SuiteSparseQR module
|
* \defgroup SPQRSupport_Module SuiteSparseQR module
|
||||||
*
|
*
|
||||||
* This module provides an interface to the SPQR library, which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
|
* This module provides an interface to the SPQR library, which is part of the <a href="xxxp://www.suitesparse.com">suitesparse</a> package.
|
||||||
*
|
*
|
||||||
* \code
|
* \code
|
||||||
* #include <Eigen/SPQRSupport>
|
* #include <Eigen/SPQRSupport>
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SVD_MODULE_H
|
#ifndef EIGEN_SVD_MODULE_H
|
||||||
#define EIGEN_SVD_MODULE_H
|
#define EIGEN_SVD_MODULE_H
|
||||||
|
@ -37,7 +37,11 @@
|
||||||
#include "src/SVD/JacobiSVD.h"
|
#include "src/SVD/JacobiSVD.h"
|
||||||
#include "src/SVD/BDCSVD.h"
|
#include "src/SVD/BDCSVD.h"
|
||||||
#if defined(EIGEN_USE_LAPACKE) && !defined(EIGEN_USE_LAPACKE_STRICT)
|
#if defined(EIGEN_USE_LAPACKE) && !defined(EIGEN_USE_LAPACKE_STRICT)
|
||||||
|
#ifdef EIGEN_USE_MKL
|
||||||
|
#include "mkl_lapacke.h"
|
||||||
|
#else
|
||||||
#include "src/misc/lapacke.h"
|
#include "src/misc/lapacke.h"
|
||||||
|
#endif
|
||||||
#include "src/SVD/JacobiSVD_LAPACKE.h"
|
#include "src/SVD/JacobiSVD_LAPACKE.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SPARSE_MODULE_H
|
#ifndef EIGEN_SPARSE_MODULE_H
|
||||||
#define EIGEN_SPARSE_MODULE_H
|
#define EIGEN_SPARSE_MODULE_H
|
||||||
|
@ -25,7 +25,9 @@
|
||||||
|
|
||||||
#include "SparseCore"
|
#include "SparseCore"
|
||||||
#include "OrderingMethods"
|
#include "OrderingMethods"
|
||||||
|
#ifndef EIGEN_MPL2_ONLY
|
||||||
#include "SparseCholesky"
|
#include "SparseCholesky"
|
||||||
|
#endif
|
||||||
#include "SparseLU"
|
#include "SparseLU"
|
||||||
#include "SparseQR"
|
#include "SparseQR"
|
||||||
#include "IterativeLinearSolvers"
|
#include "IterativeLinearSolvers"
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SPARSECHOLESKY_MODULE_H
|
#ifndef EIGEN_SPARSECHOLESKY_MODULE_H
|
||||||
#define EIGEN_SPARSECHOLESKY_MODULE_H
|
#define EIGEN_SPARSECHOLESKY_MODULE_H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SPARSECORE_MODULE_H
|
#ifndef EIGEN_SPARSECORE_MODULE_H
|
||||||
#define EIGEN_SPARSECORE_MODULE_H
|
#define EIGEN_SPARSECORE_MODULE_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SPARSELU_MODULE_H
|
#ifndef EIGEN_SPARSELU_MODULE_H
|
||||||
#define EIGEN_SPARSELU_MODULE_H
|
#define EIGEN_SPARSELU_MODULE_H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SPARSEQR_MODULE_H
|
#ifndef EIGEN_SPARSEQR_MODULE_H
|
||||||
#define EIGEN_SPARSEQR_MODULE_H
|
#define EIGEN_SPARSEQR_MODULE_H
|
||||||
|
@ -28,7 +28,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "OrderingMethods"
|
|
||||||
#include "src/SparseCore/SparseColEtree.h"
|
#include "src/SparseCore/SparseColEtree.h"
|
||||||
#include "src/SparseQR/SparseQR.h"
|
#include "src/SparseQR/SparseQR.h"
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_STDDEQUE_MODULE_H
|
#ifndef EIGEN_STDDEQUE_MODULE_H
|
||||||
#define EIGEN_STDDEQUE_MODULE_H
|
#define EIGEN_STDDEQUE_MODULE_H
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
#include "Core"
|
#include "Core"
|
||||||
#include <deque>
|
#include <deque>
|
||||||
|
|
||||||
#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 /* MSVC auto aligns in 64 bit builds */
|
#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
|
||||||
|
|
||||||
#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...)
|
#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_STDLIST_MODULE_H
|
#ifndef EIGEN_STDLIST_MODULE_H
|
||||||
#define EIGEN_STDLIST_MODULE_H
|
#define EIGEN_STDLIST_MODULE_H
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
#include "Core"
|
#include "Core"
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 /* MSVC auto aligns in 64 bit builds */
|
#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
|
||||||
|
|
||||||
#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...)
|
#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_STDVECTOR_MODULE_H
|
#ifndef EIGEN_STDVECTOR_MODULE_H
|
||||||
#define EIGEN_STDVECTOR_MODULE_H
|
#define EIGEN_STDVECTOR_MODULE_H
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
#include "Core"
|
#include "Core"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 /* MSVC auto aligns in 64 bit builds */
|
#if EIGEN_COMP_MSVC && EIGEN_OS_WIN64 && (EIGEN_MAX_STATIC_ALIGN_BYTES<=16) /* MSVC auto aligns up to 16 bytes in 64 bit builds */
|
||||||
|
|
||||||
#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...)
|
#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SUPERLUSUPPORT_MODULE_H
|
#ifndef EIGEN_SUPERLUSUPPORT_MODULE_H
|
||||||
#define EIGEN_SUPERLUSUPPORT_MODULE_H
|
#define EIGEN_SUPERLUSUPPORT_MODULE_H
|
||||||
|
@ -38,7 +38,7 @@ namespace Eigen { struct SluMatrix; }
|
||||||
/** \ingroup Support_modules
|
/** \ingroup Support_modules
|
||||||
* \defgroup SuperLUSupport_Module SuperLUSupport module
|
* \defgroup SuperLUSupport_Module SuperLUSupport module
|
||||||
*
|
*
|
||||||
* This module provides an interface to the <a href="http://crd-legacy.lbl.gov/~xiaoye/SuperLU/">SuperLU</a> library.
|
* This module provides an interface to the <a href="xxxp://crd-legacy.lbl.gov/~xiaoye/SuperLU/">SuperLU</a> library.
|
||||||
* It provides the following factorization class:
|
* It provides the following factorization class:
|
||||||
* - class SuperLU: a supernodal sequential LU factorization.
|
* - class SuperLU: a supernodal sequential LU factorization.
|
||||||
* - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative methods).
|
* - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative methods).
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_UMFPACKSUPPORT_MODULE_H
|
#ifndef EIGEN_UMFPACKSUPPORT_MODULE_H
|
||||||
#define EIGEN_UMFPACKSUPPORT_MODULE_H
|
#define EIGEN_UMFPACKSUPPORT_MODULE_H
|
||||||
|
@ -19,7 +19,7 @@ extern "C" {
|
||||||
/** \ingroup Support_modules
|
/** \ingroup Support_modules
|
||||||
* \defgroup UmfPackSupport_Module UmfPackSupport module
|
* \defgroup UmfPackSupport_Module UmfPackSupport module
|
||||||
*
|
*
|
||||||
* This module provides an interface to the UmfPack library which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
|
* This module provides an interface to the UmfPack library which is part of the <a href="xxxp://www.suitesparse.com">suitesparse</a> package.
|
||||||
* It provides the following factorization class:
|
* It provides the following factorization class:
|
||||||
* - class UmfPackLU: a multifrontal sequential LU factorization.
|
* - class UmfPackLU: a multifrontal sequential LU factorization.
|
||||||
*
|
*
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_LDLT_H
|
#ifndef EIGEN_LDLT_H
|
||||||
#define EIGEN_LDLT_H
|
#define EIGEN_LDLT_H
|
||||||
|
@ -248,7 +248,7 @@ template<typename _MatrixType, int _UpLo> class LDLT
|
||||||
/** \brief Reports whether previous computation was successful.
|
/** \brief Reports whether previous computation was successful.
|
||||||
*
|
*
|
||||||
* \returns \c Success if computation was succesful,
|
* \returns \c Success if computation was succesful,
|
||||||
* \c NumericalIssue if the matrix.appears to be negative.
|
* \c NumericalIssue if the factorization failed because of a zero pivot.
|
||||||
*/
|
*/
|
||||||
ComputationInfo info() const
|
ComputationInfo info() const
|
||||||
{
|
{
|
||||||
|
@ -305,7 +305,8 @@ template<> struct ldlt_inplace<Lower>
|
||||||
if (size <= 1)
|
if (size <= 1)
|
||||||
{
|
{
|
||||||
transpositions.setIdentity();
|
transpositions.setIdentity();
|
||||||
if (numext::real(mat.coeff(0,0)) > static_cast<RealScalar>(0) ) sign = PositiveSemiDef;
|
if(size==0) sign = ZeroSign;
|
||||||
|
else if (numext::real(mat.coeff(0,0)) > static_cast<RealScalar>(0) ) sign = PositiveSemiDef;
|
||||||
else if (numext::real(mat.coeff(0,0)) < static_cast<RealScalar>(0)) sign = NegativeSemiDef;
|
else if (numext::real(mat.coeff(0,0)) < static_cast<RealScalar>(0)) sign = NegativeSemiDef;
|
||||||
else sign = ZeroSign;
|
else sign = ZeroSign;
|
||||||
return true;
|
return true;
|
||||||
|
@ -376,6 +377,8 @@ template<> struct ldlt_inplace<Lower>
|
||||||
|
|
||||||
if((rs>0) && pivot_is_valid)
|
if((rs>0) && pivot_is_valid)
|
||||||
A21 /= realAkk;
|
A21 /= realAkk;
|
||||||
|
else if(rs>0)
|
||||||
|
ret = ret && (A21.array()==Scalar(0)).all();
|
||||||
|
|
||||||
if(found_zero_pivot && pivot_is_valid) ret = false; // factorization failed
|
if(found_zero_pivot && pivot_is_valid) ret = false; // factorization failed
|
||||||
else if(!pivot_is_valid) found_zero_pivot = true;
|
else if(!pivot_is_valid) found_zero_pivot = true;
|
||||||
|
@ -568,13 +571,14 @@ void LDLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) cons
|
||||||
// more precisely, use pseudo-inverse of D (see bug 241)
|
// more precisely, use pseudo-inverse of D (see bug 241)
|
||||||
using std::abs;
|
using std::abs;
|
||||||
const typename Diagonal<const MatrixType>::RealReturnType vecD(vectorD());
|
const typename Diagonal<const MatrixType>::RealReturnType vecD(vectorD());
|
||||||
// In some previous versions, tolerance was set to the max of 1/highest and the maximal diagonal entry * epsilon
|
// In some previous versions, tolerance was set to the max of 1/highest (or rather numeric_limits::min())
|
||||||
// as motivated by LAPACK's xGELSS:
|
// and the maximal diagonal entry * epsilon as motivated by LAPACK's xGELSS:
|
||||||
// RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits<RealScalar>::epsilon(),RealScalar(1) / NumTraits<RealScalar>::highest());
|
// RealScalar tolerance = numext::maxi(vecD.array().abs().maxCoeff() * NumTraits<RealScalar>::epsilon(),RealScalar(1) / NumTraits<RealScalar>::highest());
|
||||||
// However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the highest
|
// However, LDLT is not rank revealing, and so adjusting the tolerance wrt to the highest
|
||||||
// diagonal element is not well justified and leads to numerical issues in some cases.
|
// diagonal element is not well justified and leads to numerical issues in some cases.
|
||||||
// Moreover, Lapack's xSYTRS routines use 0 for the tolerance.
|
// Moreover, Lapack's xSYTRS routines use 0 for the tolerance.
|
||||||
RealScalar tolerance = RealScalar(1) / NumTraits<RealScalar>::highest();
|
// Using numeric_limits::min() gives us more robustness to denormals.
|
||||||
|
RealScalar tolerance = (std::numeric_limits<RealScalar>::min)();
|
||||||
|
|
||||||
for (Index i = 0; i < vecD.size(); ++i)
|
for (Index i = 0; i < vecD.size(); ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_LLT_H
|
#ifndef EIGEN_LLT_H
|
||||||
#define EIGEN_LLT_H
|
#define EIGEN_LLT_H
|
||||||
|
@ -41,14 +41,18 @@ template<typename MatrixType, int UpLo> struct LLT_Traits;
|
||||||
* Example: \include LLT_example.cpp
|
* Example: \include LLT_example.cpp
|
||||||
* Output: \verbinclude LLT_example.out
|
* Output: \verbinclude LLT_example.out
|
||||||
*
|
*
|
||||||
|
* \b Performance: for best performance, it is recommended to use a column-major storage format
|
||||||
|
* with the Lower triangular part (the default), or, equivalently, a row-major storage format
|
||||||
|
* with the Upper triangular part. Otherwise, you might get a 20% slowdown for the full factorization
|
||||||
|
* step, and rank-updates can be up to 3 times slower.
|
||||||
|
*
|
||||||
* This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
|
* This class supports the \link InplaceDecomposition inplace decomposition \endlink mechanism.
|
||||||
*
|
*
|
||||||
|
* Note that during the decomposition, only the lower (or upper, as defined by _UpLo) triangular part of A is considered.
|
||||||
|
* Therefore, the strict lower part does not have to store correct values.
|
||||||
|
*
|
||||||
* \sa MatrixBase::llt(), SelfAdjointView::llt(), class LDLT
|
* \sa MatrixBase::llt(), SelfAdjointView::llt(), class LDLT
|
||||||
*/
|
*/
|
||||||
/* HEY THIS DOX IS DISABLED BECAUSE THERE's A BUG EITHER HERE OR IN LDLT ABOUT THAT (OR BOTH)
|
|
||||||
* Note that during the decomposition, only the upper triangular part of A is considered. Therefore,
|
|
||||||
* the strict lower part does not have to store correct values.
|
|
||||||
*/
|
|
||||||
template<typename _MatrixType, int _UpLo> class LLT
|
template<typename _MatrixType, int _UpLo> class LLT
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -146,7 +150,7 @@ template<typename _MatrixType, int _UpLo> class LLT
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
void solveInPlace(MatrixBase<Derived> &bAndX) const;
|
void solveInPlace(const MatrixBase<Derived> &bAndX) const;
|
||||||
|
|
||||||
template<typename InputType>
|
template<typename InputType>
|
||||||
LLT& compute(const EigenBase<InputType>& matrix);
|
LLT& compute(const EigenBase<InputType>& matrix);
|
||||||
|
@ -177,7 +181,7 @@ template<typename _MatrixType, int _UpLo> class LLT
|
||||||
/** \brief Reports whether previous computation was successful.
|
/** \brief Reports whether previous computation was successful.
|
||||||
*
|
*
|
||||||
* \returns \c Success if computation was succesful,
|
* \returns \c Success if computation was succesful,
|
||||||
* \c NumericalIssue if the matrix.appears to be negative.
|
* \c NumericalIssue if the matrix.appears not to be positive definite.
|
||||||
*/
|
*/
|
||||||
ComputationInfo info() const
|
ComputationInfo info() const
|
||||||
{
|
{
|
||||||
|
@ -425,6 +429,7 @@ LLT<MatrixType,_UpLo>& LLT<MatrixType,_UpLo>::compute(const EigenBase<InputType>
|
||||||
eigen_assert(a.rows()==a.cols());
|
eigen_assert(a.rows()==a.cols());
|
||||||
const Index size = a.rows();
|
const Index size = a.rows();
|
||||||
m_matrix.resize(size, size);
|
m_matrix.resize(size, size);
|
||||||
|
if (!internal::is_same_dense(m_matrix, a.derived()))
|
||||||
m_matrix = a.derived();
|
m_matrix = a.derived();
|
||||||
|
|
||||||
// Compute matrix L1 norm = max abs column sum.
|
// Compute matrix L1 norm = max abs column sum.
|
||||||
|
@ -485,11 +490,14 @@ void LLT<_MatrixType,_UpLo>::_solve_impl(const RhsType &rhs, DstType &dst) const
|
||||||
*
|
*
|
||||||
* This version avoids a copy when the right hand side matrix b is not needed anymore.
|
* This version avoids a copy when the right hand side matrix b is not needed anymore.
|
||||||
*
|
*
|
||||||
|
* \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.
|
||||||
|
* This function will const_cast it, so constness isn't honored here.
|
||||||
|
*
|
||||||
* \sa LLT::solve(), MatrixBase::llt()
|
* \sa LLT::solve(), MatrixBase::llt()
|
||||||
*/
|
*/
|
||||||
template<typename MatrixType, int _UpLo>
|
template<typename MatrixType, int _UpLo>
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
void LLT<MatrixType,_UpLo>::solveInPlace(MatrixBase<Derived> &bAndX) const
|
void LLT<MatrixType,_UpLo>::solveInPlace(const MatrixBase<Derived> &bAndX) const
|
||||||
{
|
{
|
||||||
eigen_assert(m_isInitialized && "LLT is not initialized.");
|
eigen_assert(m_isInitialized && "LLT is not initialized.");
|
||||||
eigen_assert(m_matrix.rows()==bAndX.rows());
|
eigen_assert(m_matrix.rows()==bAndX.rows());
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CHOLMODSUPPORT_H
|
#ifndef EIGEN_CHOLMODSUPPORT_H
|
||||||
#define EIGEN_CHOLMODSUPPORT_H
|
#define EIGEN_CHOLMODSUPPORT_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_ARRAY_H
|
#ifndef EIGEN_ARRAY_H
|
||||||
#define EIGEN_ARRAY_H
|
#define EIGEN_ARRAY_H
|
||||||
|
@ -153,8 +153,6 @@ class Array
|
||||||
: Base(std::move(other))
|
: Base(std::move(other))
|
||||||
{
|
{
|
||||||
Base::_check_template_params();
|
Base::_check_template_params();
|
||||||
if (RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic)
|
|
||||||
Base::_set_noalias(other);
|
|
||||||
}
|
}
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
Array& operator=(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
|
Array& operator=(Array&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
|
||||||
|
@ -231,10 +229,16 @@ class Array
|
||||||
: Base(other)
|
: Base(other)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct PrivateType {};
|
||||||
|
public:
|
||||||
|
|
||||||
/** \sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */
|
/** \sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
EIGEN_STRONG_INLINE Array(const EigenBase<OtherDerived> &other)
|
EIGEN_STRONG_INLINE Array(const EigenBase<OtherDerived> &other,
|
||||||
|
typename internal::enable_if<internal::is_convertible<typename OtherDerived::Scalar,Scalar>::value,
|
||||||
|
PrivateType>::type = PrivateType())
|
||||||
: Base(other.derived())
|
: Base(other.derived())
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_ARRAYBASE_H
|
#ifndef EIGEN_ARRAYBASE_H
|
||||||
#define EIGEN_ARRAYBASE_H
|
#define EIGEN_ARRAYBASE_H
|
||||||
|
@ -153,8 +153,8 @@ template<typename Derived> class ArrayBase
|
||||||
// inline void evalTo(Dest& dst) const { dst = matrix(); }
|
// inline void evalTo(Dest& dst) const { dst = matrix(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(ArrayBase)
|
||||||
ArrayBase() : Base() {}
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(ArrayBase)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit ArrayBase(Index);
|
explicit ArrayBase(Index);
|
||||||
|
@ -175,7 +175,7 @@ template<typename Derived> class ArrayBase
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_STRONG_INLINE Derived &
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
|
||||||
ArrayBase<Derived>::operator-=(const ArrayBase<OtherDerived> &other)
|
ArrayBase<Derived>::operator-=(const ArrayBase<OtherDerived> &other)
|
||||||
{
|
{
|
||||||
call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
|
call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
|
@ -188,7 +188,7 @@ ArrayBase<Derived>::operator-=(const ArrayBase<OtherDerived> &other)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_STRONG_INLINE Derived &
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
|
||||||
ArrayBase<Derived>::operator+=(const ArrayBase<OtherDerived>& other)
|
ArrayBase<Derived>::operator+=(const ArrayBase<OtherDerived>& other)
|
||||||
{
|
{
|
||||||
call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
|
call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
|
@ -201,7 +201,7 @@ ArrayBase<Derived>::operator+=(const ArrayBase<OtherDerived>& other)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_STRONG_INLINE Derived &
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
|
||||||
ArrayBase<Derived>::operator*=(const ArrayBase<OtherDerived>& other)
|
ArrayBase<Derived>::operator*=(const ArrayBase<OtherDerived>& other)
|
||||||
{
|
{
|
||||||
call_assignment(derived(), other.derived(), internal::mul_assign_op<Scalar,typename OtherDerived::Scalar>());
|
call_assignment(derived(), other.derived(), internal::mul_assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
|
@ -214,7 +214,7 @@ ArrayBase<Derived>::operator*=(const ArrayBase<OtherDerived>& other)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_STRONG_INLINE Derived &
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived &
|
||||||
ArrayBase<Derived>::operator/=(const ArrayBase<OtherDerived>& other)
|
ArrayBase<Derived>::operator/=(const ArrayBase<OtherDerived>& other)
|
||||||
{
|
{
|
||||||
call_assignment(derived(), other.derived(), internal::div_assign_op<Scalar,typename OtherDerived::Scalar>());
|
call_assignment(derived(), other.derived(), internal::div_assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_ARRAYWRAPPER_H
|
#ifndef EIGEN_ARRAYWRAPPER_H
|
||||||
#define EIGEN_ARRAYWRAPPER_H
|
#define EIGEN_ARRAYWRAPPER_H
|
||||||
|
@ -32,7 +32,8 @@ struct traits<ArrayWrapper<ExpressionType> >
|
||||||
// Let's remove NestByRefBit
|
// Let's remove NestByRefBit
|
||||||
enum {
|
enum {
|
||||||
Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,
|
Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,
|
||||||
Flags = Flags0 & ~NestByRefBit
|
LvalueBitFlag = is_lvalue<ExpressionType>::value ? LvalueBit : 0,
|
||||||
|
Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -129,7 +130,8 @@ struct traits<MatrixWrapper<ExpressionType> >
|
||||||
// Let's remove NestByRefBit
|
// Let's remove NestByRefBit
|
||||||
enum {
|
enum {
|
||||||
Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,
|
Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,
|
||||||
Flags = Flags0 & ~NestByRefBit
|
LvalueBitFlag = is_lvalue<ExpressionType>::value ? LvalueBit : 0,
|
||||||
|
Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_ASSIGN_H
|
#ifndef EIGEN_ASSIGN_H
|
||||||
#define EIGEN_ASSIGN_H
|
#define EIGEN_ASSIGN_H
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_ASSIGN_EVALUATOR_H
|
#ifndef EIGEN_ASSIGN_EVALUATOR_H
|
||||||
#define EIGEN_ASSIGN_EVALUATOR_H
|
#define EIGEN_ASSIGN_EVALUATOR_H
|
||||||
|
@ -39,7 +39,7 @@ public:
|
||||||
enum {
|
enum {
|
||||||
DstAlignment = DstEvaluator::Alignment,
|
DstAlignment = DstEvaluator::Alignment,
|
||||||
SrcAlignment = SrcEvaluator::Alignment,
|
SrcAlignment = SrcEvaluator::Alignment,
|
||||||
DstHasDirectAccess = DstFlags & DirectAccessBit,
|
DstHasDirectAccess = (DstFlags & DirectAccessBit) == DirectAccessBit,
|
||||||
JointAlignment = EIGEN_PLAIN_ENUM_MIN(DstAlignment,SrcAlignment)
|
JointAlignment = EIGEN_PLAIN_ENUM_MIN(DstAlignment,SrcAlignment)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ private:
|
||||||
&& int(OuterStride)!=Dynamic && int(OuterStride)%int(InnerPacketSize)==0
|
&& int(OuterStride)!=Dynamic && int(OuterStride)%int(InnerPacketSize)==0
|
||||||
&& (EIGEN_UNALIGNED_VECTORIZE || int(JointAlignment)>=int(InnerRequiredAlignment)),
|
&& (EIGEN_UNALIGNED_VECTORIZE || int(JointAlignment)>=int(InnerRequiredAlignment)),
|
||||||
MayLinearize = bool(StorageOrdersAgree) && (int(DstFlags) & int(SrcFlags) & LinearAccessBit),
|
MayLinearize = bool(StorageOrdersAgree) && (int(DstFlags) & int(SrcFlags) & LinearAccessBit),
|
||||||
MayLinearVectorize = bool(MightVectorize) && MayLinearize && DstHasDirectAccess
|
MayLinearVectorize = bool(MightVectorize) && bool(MayLinearize) && bool(DstHasDirectAccess)
|
||||||
&& (EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment)) || MaxSizeAtCompileTime == Dynamic),
|
&& (EIGEN_UNALIGNED_VECTORIZE || (int(DstAlignment)>=int(LinearRequiredAlignment)) || MaxSizeAtCompileTime == Dynamic),
|
||||||
/* If the destination isn't aligned, we have to do runtime checks and we don't unroll,
|
/* If the destination isn't aligned, we have to do runtime checks and we don't unroll,
|
||||||
so it's only good for large enough sizes. */
|
so it's only good for large enough sizes. */
|
||||||
|
@ -515,7 +515,7 @@ struct dense_assignment_loop<Kernel, LinearTraversal, CompleteUnrolling>
|
||||||
template<typename Kernel>
|
template<typename Kernel>
|
||||||
struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, NoUnrolling>
|
struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, NoUnrolling>
|
||||||
{
|
{
|
||||||
EIGEN_DEVICE_FUNC static inline void run(Kernel &kernel)
|
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
|
||||||
{
|
{
|
||||||
typedef typename Kernel::Scalar Scalar;
|
typedef typename Kernel::Scalar Scalar;
|
||||||
typedef typename Kernel::PacketType PacketType;
|
typedef typename Kernel::PacketType PacketType;
|
||||||
|
@ -563,7 +563,7 @@ struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, NoUnrolling>
|
||||||
template<typename Kernel>
|
template<typename Kernel>
|
||||||
struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, InnerUnrolling>
|
struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, InnerUnrolling>
|
||||||
{
|
{
|
||||||
EIGEN_DEVICE_FUNC static inline void run(Kernel &kernel)
|
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE void run(Kernel &kernel)
|
||||||
{
|
{
|
||||||
typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
|
typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
|
||||||
typedef typename Kernel::PacketType PacketType;
|
typedef typename Kernel::PacketType PacketType;
|
||||||
|
@ -701,6 +701,26 @@ protected:
|
||||||
* Part 5 : Entry point for dense rectangular assignment
|
* Part 5 : Entry point for dense rectangular assignment
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
template<typename DstXprType,typename SrcXprType, typename Functor>
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
|
void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const Functor &/*func*/)
|
||||||
|
{
|
||||||
|
EIGEN_ONLY_USED_FOR_DEBUG(dst);
|
||||||
|
EIGEN_ONLY_USED_FOR_DEBUG(src);
|
||||||
|
eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename DstXprType,typename SrcXprType, typename T1, typename T2>
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
|
void resize_if_allowed(DstXprType &dst, const SrcXprType& src, const internal::assign_op<T1,T2> &/*func*/)
|
||||||
|
{
|
||||||
|
Index dstRows = src.rows();
|
||||||
|
Index dstCols = src.cols();
|
||||||
|
if(((dst.rows()!=dstRows) || (dst.cols()!=dstCols)))
|
||||||
|
dst.resize(dstRows, dstCols);
|
||||||
|
eigen_assert(dst.rows() == dstRows && dst.cols() == dstCols);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename DstXprType, typename SrcXprType, typename Functor>
|
template<typename DstXprType, typename SrcXprType, typename Functor>
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src, const Functor &func)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType& dst, const SrcXprType& src, const Functor &func)
|
||||||
{
|
{
|
||||||
|
@ -711,10 +731,7 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void call_dense_assignment_loop(DstXprType
|
||||||
|
|
||||||
// NOTE To properly handle A = (A*A.transpose())/s with A rectangular,
|
// NOTE To properly handle A = (A*A.transpose())/s with A rectangular,
|
||||||
// we need to resize the destination after the source evaluator has been created.
|
// we need to resize the destination after the source evaluator has been created.
|
||||||
Index dstRows = src.rows();
|
resize_if_allowed(dst, src, func);
|
||||||
Index dstCols = src.cols();
|
|
||||||
if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
|
|
||||||
dst.resize(dstRows, dstCols);
|
|
||||||
|
|
||||||
DstEvaluatorType dstEvaluator(dst);
|
DstEvaluatorType dstEvaluator(dst);
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,8 @@ class vml_assign_traits
|
||||||
struct Assignment<DstXprType, CwiseUnaryOp<scalar_##EIGENOP##_op<EIGENTYPE>, SrcXprNested>, assign_op<EIGENTYPE,EIGENTYPE>, \
|
struct Assignment<DstXprType, CwiseUnaryOp<scalar_##EIGENOP##_op<EIGENTYPE>, SrcXprNested>, assign_op<EIGENTYPE,EIGENTYPE>, \
|
||||||
Dense2Dense, typename enable_if<vml_assign_traits<DstXprType,SrcXprNested>::EnableVml>::type> { \
|
Dense2Dense, typename enable_if<vml_assign_traits<DstXprType,SrcXprNested>::EnableVml>::type> { \
|
||||||
typedef CwiseUnaryOp<scalar_##EIGENOP##_op<EIGENTYPE>, SrcXprNested> SrcXprType; \
|
typedef CwiseUnaryOp<scalar_##EIGENOP##_op<EIGENTYPE>, SrcXprNested> SrcXprType; \
|
||||||
static void run(DstXprType &dst, const SrcXprType &src, const assign_op<EIGENTYPE,EIGENTYPE> &/*func*/) { \
|
static void run(DstXprType &dst, const SrcXprType &src, const assign_op<EIGENTYPE,EIGENTYPE> &func) { \
|
||||||
|
resize_if_allowed(dst, src, func); \
|
||||||
eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \
|
eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \
|
||||||
if(vml_assign_traits<DstXprType,SrcXprNested>::Traversal==LinearTraversal) { \
|
if(vml_assign_traits<DstXprType,SrcXprNested>::Traversal==LinearTraversal) { \
|
||||||
VMLOP(dst.size(), (const VMLTYPE*)src.nestedExpression().data(), \
|
VMLOP(dst.size(), (const VMLTYPE*)src.nestedExpression().data(), \
|
||||||
|
@ -144,7 +145,8 @@ EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(ceil, Ceil, _)
|
||||||
Dense2Dense, typename enable_if<vml_assign_traits<DstXprType,SrcXprNested>::EnableVml>::type> { \
|
Dense2Dense, typename enable_if<vml_assign_traits<DstXprType,SrcXprNested>::EnableVml>::type> { \
|
||||||
typedef CwiseBinaryOp<scalar_##EIGENOP##_op<EIGENTYPE,EIGENTYPE>, SrcXprNested, \
|
typedef CwiseBinaryOp<scalar_##EIGENOP##_op<EIGENTYPE,EIGENTYPE>, SrcXprNested, \
|
||||||
const CwiseNullaryOp<internal::scalar_constant_op<EIGENTYPE>,Plain> > SrcXprType; \
|
const CwiseNullaryOp<internal::scalar_constant_op<EIGENTYPE>,Plain> > SrcXprType; \
|
||||||
static void run(DstXprType &dst, const SrcXprType &src, const assign_op<EIGENTYPE,EIGENTYPE> &/*func*/) { \
|
static void run(DstXprType &dst, const SrcXprType &src, const assign_op<EIGENTYPE,EIGENTYPE> &func) { \
|
||||||
|
resize_if_allowed(dst, src, func); \
|
||||||
eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \
|
eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); \
|
||||||
VMLTYPE exponent = reinterpret_cast<const VMLTYPE&>(src.rhs().functor().m_other); \
|
VMLTYPE exponent = reinterpret_cast<const VMLTYPE&>(src.rhs().functor().m_other); \
|
||||||
if(vml_assign_traits<DstXprType,SrcXprNested>::Traversal==LinearTraversal) \
|
if(vml_assign_traits<DstXprType,SrcXprNested>::Traversal==LinearTraversal) \
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_BANDMATRIX_H
|
#ifndef EIGEN_BANDMATRIX_H
|
||||||
#define EIGEN_BANDMATRIX_H
|
#define EIGEN_BANDMATRIX_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_BLOCK_H
|
#ifndef EIGEN_BLOCK_H
|
||||||
#define EIGEN_BLOCK_H
|
#define EIGEN_BLOCK_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_ALLANDANY_H
|
#ifndef EIGEN_ALLANDANY_H
|
||||||
#define EIGEN_ALLANDANY_H
|
#define EIGEN_ALLANDANY_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_COMMAINITIALIZER_H
|
#ifndef EIGEN_COMMAINITIALIZER_H
|
||||||
#define EIGEN_COMMAINITIALIZER_H
|
#define EIGEN_COMMAINITIALIZER_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CONDITIONESTIMATOR_H
|
#ifndef EIGEN_CONDITIONESTIMATOR_H
|
||||||
#define EIGEN_CONDITIONESTIMATOR_H
|
#define EIGEN_CONDITIONESTIMATOR_H
|
||||||
|
@ -37,7 +37,7 @@ struct rcond_compute_sign<Vector, Vector, false> {
|
||||||
* \a matrix that implements .solve() and .adjoint().solve() methods.
|
* \a matrix that implements .solve() and .adjoint().solve() methods.
|
||||||
*
|
*
|
||||||
* This function implements Algorithms 4.1 and 5.1 from
|
* This function implements Algorithms 4.1 and 5.1 from
|
||||||
* http://www.maths.manchester.ac.uk/~higham/narep/narep135.pdf
|
* xxxp://www.maths.manchester.ac.uk/~higham/narep/narep135.pdf
|
||||||
* which also forms the basis for the condition number estimators in
|
* which also forms the basis for the condition number estimators in
|
||||||
* LAPACK. Since at most 10 calls to the solve method of dec are
|
* LAPACK. Since at most 10 calls to the solve method of dec are
|
||||||
* performed, the total cost is O(dims^2), as opposed to O(dims^3)
|
* performed, the total cost is O(dims^2), as opposed to O(dims^3)
|
||||||
|
@ -160,7 +160,7 @@ rcond_estimate_helper(typename Decomposition::RealScalar matrix_norm, const Deco
|
||||||
{
|
{
|
||||||
typedef typename Decomposition::RealScalar RealScalar;
|
typedef typename Decomposition::RealScalar RealScalar;
|
||||||
eigen_assert(dec.rows() == dec.cols());
|
eigen_assert(dec.rows() == dec.cols());
|
||||||
if (dec.rows() == 0) return RealScalar(1);
|
if (dec.rows() == 0) return NumTraits<RealScalar>::infinity();
|
||||||
if (matrix_norm == RealScalar(0)) return RealScalar(0);
|
if (matrix_norm == RealScalar(0)) return RealScalar(0);
|
||||||
if (dec.rows() == 1) return RealScalar(1);
|
if (dec.rows() == 1) return RealScalar(1);
|
||||||
const RealScalar inverse_matrix_norm = rcond_invmatrix_L1_norm_estimate(dec);
|
const RealScalar inverse_matrix_norm = rcond_invmatrix_L1_norm_estimate(dec);
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
|
|
||||||
#ifndef EIGEN_COREEVALUATORS_H
|
#ifndef EIGEN_COREEVALUATORS_H
|
||||||
|
@ -977,7 +977,7 @@ struct evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
|
||||||
OuterStrideAtCompileTime = HasSameStorageOrderAsArgType
|
OuterStrideAtCompileTime = HasSameStorageOrderAsArgType
|
||||||
? int(outer_stride_at_compile_time<ArgType>::ret)
|
? int(outer_stride_at_compile_time<ArgType>::ret)
|
||||||
: int(inner_stride_at_compile_time<ArgType>::ret),
|
: int(inner_stride_at_compile_time<ArgType>::ret),
|
||||||
MaskPacketAccessBit = (InnerStrideAtCompileTime == 1) ? PacketAccessBit : 0,
|
MaskPacketAccessBit = (InnerStrideAtCompileTime == 1 || HasSameStorageOrderAsArgType) ? PacketAccessBit : 0,
|
||||||
|
|
||||||
FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 || (InnerPanel && (evaluator<ArgType>::Flags&LinearAccessBit))) ? LinearAccessBit : 0,
|
FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 || (InnerPanel && (evaluator<ArgType>::Flags&LinearAccessBit))) ? LinearAccessBit : 0,
|
||||||
FlagsRowMajorBit = XprType::Flags&RowMajorBit,
|
FlagsRowMajorBit = XprType::Flags&RowMajorBit,
|
||||||
|
@ -987,7 +987,9 @@ struct evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
|
||||||
Flags = Flags0 | FlagsLinearAccessBit | FlagsRowMajorBit,
|
Flags = Flags0 | FlagsLinearAccessBit | FlagsRowMajorBit,
|
||||||
|
|
||||||
PacketAlignment = unpacket_traits<PacketScalar>::alignment,
|
PacketAlignment = unpacket_traits<PacketScalar>::alignment,
|
||||||
Alignment0 = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % int(PacketAlignment)) == 0)) ? int(PacketAlignment) : 0,
|
Alignment0 = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic)
|
||||||
|
&& (OuterStrideAtCompileTime!=0)
|
||||||
|
&& (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % int(PacketAlignment)) == 0)) ? int(PacketAlignment) : 0,
|
||||||
Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator<ArgType>::Alignment, Alignment0)
|
Alignment = EIGEN_PLAIN_ENUM_MIN(evaluator<ArgType>::Alignment, Alignment0)
|
||||||
};
|
};
|
||||||
typedef block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel> block_evaluator_type;
|
typedef block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel> block_evaluator_type;
|
||||||
|
@ -1018,14 +1020,16 @@ struct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IndexBa
|
||||||
EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& block)
|
EIGEN_DEVICE_FUNC explicit unary_evaluator(const XprType& block)
|
||||||
: m_argImpl(block.nestedExpression()),
|
: m_argImpl(block.nestedExpression()),
|
||||||
m_startRow(block.startRow()),
|
m_startRow(block.startRow()),
|
||||||
m_startCol(block.startCol())
|
m_startCol(block.startCol()),
|
||||||
|
m_linear_offset(InnerPanel?(XprType::IsRowMajor ? block.startRow()*block.cols() : block.startCol()*block.rows()):0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
typedef typename XprType::Scalar Scalar;
|
typedef typename XprType::Scalar Scalar;
|
||||||
typedef typename XprType::CoeffReturnType CoeffReturnType;
|
typedef typename XprType::CoeffReturnType CoeffReturnType;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
RowsAtCompileTime = XprType::RowsAtCompileTime
|
RowsAtCompileTime = XprType::RowsAtCompileTime,
|
||||||
|
ForwardLinearAccess = InnerPanel && bool(evaluator<ArgType>::Flags&LinearAccessBit)
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
|
@ -1037,6 +1041,9 @@ struct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IndexBa
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
CoeffReturnType coeff(Index index) const
|
CoeffReturnType coeff(Index index) const
|
||||||
{
|
{
|
||||||
|
if (ForwardLinearAccess)
|
||||||
|
return m_argImpl.coeff(m_linear_offset.value() + index);
|
||||||
|
else
|
||||||
return coeff(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
|
return coeff(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1049,6 +1056,9 @@ struct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IndexBa
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
Scalar& coeffRef(Index index)
|
Scalar& coeffRef(Index index)
|
||||||
{
|
{
|
||||||
|
if (ForwardLinearAccess)
|
||||||
|
return m_argImpl.coeffRef(m_linear_offset.value() + index);
|
||||||
|
else
|
||||||
return coeffRef(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
|
return coeffRef(RowsAtCompileTime == 1 ? 0 : index, RowsAtCompileTime == 1 ? index : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1063,6 +1073,9 @@ struct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IndexBa
|
||||||
EIGEN_STRONG_INLINE
|
EIGEN_STRONG_INLINE
|
||||||
PacketType packet(Index index) const
|
PacketType packet(Index index) const
|
||||||
{
|
{
|
||||||
|
if (ForwardLinearAccess)
|
||||||
|
return m_argImpl.template packet<LoadMode,PacketType>(m_linear_offset.value() + index);
|
||||||
|
else
|
||||||
return packet<LoadMode,PacketType>(RowsAtCompileTime == 1 ? 0 : index,
|
return packet<LoadMode,PacketType>(RowsAtCompileTime == 1 ? 0 : index,
|
||||||
RowsAtCompileTime == 1 ? index : 0);
|
RowsAtCompileTime == 1 ? index : 0);
|
||||||
}
|
}
|
||||||
|
@ -1078,6 +1091,9 @@ struct unary_evaluator<Block<ArgType, BlockRows, BlockCols, InnerPanel>, IndexBa
|
||||||
EIGEN_STRONG_INLINE
|
EIGEN_STRONG_INLINE
|
||||||
void writePacket(Index index, const PacketType& x)
|
void writePacket(Index index, const PacketType& x)
|
||||||
{
|
{
|
||||||
|
if (ForwardLinearAccess)
|
||||||
|
return m_argImpl.template writePacket<StoreMode,PacketType>(m_linear_offset.value() + index, x);
|
||||||
|
else
|
||||||
return writePacket<StoreMode,PacketType>(RowsAtCompileTime == 1 ? 0 : index,
|
return writePacket<StoreMode,PacketType>(RowsAtCompileTime == 1 ? 0 : index,
|
||||||
RowsAtCompileTime == 1 ? index : 0,
|
RowsAtCompileTime == 1 ? index : 0,
|
||||||
x);
|
x);
|
||||||
|
@ -1087,6 +1103,7 @@ protected:
|
||||||
evaluator<ArgType> m_argImpl;
|
evaluator<ArgType> m_argImpl;
|
||||||
const variable_if_dynamic<Index, (ArgType::RowsAtCompileTime == 1 && BlockRows==1) ? 0 : Dynamic> m_startRow;
|
const variable_if_dynamic<Index, (ArgType::RowsAtCompileTime == 1 && BlockRows==1) ? 0 : Dynamic> m_startRow;
|
||||||
const variable_if_dynamic<Index, (ArgType::ColsAtCompileTime == 1 && BlockCols==1) ? 0 : Dynamic> m_startCol;
|
const variable_if_dynamic<Index, (ArgType::ColsAtCompileTime == 1 && BlockCols==1) ? 0 : Dynamic> m_startCol;
|
||||||
|
const variable_if_dynamic<Index, InnerPanel ? Dynamic : 0> m_linear_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: This evaluator does not actually use the child evaluator;
|
// TODO: This evaluator does not actually use the child evaluator;
|
||||||
|
@ -1556,9 +1573,7 @@ struct evaluator<Diagonal<ArgType, DiagIndex> >
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
typedef typename XprType::Scalar Scalar;
|
typedef typename XprType::Scalar Scalar;
|
||||||
// FIXME having to check whether ArgType is sparse here i not very nice.
|
typedef typename XprType::CoeffReturnType CoeffReturnType;
|
||||||
typedef typename internal::conditional<!internal::is_same<typename ArgType::StorageKind,Sparse>::value,
|
|
||||||
typename XprType::CoeffReturnType,Scalar>::type CoeffReturnType;
|
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
CoeffReturnType coeff(Index row, Index) const
|
CoeffReturnType coeff(Index row, Index) const
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_COREITERATORS_H
|
#ifndef EIGEN_COREITERATORS_H
|
||||||
#define EIGEN_COREITERATORS_H
|
#define EIGEN_COREITERATORS_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CWISE_BINARY_OP_H
|
#ifndef EIGEN_CWISE_BINARY_OP_H
|
||||||
#define EIGEN_CWISE_BINARY_OP_H
|
#define EIGEN_CWISE_BINARY_OP_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CWISE_NULLARY_OP_H
|
#ifndef EIGEN_CWISE_NULLARY_OP_H
|
||||||
#define EIGEN_CWISE_NULLARY_OP_H
|
#define EIGEN_CWISE_NULLARY_OP_H
|
||||||
|
@ -105,7 +105,7 @@ class CwiseNullaryOp : public internal::dense_xpr_base< CwiseNullaryOp<NullaryOp
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename CustomNullaryOp>
|
template<typename CustomNullaryOp>
|
||||||
EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
|
||||||
DenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func)
|
DenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func)
|
||||||
{
|
{
|
||||||
return CwiseNullaryOp<CustomNullaryOp, PlainObject>(rows, cols, func);
|
return CwiseNullaryOp<CustomNullaryOp, PlainObject>(rows, cols, func);
|
||||||
|
@ -150,7 +150,7 @@ DenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename CustomNullaryOp>
|
template<typename CustomNullaryOp>
|
||||||
EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, typename DenseBase<Derived>::PlainObject>
|
||||||
DenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func)
|
DenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func)
|
||||||
{
|
{
|
||||||
return CwiseNullaryOp<CustomNullaryOp, PlainObject>(RowsAtCompileTime, ColsAtCompileTime, func);
|
return CwiseNullaryOp<CustomNullaryOp, PlainObject>(RowsAtCompileTime, ColsAtCompileTime, func);
|
||||||
|
@ -192,7 +192,7 @@ DenseBase<Derived>::Constant(Index rows, Index cols, const Scalar& value)
|
||||||
* \sa class CwiseNullaryOp
|
* \sa class CwiseNullaryOp
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
||||||
DenseBase<Derived>::Constant(Index size, const Scalar& value)
|
DenseBase<Derived>::Constant(Index size, const Scalar& value)
|
||||||
{
|
{
|
||||||
return DenseBase<Derived>::NullaryExpr(size, internal::scalar_constant_op<Scalar>(value));
|
return DenseBase<Derived>::NullaryExpr(size, internal::scalar_constant_op<Scalar>(value));
|
||||||
|
@ -208,7 +208,7 @@ DenseBase<Derived>::Constant(Index size, const Scalar& value)
|
||||||
* \sa class CwiseNullaryOp
|
* \sa class CwiseNullaryOp
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
||||||
DenseBase<Derived>::Constant(const Scalar& value)
|
DenseBase<Derived>::Constant(const Scalar& value)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
|
EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
|
||||||
|
@ -220,7 +220,7 @@ DenseBase<Derived>::Constant(const Scalar& value)
|
||||||
* \sa LinSpaced(Index,Scalar,Scalar), setLinSpaced(Index,const Scalar&,const Scalar&)
|
* \sa LinSpaced(Index,Scalar,Scalar), setLinSpaced(Index,const Scalar&,const Scalar&)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
|
||||||
DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high)
|
DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
||||||
|
@ -232,7 +232,7 @@ DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const
|
||||||
* \sa LinSpaced(Scalar,Scalar)
|
* \sa LinSpaced(Scalar,Scalar)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
|
||||||
DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high)
|
DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
||||||
|
@ -264,7 +264,7 @@ DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& hig
|
||||||
* \sa setLinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
|
* \sa setLinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
|
||||||
DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
|
DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
||||||
|
@ -276,7 +276,7 @@ DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
|
||||||
* Special version for fixed size types which does not require the size parameter.
|
* Special version for fixed size types which does not require the size parameter.
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
|
||||||
DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)
|
DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
||||||
|
@ -286,7 +286,7 @@ DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)
|
||||||
|
|
||||||
/** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */
|
/** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
bool DenseBase<Derived>::isApproxToConstant
|
EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isApproxToConstant
|
||||||
(const Scalar& val, const RealScalar& prec) const
|
(const Scalar& val, const RealScalar& prec) const
|
||||||
{
|
{
|
||||||
typename internal::nested_eval<Derived,1>::type self(derived());
|
typename internal::nested_eval<Derived,1>::type self(derived());
|
||||||
|
@ -301,7 +301,7 @@ bool DenseBase<Derived>::isApproxToConstant
|
||||||
*
|
*
|
||||||
* \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
|
* \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
bool DenseBase<Derived>::isConstant
|
EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isConstant
|
||||||
(const Scalar& val, const RealScalar& prec) const
|
(const Scalar& val, const RealScalar& prec) const
|
||||||
{
|
{
|
||||||
return isApproxToConstant(val, prec);
|
return isApproxToConstant(val, prec);
|
||||||
|
@ -312,7 +312,7 @@ bool DenseBase<Derived>::isConstant
|
||||||
* \sa setConstant(), Constant(), class CwiseNullaryOp
|
* \sa setConstant(), Constant(), class CwiseNullaryOp
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)
|
||||||
{
|
{
|
||||||
setConstant(val);
|
setConstant(val);
|
||||||
}
|
}
|
||||||
|
@ -322,7 +322,7 @@ EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)
|
||||||
* \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
|
* \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)
|
||||||
{
|
{
|
||||||
return derived() = Constant(rows(), cols(), val);
|
return derived() = Constant(rows(), cols(), val);
|
||||||
}
|
}
|
||||||
|
@ -337,7 +337,7 @@ EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)
|
||||||
* \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
|
* \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived&
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
|
||||||
PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)
|
PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)
|
||||||
{
|
{
|
||||||
resize(size);
|
resize(size);
|
||||||
|
@ -356,7 +356,7 @@ PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)
|
||||||
* \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
|
* \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived&
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
|
||||||
PlainObjectBase<Derived>::setConstant(Index rows, Index cols, const Scalar& val)
|
PlainObjectBase<Derived>::setConstant(Index rows, Index cols, const Scalar& val)
|
||||||
{
|
{
|
||||||
resize(rows, cols);
|
resize(rows, cols);
|
||||||
|
@ -380,7 +380,7 @@ PlainObjectBase<Derived>::setConstant(Index rows, Index cols, const Scalar& val)
|
||||||
* \sa LinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
|
* \sa LinSpaced(Index,const Scalar&,const Scalar&), CwiseNullaryOp
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
||||||
return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar,PacketScalar>(low,high,newSize));
|
return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar,PacketScalar>(low,high,newSize));
|
||||||
|
@ -400,7 +400,7 @@ EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, con
|
||||||
* \sa LinSpaced(Index,const Scalar&,const Scalar&), setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
|
* \sa LinSpaced(Index,const Scalar&,const Scalar&), setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
||||||
return setLinSpaced(size(), low, high);
|
return setLinSpaced(size(), low, high);
|
||||||
|
@ -423,7 +423,7 @@ EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low,
|
||||||
* \sa Zero(), Zero(Index)
|
* \sa Zero(), Zero(Index)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
||||||
DenseBase<Derived>::Zero(Index rows, Index cols)
|
DenseBase<Derived>::Zero(Index rows, Index cols)
|
||||||
{
|
{
|
||||||
return Constant(rows, cols, Scalar(0));
|
return Constant(rows, cols, Scalar(0));
|
||||||
|
@ -446,7 +446,7 @@ DenseBase<Derived>::Zero(Index rows, Index cols)
|
||||||
* \sa Zero(), Zero(Index,Index)
|
* \sa Zero(), Zero(Index,Index)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
||||||
DenseBase<Derived>::Zero(Index size)
|
DenseBase<Derived>::Zero(Index size)
|
||||||
{
|
{
|
||||||
return Constant(size, Scalar(0));
|
return Constant(size, Scalar(0));
|
||||||
|
@ -463,7 +463,7 @@ DenseBase<Derived>::Zero(Index size)
|
||||||
* \sa Zero(Index), Zero(Index,Index)
|
* \sa Zero(Index), Zero(Index,Index)
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
||||||
DenseBase<Derived>::Zero()
|
DenseBase<Derived>::Zero()
|
||||||
{
|
{
|
||||||
return Constant(Scalar(0));
|
return Constant(Scalar(0));
|
||||||
|
@ -478,7 +478,7 @@ DenseBase<Derived>::Zero()
|
||||||
* \sa class CwiseNullaryOp, Zero()
|
* \sa class CwiseNullaryOp, Zero()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
bool DenseBase<Derived>::isZero(const RealScalar& prec) const
|
EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isZero(const RealScalar& prec) const
|
||||||
{
|
{
|
||||||
typename internal::nested_eval<Derived,1>::type self(derived());
|
typename internal::nested_eval<Derived,1>::type self(derived());
|
||||||
for(Index j = 0; j < cols(); ++j)
|
for(Index j = 0; j < cols(); ++j)
|
||||||
|
@ -496,7 +496,7 @@ bool DenseBase<Derived>::isZero(const RealScalar& prec) const
|
||||||
* \sa class CwiseNullaryOp, Zero()
|
* \sa class CwiseNullaryOp, Zero()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero()
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero()
|
||||||
{
|
{
|
||||||
return setConstant(Scalar(0));
|
return setConstant(Scalar(0));
|
||||||
}
|
}
|
||||||
|
@ -511,7 +511,7 @@ EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero()
|
||||||
* \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()
|
* \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived&
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
|
||||||
PlainObjectBase<Derived>::setZero(Index newSize)
|
PlainObjectBase<Derived>::setZero(Index newSize)
|
||||||
{
|
{
|
||||||
resize(newSize);
|
resize(newSize);
|
||||||
|
@ -529,7 +529,7 @@ PlainObjectBase<Derived>::setZero(Index newSize)
|
||||||
* \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()
|
* \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived&
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
|
||||||
PlainObjectBase<Derived>::setZero(Index rows, Index cols)
|
PlainObjectBase<Derived>::setZero(Index rows, Index cols)
|
||||||
{
|
{
|
||||||
resize(rows, cols);
|
resize(rows, cols);
|
||||||
|
@ -553,7 +553,7 @@ PlainObjectBase<Derived>::setZero(Index rows, Index cols)
|
||||||
* \sa Ones(), Ones(Index), isOnes(), class Ones
|
* \sa Ones(), Ones(Index), isOnes(), class Ones
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
||||||
DenseBase<Derived>::Ones(Index rows, Index cols)
|
DenseBase<Derived>::Ones(Index rows, Index cols)
|
||||||
{
|
{
|
||||||
return Constant(rows, cols, Scalar(1));
|
return Constant(rows, cols, Scalar(1));
|
||||||
|
@ -576,7 +576,7 @@ DenseBase<Derived>::Ones(Index rows, Index cols)
|
||||||
* \sa Ones(), Ones(Index,Index), isOnes(), class Ones
|
* \sa Ones(), Ones(Index,Index), isOnes(), class Ones
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
||||||
DenseBase<Derived>::Ones(Index newSize)
|
DenseBase<Derived>::Ones(Index newSize)
|
||||||
{
|
{
|
||||||
return Constant(newSize, Scalar(1));
|
return Constant(newSize, Scalar(1));
|
||||||
|
@ -593,7 +593,7 @@ DenseBase<Derived>::Ones(Index newSize)
|
||||||
* \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones
|
* \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
|
||||||
DenseBase<Derived>::Ones()
|
DenseBase<Derived>::Ones()
|
||||||
{
|
{
|
||||||
return Constant(Scalar(1));
|
return Constant(Scalar(1));
|
||||||
|
@ -608,7 +608,7 @@ DenseBase<Derived>::Ones()
|
||||||
* \sa class CwiseNullaryOp, Ones()
|
* \sa class CwiseNullaryOp, Ones()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
bool DenseBase<Derived>::isOnes
|
EIGEN_DEVICE_FUNC bool DenseBase<Derived>::isOnes
|
||||||
(const RealScalar& prec) const
|
(const RealScalar& prec) const
|
||||||
{
|
{
|
||||||
return isApproxToConstant(Scalar(1), prec);
|
return isApproxToConstant(Scalar(1), prec);
|
||||||
|
@ -622,7 +622,7 @@ bool DenseBase<Derived>::isOnes
|
||||||
* \sa class CwiseNullaryOp, Ones()
|
* \sa class CwiseNullaryOp, Ones()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes()
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes()
|
||||||
{
|
{
|
||||||
return setConstant(Scalar(1));
|
return setConstant(Scalar(1));
|
||||||
}
|
}
|
||||||
|
@ -637,7 +637,7 @@ EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes()
|
||||||
* \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()
|
* \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived&
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
|
||||||
PlainObjectBase<Derived>::setOnes(Index newSize)
|
PlainObjectBase<Derived>::setOnes(Index newSize)
|
||||||
{
|
{
|
||||||
resize(newSize);
|
resize(newSize);
|
||||||
|
@ -655,7 +655,7 @@ PlainObjectBase<Derived>::setOnes(Index newSize)
|
||||||
* \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()
|
* \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived&
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived&
|
||||||
PlainObjectBase<Derived>::setOnes(Index rows, Index cols)
|
PlainObjectBase<Derived>::setOnes(Index rows, Index cols)
|
||||||
{
|
{
|
||||||
resize(rows, cols);
|
resize(rows, cols);
|
||||||
|
@ -679,7 +679,7 @@ PlainObjectBase<Derived>::setOnes(Index rows, Index cols)
|
||||||
* \sa Identity(), setIdentity(), isIdentity()
|
* \sa Identity(), setIdentity(), isIdentity()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
|
||||||
MatrixBase<Derived>::Identity(Index rows, Index cols)
|
MatrixBase<Derived>::Identity(Index rows, Index cols)
|
||||||
{
|
{
|
||||||
return DenseBase<Derived>::NullaryExpr(rows, cols, internal::scalar_identity_op<Scalar>());
|
return DenseBase<Derived>::NullaryExpr(rows, cols, internal::scalar_identity_op<Scalar>());
|
||||||
|
@ -696,7 +696,7 @@ MatrixBase<Derived>::Identity(Index rows, Index cols)
|
||||||
* \sa Identity(Index,Index), setIdentity(), isIdentity()
|
* \sa Identity(Index,Index), setIdentity(), isIdentity()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
|
||||||
MatrixBase<Derived>::Identity()
|
MatrixBase<Derived>::Identity()
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
|
EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
|
||||||
|
@ -771,7 +771,7 @@ struct setIdentity_impl<Derived, true>
|
||||||
* \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
|
* \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()
|
||||||
{
|
{
|
||||||
return internal::setIdentity_impl<Derived>::run(derived());
|
return internal::setIdentity_impl<Derived>::run(derived());
|
||||||
}
|
}
|
||||||
|
@ -787,7 +787,7 @@ EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()
|
||||||
* \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
|
* \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index rows, Index cols)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index rows, Index cols)
|
||||||
{
|
{
|
||||||
derived().resize(rows, cols);
|
derived().resize(rows, cols);
|
||||||
return setIdentity();
|
return setIdentity();
|
||||||
|
@ -800,7 +800,7 @@ EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index rows, Index
|
||||||
* \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
* \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index newSize, Index i)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index newSize, Index i)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
||||||
return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i);
|
return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i);
|
||||||
|
@ -815,7 +815,7 @@ EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBa
|
||||||
* \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
* \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index i)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index i)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
|
||||||
return BasisReturnType(SquareMatrixType::Identity(),i);
|
return BasisReturnType(SquareMatrixType::Identity(),i);
|
||||||
|
@ -828,7 +828,7 @@ EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBa
|
||||||
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX()
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX()
|
||||||
{ return Derived::Unit(0); }
|
{ return Derived::Unit(0); }
|
||||||
|
|
||||||
/** \returns an expression of the Y axis unit vector (0,1{,0}^*)
|
/** \returns an expression of the Y axis unit vector (0,1{,0}^*)
|
||||||
|
@ -838,7 +838,7 @@ EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBa
|
||||||
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY()
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY()
|
||||||
{ return Derived::Unit(1); }
|
{ return Derived::Unit(1); }
|
||||||
|
|
||||||
/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*)
|
/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*)
|
||||||
|
@ -848,7 +848,7 @@ EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBa
|
||||||
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ()
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ()
|
||||||
{ return Derived::Unit(2); }
|
{ return Derived::Unit(2); }
|
||||||
|
|
||||||
/** \returns an expression of the W axis unit vector (0,0,0,1)
|
/** \returns an expression of the W axis unit vector (0,0,0,1)
|
||||||
|
@ -858,7 +858,7 @@ EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBa
|
||||||
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
* \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW()
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW()
|
||||||
{ return Derived::Unit(3); }
|
{ return Derived::Unit(3); }
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CWISE_TERNARY_OP_H
|
#ifndef EIGEN_CWISE_TERNARY_OP_H
|
||||||
#define EIGEN_CWISE_TERNARY_OP_H
|
#define EIGEN_CWISE_TERNARY_OP_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CWISE_UNARY_OP_H
|
#ifndef EIGEN_CWISE_UNARY_OP_H
|
||||||
#define EIGEN_CWISE_UNARY_OP_H
|
#define EIGEN_CWISE_UNARY_OP_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_CWISE_UNARY_VIEW_H
|
#ifndef EIGEN_CWISE_UNARY_VIEW_H
|
||||||
#define EIGEN_CWISE_UNARY_VIEW_H
|
#define EIGEN_CWISE_UNARY_VIEW_H
|
||||||
|
@ -121,6 +121,8 @@ class CwiseUnaryViewImpl<ViewOp,MatrixType,Dense>
|
||||||
{
|
{
|
||||||
return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
|
return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
|
||||||
}
|
}
|
||||||
|
protected:
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(CwiseUnaryViewImpl)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_DENSEBASE_H
|
#ifndef EIGEN_DENSEBASE_H
|
||||||
#define EIGEN_DENSEBASE_H
|
#define EIGEN_DENSEBASE_H
|
||||||
|
@ -40,7 +40,7 @@ static inline void check_DenseIndex_is_signed() {
|
||||||
*/
|
*/
|
||||||
template<typename Derived> class DenseBase
|
template<typename Derived> class DenseBase
|
||||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||||
: public DenseCoeffsBase<Derived>
|
: public DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value>
|
||||||
#else
|
#else
|
||||||
: public DenseCoeffsBase<Derived,DirectWriteAccessors>
|
: public DenseCoeffsBase<Derived,DirectWriteAccessors>
|
||||||
#endif // not EIGEN_PARSED_BY_DOXYGEN
|
#endif // not EIGEN_PARSED_BY_DOXYGEN
|
||||||
|
@ -71,7 +71,7 @@ template<typename Derived> class DenseBase
|
||||||
typedef Scalar value_type;
|
typedef Scalar value_type;
|
||||||
|
|
||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
typedef DenseCoeffsBase<Derived> Base;
|
typedef DenseCoeffsBase<Derived, internal::accessors_level<Derived>::value> Base;
|
||||||
|
|
||||||
using Base::derived;
|
using Base::derived;
|
||||||
using Base::const_cast_derived;
|
using Base::const_cast_derived;
|
||||||
|
@ -296,7 +296,7 @@ template<typename Derived> class DenseBase
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
Derived& operator=(const ReturnByValue<OtherDerived>& func);
|
Derived& operator=(const ReturnByValue<OtherDerived>& func);
|
||||||
|
|
||||||
/** \ínternal
|
/** \internal
|
||||||
* Copies \a other into *this without evaluating other. \returns a reference to *this.
|
* Copies \a other into *this without evaluating other. \returns a reference to *this.
|
||||||
* \deprecated */
|
* \deprecated */
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
|
@ -463,7 +463,17 @@ template<typename Derived> class DenseBase
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
void visit(Visitor& func) const;
|
void visit(Visitor& func) const;
|
||||||
|
|
||||||
inline const WithFormat<Derived> format(const IOFormat& fmt) const;
|
/** \returns a WithFormat proxy object allowing to print a matrix the with given
|
||||||
|
* format \a fmt.
|
||||||
|
*
|
||||||
|
* See class IOFormat for some examples.
|
||||||
|
*
|
||||||
|
* \sa class IOFormat, class WithFormat
|
||||||
|
*/
|
||||||
|
inline const WithFormat<Derived> format(const IOFormat& fmt) const
|
||||||
|
{
|
||||||
|
return WithFormat<Derived>(derived(), fmt);
|
||||||
|
}
|
||||||
|
|
||||||
/** \returns the unique coefficient of a 1x1 expression */
|
/** \returns the unique coefficient of a 1x1 expression */
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
|
@ -474,9 +484,9 @@ template<typename Derived> class DenseBase
|
||||||
return derived().coeff(0,0);
|
return derived().coeff(0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool all() const;
|
EIGEN_DEVICE_FUNC bool all() const;
|
||||||
bool any() const;
|
EIGEN_DEVICE_FUNC bool any() const;
|
||||||
Index count() const;
|
EIGEN_DEVICE_FUNC Index count() const;
|
||||||
|
|
||||||
typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
|
typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
|
||||||
typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
|
typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
|
||||||
|
@ -577,11 +587,12 @@ template<typename Derived> class DenseBase
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(DenseBase)
|
||||||
/** Default constructor. Do nothing. */
|
/** Default constructor. Do nothing. */
|
||||||
EIGEN_DEVICE_FUNC DenseBase()
|
EIGEN_DEVICE_FUNC DenseBase()
|
||||||
{
|
{
|
||||||
/* Just checks for self-consistency of the flags.
|
/* Just checks for self-consistency of the flags.
|
||||||
* Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down
|
* Only do it when debugging Eigen, as this borders on paranoia and could slow compilation down
|
||||||
*/
|
*/
|
||||||
#ifdef EIGEN_INTERNAL_DEBUGGING
|
#ifdef EIGEN_INTERNAL_DEBUGGING
|
||||||
EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
|
EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_DENSECOEFFSBASE_H
|
#ifndef EIGEN_DENSECOEFFSBASE_H
|
||||||
#define EIGEN_DENSECOEFFSBASE_H
|
#define EIGEN_DENSECOEFFSBASE_H
|
||||||
|
|
|
@ -7,15 +7,15 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_MATRIXSTORAGE_H
|
#ifndef EIGEN_MATRIXSTORAGE_H
|
||||||
#define EIGEN_MATRIXSTORAGE_H
|
#define EIGEN_MATRIXSTORAGE_H
|
||||||
|
|
||||||
#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
|
#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
|
||||||
#define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN EIGEN_DENSE_STORAGE_CTOR_PLUGIN;
|
#define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X) X; EIGEN_DENSE_STORAGE_CTOR_PLUGIN;
|
||||||
#else
|
#else
|
||||||
#define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
|
#define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(X)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
@ -62,20 +62,20 @@ struct plain_array
|
||||||
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)
|
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)
|
||||||
#elif EIGEN_GNUC_AT_LEAST(4,7)
|
#elif EIGEN_GNUC_AT_LEAST(4,7)
|
||||||
// GCC 4.7 is too aggressive in its optimizations and remove the alignement test based on the fact the array is declared to be aligned.
|
// GCC 4.7 is too aggressive in its optimizations and remove the alignement test based on the fact the array is declared to be aligned.
|
||||||
// See this bug report: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53900
|
// See this bug report: xxxp://gcc.gnu.org/bugzilla/show_bug.cgi?id=53900
|
||||||
// Hiding the origin of the array pointer behind a function argument seems to do the trick even if the function is inlined:
|
// Hiding the origin of the array pointer behind a function argument seems to do the trick even if the function is inlined:
|
||||||
template<typename PtrType>
|
template<typename PtrType>
|
||||||
EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; }
|
EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; }
|
||||||
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
|
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
|
||||||
eigen_assert((internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0 \
|
eigen_assert((internal::UIntPtr(eigen_unaligned_array_assert_workaround_gcc47(array)) & (sizemask)) == 0 \
|
||||||
&& "this assertion is explained here: " \
|
&& "this assertion is explained here: " \
|
||||||
"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
|
"xxxp://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
|
||||||
" **** READ THIS WEB PAGE !!! ****");
|
" **** READ THIS WEB PAGE !!! ****");
|
||||||
#else
|
#else
|
||||||
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
|
#define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
|
||||||
eigen_assert((internal::UIntPtr(array) & (sizemask)) == 0 \
|
eigen_assert((internal::UIntPtr(array) & (sizemask)) == 0 \
|
||||||
&& "this assertion is explained here: " \
|
&& "this assertion is explained here: " \
|
||||||
"http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
|
"xxxp://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
|
||||||
" **** READ THIS WEB PAGE !!! ****");
|
" **** READ THIS WEB PAGE !!! ****");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -184,12 +184,16 @@ template<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseSt
|
||||||
{
|
{
|
||||||
internal::plain_array<T,Size,_Options> m_data;
|
internal::plain_array<T,Size,_Options> m_data;
|
||||||
public:
|
public:
|
||||||
EIGEN_DEVICE_FUNC DenseStorage() {}
|
EIGEN_DEVICE_FUNC DenseStorage() {
|
||||||
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size)
|
||||||
|
}
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
explicit DenseStorage(internal::constructor_without_unaligned_array_assert)
|
explicit DenseStorage(internal::constructor_without_unaligned_array_assert)
|
||||||
: m_data(internal::constructor_without_unaligned_array_assert()) {}
|
: m_data(internal::constructor_without_unaligned_array_assert()) {}
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
DenseStorage(const DenseStorage& other) : m_data(other.m_data) {}
|
DenseStorage(const DenseStorage& other) : m_data(other.m_data) {
|
||||||
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = Size)
|
||||||
|
}
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
DenseStorage& operator=(const DenseStorage& other)
|
DenseStorage& operator=(const DenseStorage& other)
|
||||||
{
|
{
|
||||||
|
@ -197,7 +201,7 @@ template<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseSt
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) {
|
EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) {
|
||||||
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
|
||||||
eigen_internal_assert(size==rows*cols && rows==_Rows && cols==_Cols);
|
eigen_internal_assert(size==rows*cols && rows==_Rows && cols==_Cols);
|
||||||
EIGEN_UNUSED_VARIABLE(size);
|
EIGEN_UNUSED_VARIABLE(size);
|
||||||
EIGEN_UNUSED_VARIABLE(rows);
|
EIGEN_UNUSED_VARIABLE(rows);
|
||||||
|
@ -343,7 +347,7 @@ template<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynam
|
||||||
EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols)
|
EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols)
|
||||||
: m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(rows), m_cols(cols)
|
: m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(rows), m_cols(cols)
|
||||||
{
|
{
|
||||||
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
|
||||||
eigen_internal_assert(size==rows*cols && rows>=0 && cols >=0);
|
eigen_internal_assert(size==rows*cols && rows>=0 && cols >=0);
|
||||||
}
|
}
|
||||||
EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other)
|
EIGEN_DEVICE_FUNC DenseStorage(const DenseStorage& other)
|
||||||
|
@ -351,6 +355,7 @@ template<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynam
|
||||||
, m_rows(other.m_rows)
|
, m_rows(other.m_rows)
|
||||||
, m_cols(other.m_cols)
|
, m_cols(other.m_cols)
|
||||||
{
|
{
|
||||||
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows*m_cols)
|
||||||
internal::smart_copy(other.m_data, other.m_data+other.m_rows*other.m_cols, m_data);
|
internal::smart_copy(other.m_data, other.m_data+other.m_rows*other.m_cols, m_data);
|
||||||
}
|
}
|
||||||
EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
|
EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
|
||||||
|
@ -399,11 +404,11 @@ template<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynam
|
||||||
if(size != m_rows*m_cols)
|
if(size != m_rows*m_cols)
|
||||||
{
|
{
|
||||||
internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols);
|
internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols);
|
||||||
if (size)
|
if (size>0) // >0 and not simply !=0 to let the compiler knows that size cannot be negative
|
||||||
m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
|
m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
|
||||||
else
|
else
|
||||||
m_data = 0;
|
m_data = 0;
|
||||||
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
|
||||||
}
|
}
|
||||||
m_rows = rows;
|
m_rows = rows;
|
||||||
m_cols = cols;
|
m_cols = cols;
|
||||||
|
@ -422,7 +427,7 @@ template<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Ro
|
||||||
explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {}
|
explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {}
|
||||||
EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_cols(cols)
|
EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_cols(cols)
|
||||||
{
|
{
|
||||||
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
|
||||||
eigen_internal_assert(size==rows*cols && rows==_Rows && cols >=0);
|
eigen_internal_assert(size==rows*cols && rows==_Rows && cols >=0);
|
||||||
EIGEN_UNUSED_VARIABLE(rows);
|
EIGEN_UNUSED_VARIABLE(rows);
|
||||||
}
|
}
|
||||||
|
@ -430,6 +435,7 @@ template<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Ro
|
||||||
: m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(_Rows*other.m_cols))
|
: m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(_Rows*other.m_cols))
|
||||||
, m_cols(other.m_cols)
|
, m_cols(other.m_cols)
|
||||||
{
|
{
|
||||||
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_cols*_Rows)
|
||||||
internal::smart_copy(other.m_data, other.m_data+_Rows*m_cols, m_data);
|
internal::smart_copy(other.m_data, other.m_data+_Rows*m_cols, m_data);
|
||||||
}
|
}
|
||||||
EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
|
EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
|
||||||
|
@ -473,11 +479,11 @@ template<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Ro
|
||||||
if(size != _Rows*m_cols)
|
if(size != _Rows*m_cols)
|
||||||
{
|
{
|
||||||
internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols);
|
internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols);
|
||||||
if (size)
|
if (size>0) // >0 and not simply !=0 to let the compiler knows that size cannot be negative
|
||||||
m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
|
m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
|
||||||
else
|
else
|
||||||
m_data = 0;
|
m_data = 0;
|
||||||
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
|
||||||
}
|
}
|
||||||
m_cols = cols;
|
m_cols = cols;
|
||||||
}
|
}
|
||||||
|
@ -495,7 +501,7 @@ template<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dyn
|
||||||
explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {}
|
explicit DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {}
|
||||||
EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(rows)
|
EIGEN_DEVICE_FUNC DenseStorage(Index size, Index rows, Index cols) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(rows)
|
||||||
{
|
{
|
||||||
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
|
||||||
eigen_internal_assert(size==rows*cols && rows>=0 && cols == _Cols);
|
eigen_internal_assert(size==rows*cols && rows>=0 && cols == _Cols);
|
||||||
EIGEN_UNUSED_VARIABLE(cols);
|
EIGEN_UNUSED_VARIABLE(cols);
|
||||||
}
|
}
|
||||||
|
@ -503,6 +509,7 @@ template<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dyn
|
||||||
: m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(other.m_rows*_Cols))
|
: m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(other.m_rows*_Cols))
|
||||||
, m_rows(other.m_rows)
|
, m_rows(other.m_rows)
|
||||||
{
|
{
|
||||||
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN(Index size = m_rows*_Cols)
|
||||||
internal::smart_copy(other.m_data, other.m_data+other.m_rows*_Cols, m_data);
|
internal::smart_copy(other.m_data, other.m_data+other.m_rows*_Cols, m_data);
|
||||||
}
|
}
|
||||||
EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
|
EIGEN_DEVICE_FUNC DenseStorage& operator=(const DenseStorage& other)
|
||||||
|
@ -546,11 +553,11 @@ template<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dyn
|
||||||
if(size != m_rows*_Cols)
|
if(size != m_rows*_Cols)
|
||||||
{
|
{
|
||||||
internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows);
|
internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows);
|
||||||
if (size)
|
if (size>0) // >0 and not simply !=0 to let the compiler knows that size cannot be negative
|
||||||
m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
|
m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
|
||||||
else
|
else
|
||||||
m_data = 0;
|
m_data = 0;
|
||||||
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
|
EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
|
||||||
}
|
}
|
||||||
m_rows = rows;
|
m_rows = rows;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_DIAGONAL_H
|
#ifndef EIGEN_DIAGONAL_H
|
||||||
#define EIGEN_DIAGONAL_H
|
#define EIGEN_DIAGONAL_H
|
||||||
|
@ -21,7 +21,7 @@ namespace Eigen {
|
||||||
* \param MatrixType the type of the object in which we are taking a sub/main/super diagonal
|
* \param MatrixType the type of the object in which we are taking a sub/main/super diagonal
|
||||||
* \param DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal.
|
* \param DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal.
|
||||||
* A positive value means a superdiagonal, a negative value means a subdiagonal.
|
* A positive value means a superdiagonal, a negative value means a subdiagonal.
|
||||||
* You can also use Dynamic so the index can be set at runtime.
|
* You can also use DynamicIndex so the index can be set at runtime.
|
||||||
*
|
*
|
||||||
* The matrix is not required to be square.
|
* The matrix is not required to be square.
|
||||||
*
|
*
|
||||||
|
@ -70,7 +70,10 @@ template<typename MatrixType, int _DiagIndex> class Diagonal
|
||||||
EIGEN_DENSE_PUBLIC_INTERFACE(Diagonal)
|
EIGEN_DENSE_PUBLIC_INTERFACE(Diagonal)
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
explicit inline Diagonal(MatrixType& matrix, Index a_index = DiagIndex) : m_matrix(matrix), m_index(a_index) {}
|
explicit inline Diagonal(MatrixType& matrix, Index a_index = DiagIndex) : m_matrix(matrix), m_index(a_index)
|
||||||
|
{
|
||||||
|
eigen_assert( a_index <= m_matrix.cols() && -a_index <= m_matrix.rows() );
|
||||||
|
}
|
||||||
|
|
||||||
EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Diagonal)
|
EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Diagonal)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_DIAGONALMATRIX_H
|
#ifndef EIGEN_DIAGONALMATRIX_H
|
||||||
#define EIGEN_DIAGONALMATRIX_H
|
#define EIGEN_DIAGONALMATRIX_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_DIAGONALPRODUCT_H
|
#ifndef EIGEN_DIAGONALPRODUCT_H
|
||||||
#define EIGEN_DIAGONALPRODUCT_H
|
#define EIGEN_DIAGONALPRODUCT_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_DOT_H
|
#ifndef EIGEN_DOT_H
|
||||||
#define EIGEN_DOT_H
|
#define EIGEN_DOT_H
|
||||||
|
@ -31,7 +31,8 @@ struct dot_nocheck
|
||||||
typedef scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> conj_prod;
|
typedef scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> conj_prod;
|
||||||
typedef typename conj_prod::result_type ResScalar;
|
typedef typename conj_prod::result_type ResScalar;
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
|
EIGEN_STRONG_INLINE
|
||||||
|
static ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
|
||||||
{
|
{
|
||||||
return a.template binaryExpr<conj_prod>(b).sum();
|
return a.template binaryExpr<conj_prod>(b).sum();
|
||||||
}
|
}
|
||||||
|
@ -43,7 +44,8 @@ struct dot_nocheck<T, U, true>
|
||||||
typedef scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> conj_prod;
|
typedef scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> conj_prod;
|
||||||
typedef typename conj_prod::result_type ResScalar;
|
typedef typename conj_prod::result_type ResScalar;
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
|
EIGEN_STRONG_INLINE
|
||||||
|
static ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
|
||||||
{
|
{
|
||||||
return a.transpose().template binaryExpr<conj_prod>(b).sum();
|
return a.transpose().template binaryExpr<conj_prod>(b).sum();
|
||||||
}
|
}
|
||||||
|
@ -65,6 +67,7 @@ struct dot_nocheck<T, U, true>
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE
|
||||||
typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
|
typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
|
||||||
MatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
|
MatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
|
||||||
{
|
{
|
||||||
|
@ -102,7 +105,7 @@ EIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scala
|
||||||
* \sa lpNorm(), dot(), squaredNorm()
|
* \sa lpNorm(), dot(), squaredNorm()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::norm() const
|
EIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::norm() const
|
||||||
{
|
{
|
||||||
return numext::sqrt(squaredNorm());
|
return numext::sqrt(squaredNorm());
|
||||||
}
|
}
|
||||||
|
@ -117,7 +120,7 @@ inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real Matr
|
||||||
* \sa norm(), normalize()
|
* \sa norm(), normalize()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline const typename MatrixBase<Derived>::PlainObject
|
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::PlainObject
|
||||||
MatrixBase<Derived>::normalized() const
|
MatrixBase<Derived>::normalized() const
|
||||||
{
|
{
|
||||||
typedef typename internal::nested_eval<Derived,2>::type _Nested;
|
typedef typename internal::nested_eval<Derived,2>::type _Nested;
|
||||||
|
@ -139,7 +142,7 @@ MatrixBase<Derived>::normalized() const
|
||||||
* \sa norm(), normalized()
|
* \sa norm(), normalized()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline void MatrixBase<Derived>::normalize()
|
EIGEN_STRONG_INLINE void MatrixBase<Derived>::normalize()
|
||||||
{
|
{
|
||||||
RealScalar z = squaredNorm();
|
RealScalar z = squaredNorm();
|
||||||
// NOTE: after extensive benchmarking, this conditional does not impact performance, at least on recent x86 CPU
|
// NOTE: after extensive benchmarking, this conditional does not impact performance, at least on recent x86 CPU
|
||||||
|
@ -160,7 +163,7 @@ inline void MatrixBase<Derived>::normalize()
|
||||||
* \sa stableNorm(), stableNormalize(), normalized()
|
* \sa stableNorm(), stableNormalize(), normalized()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline const typename MatrixBase<Derived>::PlainObject
|
EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::PlainObject
|
||||||
MatrixBase<Derived>::stableNormalized() const
|
MatrixBase<Derived>::stableNormalized() const
|
||||||
{
|
{
|
||||||
typedef typename internal::nested_eval<Derived,3>::type _Nested;
|
typedef typename internal::nested_eval<Derived,3>::type _Nested;
|
||||||
|
@ -185,7 +188,7 @@ MatrixBase<Derived>::stableNormalized() const
|
||||||
* \sa stableNorm(), stableNormalized(), normalize()
|
* \sa stableNorm(), stableNormalized(), normalize()
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline void MatrixBase<Derived>::stableNormalize()
|
EIGEN_STRONG_INLINE void MatrixBase<Derived>::stableNormalize()
|
||||||
{
|
{
|
||||||
RealScalar w = cwiseAbs().maxCoeff();
|
RealScalar w = cwiseAbs().maxCoeff();
|
||||||
RealScalar z = (derived()/w).squaredNorm();
|
RealScalar z = (derived()/w).squaredNorm();
|
||||||
|
@ -250,7 +253,7 @@ struct lpNorm_selector<Derived, Infinity>
|
||||||
*
|
*
|
||||||
* In all cases, if \c *this is empty, then the value 0 is returned.
|
* In all cases, if \c *this is empty, then the value 0 is returned.
|
||||||
*
|
*
|
||||||
* \note For matrices, this function does not compute the <a href="https://en.wikipedia.org/wiki/Operator_norm">operator-norm</a>. That is, if \c *this is a matrix, then its coefficients are interpreted as a 1D vector. Nonetheless, you can easily compute the 1-norm and \f$\infty\f$-norm matrix operator norms using \link TutorialReductionsVisitorsBroadcastingReductionsNorm partial reductions \endlink.
|
* \note For matrices, this function does not compute the <a href="xxxps://en.wikipedia.org/wiki/Operator_norm">operator-norm</a>. That is, if \c *this is a matrix, then its coefficients are interpreted as a 1D vector. Nonetheless, you can easily compute the 1-norm and \f$\infty\f$-norm matrix operator norms using \link TutorialReductionsVisitorsBroadcastingReductionsNorm partial reductions \endlink.
|
||||||
*
|
*
|
||||||
* \sa norm()
|
* \sa norm()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_EIGENBASE_H
|
#ifndef EIGEN_EIGENBASE_H
|
||||||
#define EIGEN_EIGENBASE_H
|
#define EIGEN_EIGENBASE_H
|
||||||
|
@ -14,6 +14,7 @@
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
/** \class EigenBase
|
/** \class EigenBase
|
||||||
|
* \ingroup Core_Module
|
||||||
*
|
*
|
||||||
* Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T).
|
* Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T).
|
||||||
*
|
*
|
||||||
|
@ -128,6 +129,7 @@ template<typename Derived> struct EigenBase
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
Derived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived> &other)
|
Derived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived> &other)
|
||||||
{
|
{
|
||||||
call_assignment(derived(), other.derived());
|
call_assignment(derived(), other.derived());
|
||||||
|
@ -136,6 +138,7 @@ Derived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived> &other)
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
Derived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)
|
Derived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)
|
||||||
{
|
{
|
||||||
call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
|
call_assignment(derived(), other.derived(), internal::add_assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
|
@ -144,6 +147,7 @@ Derived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
Derived& DenseBase<Derived>::operator-=(const EigenBase<OtherDerived> &other)
|
Derived& DenseBase<Derived>::operator-=(const EigenBase<OtherDerived> &other)
|
||||||
{
|
{
|
||||||
call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
|
call_assignment(derived(), other.derived(), internal::sub_assign_op<Scalar,typename OtherDerived::Scalar>());
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_FORCEALIGNEDACCESS_H
|
#ifndef EIGEN_FORCEALIGNEDACCESS_H
|
||||||
#define EIGEN_FORCEALIGNEDACCESS_H
|
#define EIGEN_FORCEALIGNEDACCESS_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_FUZZY_H
|
#ifndef EIGEN_FUZZY_H
|
||||||
#define EIGEN_FUZZY_H
|
#define EIGEN_FUZZY_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_GENERAL_PRODUCT_H
|
#ifndef EIGEN_GENERAL_PRODUCT_H
|
||||||
#define EIGEN_GENERAL_PRODUCT_H
|
#define EIGEN_GENERAL_PRODUCT_H
|
||||||
|
@ -24,9 +24,14 @@ template<int Rows, int Cols, int Depth> struct product_type_selector;
|
||||||
|
|
||||||
template<int Size, int MaxSize> struct product_size_category
|
template<int Size, int MaxSize> struct product_size_category
|
||||||
{
|
{
|
||||||
enum { is_large = MaxSize == Dynamic ||
|
enum {
|
||||||
|
#ifndef EIGEN_CUDA_ARCH
|
||||||
|
is_large = MaxSize == Dynamic ||
|
||||||
Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD ||
|
Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD ||
|
||||||
(Size==Dynamic && MaxSize>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD),
|
(Size==Dynamic && MaxSize>=EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD),
|
||||||
|
#else
|
||||||
|
is_large = 0,
|
||||||
|
#endif
|
||||||
value = is_large ? Large
|
value = is_large ? Large
|
||||||
: Size == 1 ? 1
|
: Size == 1 ? 1
|
||||||
: Small
|
: Small
|
||||||
|
@ -379,8 +384,6 @@ template<> struct gemv_dense_selector<OnTheRight,RowMajor,false>
|
||||||
*
|
*
|
||||||
* \sa lazyProduct(), operator*=(const MatrixBase&), Cwise::operator*()
|
* \sa lazyProduct(), operator*=(const MatrixBase&), Cwise::operator*()
|
||||||
*/
|
*/
|
||||||
#ifndef __CUDACC__
|
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
inline const Product<Derived, OtherDerived>
|
inline const Product<Derived, OtherDerived>
|
||||||
|
@ -412,8 +415,6 @@ MatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const
|
||||||
return Product<Derived, OtherDerived>(derived(), other.derived());
|
return Product<Derived, OtherDerived>(derived(), other.derived());
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __CUDACC__
|
|
||||||
|
|
||||||
/** \returns an expression of the matrix product of \c *this and \a other without implicit evaluation.
|
/** \returns an expression of the matrix product of \c *this and \a other without implicit evaluation.
|
||||||
*
|
*
|
||||||
* The returned product will behave like any other expressions: the coefficients of the product will be
|
* The returned product will behave like any other expressions: the coefficients of the product will be
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_GENERIC_PACKET_MATH_H
|
#ifndef EIGEN_GENERIC_PACKET_MATH_H
|
||||||
#define EIGEN_GENERIC_PACKET_MATH_H
|
#define EIGEN_GENERIC_PACKET_MATH_H
|
||||||
|
@ -230,7 +230,7 @@ pload1(const typename unpacket_traits<Packet>::type *a) { return pset1<Packet>(
|
||||||
* duplicated to form: {from[0],from[0],from[1],from[1],from[2],from[2],from[3],from[3]}
|
* duplicated to form: {from[0],from[0],from[1],from[1],from[2],from[2],from[3],from[3]}
|
||||||
* Currently, this function is only used for scalar * complex products.
|
* Currently, this function is only used for scalar * complex products.
|
||||||
*/
|
*/
|
||||||
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet
|
template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet
|
||||||
ploaddup(const typename unpacket_traits<Packet>::type* from) { return *from; }
|
ploaddup(const typename unpacket_traits<Packet>::type* from) { return *from; }
|
||||||
|
|
||||||
/** \internal \returns a packet with elements of \a *from quadrupled.
|
/** \internal \returns a packet with elements of \a *from quadrupled.
|
||||||
|
@ -278,7 +278,7 @@ inline void pbroadcast2(const typename unpacket_traits<Packet>::type *a,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \internal \brief Returns a packet with coefficients (a,a+1,...,a+packet_size-1). */
|
/** \internal \brief Returns a packet with coefficients (a,a+1,...,a+packet_size-1). */
|
||||||
template<typename Packet> inline Packet
|
template<typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet
|
||||||
plset(const typename unpacket_traits<Packet>::type& a) { return a; }
|
plset(const typename unpacket_traits<Packet>::type& a) { return a; }
|
||||||
|
|
||||||
/** \internal copy the packet \a from to \a *to, \a to must be 16 bytes aligned */
|
/** \internal copy the packet \a from to \a *to, \a to must be 16 bytes aligned */
|
||||||
|
@ -351,10 +351,7 @@ template<typename Packet> EIGEN_DEVICE_FUNC inline Packet preverse(const Packet&
|
||||||
/** \internal \returns \a a with real and imaginary part flipped (for complex type only) */
|
/** \internal \returns \a a with real and imaginary part flipped (for complex type only) */
|
||||||
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet pcplxflip(const Packet& a)
|
template<typename Packet> EIGEN_DEVICE_FUNC inline Packet pcplxflip(const Packet& a)
|
||||||
{
|
{
|
||||||
// FIXME: uncomment the following in case we drop the internal imag and real functions.
|
return Packet(a.imag(),a.real());
|
||||||
// using std::imag;
|
|
||||||
// using std::real;
|
|
||||||
return Packet(imag(a),real(a));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************
|
/**************************
|
||||||
|
@ -482,7 +479,7 @@ EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void pstoret(Scalar* to, const Packet& fro
|
||||||
* by the current computation.
|
* by the current computation.
|
||||||
*/
|
*/
|
||||||
template<typename Packet, int LoadMode>
|
template<typename Packet, int LoadMode>
|
||||||
inline Packet ploadt_ro(const typename unpacket_traits<Packet>::type* from)
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_ro(const typename unpacket_traits<Packet>::type* from)
|
||||||
{
|
{
|
||||||
return ploadt<Packet, LoadMode>(from);
|
return ploadt<Packet, LoadMode>(from);
|
||||||
}
|
}
|
||||||
|
@ -524,10 +521,10 @@ inline void palign(PacketType& first, const PacketType& second)
|
||||||
#ifndef __CUDACC__
|
#ifndef __CUDACC__
|
||||||
|
|
||||||
template<> inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b)
|
template<> inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b)
|
||||||
{ return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
|
{ return std::complex<float>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); }
|
||||||
|
|
||||||
template<> inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b)
|
template<> inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b)
|
||||||
{ return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
|
{ return std::complex<double>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_GLOBAL_FUNCTIONS_H
|
#ifndef EIGEN_GLOBAL_FUNCTIONS_H
|
||||||
#define EIGEN_GLOBAL_FUNCTIONS_H
|
#define EIGEN_GLOBAL_FUNCTIONS_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_IO_H
|
#ifndef EIGEN_IO_H
|
||||||
#define EIGEN_IO_H
|
#define EIGEN_IO_H
|
||||||
|
@ -109,20 +109,6 @@ class WithFormat
|
||||||
IOFormat m_format;
|
IOFormat m_format;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** \returns a WithFormat proxy object allowing to print a matrix the with given
|
|
||||||
* format \a fmt.
|
|
||||||
*
|
|
||||||
* See class IOFormat for some examples.
|
|
||||||
*
|
|
||||||
* \sa class IOFormat, class WithFormat
|
|
||||||
*/
|
|
||||||
template<typename Derived>
|
|
||||||
inline const WithFormat<Derived>
|
|
||||||
DenseBase<Derived>::format(const IOFormat& fmt) const
|
|
||||||
{
|
|
||||||
return WithFormat<Derived>(derived(), fmt);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
// NOTE: This helper is kept for backward compatibility with previous code specializing
|
// NOTE: This helper is kept for backward compatibility with previous code specializing
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_INVERSE_H
|
#ifndef EIGEN_INVERSE_H
|
||||||
#define EIGEN_INVERSE_H
|
#define EIGEN_INVERSE_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_MAP_H
|
#ifndef EIGEN_MAP_H
|
||||||
#define EIGEN_MAP_H
|
#define EIGEN_MAP_H
|
||||||
|
@ -20,11 +20,17 @@ struct traits<Map<PlainObjectType, MapOptions, StrideType> >
|
||||||
{
|
{
|
||||||
typedef traits<PlainObjectType> TraitsBase;
|
typedef traits<PlainObjectType> TraitsBase;
|
||||||
enum {
|
enum {
|
||||||
|
PlainObjectTypeInnerSize = ((traits<PlainObjectType>::Flags&RowMajorBit)==RowMajorBit)
|
||||||
|
? PlainObjectType::ColsAtCompileTime
|
||||||
|
: PlainObjectType::RowsAtCompileTime,
|
||||||
|
|
||||||
InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0
|
InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0
|
||||||
? int(PlainObjectType::InnerStrideAtCompileTime)
|
? int(PlainObjectType::InnerStrideAtCompileTime)
|
||||||
: int(StrideType::InnerStrideAtCompileTime),
|
: int(StrideType::InnerStrideAtCompileTime),
|
||||||
OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0
|
OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0
|
||||||
? int(PlainObjectType::OuterStrideAtCompileTime)
|
? (InnerStrideAtCompileTime==Dynamic || PlainObjectTypeInnerSize==Dynamic
|
||||||
|
? Dynamic
|
||||||
|
: int(InnerStrideAtCompileTime) * int(PlainObjectTypeInnerSize))
|
||||||
: int(StrideType::OuterStrideAtCompileTime),
|
: int(StrideType::OuterStrideAtCompileTime),
|
||||||
Alignment = int(MapOptions)&int(AlignedMask),
|
Alignment = int(MapOptions)&int(AlignedMask),
|
||||||
Flags0 = TraitsBase::Flags & (~NestByRefBit),
|
Flags0 = TraitsBase::Flags & (~NestByRefBit),
|
||||||
|
@ -107,10 +113,11 @@ template<typename PlainObjectType, int MapOptions, typename StrideType> class Ma
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
inline Index outerStride() const
|
inline Index outerStride() const
|
||||||
{
|
{
|
||||||
return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()
|
return int(StrideType::OuterStrideAtCompileTime) != 0 ? m_stride.outer()
|
||||||
: IsVectorAtCompileTime ? this->size()
|
: int(internal::traits<Map>::OuterStrideAtCompileTime) != Dynamic ? Index(internal::traits<Map>::OuterStrideAtCompileTime)
|
||||||
: int(Flags)&RowMajorBit ? this->cols()
|
: IsVectorAtCompileTime ? (this->size() * innerStride())
|
||||||
: this->rows();
|
: (int(Flags)&RowMajorBit) ? (this->cols() * innerStride())
|
||||||
|
: (this->rows() * innerStride());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Constructor in the fixed-size case.
|
/** Constructor in the fixed-size case.
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_MAPBASE_H
|
#ifndef EIGEN_MAPBASE_H
|
||||||
#define EIGEN_MAPBASE_H
|
#define EIGEN_MAPBASE_H
|
||||||
|
@ -43,6 +43,7 @@ template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
|
||||||
enum {
|
enum {
|
||||||
RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
|
RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
|
||||||
ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
|
ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
|
||||||
|
InnerStrideAtCompileTime = internal::traits<Derived>::InnerStrideAtCompileTime,
|
||||||
SizeAtCompileTime = Base::SizeAtCompileTime
|
SizeAtCompileTime = Base::SizeAtCompileTime
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -181,14 +182,19 @@ template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
void checkSanity(typename internal::enable_if<(internal::traits<T>::Alignment>0),void*>::type = 0) const
|
void checkSanity(typename internal::enable_if<(internal::traits<T>::Alignment>0),void*>::type = 0) const
|
||||||
{
|
{
|
||||||
#if EIGEN_MAX_ALIGN_BYTES>0
|
#if EIGEN_MAX_ALIGN_BYTES>0
|
||||||
|
// innerStride() is not set yet when this function is called, so we optimistically assume the lowest plausible value:
|
||||||
|
const Index minInnerStride = InnerStrideAtCompileTime == Dynamic ? 1 : Index(InnerStrideAtCompileTime);
|
||||||
|
EIGEN_ONLY_USED_FOR_DEBUG(minInnerStride);
|
||||||
eigen_assert(( ((internal::UIntPtr(m_data) % internal::traits<Derived>::Alignment) == 0)
|
eigen_assert(( ((internal::UIntPtr(m_data) % internal::traits<Derived>::Alignment) == 0)
|
||||||
|| (cols() * rows() * innerStride() * sizeof(Scalar)) < internal::traits<Derived>::Alignment ) && "data is not aligned");
|
|| (cols() * rows() * minInnerStride * sizeof(Scalar)) < internal::traits<Derived>::Alignment ) && "data is not aligned");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -290,6 +296,9 @@ template<typename Derived> class MapBase<Derived, WriteAccessors>
|
||||||
// In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base,
|
// In theory we could simply refer to Base:Base::operator=, but MSVC does not like Base::Base,
|
||||||
// see bugs 821 and 920.
|
// see bugs 821 and 920.
|
||||||
using ReadOnlyMapBase::Base::operator=;
|
using ReadOnlyMapBase::Base::operator=;
|
||||||
|
protected:
|
||||||
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS
|
#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS
|
||||||
|
|
|
@ -5,12 +5,12 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_MATHFUNCTIONS_H
|
#ifndef EIGEN_MATHFUNCTIONS_H
|
||||||
#define EIGEN_MATHFUNCTIONS_H
|
#define EIGEN_MATHFUNCTIONS_H
|
||||||
|
|
||||||
// source: http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html
|
// source: xxxp://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html
|
||||||
// TODO this should better be moved to NumTraits
|
// TODO this should better be moved to NumTraits
|
||||||
#define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L
|
#define EIGEN_PI 3.141592653589793238462643383279502884197169399375105820974944592307816406L
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ struct abs2_impl_default<Scalar, true> // IsComplex
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static inline RealScalar run(const Scalar& x)
|
static inline RealScalar run(const Scalar& x)
|
||||||
{
|
{
|
||||||
return real(x)*real(x) + imag(x)*imag(x);
|
return x.real()*x.real() + x.imag()*x.imag();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -313,14 +313,17 @@ struct abs2_retval
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
template<typename Scalar, bool IsComplex>
|
template<typename Scalar, bool IsComplex>
|
||||||
struct norm1_default_impl
|
struct norm1_default_impl;
|
||||||
|
|
||||||
|
template<typename Scalar>
|
||||||
|
struct norm1_default_impl<Scalar,true>
|
||||||
{
|
{
|
||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static inline RealScalar run(const Scalar& x)
|
static inline RealScalar run(const Scalar& x)
|
||||||
{
|
{
|
||||||
EIGEN_USING_STD_MATH(abs);
|
EIGEN_USING_STD_MATH(abs);
|
||||||
return abs(real(x)) + abs(imag(x));
|
return abs(x.real()) + abs(x.imag());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -348,31 +351,7 @@ struct norm1_retval
|
||||||
* Implementation of hypot *
|
* Implementation of hypot *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
template<typename Scalar>
|
template<typename Scalar> struct hypot_impl;
|
||||||
struct hypot_impl
|
|
||||||
{
|
|
||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
|
||||||
static inline RealScalar run(const Scalar& x, const Scalar& y)
|
|
||||||
{
|
|
||||||
EIGEN_USING_STD_MATH(abs);
|
|
||||||
EIGEN_USING_STD_MATH(sqrt);
|
|
||||||
RealScalar _x = abs(x);
|
|
||||||
RealScalar _y = abs(y);
|
|
||||||
Scalar p, qp;
|
|
||||||
if(_x>_y)
|
|
||||||
{
|
|
||||||
p = _x;
|
|
||||||
qp = _y / p;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
p = _y;
|
|
||||||
qp = _x / p;
|
|
||||||
}
|
|
||||||
if(p==RealScalar(0)) return RealScalar(0);
|
|
||||||
return p * sqrt(RealScalar(1) + qp*qp);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename Scalar>
|
template<typename Scalar>
|
||||||
struct hypot_retval
|
struct hypot_retval
|
||||||
|
@ -495,7 +474,7 @@ namespace std_fallback {
|
||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
EIGEN_USING_STD_MATH(log);
|
EIGEN_USING_STD_MATH(log);
|
||||||
Scalar x1p = RealScalar(1) + x;
|
Scalar x1p = RealScalar(1) + x;
|
||||||
return ( x1p == Scalar(1) ) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
|
return numext::equal_strict(x1p, Scalar(1)) ? x : x * ( log(x1p) / (x1p - RealScalar(1)) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -641,20 +620,27 @@ struct random_default_impl<Scalar, false, true>
|
||||||
{
|
{
|
||||||
static inline Scalar run(const Scalar& x, const Scalar& y)
|
static inline Scalar run(const Scalar& x, const Scalar& y)
|
||||||
{
|
{
|
||||||
typedef typename conditional<NumTraits<Scalar>::IsSigned,std::ptrdiff_t,std::size_t>::type ScalarX;
|
if (y <= x)
|
||||||
if(y<x)
|
|
||||||
return x;
|
return x;
|
||||||
// the following difference might overflow on a 32 bits system,
|
// ScalarU is the unsigned counterpart of Scalar, possibly Scalar itself.
|
||||||
// but since y>=x the result converted to an unsigned long is still correct.
|
typedef typename make_unsigned<Scalar>::type ScalarU;
|
||||||
std::size_t range = ScalarX(y)-ScalarX(x);
|
// ScalarX is the widest of ScalarU and unsigned int.
|
||||||
std::size_t offset = 0;
|
// We'll deal only with ScalarX and unsigned int below thus avoiding signed
|
||||||
// rejection sampling
|
// types and arithmetic and signed overflows (which are undefined behavior).
|
||||||
std::size_t divisor = 1;
|
typedef typename conditional<(ScalarU(-1) > unsigned(-1)), ScalarU, unsigned>::type ScalarX;
|
||||||
std::size_t multiplier = 1;
|
// The following difference doesn't overflow, provided our integer types are two's
|
||||||
if(range<RAND_MAX) divisor = (std::size_t(RAND_MAX)+1)/(range+1);
|
// complement and have the same number of padding bits in signed and unsigned variants.
|
||||||
else multiplier = 1 + range/(std::size_t(RAND_MAX)+1);
|
// This is the case in most modern implementations of C++.
|
||||||
|
ScalarX range = ScalarX(y) - ScalarX(x);
|
||||||
|
ScalarX offset = 0;
|
||||||
|
ScalarX divisor = 1;
|
||||||
|
ScalarX multiplier = 1;
|
||||||
|
const unsigned rand_max = RAND_MAX;
|
||||||
|
if (range <= rand_max) divisor = (rand_max + 1) / (range + 1);
|
||||||
|
else multiplier = 1 + range / (rand_max + 1);
|
||||||
|
// Rejection sampling.
|
||||||
do {
|
do {
|
||||||
offset = (std::size_t(std::rand()) * multiplier) / divisor;
|
offset = (unsigned(std::rand()) * multiplier) / divisor;
|
||||||
} while (offset > range);
|
} while (offset > range);
|
||||||
return Scalar(ScalarX(x) + offset);
|
return Scalar(ScalarX(x) + offset);
|
||||||
}
|
}
|
||||||
|
@ -679,8 +665,8 @@ struct random_default_impl<Scalar, true, false>
|
||||||
{
|
{
|
||||||
static inline Scalar run(const Scalar& x, const Scalar& y)
|
static inline Scalar run(const Scalar& x, const Scalar& y)
|
||||||
{
|
{
|
||||||
return Scalar(random(real(x), real(y)),
|
return Scalar(random(x.real(), y.real()),
|
||||||
random(imag(x), imag(y)));
|
random(x.imag(), y.imag()));
|
||||||
}
|
}
|
||||||
static inline Scalar run()
|
static inline Scalar run()
|
||||||
{
|
{
|
||||||
|
@ -933,6 +919,9 @@ inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x)
|
||||||
return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
|
return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
inline bool abs2(bool x) { return x; }
|
||||||
|
|
||||||
template<typename Scalar>
|
template<typename Scalar>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x)
|
inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x)
|
||||||
|
@ -1030,7 +1019,8 @@ inline int log2(int x)
|
||||||
|
|
||||||
/** \returns the square root of \a x.
|
/** \returns the square root of \a x.
|
||||||
*
|
*
|
||||||
* It is essentially equivalent to \code using std::sqrt; return sqrt(x); \endcode,
|
* It is essentially equivalent to
|
||||||
|
* \code using std::sqrt; return sqrt(x); \endcode
|
||||||
* but slightly faster for float/double and some compilers (e.g., gcc), thanks to
|
* but slightly faster for float/double and some compilers (e.g., gcc), thanks to
|
||||||
* specializations when SSE is enabled.
|
* specializations when SSE is enabled.
|
||||||
*
|
*
|
||||||
|
@ -1061,11 +1051,24 @@ double log(const double &x) { return ::log(x); }
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
||||||
typename NumTraits<T>::Real abs(const T &x) {
|
typename internal::enable_if<NumTraits<T>::IsSigned || NumTraits<T>::IsComplex,typename NumTraits<T>::Real>::type
|
||||||
|
abs(const T &x) {
|
||||||
EIGEN_USING_STD_MATH(abs);
|
EIGEN_USING_STD_MATH(abs);
|
||||||
return abs(x);
|
return abs(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
||||||
|
typename internal::enable_if<!(NumTraits<T>::IsSigned || NumTraits<T>::IsComplex),typename NumTraits<T>::Real>::type
|
||||||
|
abs(const T &x) {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__SYCL_DEVICE_ONLY__)
|
||||||
|
EIGEN_ALWAYS_INLINE float abs(float x) { return cl::sycl::fabs(x); }
|
||||||
|
EIGEN_ALWAYS_INLINE double abs(double x) { return cl::sycl::fabs(x); }
|
||||||
|
#endif // defined(__SYCL_DEVICE_ONLY__)
|
||||||
|
|
||||||
#ifdef __CUDACC__
|
#ifdef __CUDACC__
|
||||||
template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
template<> EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
||||||
float abs(const float &x) { return ::fabsf(x); }
|
float abs(const float &x) { return ::fabsf(x); }
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_MATHFUNCTIONSIMPL_H
|
#ifndef EIGEN_MATHFUNCTIONSIMPL_H
|
||||||
#define EIGEN_MATHFUNCTIONSIMPL_H
|
#define EIGEN_MATHFUNCTIONSIMPL_H
|
||||||
|
@ -33,7 +33,7 @@ T generic_fast_tanh_float(const T& a_x)
|
||||||
// step such that if a_x is nan, x will be either 9 or -9,
|
// step such that if a_x is nan, x will be either 9 or -9,
|
||||||
// and tanh will return 1 or -1 instead of nan.
|
// and tanh will return 1 or -1 instead of nan.
|
||||||
// This is supposed to be fixed in gcc6.3,
|
// This is supposed to be fixed in gcc6.3,
|
||||||
// see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72867
|
// see: xxxps://gcc.gnu.org/bugzilla/show_bug.cgi?id=72867
|
||||||
const T x = pmax(minus_9,pmin(plus_9,a_x));
|
const T x = pmax(minus_9,pmin(plus_9,a_x));
|
||||||
// The monomial coefficients of the numerator polynomial (odd).
|
// The monomial coefficients of the numerator polynomial (odd).
|
||||||
const T alpha_1 = pset1<T>(4.89352455891786e-03f);
|
const T alpha_1 = pset1<T>(4.89352455891786e-03f);
|
||||||
|
@ -71,6 +71,29 @@ T generic_fast_tanh_float(const T& a_x)
|
||||||
return pdiv(p, q);
|
return pdiv(p, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename RealScalar>
|
||||||
|
EIGEN_STRONG_INLINE
|
||||||
|
RealScalar positive_real_hypot(const RealScalar& x, const RealScalar& y)
|
||||||
|
{
|
||||||
|
EIGEN_USING_STD_MATH(sqrt);
|
||||||
|
RealScalar p, qp;
|
||||||
|
p = numext::maxi(x,y);
|
||||||
|
if(p==RealScalar(0)) return RealScalar(0);
|
||||||
|
qp = numext::mini(y,x) / p;
|
||||||
|
return p * sqrt(RealScalar(1) + qp*qp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Scalar>
|
||||||
|
struct hypot_impl
|
||||||
|
{
|
||||||
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
|
static inline RealScalar run(const Scalar& x, const Scalar& y)
|
||||||
|
{
|
||||||
|
EIGEN_USING_STD_MATH(abs);
|
||||||
|
return positive_real_hypot<RealScalar>(abs(x), abs(y));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_MATRIX_H
|
#ifndef EIGEN_MATRIX_H
|
||||||
#define EIGEN_MATRIX_H
|
#define EIGEN_MATRIX_H
|
||||||
|
@ -274,8 +274,6 @@ class Matrix
|
||||||
: Base(std::move(other))
|
: Base(std::move(other))
|
||||||
{
|
{
|
||||||
Base::_check_template_params();
|
Base::_check_template_params();
|
||||||
if (RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic)
|
|
||||||
Base::_set_noalias(other);
|
|
||||||
}
|
}
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
Matrix& operator=(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
|
Matrix& operator=(Matrix&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_MATRIXBASE_H
|
#ifndef EIGEN_MATRIXBASE_H
|
||||||
#define EIGEN_MATRIXBASE_H
|
#define EIGEN_MATRIXBASE_H
|
||||||
|
@ -160,20 +160,11 @@ template<typename Derived> class MatrixBase
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
Derived& operator-=(const MatrixBase<OtherDerived>& other);
|
Derived& operator-=(const MatrixBase<OtherDerived>& other);
|
||||||
|
|
||||||
#ifdef __CUDACC__
|
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
const Product<Derived,OtherDerived,LazyProduct>
|
|
||||||
operator*(const MatrixBase<OtherDerived> &other) const
|
|
||||||
{ return this->lazyProduct(other); }
|
|
||||||
#else
|
|
||||||
|
|
||||||
template<typename OtherDerived>
|
|
||||||
const Product<Derived,OtherDerived>
|
const Product<Derived,OtherDerived>
|
||||||
operator*(const MatrixBase<OtherDerived> &other) const;
|
operator*(const MatrixBase<OtherDerived> &other) const;
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
const Product<Derived,OtherDerived,LazyProduct>
|
const Product<Derived,OtherDerived,LazyProduct>
|
||||||
|
@ -294,7 +285,7 @@ template<typename Derived> class MatrixBase
|
||||||
* fuzzy comparison such as isApprox()
|
* fuzzy comparison such as isApprox()
|
||||||
* \sa isApprox(), operator!= */
|
* \sa isApprox(), operator!= */
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
inline bool operator==(const MatrixBase<OtherDerived>& other) const
|
EIGEN_DEVICE_FUNC inline bool operator==(const MatrixBase<OtherDerived>& other) const
|
||||||
{ return cwiseEqual(other).all(); }
|
{ return cwiseEqual(other).all(); }
|
||||||
|
|
||||||
/** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
|
/** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
|
||||||
|
@ -302,7 +293,7 @@ template<typename Derived> class MatrixBase
|
||||||
* fuzzy comparison such as isApprox()
|
* fuzzy comparison such as isApprox()
|
||||||
* \sa isApprox(), operator== */
|
* \sa isApprox(), operator== */
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
inline bool operator!=(const MatrixBase<OtherDerived>& other) const
|
EIGEN_DEVICE_FUNC inline bool operator!=(const MatrixBase<OtherDerived>& other) const
|
||||||
{ return cwiseNotEqual(other).any(); }
|
{ return cwiseNotEqual(other).any(); }
|
||||||
|
|
||||||
NoAlias<Derived,Eigen::MatrixBase > noalias();
|
NoAlias<Derived,Eigen::MatrixBase > noalias();
|
||||||
|
@ -453,19 +444,28 @@ template<typename Derived> class MatrixBase
|
||||||
///////// MatrixFunctions module /////////
|
///////// MatrixFunctions module /////////
|
||||||
|
|
||||||
typedef typename internal::stem_function<Scalar>::type StemFunction;
|
typedef typename internal::stem_function<Scalar>::type StemFunction;
|
||||||
const MatrixExponentialReturnValue<Derived> exp() const;
|
#define EIGEN_MATRIX_FUNCTION(ReturnType, Name, Description) \
|
||||||
|
/** \returns an expression of the matrix Description of \c *this. \brief This function requires the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>. To compute the coefficient-wise Description use ArrayBase::##Name . */ \
|
||||||
|
const ReturnType<Derived> Name() const;
|
||||||
|
#define EIGEN_MATRIX_FUNCTION_1(ReturnType, Name, Description, Argument) \
|
||||||
|
/** \returns an expression of the matrix Description of \c *this. \brief This function requires the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>. To compute the coefficient-wise Description use ArrayBase::##Name . */ \
|
||||||
|
const ReturnType<Derived> Name(Argument) const;
|
||||||
|
|
||||||
|
EIGEN_MATRIX_FUNCTION(MatrixExponentialReturnValue, exp, exponential)
|
||||||
|
/** \brief Helper function for the <a href="unsupported/group__MatrixFunctions__Module.html"> unsupported MatrixFunctions module</a>.*/
|
||||||
const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;
|
const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;
|
||||||
const MatrixFunctionReturnValue<Derived> cosh() const;
|
EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, cosh, hyperbolic cosine)
|
||||||
const MatrixFunctionReturnValue<Derived> sinh() const;
|
EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, sinh, hyperbolic sine)
|
||||||
const MatrixFunctionReturnValue<Derived> cos() const;
|
EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, cos, cosine)
|
||||||
const MatrixFunctionReturnValue<Derived> sin() const;
|
EIGEN_MATRIX_FUNCTION(MatrixFunctionReturnValue, sin, sine)
|
||||||
const MatrixSquareRootReturnValue<Derived> sqrt() const;
|
EIGEN_MATRIX_FUNCTION(MatrixSquareRootReturnValue, sqrt, square root)
|
||||||
const MatrixLogarithmReturnValue<Derived> log() const;
|
EIGEN_MATRIX_FUNCTION(MatrixLogarithmReturnValue, log, logarithm)
|
||||||
const MatrixPowerReturnValue<Derived> pow(const RealScalar& p) const;
|
EIGEN_MATRIX_FUNCTION_1(MatrixPowerReturnValue, pow, power to \c p, const RealScalar& p)
|
||||||
const MatrixComplexPowerReturnValue<Derived> pow(const std::complex<RealScalar>& p) const;
|
EIGEN_MATRIX_FUNCTION_1(MatrixComplexPowerReturnValue, pow, power to \c p, const std::complex<RealScalar>& p)
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
EIGEN_DEVICE_FUNC MatrixBase() : Base() {}
|
EIGEN_DEFAULT_COPY_CONSTRUCTOR(MatrixBase)
|
||||||
|
EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MatrixBase)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EIGEN_DEVICE_FUNC explicit MatrixBase(int);
|
EIGEN_DEVICE_FUNC explicit MatrixBase(int);
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_NESTBYVALUE_H
|
#ifndef EIGEN_NESTBYVALUE_H
|
||||||
#define EIGEN_NESTBYVALUE_H
|
#define EIGEN_NESTBYVALUE_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_NOALIAS_H
|
#ifndef EIGEN_NOALIAS_H
|
||||||
#define EIGEN_NOALIAS_H
|
#define EIGEN_NOALIAS_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_NUMTRAITS_H
|
#ifndef EIGEN_NUMTRAITS_H
|
||||||
#define EIGEN_NUMTRAITS_H
|
#define EIGEN_NUMTRAITS_H
|
||||||
|
@ -75,13 +75,13 @@ struct default_digits10_impl<T,false,true> // Integer
|
||||||
* \li An enum value \a IsSigned. It is equal to \c 1 if \a T is a signed type and to 0 if \a T is unsigned.
|
* \li An enum value \a IsSigned. It is equal to \c 1 if \a T is a signed type and to 0 if \a T is unsigned.
|
||||||
* \li An enum value \a RequireInitialization. It is equal to \c 1 if the constructor of the numeric type \a T must
|
* \li An enum value \a RequireInitialization. It is equal to \c 1 if the constructor of the numeric type \a T must
|
||||||
* be called, and to 0 if it is safe not to call it. Default is 0 if \a T is an arithmetic type, and 1 otherwise.
|
* be called, and to 0 if it is safe not to call it. Default is 0 if \a T is an arithmetic type, and 1 otherwise.
|
||||||
* \li An epsilon() function which, unlike <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/epsilon">std::numeric_limits::epsilon()</a>,
|
* \li An epsilon() function which, unlike <a href="xxxp://en.cppreference.com/w/cpp/types/numeric_limits/epsilon">std::numeric_limits::epsilon()</a>,
|
||||||
* it returns a \a Real instead of a \a T.
|
* it returns a \a Real instead of a \a T.
|
||||||
* \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default
|
* \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default
|
||||||
* value by the fuzzy comparison operators.
|
* value by the fuzzy comparison operators.
|
||||||
* \li highest() and lowest() functions returning the highest and lowest possible values respectively.
|
* \li highest() and lowest() functions returning the highest and lowest possible values respectively.
|
||||||
* \li digits10() function returning the number of decimal digits that can be represented without change. This is
|
* \li digits10() function returning the number of decimal digits that can be represented without change. This is
|
||||||
* the analogue of <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/digits10">std::numeric_limits<T>::digits10</a>
|
* the analogue of <a href="xxxp://en.cppreference.com/w/cpp/types/numeric_limits/digits10">std::numeric_limits<T>::digits10</a>
|
||||||
* which is used as the default implementation if specialized.
|
* which is used as the default implementation if specialized.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -215,6 +215,8 @@ struct NumTraits<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
|
||||||
static inline RealScalar epsilon() { return NumTraits<RealScalar>::epsilon(); }
|
static inline RealScalar epsilon() { return NumTraits<RealScalar>::epsilon(); }
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static inline RealScalar dummy_precision() { return NumTraits<RealScalar>::dummy_precision(); }
|
static inline RealScalar dummy_precision() { return NumTraits<RealScalar>::dummy_precision(); }
|
||||||
|
|
||||||
|
static inline int digits10() { return NumTraits<Scalar>::digits10(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<> struct NumTraits<std::string>
|
template<> struct NumTraits<std::string>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_PERMUTATIONMATRIX_H
|
#ifndef EIGEN_PERMUTATIONMATRIX_H
|
||||||
#define EIGEN_PERMUTATIONMATRIX_H
|
#define EIGEN_PERMUTATIONMATRIX_H
|
||||||
|
@ -87,17 +87,6 @@ class PermutationBase : public EigenBase<Derived>
|
||||||
return derived();
|
return derived();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
||||||
/** This is a special case of the templated operator=. Its purpose is to
|
|
||||||
* prevent a default operator= from hiding the templated operator=.
|
|
||||||
*/
|
|
||||||
Derived& operator=(const PermutationBase& other)
|
|
||||||
{
|
|
||||||
indices() = other.indices();
|
|
||||||
return derived();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** \returns the number of rows */
|
/** \returns the number of rows */
|
||||||
inline Index rows() const { return Index(indices().size()); }
|
inline Index rows() const { return Index(indices().size()); }
|
||||||
|
|
||||||
|
@ -333,12 +322,6 @@ class PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompile
|
||||||
inline PermutationMatrix(const PermutationBase<OtherDerived>& other)
|
inline PermutationMatrix(const PermutationBase<OtherDerived>& other)
|
||||||
: m_indices(other.indices()) {}
|
: m_indices(other.indices()) {}
|
||||||
|
|
||||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
||||||
/** Standard copy constructor. Defined only to prevent a default copy constructor
|
|
||||||
* from hiding the other templated constructor */
|
|
||||||
inline PermutationMatrix(const PermutationMatrix& other) : m_indices(other.indices()) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Generic constructor from expression of the indices. The indices
|
/** Generic constructor from expression of the indices. The indices
|
||||||
* array has the meaning that the permutations sends each integer i to indices[i].
|
* array has the meaning that the permutations sends each integer i to indices[i].
|
||||||
*
|
*
|
||||||
|
@ -373,17 +356,6 @@ class PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompile
|
||||||
return Base::operator=(tr.derived());
|
return Base::operator=(tr.derived());
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
|
||||||
/** This is a special case of the templated operator=. Its purpose is to
|
|
||||||
* prevent a default operator= from hiding the templated operator=.
|
|
||||||
*/
|
|
||||||
PermutationMatrix& operator=(const PermutationMatrix& other)
|
|
||||||
{
|
|
||||||
m_indices = other.m_indices;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** const version of indices(). */
|
/** const version of indices(). */
|
||||||
const IndicesType& indices() const { return m_indices; }
|
const IndicesType& indices() const { return m_indices; }
|
||||||
/** \returns a reference to the stored array representing the permutation. */
|
/** \returns a reference to the stored array representing the permutation. */
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_DENSESTORAGEBASE_H
|
#ifndef EIGEN_DENSESTORAGEBASE_H
|
||||||
#define EIGEN_DENSESTORAGEBASE_H
|
#define EIGEN_DENSESTORAGEBASE_H
|
||||||
|
@ -39,9 +39,9 @@ template<> struct check_rows_cols_for_overflow<Dynamic> {
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static EIGEN_ALWAYS_INLINE void run(Index rows, Index cols)
|
static EIGEN_ALWAYS_INLINE void run(Index rows, Index cols)
|
||||||
{
|
{
|
||||||
// http://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242
|
// xxxp://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242
|
||||||
// we assume Index is signed
|
// we assume Index is signed
|
||||||
Index max_index = (size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed
|
Index max_index = (std::size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed
|
||||||
bool error = (rows == 0 || cols == 0) ? false
|
bool error = (rows == 0 || cols == 0) ? false
|
||||||
: (rows > max_index / cols);
|
: (rows > max_index / cols);
|
||||||
if (error)
|
if (error)
|
||||||
|
@ -577,6 +577,10 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
|
||||||
* while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned
|
* while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned
|
||||||
* \a data pointers.
|
* \a data pointers.
|
||||||
*
|
*
|
||||||
|
* Here is an example using strides:
|
||||||
|
* \include Matrix_Map_stride.cpp
|
||||||
|
* Output: \verbinclude Matrix_Map_stride.out
|
||||||
|
*
|
||||||
* \see class Map
|
* \see class Map
|
||||||
*/
|
*/
|
||||||
//@{
|
//@{
|
||||||
|
@ -733,8 +737,10 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
EIGEN_STRONG_INLINE void _init2(Index rows, Index cols, typename internal::enable_if<Base::SizeAtCompileTime!=2,T0>::type* = 0)
|
EIGEN_STRONG_INLINE void _init2(Index rows, Index cols, typename internal::enable_if<Base::SizeAtCompileTime!=2,T0>::type* = 0)
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT(bool(NumTraits<T0>::IsInteger) &&
|
const bool t0_is_integer_alike = internal::is_valid_index_type<T0>::value;
|
||||||
bool(NumTraits<T1>::IsInteger),
|
const bool t1_is_integer_alike = internal::is_valid_index_type<T1>::value;
|
||||||
|
EIGEN_STATIC_ASSERT(t0_is_integer_alike &&
|
||||||
|
t1_is_integer_alike,
|
||||||
FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
|
FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
|
||||||
resize(rows,cols);
|
resize(rows,cols);
|
||||||
}
|
}
|
||||||
|
@ -769,9 +775,9 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
|
||||||
&& ((!internal::is_same<typename internal::traits<Derived>::XprKind,ArrayXpr>::value || Base::SizeAtCompileTime==Dynamic)),T>::type* = 0)
|
&& ((!internal::is_same<typename internal::traits<Derived>::XprKind,ArrayXpr>::value || Base::SizeAtCompileTime==Dynamic)),T>::type* = 0)
|
||||||
{
|
{
|
||||||
// NOTE MSVC 2008 complains if we directly put bool(NumTraits<T>::IsInteger) as the EIGEN_STATIC_ASSERT argument.
|
// NOTE MSVC 2008 complains if we directly put bool(NumTraits<T>::IsInteger) as the EIGEN_STATIC_ASSERT argument.
|
||||||
const bool is_integer = NumTraits<T>::IsInteger;
|
const bool is_integer_alike = internal::is_valid_index_type<T>::value;
|
||||||
EIGEN_UNUSED_VARIABLE(is_integer);
|
EIGEN_UNUSED_VARIABLE(is_integer_alike);
|
||||||
EIGEN_STATIC_ASSERT(is_integer,
|
EIGEN_STATIC_ASSERT(is_integer_alike,
|
||||||
FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
|
FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
|
||||||
resize(size);
|
resize(size);
|
||||||
}
|
}
|
||||||
|
@ -812,6 +818,13 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
|
||||||
this->_set_noalias(other);
|
this->_set_noalias(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Initialize an arbitrary matrix from an object convertible to the Derived type.
|
||||||
|
template<typename T>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE void _init1(const Derived& other){
|
||||||
|
this->_set_noalias(other);
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize an arbitrary matrix from a generic Eigen expression
|
// Initialize an arbitrary matrix from a generic Eigen expression
|
||||||
template<typename T, typename OtherDerived>
|
template<typename T, typename OtherDerived>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
|
@ -834,7 +847,7 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
|
||||||
this->derived() = r;
|
this->derived() = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For fixed -size arrays:
|
// For fixed-size Array<Scalar,...>
|
||||||
template<typename T>
|
template<typename T>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
EIGEN_STRONG_INLINE void _init1(const Scalar& val0,
|
EIGEN_STRONG_INLINE void _init1(const Scalar& val0,
|
||||||
|
@ -846,6 +859,7 @@ class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
|
||||||
Base::setConstant(val0);
|
Base::setConstant(val0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For fixed-size Array<Index,...>
|
||||||
template<typename T>
|
template<typename T>
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
EIGEN_STRONG_INLINE void _init1(const Index& val0,
|
EIGEN_STRONG_INLINE void _init1(const Index& val0,
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_PRODUCT_H
|
#ifndef EIGEN_PRODUCT_H
|
||||||
#define EIGEN_PRODUCT_H
|
#define EIGEN_PRODUCT_H
|
||||||
|
@ -97,8 +97,8 @@ class Product : public ProductImpl<_Lhs,_Rhs,Option,
|
||||||
&& "if you wanted a coeff-wise or a dot product use the respective explicit functions");
|
&& "if you wanted a coeff-wise or a dot product use the respective explicit functions");
|
||||||
}
|
}
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC inline Index rows() const { return m_lhs.rows(); }
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }
|
||||||
EIGEN_DEVICE_FUNC inline Index cols() const { return m_rhs.cols(); }
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC const LhsNestedCleaned& lhs() const { return m_lhs; }
|
EIGEN_DEVICE_FUNC const LhsNestedCleaned& lhs() const { return m_lhs; }
|
||||||
EIGEN_DEVICE_FUNC const RhsNestedCleaned& rhs() const { return m_rhs; }
|
EIGEN_DEVICE_FUNC const RhsNestedCleaned& rhs() const { return m_rhs; }
|
||||||
|
@ -127,7 +127,7 @@ public:
|
||||||
using Base::derived;
|
using Base::derived;
|
||||||
typedef typename Base::Scalar Scalar;
|
typedef typename Base::Scalar Scalar;
|
||||||
|
|
||||||
operator const Scalar() const
|
EIGEN_STRONG_INLINE operator const Scalar() const
|
||||||
{
|
{
|
||||||
return internal::evaluator<ProductXpr>(derived()).coeff(0,0);
|
return internal::evaluator<ProductXpr>(derived()).coeff(0,0);
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ class ProductImpl<Lhs,Rhs,Option,Dense>
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC Scalar coeff(Index row, Index col) const
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar coeff(Index row, Index col) const
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS);
|
EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS);
|
||||||
eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) );
|
eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) );
|
||||||
|
@ -170,7 +170,7 @@ class ProductImpl<Lhs,Rhs,Option,Dense>
|
||||||
return internal::evaluator<Derived>(derived()).coeff(row,col);
|
return internal::evaluator<Derived>(derived()).coeff(row,col);
|
||||||
}
|
}
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC Scalar coeff(Index i) const
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar coeff(Index i) const
|
||||||
{
|
{
|
||||||
EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS);
|
EIGEN_STATIC_ASSERT(EnableCoeff, THIS_METHOD_IS_ONLY_FOR_INNER_OR_LAZY_PRODUCTS);
|
||||||
eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) );
|
eigen_assert( (Option==LazyProduct) || (this->rows() == 1 && this->cols() == 1) );
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
|
|
||||||
#ifndef EIGEN_PRODUCTEVALUATORS_H
|
#ifndef EIGEN_PRODUCTEVALUATORS_H
|
||||||
|
@ -32,7 +32,7 @@ struct evaluator<Product<Lhs, Rhs, Options> >
|
||||||
typedef Product<Lhs, Rhs, Options> XprType;
|
typedef Product<Lhs, Rhs, Options> XprType;
|
||||||
typedef product_evaluator<XprType> Base;
|
typedef product_evaluator<XprType> Base;
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr) : Base(xpr) {}
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& xpr) : Base(xpr) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Catch "scalar * ( A * B )" and transform it to "(A*scalar) * B"
|
// Catch "scalar * ( A * B )" and transform it to "(A*scalar) * B"
|
||||||
|
@ -55,7 +55,7 @@ struct evaluator<CwiseBinaryOp<internal::scalar_product_op<Scalar1,Scalar2>,
|
||||||
const Product<Lhs, Rhs, DefaultProduct> > XprType;
|
const Product<Lhs, Rhs, DefaultProduct> > XprType;
|
||||||
typedef evaluator<Product<EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar1,Lhs,product), Rhs, DefaultProduct> > Base;
|
typedef evaluator<Product<EIGEN_SCALAR_BINARYOP_EXPR_RETURN_TYPE(Scalar1,Lhs,product), Rhs, DefaultProduct> > Base;
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& xpr)
|
||||||
: Base(xpr.lhs().functor().m_other * xpr.rhs().lhs() * xpr.rhs().rhs())
|
: Base(xpr.lhs().functor().m_other * xpr.rhs().lhs() * xpr.rhs().rhs())
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
@ -68,7 +68,7 @@ struct evaluator<Diagonal<const Product<Lhs, Rhs, DefaultProduct>, DiagIndex> >
|
||||||
typedef Diagonal<const Product<Lhs, Rhs, DefaultProduct>, DiagIndex> XprType;
|
typedef Diagonal<const Product<Lhs, Rhs, DefaultProduct>, DiagIndex> XprType;
|
||||||
typedef evaluator<Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex> > Base;
|
typedef evaluator<Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex> > Base;
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC explicit evaluator(const XprType& xpr)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit evaluator(const XprType& xpr)
|
||||||
: Base(Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex>(
|
: Base(Diagonal<const Product<Lhs, Rhs, LazyProduct>, DiagIndex>(
|
||||||
Product<Lhs, Rhs, LazyProduct>(xpr.nestedExpression().lhs(), xpr.nestedExpression().rhs()),
|
Product<Lhs, Rhs, LazyProduct>(xpr.nestedExpression().lhs(), xpr.nestedExpression().rhs()),
|
||||||
xpr.index() ))
|
xpr.index() ))
|
||||||
|
@ -207,6 +207,12 @@ struct evaluator_assume_aliasing<CwiseBinaryOp<internal::scalar_sum_op<typename
|
||||||
static const bool value = true;
|
static const bool value = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename OtherXpr, typename Lhs, typename Rhs>
|
||||||
|
struct evaluator_assume_aliasing<CwiseBinaryOp<internal::scalar_difference_op<typename OtherXpr::Scalar,typename Product<Lhs,Rhs,DefaultProduct>::Scalar>, const OtherXpr,
|
||||||
|
const Product<Lhs,Rhs,DefaultProduct> >, DenseShape > {
|
||||||
|
static const bool value = true;
|
||||||
|
};
|
||||||
|
|
||||||
template<typename DstXprType, typename OtherXpr, typename ProductType, typename Func1, typename Func2>
|
template<typename DstXprType, typename OtherXpr, typename ProductType, typename Func1, typename Func2>
|
||||||
struct assignment_from_xpr_op_product
|
struct assignment_from_xpr_op_product
|
||||||
{
|
{
|
||||||
|
@ -240,19 +246,19 @@ template<typename Lhs, typename Rhs>
|
||||||
struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,InnerProduct>
|
struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,InnerProduct>
|
||||||
{
|
{
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{
|
{
|
||||||
dst.coeffRef(0,0) = (lhs.transpose().cwiseProduct(rhs)).sum();
|
dst.coeffRef(0,0) = (lhs.transpose().cwiseProduct(rhs)).sum();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{
|
{
|
||||||
dst.coeffRef(0,0) += (lhs.transpose().cwiseProduct(rhs)).sum();
|
dst.coeffRef(0,0) += (lhs.transpose().cwiseProduct(rhs)).sum();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{ dst.coeffRef(0,0) -= (lhs.transpose().cwiseProduct(rhs)).sum(); }
|
{ dst.coeffRef(0,0) -= (lhs.transpose().cwiseProduct(rhs)).sum(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -306,25 +312,25 @@ struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,OuterProduct>
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void evalTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{
|
{
|
||||||
internal::outer_product_selector_run(dst, lhs, rhs, set(), is_row_major<Dst>());
|
internal::outer_product_selector_run(dst, lhs, rhs, set(), is_row_major<Dst>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void addTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{
|
{
|
||||||
internal::outer_product_selector_run(dst, lhs, rhs, add(), is_row_major<Dst>());
|
internal::outer_product_selector_run(dst, lhs, rhs, add(), is_row_major<Dst>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
static EIGEN_STRONG_INLINE void subTo(Dst& dst, const Lhs& lhs, const Rhs& rhs)
|
||||||
{
|
{
|
||||||
internal::outer_product_selector_run(dst, lhs, rhs, sub(), is_row_major<Dst>());
|
internal::outer_product_selector_run(dst, lhs, rhs, sub(), is_row_major<Dst>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Dst>
|
template<typename Dst>
|
||||||
static inline void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
|
static EIGEN_STRONG_INLINE void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
|
||||||
{
|
{
|
||||||
internal::outer_product_selector_run(dst, lhs, rhs, adds(alpha), is_row_major<Dst>());
|
internal::outer_product_selector_run(dst, lhs, rhs, adds(alpha), is_row_major<Dst>());
|
||||||
}
|
}
|
||||||
|
@ -405,6 +411,32 @@ struct generic_product_impl<Lhs,Rhs,DenseShape,DenseShape,CoeffBasedProductMode>
|
||||||
call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::sub_assign_op<typename Dst::Scalar,Scalar>());
|
call_assignment_no_alias(dst, lhs.lazyProduct(rhs), internal::sub_assign_op<typename Dst::Scalar,Scalar>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Catch "dst {,+,-}= (s*A)*B" and evaluate it lazily by moving out the scalar factor:
|
||||||
|
// dst {,+,-}= s * (A.lazyProduct(B))
|
||||||
|
// This is a huge benefit for heap-allocated matrix types as it save one costly allocation.
|
||||||
|
// For them, this strategy is also faster than simply by-passing the heap allocation through
|
||||||
|
// stack allocation.
|
||||||
|
// For fixed sizes matrices, this is less obvious, it is sometimes x2 faster, but sometimes x3 slower,
|
||||||
|
// and the behavior depends also a lot on the compiler... so let's be conservative and enable them for dynamic-size only,
|
||||||
|
// that is when coming from generic_product_impl<...,GemmProduct> in file GeneralMatrixMatrix.h
|
||||||
|
template<typename Dst, typename Scalar1, typename Scalar2, typename Plain1, typename Xpr2, typename Func>
|
||||||
|
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
|
void eval_dynamic(Dst& dst, const CwiseBinaryOp<internal::scalar_product_op<Scalar1,Scalar2>,
|
||||||
|
const CwiseNullaryOp<internal::scalar_constant_op<Scalar1>, Plain1>, Xpr2>& lhs, const Rhs& rhs, const Func &func)
|
||||||
|
{
|
||||||
|
call_assignment_no_alias(dst, lhs.lhs().functor().m_other * lhs.rhs().lazyProduct(rhs), func);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Here, we we always have LhsT==Lhs, but we need to make it a template type to make the above
|
||||||
|
// overload more specialized.
|
||||||
|
template<typename Dst, typename LhsT, typename Func>
|
||||||
|
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
||||||
|
void eval_dynamic(Dst& dst, const LhsT& lhs, const Rhs& rhs, const Func &func)
|
||||||
|
{
|
||||||
|
call_assignment_no_alias(dst, lhs.lazyProduct(rhs), func);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// template<typename Dst>
|
// template<typename Dst>
|
||||||
// static inline void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
|
// static inline void scaleAndAddTo(Dst& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
|
||||||
// { dst.noalias() += alpha * lhs.lazyProduct(rhs); }
|
// { dst.noalias() += alpha * lhs.lazyProduct(rhs); }
|
||||||
|
@ -779,7 +811,11 @@ public:
|
||||||
_Vectorizable = bool(int(MatrixFlags)&PacketAccessBit) && _SameTypes && (_ScalarAccessOnDiag || (bool(int(DiagFlags)&PacketAccessBit))),
|
_Vectorizable = bool(int(MatrixFlags)&PacketAccessBit) && _SameTypes && (_ScalarAccessOnDiag || (bool(int(DiagFlags)&PacketAccessBit))),
|
||||||
_LinearAccessMask = (MatrixType::RowsAtCompileTime==1 || MatrixType::ColsAtCompileTime==1) ? LinearAccessBit : 0,
|
_LinearAccessMask = (MatrixType::RowsAtCompileTime==1 || MatrixType::ColsAtCompileTime==1) ? LinearAccessBit : 0,
|
||||||
Flags = ((HereditaryBits|_LinearAccessMask) & (unsigned int)(MatrixFlags)) | (_Vectorizable ? PacketAccessBit : 0),
|
Flags = ((HereditaryBits|_LinearAccessMask) & (unsigned int)(MatrixFlags)) | (_Vectorizable ? PacketAccessBit : 0),
|
||||||
Alignment = evaluator<MatrixType>::Alignment
|
Alignment = evaluator<MatrixType>::Alignment,
|
||||||
|
|
||||||
|
AsScalarProduct = (DiagonalType::SizeAtCompileTime==1)
|
||||||
|
|| (DiagonalType::SizeAtCompileTime==Dynamic && MatrixType::RowsAtCompileTime==1 && ProductOrder==OnTheLeft)
|
||||||
|
|| (DiagonalType::SizeAtCompileTime==Dynamic && MatrixType::ColsAtCompileTime==1 && ProductOrder==OnTheRight)
|
||||||
};
|
};
|
||||||
|
|
||||||
diagonal_product_evaluator_base(const MatrixType &mat, const DiagonalType &diag)
|
diagonal_product_evaluator_base(const MatrixType &mat, const DiagonalType &diag)
|
||||||
|
@ -791,6 +827,9 @@ public:
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index idx) const
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar coeff(Index idx) const
|
||||||
{
|
{
|
||||||
|
if(AsScalarProduct)
|
||||||
|
return m_diagImpl.coeff(0) * m_matImpl.coeff(idx);
|
||||||
|
else
|
||||||
return m_diagImpl.coeff(idx) * m_matImpl.coeff(idx);
|
return m_diagImpl.coeff(idx) * m_matImpl.coeff(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_RANDOM_H
|
#ifndef EIGEN_RANDOM_H
|
||||||
#define EIGEN_RANDOM_H
|
#define EIGEN_RANDOM_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_REDUX_H
|
#ifndef EIGEN_REDUX_H
|
||||||
#define EIGEN_REDUX_H
|
#define EIGEN_REDUX_H
|
||||||
|
@ -407,7 +407,7 @@ protected:
|
||||||
*/
|
*/
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
template<typename Func>
|
template<typename Func>
|
||||||
typename internal::traits<Derived>::Scalar
|
EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
|
||||||
DenseBase<Derived>::redux(const Func& func) const
|
DenseBase<Derived>::redux(const Func& func) const
|
||||||
{
|
{
|
||||||
eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
|
eigen_assert(this->rows()>0 && this->cols()>0 && "you are using an empty matrix");
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_REF_H
|
#ifndef EIGEN_REF_H
|
||||||
#define EIGEN_REF_H
|
#define EIGEN_REF_H
|
||||||
|
@ -28,12 +28,13 @@ struct traits<Ref<_PlainObjectType, _Options, _StrideType> >
|
||||||
|
|
||||||
template<typename Derived> struct match {
|
template<typename Derived> struct match {
|
||||||
enum {
|
enum {
|
||||||
|
IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime,
|
||||||
HasDirectAccess = internal::has_direct_access<Derived>::ret,
|
HasDirectAccess = internal::has_direct_access<Derived>::ret,
|
||||||
StorageOrderMatch = PlainObjectType::IsVectorAtCompileTime || Derived::IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)),
|
StorageOrderMatch = IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)),
|
||||||
InnerStrideMatch = int(StrideType::InnerStrideAtCompileTime)==int(Dynamic)
|
InnerStrideMatch = int(StrideType::InnerStrideAtCompileTime)==int(Dynamic)
|
||||||
|| int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime)
|
|| int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime)
|
||||||
|| (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1),
|
|| (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1),
|
||||||
OuterStrideMatch = Derived::IsVectorAtCompileTime
|
OuterStrideMatch = IsVectorAtCompileTime
|
||||||
|| int(StrideType::OuterStrideAtCompileTime)==int(Dynamic) || int(StrideType::OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime),
|
|| int(StrideType::OuterStrideAtCompileTime)==int(Dynamic) || int(StrideType::OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime),
|
||||||
// NOTE, this indirection of evaluator<Derived>::Alignment is needed
|
// NOTE, this indirection of evaluator<Derived>::Alignment is needed
|
||||||
// to workaround a very strange bug in MSVC related to the instantiation
|
// to workaround a very strange bug in MSVC related to the instantiation
|
||||||
|
@ -95,6 +96,8 @@ protected:
|
||||||
template<typename Expression>
|
template<typename Expression>
|
||||||
EIGEN_DEVICE_FUNC void construct(Expression& expr)
|
EIGEN_DEVICE_FUNC void construct(Expression& expr)
|
||||||
{
|
{
|
||||||
|
EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(PlainObjectType,Expression);
|
||||||
|
|
||||||
if(PlainObjectType::RowsAtCompileTime==1)
|
if(PlainObjectType::RowsAtCompileTime==1)
|
||||||
{
|
{
|
||||||
eigen_assert(expr.rows()==1 || expr.cols()==1);
|
eigen_assert(expr.rows()==1 || expr.cols()==1);
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_REPLICATE_H
|
#ifndef EIGEN_REPLICATE_H
|
||||||
#define EIGEN_REPLICATE_H
|
#define EIGEN_REPLICATE_H
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_RETURNBYVALUE_H
|
#ifndef EIGEN_RETURNBYVALUE_H
|
||||||
#define EIGEN_RETURNBYVALUE_H
|
#define EIGEN_RETURNBYVALUE_H
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_REVERSE_H
|
#ifndef EIGEN_REVERSE_H
|
||||||
#define EIGEN_REVERSE_H
|
#define EIGEN_REVERSE_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SELECT_H
|
#ifndef EIGEN_SELECT_H
|
||||||
#define EIGEN_SELECT_H
|
#define EIGEN_SELECT_H
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SELFADJOINTMATRIX_H
|
#ifndef EIGEN_SELFADJOINTMATRIX_H
|
||||||
#define EIGEN_SELFADJOINTMATRIX_H
|
#define EIGEN_SELFADJOINTMATRIX_H
|
||||||
|
@ -71,7 +71,9 @@ template<typename _MatrixType, unsigned int UpLo> class SelfAdjointView
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
explicit inline SelfAdjointView(MatrixType& matrix) : m_matrix(matrix)
|
explicit inline SelfAdjointView(MatrixType& matrix) : m_matrix(matrix)
|
||||||
{}
|
{
|
||||||
|
EIGEN_STATIC_ASSERT(UpLo==Lower || UpLo==Upper,SELFADJOINTVIEW_ACCEPTS_UPPER_AND_LOWER_MODE_ONLY);
|
||||||
|
}
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
inline Index rows() const { return m_matrix.rows(); }
|
inline Index rows() const { return m_matrix.rows(); }
|
||||||
|
@ -189,7 +191,7 @@ template<typename _MatrixType, unsigned int UpLo> class SelfAdjointView
|
||||||
TriangularView<typename MatrixType::AdjointReturnType,TriMode> >::type(tmp2);
|
TriangularView<typename MatrixType::AdjointReturnType,TriMode> >::type(tmp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef SelfAdjointView<const MatrixConjugateReturnType,Mode> ConjugateReturnType;
|
typedef SelfAdjointView<const MatrixConjugateReturnType,UpLo> ConjugateReturnType;
|
||||||
/** \sa MatrixBase::conjugate() const */
|
/** \sa MatrixBase::conjugate() const */
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
inline const ConjugateReturnType conjugate() const
|
inline const ConjugateReturnType conjugate() const
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SELFCWISEBINARYOP_H
|
#ifndef EIGEN_SELFCWISEBINARYOP_H
|
||||||
#define EIGEN_SELFCWISEBINARYOP_H
|
#define EIGEN_SELFCWISEBINARYOP_H
|
||||||
|
@ -15,33 +15,29 @@ namespace Eigen {
|
||||||
// TODO generalize the scalar type of 'other'
|
// TODO generalize the scalar type of 'other'
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator*=(const Scalar& other)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator*=(const Scalar& other)
|
||||||
{
|
{
|
||||||
typedef typename Derived::PlainObject PlainObject;
|
|
||||||
internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::mul_assign_op<Scalar,Scalar>());
|
internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::mul_assign_op<Scalar,Scalar>());
|
||||||
return derived();
|
return derived();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator+=(const Scalar& other)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator+=(const Scalar& other)
|
||||||
{
|
{
|
||||||
typedef typename Derived::PlainObject PlainObject;
|
|
||||||
internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::add_assign_op<Scalar,Scalar>());
|
internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::add_assign_op<Scalar,Scalar>());
|
||||||
return derived();
|
return derived();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator-=(const Scalar& other)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& ArrayBase<Derived>::operator-=(const Scalar& other)
|
||||||
{
|
{
|
||||||
typedef typename Derived::PlainObject PlainObject;
|
|
||||||
internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::sub_assign_op<Scalar,Scalar>());
|
internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::sub_assign_op<Scalar,Scalar>());
|
||||||
return derived();
|
return derived();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator/=(const Scalar& other)
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator/=(const Scalar& other)
|
||||||
{
|
{
|
||||||
typedef typename Derived::PlainObject PlainObject;
|
|
||||||
internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::div_assign_op<Scalar,Scalar>());
|
internal::call_assignment(this->derived(), PlainObject::Constant(rows(),cols(),other), internal::div_assign_op<Scalar,Scalar>());
|
||||||
return derived();
|
return derived();
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SOLVE_H
|
#ifndef EIGEN_SOLVE_H
|
||||||
#define EIGEN_SOLVE_H
|
#define EIGEN_SOLVE_H
|
||||||
|
@ -34,12 +34,12 @@ template<typename Decomposition, typename RhsType,typename StorageKind> struct s
|
||||||
template<typename Decomposition, typename RhsType>
|
template<typename Decomposition, typename RhsType>
|
||||||
struct solve_traits<Decomposition,RhsType,Dense>
|
struct solve_traits<Decomposition,RhsType,Dense>
|
||||||
{
|
{
|
||||||
typedef Matrix<typename RhsType::Scalar,
|
typedef typename make_proper_matrix_type<typename RhsType::Scalar,
|
||||||
Decomposition::ColsAtCompileTime,
|
Decomposition::ColsAtCompileTime,
|
||||||
RhsType::ColsAtCompileTime,
|
RhsType::ColsAtCompileTime,
|
||||||
RhsType::PlainObject::Options,
|
RhsType::PlainObject::Options,
|
||||||
Decomposition::MaxColsAtCompileTime,
|
Decomposition::MaxColsAtCompileTime,
|
||||||
RhsType::MaxColsAtCompileTime> PlainObject;
|
RhsType::MaxColsAtCompileTime>::type PlainObject;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Decomposition, typename RhsType>
|
template<typename Decomposition, typename RhsType>
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SOLVETRIANGULAR_H
|
#ifndef EIGEN_SOLVETRIANGULAR_H
|
||||||
#define EIGEN_SOLVETRIANGULAR_H
|
#define EIGEN_SOLVETRIANGULAR_H
|
||||||
|
@ -19,7 +19,7 @@ namespace internal {
|
||||||
template<typename LhsScalar, typename RhsScalar, typename Index, int Side, int Mode, bool Conjugate, int StorageOrder>
|
template<typename LhsScalar, typename RhsScalar, typename Index, int Side, int Mode, bool Conjugate, int StorageOrder>
|
||||||
struct triangular_solve_vector;
|
struct triangular_solve_vector;
|
||||||
|
|
||||||
template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder, int OtherStorageOrder>
|
template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder, int OtherStorageOrder, int OtherInnerStride>
|
||||||
struct triangular_solve_matrix;
|
struct triangular_solve_matrix;
|
||||||
|
|
||||||
// small helper struct extracting some traits on the underlying solver operation
|
// small helper struct extracting some traits on the underlying solver operation
|
||||||
|
@ -98,8 +98,8 @@ struct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,Dynamic>
|
||||||
BlockingType blocking(rhs.rows(), rhs.cols(), size, 1, false);
|
BlockingType blocking(rhs.rows(), rhs.cols(), size, 1, false);
|
||||||
|
|
||||||
triangular_solve_matrix<Scalar,Index,Side,Mode,LhsProductTraits::NeedToConjugate,(int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor,
|
triangular_solve_matrix<Scalar,Index,Side,Mode,LhsProductTraits::NeedToConjugate,(int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor,
|
||||||
(Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor>
|
(Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor, Rhs::InnerStrideAtCompileTime>
|
||||||
::run(size, othersize, &actualLhs.coeffRef(0,0), actualLhs.outerStride(), &rhs.coeffRef(0,0), rhs.outerStride(), blocking);
|
::run(size, othersize, &actualLhs.coeffRef(0,0), actualLhs.outerStride(), &rhs.coeffRef(0,0), rhs.innerStride(), rhs.outerStride(), blocking);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -169,6 +169,9 @@ void TriangularViewImpl<MatrixType,Mode,Dense>::solveInPlace(const MatrixBase<Ot
|
||||||
OtherDerived& other = _other.const_cast_derived();
|
OtherDerived& other = _other.const_cast_derived();
|
||||||
eigen_assert( derived().cols() == derived().rows() && ((Side==OnTheLeft && derived().cols() == other.rows()) || (Side==OnTheRight && derived().cols() == other.cols())) );
|
eigen_assert( derived().cols() == derived().rows() && ((Side==OnTheLeft && derived().cols() == other.rows()) || (Side==OnTheRight && derived().cols() == other.cols())) );
|
||||||
eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));
|
eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));
|
||||||
|
// If solving for a 0x0 matrix, nothing to do, simply return.
|
||||||
|
if (derived().cols() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
enum { copy = (internal::traits<OtherDerived>::Flags & RowMajorBit) && OtherDerived::IsVectorAtCompileTime && OtherDerived::SizeAtCompileTime!=1};
|
enum { copy = (internal::traits<OtherDerived>::Flags & RowMajorBit) && OtherDerived::IsVectorAtCompileTime && OtherDerived::SizeAtCompileTime!=1};
|
||||||
typedef typename internal::conditional<copy,
|
typedef typename internal::conditional<copy,
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
// Public License v. 2.0. If a copy of the MPL was not distributed
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// with this file, You can obtain one at the mozilla.org home page
|
||||||
|
|
||||||
#ifndef EIGEN_SOLVERBASE_H
|
#ifndef EIGEN_SOLVERBASE_H
|
||||||
#define EIGEN_SOLVERBASE_H
|
#define EIGEN_SOLVERBASE_H
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue